【AI安全之对抗样本】深度学习基础知识(二)

文章目录

  • 00 前言
  • 01 深度学习训练过程
  • 02 优化器(optimizers)
    • 2.1 梯度算法
    • 2.2 常用的优化器
      • 2.2.1 SGD
      • 2.2.2 Adagrad
      • 2.2.3 Adadelta
      • 2.2.4 RMSprop
      • 2.2.5 Adam
    • 2.3 如何使用优化器(optimizers)
  • 03 总结

00 前言

【我的AI安全之路】以下内容适合于有web安全基础但对AI"一无所知"的师傅们

如果是有安全基础,想入门AI安全,可以看下以web安全为背景介绍AI安全的书:《Web安全之机器学习入门》和《Web安全之深度学习实战》,以及一本关于对抗样本的书:《AI安全之对抗样本入门》

【补充】以下均基于深度学习主流框架之一keras为例

01 深度学习训练过程

深度学习训练全过程分为:正向传递和反向传递

正向传播的计算可能依赖于模型参数的当前值,而这些模型参数是在反向传播的梯度

反向传播的梯度计算可能依赖于各变量的当前值,而这些变量的当前值是通过正向传播计算得到的

参考:参考博客

02 优化器(optimizers)

学习优化器之前需要先了解一下梯度算法

【补充知识点】

  • 导数,偏导数,方向导数,梯度,梯度下降等参考内容:导数、偏导数、方向导数、梯度、梯度下降、如何直观形象的理解方向导数与梯度以及它们之间的关系?、什么是全导数?

  • 学习本篇需要理解的点:

    偏导数连续才有梯度的存在

    梯度的方向是方向导数中取到最大值的方向,梯度的值是方向导数的最大值

2.1 梯度算法

  • 梯度

    多元函数的指定点上升的坡度,假设多元函数可以表示为f(x,y),那么对应的梯度的定义为【AI安全之对抗样本】深度学习基础知识(二)_第1张图片

  • 梯度向上算法

    在求函数的最大值时,向梯度向上的方向移动,使用加号(α表示学习率)
    【AI安全之对抗样本】深度学习基础知识(二)_第2张图片

  • 梯度下降算法

    在求函数的最小值时,向梯度向下的方向移动,使用减号(α表示学习率)
    【AI安全之对抗样本】深度学习基础知识(二)_第3张图片

  • 代码示例

    以 函数 f(x)=x*x+2 为例,其对应的梯度为【AI安全之对抗样本】深度学习基础知识(二)_第4张图片
    将学习率α设为0.1,整个过程代码如下

    def demo():
        import random
        a=0.1
        x=randaom.randint(1,10)
        y = x * x + 2
        index = 1
        while index < 100 and abs(y-2) > 0.01 :#当结果接近2(绝对值相差不超过0.01)时退出迭代过程
            y=x*x+2
            print "batch={} x={} y={}".format(index,x,y)
            x=x-2*x*a
            index+=1
    

    输出结果表示迭代20次后出现最小点

    batch=14 x=0.329853488333 y=2.10880332377
    batch=15 x=0.263882790666 y=2.06963412721
    batch=16 x=0.211106232533 y=2.04456584141
    batch=17 x=0.168884986026 y=2.02852213851
    batch=18 x=0.135107988821 y=2.01825416864
    batch=19 x=0.108086391057 y=2.01168266793
    batch=20 x=0.0864691128455 y=2.00747690748
    

    在Keras中提供工具返回loss函数(损失函数)关于variables(张量变量的列表)的梯度:

    from keras import backend as K

    k.gradients(loss, variables)

    Keras也提供function用于实例化一个Keras函数

    inputs是输入张量的列表,其元素为占位符或张量变量

    outputs为输出张量的列表

    k.function(inputs, outputs, updata=[])

2.2 常用的优化器

2.2.1 SGD

  • 介绍随机梯度下降法,最基础的优化方法。

    把数据拆分后再分批不断地放入神经网络中来计算,支持动量参数,支持学习衰减率。

  • 函数定义

    keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

  • 参数解释

    lr:学习率

    momentum:动量参数

    decay:每次更新后的学习率衰减值

2.2.2 Adagrad

  • 介绍:具有特定参数学习率的优化器,它根据参数在训练期间的更新频率进行自适应调整。参数接收的更新越多,更新越小。

  • 函数定义

    keras.optimizers.Adagrad(lr=0.01, epsilon=1e-6)

  • 参数解释

    lr: float >= 0. 学习率

    epsilon: float >= 0,防止除0错误

2.2.3 Adadelta

  • 介绍:是 Adagrad 的一个具有更强鲁棒性的的扩展版本。

  • 函数定义

    keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=1e-6)

  • 参数解释

    lr: float >= 0. 默认设置

    rho: float >= 0.

    epsilon: float >= 0. Fuzz factor

2.2.4 RMSprop

  • 介绍:面对递归神经网络时的良好选择。

  • 函数定义

    keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=le-06)

  • 参数解释

    lr:学习率

    epsilon:大于或等于0的小浮点数,防止除0错误

2.2.5 Adam

  • 介绍:可以替代SGD的一阶优化算法基于训练数据迭代的更新。

  • 函数定义

    keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=le-08)

  • 参数解释

    lr:学习率

    epsilon:大于或等于0的小浮点数,防止除0错误

2.3 如何使用优化器(optimizers)

优化器是编译 Keras 模型所需的两个参数之一:

model = Sequential()
model.add(Dense(20, 64, init='uniform'))
model.add(Activation('tanh'))
model.add(Activation('softmax'))

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd)

我们可以在将优化器传递给 model.compile() 之前初始化,正如上面代码所示,或者你可以直接通过名字调用。在后面的例子中,默认的优化器参数将会被使用。

# pass optimizer by name: default parameters will be used
model.compile(loss='mean_squared_error', optimizer='sgd')
  • 基类(base class):用来构建优化器的基类,不是实际可以用作训练的优化器。所有的优化器都继承自该类

    函数定义:keras.optimizers.Optimizer(参数)

    参数解释:clipnorm: float >= 0

03 总结

以上内容很少从数学公式方面论述,只是浅谈一下,详细内容后续更新。

说实话,有关导数这方面的知识很容易消减我学习AI的劲头,还是得花费时间去弥补我的这个弱项,不然AI安全进行不下去啊。唉,终究是逃不过高数啊!
【AI安全之对抗样本】深度学习基础知识(二)_第5张图片

你可能感兴趣的:(AI安全之对抗样本,人工智能,安全,深度学习)