AI算法
一、优化器
1.SGD(Stochastic Gradient Descent)随机梯度下降
SGD的基本公式,其中 为要更新的参数,
为学习率,
为目标函数。
缺点:
- 选择合适的初始学习率很困难
- 学习率的调整策略受限于预先设定调整规则
- 相同的学习率被应用于各个参数
2.SGDM(SGD with Momentum)带动量的SGD
动量公式为前
次迭代的梯度加权和,其中
为衰减权重。从公式可以看出,参数更新时,不仅减去了当前迭代的梯度,也减去了之前的累计梯度。
相比SGD的优势:
- 参数更新可以保持之前的更新趋势,而不会卡在当前梯度的较小点
3.AdaGrad(Adaptive Gradient)自适应梯度
利用迭代次数和累计梯度,对学习率进行自动衰减。刚开始时学习率较大,可以快速收敛;后来则逐渐减小,精调参数。
和SGD的区别在于,学习率除以前 步的 梯度平方累积和的平方根 。频繁更新的梯度,则累积的分母项逐渐偏大,那么更新的步长(stepsize)相对就会变小,而稀疏的梯度,则导致累积的分母项中对应值比较小,那么更新的步长则相对比较大。
缺点:AdaGrad有个致命问题,就是没有考虑迭代衰减。极端情况,如果刚开始的梯度特别大,而后面的比较小,则学习率基本不会变化了,也就谈不上自适应学习率了。这个问题在RMSProp中得到了修正。
4.RMSProp()
在AdaGrad上加入了迭代衰减。
计算梯度平方的指数移动平均数(Exponential Moving Average),γ是遗忘因子(或称为指数衰减率),依据经验,默认设置为0.9。
梯度更新时候,与AdaGrad类似,只是更新的梯度平方的期望(指数移动均值),其中ε=10^-8,避免除数为0。默认学习率α=0.001。
优势:能够克服AdaGrad梯度急剧减小的问题,在很多应用中都展示出优秀的学习率自适应能力。尤其在不稳定(Non-Stationary)的目标函数下,比基本的SGD、Momentum、AdaGrad表现更良好。
5.Adam优化器
首先计算t时刻的梯度。
计算梯度的指数移动平均数,m0 初始化为0。类似于Momentum算法,综合考虑之前时间步的梯度动量。β1 系数为指数衰减率,控制权重分配(动量与当前梯度),通常取接近于1的值,默认为0.9。
其次,计算梯度平方的指数移动平均数,v0初始化为0。β2 系数为指数衰减率,控制之前的梯度平方的影响情况。类似于RMSProp算法,对梯度平方进行加权均值。默认为0.999
由于m0初始化为0,会导致mt偏向于0,尤其在训练初期阶段。所以,此处需要对梯度均值mt进行偏差纠正,降低偏差对训练初期的影响。
与m0 类似,因为v0初始化为0导致训练初始阶段vt偏向0,对其进行纠正。
最后,更新参数,初始的学习率α乘以梯度均值与梯度方差的平方根之比。其中默认学习率α=0.001,ε=10^-8,避免除数变为0。由表达式可以看出,对更新的步长计算,能够从梯度均值及梯度平方两个角度进行自适应地调节,而不是直接由当前梯度决定。
6.Adam变体
- 解耦权重衰减
在每次更新梯度时,同时对其进行衰减(衰减系数w略小于1),避免产生过大的参数。
在Adam优化过程中,增加参数权重衰减项。解耦学习率和权重衰减两个超参数,能单独调试优化两个参数。
- 修正指数移动均值AMSGrad
优点:
1、学习率可以随迭代次数单调递减,不会在某些迭代突然变大
2、去掉了没什么信息含量的梯度,也就是较小的梯度
二、激活函数
1.激活函数的用途(为什么需要激活函数?)
如果没有激活函数,每层节点的输出都是输入(上层输出)的线性函数,网络的逼近能力有限。因此引入非线性的函数作为激活函数,这样深层神经网络的表达能力就更加强大,几乎可以逼近任何函数。
2.Sigmoid函数
数学形式如下:
几何图像如下:
特点 :它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
缺点:
- 在梯度反向传播时容易导致梯度爆炸和 梯度消失 。Sigmoid函数的倒数如下图所示:
如果我们初始化神经网络的权值为[0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为(1,+∞)区间内的值,则会出现梯度爆炸情况。
- Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如果
,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。
- 其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
3.tanh函数
公式如下:
函数图像(左)和导函数图像(右):
解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
4.ReLU函数
公式如下:
函数图像(左)和导函数图像(右):
优点 :
解决了梯度消失问题(正区间)
计算速度快,只需要比较是否大于0
收敛速度远快于Sigmoid和tanh
注意:
输出不是0均值化的
Dead ReLU Problem。指的是某些神经元可能永远不会被激活,相应的参数也就永远不会被更新。原因有:(1)不幸的参数初始化;(2)学习率太高导致参数更新太大。可以使用AdaGrad等能自动调节学习率的算法来解决这个问题。
5.Leaky ReLU函数(PReLU)
函数表达式:
函数图像(左)和导函数的图像(右),α=0.01时左半边的图像很接近0但不是0。
人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为αx而非0,通常α=0.01。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。
6.ELU (Exponential Linear Units) 函数
函数表达式:
函数与导函数图像:
ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:
- 不会有Dead ReLU问题
- 输出均值接近于0
问题:计算开销大。