1.梯度下降法
1.1梯度
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)。
微积分中使用梯度表示函数增长最快的方向;因此,神经网络中使用负梯度来指示目标函数下降最快的方向,这样可以求得目标函数的最小值
1.2梯度下降法的直观解释
一个人站在初始点位置,怎么最快下山。由于不知道怎么走,只能走一步算一步。由于梯度的负方向是山最陡的方向,为了下的快,就要沿着最陡的方向走。因此每走一步,都计算当前位置最陡的方向,这样一直走直到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。当我们换一个初始点位置,这个山峰的低处可能和之前的不一样。
从上面的解释可以看出,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。
负梯度中的每一项可以认为传达了两个信息:
- 正负号在告诉输入向量应该调大还是调小(正调大,负调小)
- 每一项的相对大小表明每个参数对函数值达到最值的影响程度;
1.3梯度下降法算法
1). 先决条件: 确认优化模型和损失函数。
比如对于线性回归,假设函数表示为$h_ heta(x_1, x_2, ...x_n) = heta_0 + heta_{1}x_1 + ... + heta_{n}x_{n}$,添加一维特征$x_0 = 1$
变为$h_ heta(x_0, x_1, ...x_n) = sumlimits_{i=0}^{n} heta_{i}x_{i}$
损失函数为:$J( heta_0, heta_1..., heta_n) = frac{1}{2m}sumlimits_{j=0}^{m}(h_ heta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)^2$
2).初始化参数:在没有任何先验知识的时候,通常将所有的$ heta_i$初始化为0,步长初始化为1
3).梯度下降法:
一.确定当前位置的损失函数的梯度,对于$ heta_i$其梯度表达式如下:
$frac{partial}{partial heta_i}J( heta_0, heta_1..., heta_n)$
二.用步长乘以损失函数的梯度,得到当前位置下降的距离,$alphafrac{partial}{partial heta_i}J( heta_0, heta_1..., heta_n)$
三.确定是否所有的$ heta_i$的距离小于$varepsilon$,如果小于$varepsilon$则算法终止,否则进入步骤四($varepsilon$是自己设定的)
四.更新所有的$ heta_i$,更新表达式如下,更新完毕后继续执行步骤一
$ heta_i = heta_i - alphafrac{partial}{partial heta_i}J( heta_0, heta_1..., heta_n)$
1.4批量梯度下降法(Batch Gradient Descent)
求全部m条数据的梯度,$ heta_i $的表达式:$ heta_i = heta_i - alphasumlimits_{j=0}^{m}(h_ heta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}$
1.5随机梯度下降法(Stochastic Gradient Descent)
求一条数据的梯度,$ heta_i $的表达式:$ heta_i = heta_i - alpha (h_ heta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}$
使用一条数据的损失近似平均损失
随机梯度下降最大的缺点在于每次更新可能并不会按照正确的方向进行,因此可以带来优化波动(扰动)
1.6小批量梯度下降法(Mini-batch Gradient Descent)
小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个样本来迭代,1<x<m。一般可以取x=10,当然根据样本的数据,可以调整这个x的值。对应的更新公式是:$ heta_i = heta_i - alpha sumlimits_{j=t}^{t+x-1}(h_ heta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}$,其中t是每次取x个样本的起始位置
批大小对优化效果的影响:
较大的批可以使梯度估计更精确
较小的批可以使模型具有更好的泛化能力(对未知数据有更好的预测能力),原因是小的批使梯度估计不那么准确,产生了一些正则化效果;小批量需要小的学习率,同时需要更长的训练时间。
当批的大小为 2 的幂时能充分利用矩阵运算操作,所以批的大小一般取 32、64、128、256 等。
1.7梯度下降法存在的问题
梯度下降需要调整超参数α
梯度下降可能陷入局部极值点;除此之外,梯度下降还可能遇到“峡谷”和“鞍点”两种情况
- 峡谷类似一个带有坡度的狭长小道,左右两侧是“峭壁”;在峡谷中,准确的梯度方向应该沿着坡的方向向下,但粗糙的梯度估计使其稍有偏离就撞向两侧的峭壁,然后在两个峭壁间来回震荡。
- 鞍点的形状类似一个马鞍,一个方向两头翘,一个方向两头垂,而中间区域近似平地;一旦优化的过程中不慎落入鞍点,优化很可能就会停滞下来。
2.自适应学习率α算法
2.1AdaGard
AdaGard为不同参数自动选择不同学习率,偏导大,学习率大;偏导小,学习率小,因此适合稀疏数据学习。
$ heta_i $的表达式:$ heta_i = heta_i - {epsilon over delta + sqrt r} * g_{i-1}$
AdaGard存在的问题:
- 学习率是单调递减的,训练后期学习率过小会导致训练困难,甚至提前结束
- 需要设置一个全局的初始学习率
2.2RMSProp
RMSProp用来解决AdaGard学习率单调递减,到后期学习率过小训练困难。
它在累计平方梯度的时候使用指数加权的移动平均。$r_t = ho*r_{t-1} + (1- ho)g_i * g_i$
-
经验上,RMSProp 已被证明是一种有效且实用的深度神经网络优化算法。
-
RMSProp 依然需要设置一个全局学习率,同时又多了一个超参数(推荐了默认值)
- Hinton 建议,衰减lvρ推荐为0.1,学习率ε设为0.001
2.3AdaDelta
AdaDelta 和 RMSProp 都是为了解决 AdaGrad 对学习率过度衰减的问题而产生的。
AdaDelta 在一个窗口w
中对梯度进行求和,而不是对梯度一直累加
$RMS[g]_{t} = sqrt{E[g^2]_t + epsilon}$
$RMS[Delta x]_{t-1} = sqrt{E[Delta x^2]_{t-1} + epsilon}$
2.4Adam
Adam在RMSProp基础上,增加了一阶矩估计,增加了偏差修正。
偏差修正
注意到,s
和 r
需要初始化为 0
;且 ρ1
和 ρ2
推荐的初始值都很接近 1
(0.9
和 0.999
),这将导致在训练初期 s
和 r
都很小(偏向于 0),从而训练缓慢。因此,Adam 通过修正偏差来抵消这个倾向。
3.reference
梯度下降法:https://www.cnblogs.com/pinard/p/5970503.html
各种优化算法:http://ruder.io/optimizing-gradient-descent/
Momentum:http://www.cnblogs.com/jiaxblog/p/9695042.html
AdaDelta:https://blog.csdn.net/XiangJiaoJun_/article/details/83960136