背景
对一个多元函数 f(x) 求最小值,当无法准确求出其准确结果时,需要用到其导数。
根据泰勒公式,f(x) 在 xk 处展开二阶导:
f(x)≈f(xk)+∇xf′(xk)(x−xk)T+21(x−xk)T∇x2f′′(xk)(x−xk)
其中,一阶导梯度和二阶导 Hessian 矩阵如下:
gk=f′(xk)=(∂x1∂f(xk),∂x2∂f(xk),…,∂xn∂f(xk))Hk−1=f′′(xk)−1=⎝⎜⎜⎜⎛∂2x12∂2f(xk)⋮∂xn∂x1∂2f(xk)⋯∂xi∂xj∂2f(xk)⋯∂x1∂xn∂2f(xk)⋮∂2xn2∂2f(xk)⎠⎟⎟⎟⎞
1. 梯度下降法
梯度下降法只用到了一阶导,其思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以只要函数沿着负梯度的方向上迭代移动就可以找到最小值。
迭代公式如下:
θ=θ−η ⋅ ∇θJ(θ)
梯度下降法给出了函数下降的方向,沿着该方向可以找到最小值。
缺点:
1.1 随机梯度下降法
根据每一条训练样本更新参数:
θ=θ−η ⋅ ∇θJ(xi,yi;θ)
缺点:
- SGD以高方差频繁地更新,导致目标函数具有波动性。
优点:
- 计算速度快。
- 波动性使得SGD可以跳到新的和潜在更好的局部最优点。
1.2 小批量梯度下降法
每次使用一批数据进行梯度的计算,而非计算全部数据的梯度。
θ=θ−η ⋅ m1∇θJ(xi,yi;θ)
优点:
缺点:
- 梯度更新的方向完全依赖于当前的batch,因而其参数更新十分不稳定。
1.3 Momentum
SGD可能在局部最优点附近更新时发生震荡。在随机梯度下降法的基础上,保留上一轮参数更新的增量,同时利用当前batch的梯度微调最终的更新方向。
vt=γ ⋅ vt−1+η ⋅ ∇θJ(θ)θ=θ−vt
优点:
1.4 Nesterov
1.5 Adagrad
即adaptive gradient,是一种自适应学习率的梯度法。 上面提到的优化方法每次更新都使用了同一个学习率,而该算法记录并调整每次迭代过程中的前进方向和距离(梯度平方累加和),逐渐减小学习率。
梯度:g=m1∇θJ(xi,yi;θ)累计梯度平方和:r=r+g ⋅ g更新参数:θ=θ−δ+√rη ⋅ g
缺点:
- 梯度平方累加和是一直增大的,学习率是单调递减的,最后变小以至于最终变得无限小,在学习率无限小时,Adagrad算法将无法取得额外的信息。
优点:
1.5 Adadelta
Adadelta是Adagrad的扩展算法,用来处理Adagrad学习率单调递减的问题。与Adagrad优化算法不同的是它不是计算所有的梯度平方累加和,而是使用历史梯度平方累加的均值代替。
梯度:gk=m1∇θJ(xi,yi;θ)累计梯度平方期望:E[g2]k=ρE[g2]k−1+(1−ρ)gk2更新参数:θ=θ−δ+√rη ⋅ g
1.6 RMSProp
1.7 Adam
Adam算法与以上优化算法相比,区别还是比较大的,在参数更新的过程中,首先计算了有偏一阶矩和二阶矩,然后修正一阶矩和二阶矩的偏差,再用修正后的一阶和二阶矩求解参数更新量,最后利用参数更新量对参数进行更新。
梯度:gk=m1∇θJ(xi,yi;θ)一阶矩:sk=ρ1sk−1+(1−ρ1)gk二阶矩:rk=ρ2rk−1+(1−ρ2)gk⋅ gk修正一阶矩:s^=1−ρ1s修正二阶矩:t^=1−ρ2t更新参数:θ=θ−η ⋅ δ+√r^s^ ⋅ g
2. 牛顿法
牛顿法考虑了梯度和梯度的变化率,函数的二阶导为零可以对局部凸的函数找到极值,对不凹不凸的函数可能找到鞍点。
将泰勒二阶导展开式两边同时对 x 求导:
∇f(x)=∇f(xk)+∇2f(xk)(x−xk)
令函数的梯度为 0:
∇f(xk)+∇2f(xk)(x−xk)=0
可解得:
x=xk−Hk−1gk
迭代公式如下:
xk+1=xk−Hk−1gk
https://blog.csdn.net/google19890102/article/details/69942970