文章目录
00 前言
【我的AI安全之路】以下内容适合于有web安全基础但对AI"一无所知"的师傅们
如果是有安全基础,想入门AI安全,可以看下以web安全为背景介绍AI安全的书:《Web安全之机器学习入门》和《Web安全之深度学习实战》,以及一本关于对抗样本的书:《AI安全之对抗样本入门》
【补充】以下均基于深度学习主流框架之一keras为例
01 深度学习训练过程
深度学习训练全过程分为:正向传递和反向传递
正向传播的计算可能依赖于模型参数的当前值,而这些模型参数是在反向传播的梯度
反向传播的梯度计算可能依赖于各变量的当前值,而这些变量的当前值是通过正向传播计算得到的
参考:参考博客
02 优化器(optimizers)
学习优化器之前需要先了解一下梯度算法
【补充知识点】
导数,偏导数,方向导数,梯度,梯度下降等参考内容:导数、偏导数、方向导数、梯度、梯度下降、如何直观形象的理解方向导数与梯度以及它们之间的关系?、什么是全导数?
学习本篇需要理解的点:
偏导数连续才有梯度的存在
梯度的方向是方向导数中取到最大值的方向,梯度的值是方向导数的最大值
2.1 梯度算法
-
梯度
多元函数的指定点上升的坡度,假设多元函数可以表示为f(x,y),那么对应的梯度的定义为
-
梯度向上算法
在求函数的最大值时,向梯度向上的方向移动,使用加号(α表示学习率)
-
梯度下降算法
在求函数的最小值时,向梯度向下的方向移动,使用减号(α表示学习率)
-
代码示例
以 函数
f(x)=x*x+2
为例,其对应的梯度为
将学习率α设为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安全进行不下去啊。唉,终究是逃不过高数啊!