▽ f = ( ∂ f ∂ x , ∂ f ∂ y , ∂ f ∂ z ) \triangledown f=(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y},\frac{\partial f}{\partial z}) ▽f=(∂x∂f,∂y∂f,∂z∂f)
θ 1 = θ 0 − α ▽ J ( θ 0 ) \theta_{1}=\theta_{0}-\alpha \triangledown J(\theta_{0}) θ1=θ0−α▽J(θ0)
其中, θ 1 \theta_{1} θ1和 θ 1 \theta_{1} θ1表示位置始末, α \alpha α表示步长或者说学习率, J ( θ ) J(\theta) J(θ)表示 θ \theta θ的一个函数
算法实际步骤:
代码实现:
θ t + 1 = θ t − α ▽ J t ( θ ) \theta_{t+1}=\theta_{t}-\alpha \triangledown J_{t}(\theta) θt+1=θt−α▽Jt(θ)
假如以MSE作为损失函数,有
y i ^ = ∑ j = 0 m w j x i , j ( w 0 = b , x i , 0 = 1 ) J ( w ) = 1 2 n ∑ i = 1 n ( y i ^ − y i ) 2 ▽ J ( w j ) = ∂ J ( w ) ∂ w j = 1 n ∑ i = 1 n ( y i ^ − y i ) x i , j w j , t + 1 = w j , t − α ▽ J t ( w j ) , t = 1 , 2 , . . . \hat{y_{i}}=\sum_{j=0}^{m} w_{j} x_{i,j} (w_{0}=b, x_{i,0}=1)\\ J(w)= \frac {1} {2n} \sum_{i=1}^{n} ( \hat{y_{i}} -y_{i})^{2}\\ \triangledown J(w_{j})=\frac{\partial J(w)}{\partial w_{j}}=\frac{1}{n} \sum_{i=1}^{n} ( \hat{y_{i}} -y_{i})x_{i,j}\\ w_{j,t+1}=w_{j,t}-\alpha \triangledown J_{t}(w_{j}),t=1,2,... yi^=j=0∑mwjxi,j(w0=b,xi,0=1)J(w)=2n1i=1∑n(yi^−yi)2▽J(wj)=∂wj∂J(w)=n1i=1∑n(yi^−yi)xi,jwj,t+1=wj,t−α▽Jt(wj),t=1,2,...
其中,j为数据的特征数,m为特征总数,i为数据的样本数,n为样本总数,t为迭代次数epoch, y i ^ \hat{y_{i}} yi^为预测值, y i y_{i} yi为实际值, J ( w ) J(w) J(w)为代价函数
(1)优点:下降方向为总体平均梯度,得到全局最优解
(2)缺点:需要计算整个数据样本集,速度会比较慢
(3)特点:
每次更新使用k个样本,一定程度的反应样本的分布情况
θ t + 1 = θ t − α k ∑ i = k ( t − 1 ) + 1 k t ▽ J i , t ( θ ) \theta_{t+1}=\theta_{t}-\frac{\alpha}{k} \sum_{i=k(t-1)+1}^{kt} \triangledown J_{i,t}(\theta) θt+1=θt−kαi=k(t−1)+1∑kt▽Ji,t(θ)
假如以MSE作为损失函数,有
y i ^ = ∑ j = 0 m w j x i , j ( w 0 = b , x i , 0 = 1 ) J i ( w ) = 1 2 ( y i ^ − y i ) 2 ▽ J i ( w j ) = ∂ J i ( w ) ∂ w j = ( y i ^ − y i ) x i , j w j , t + 1 = w j , t − α k ∑ i = k ( t − 1 ) + 1 k t ▽ J i , t ( w j ) , t = 1 , 2 , 3 , . . . , [ n k ] \hat{y_{i}}=\sum_{j=0}^{m} w_{j} x_{i,j} (w_{0}=b, x_{i,0}=1)\\ J_{i}(w)= \frac {1} {2} ( \hat{y_{i}} -y_{i})^{2}\\ \triangledown J_{i}(w_{j})=\frac{\partial J_{i}(w)}{\partial w_{j}}=( \hat{y_{i}} -y_{i})x_{i,j}\\ w_{j,t+1}=w_{j,t}- \frac{\alpha}{k} \sum_{i=k(t-1)+1}^{kt}\triangledown J_{i,t}(w_{j}),t=1,2,3,...,[\frac{n}{k}] yi^=j=0∑mwjxi,j(w0=b,xi,0=1)Ji(w)=21(yi^−yi)2▽Ji(wj)=∂wj∂Ji(w)=(yi^−yi)xi,jwj,t+1=wj,t−kαi=k(t−1)+1∑kt▽Ji,t(wj),t=1,2,3,...,[kn]
其中,j为数据的特征数,m为特征总数,i为数据的样本数,n为样本总数,t为迭代次数epoch,k为批样本数量batch size, y i ^ \hat{y_{i}} yi^为预测值, y i y_{i} yi为实际值, J i ( w ) J_{i}(w) Ji(w)为损失函数
(1)优点:保证了训练速度,又能保证最后收敛的准确度
(2)缺点:选择合适的学习率比较困难
每次迭代更新参数,只使用一个随机样本p
θ t + 1 = θ t − α ▽ J i = p , t ( θ ) , p ∈ [ 1 , 2 , . . . , n ] \theta_{t+1}=\theta_{t}-\alpha \triangledown J_{i=p,t}(\theta),p \in [1,2,...,n] θt+1=θt−α▽Ji=p,t(θ),p∈[1,2,...,n]
假如以MSE作为损失函数,有
y i ^ = ∑ j = 0 m w j x i , j ( w 0 = b , x i , 0 = 1 ) J i ( w ) = 1 2 ( y i ^ − y i ) 2 ▽ J i ( w j ) = ∂ J i ( w ) ∂ w j = ( y i ^ − y i ) x i , j w j , t + 1 = w j , t − α ▽ J i = p , t ( w j ) , 其 中 p ∈ [ 1 , 2 , . . . , n ] , t = 1 , 2 , . . . \hat{y_{i}}=\sum_{j=0}^{m} w_{j} x_{i,j} (w_{0}=b, x_{i,0}=1)\\ J_{i}(w)= \frac {1} {2} ( \hat{y_{i}} -y_{i})^{2}\\ \triangledown J_{i}(w_{j})=\frac{\partial J_{i}(w)}{\partial w_{j}}=( \hat{y_{i}} -y_{i})x_{i,j}\\ w_{j,t+1}=w_{j,t}- \alpha \triangledown J_{i=p,t}(w_{j}),其中p \in [1,2,...,n],t=1,2,... yi^=j=0∑mwjxi,j(w0=b,xi,0=1)Ji(w)=21(yi^−yi)2▽Ji(wj)=∂wj∂Ji(w)=(yi^−yi)xi,jwj,t+1=wj,t−α▽Ji=p,t(wj),其中p∈[1,2,...,n],t=1,2,...
其中,j为数据的特征数,m为特征总数,i为数据的样本数,n为样本总数,t为迭代次数epoch,p为随机样本次序, y i ^ \hat{y_{i}} yi^为预测值, y i y_{i} yi为实际值, J i ( w ) J_{i}(w) Ji(w)为损失函数
(1)优点:仅需要计算一个样本的梯度,训练速度很快
(2)缺点:容易从一个局部最优跳到另一个局部最优,准确度下降
(3)特点:
假如以MSE作为损失函数,只使用一个随机样本p更新梯度,有
y i , t ^ = ∑ j = 0 m w j , t x i , j ( w 0 = b , x i , 0 = 1 ) J i , t ( w ) = 1 2 ( y i , t ^ − y i ) 2 ▽ J i , t ( w j ) = ∂ J i , t ( w ) ∂ w j = ( y i , t ^ − y i ) x i , j 初 始 化 : ▽ J i , t = 1 ( w j ) = ( ∑ j = 0 m w j , t = 1 x i , j − y i ) x i , j w j , t + 1 = w j , t − α n [ ▽ J i = p , t ( w j ) + ∑ i = 1 n ▽ J i ≠ p , t − 1 ( w j ) ] 其 中 p ∈ [ 1 , 2 , . . . , n ] , t = 1 , 2 , . . . \hat{y_{i,t}}=\sum_{j=0}^{m} w_{j,t} x_{i,j} (w_{0}=b, x_{i,0}=1)\\ J_{i,t}(w)= \frac {1} {2} ( \hat{y_{i,t}} -y_{i})^{2}\\ \triangledown J_{i,t}(w_{j})=\frac{\partial J_{i,t}(w)}{\partial w_{j}}=( \hat{y_{i,t}} -y_{i})x_{i,j}\\ 初始化:\triangledown J_{i,t=1}(w_{j})=(\sum_{j=0}^{m} w_{j,t=1} x_{i,j}-y_{i})x_{i,j}\\ w_{j,t+1}=w_{j,t}- \frac{\alpha}{n} [\triangledown J_{i=p,t}(w_{j})+\sum_{i=1}^{n}\triangledown J_{i\neq p,t-1}(w_{j})]\\ 其中p \in [1,2,...,n],t=1,2,... yi,t^=j=0∑mwj,txi,j(w0=b,xi,0=1)Ji,t(w)=21(yi,t^−yi)2▽Ji,t(wj)=∂wj∂Ji,t(w)=(yi,t^−yi)xi,j初始化:▽Ji,t=1(wj)=(j=0∑mwj,t=1xi,j−yi)xi,jwj,t+1=wj,t−nα[▽Ji=p,t(wj)+i=1∑n▽Ji=p,t−1(wj)]其中p∈[1,2,...,n],t=1,2,...
其中,j为数据的特征数,m为特征总数,i为数据的样本数,n为样本总数,t为迭代次数epoch,k为批样本数量batch size, y i ^ \hat{y_{i}} yi^为预测值, y i y_{i} yi为实际值, J i ( w ) J_{i}(w) Ji(w)为损失函数
在SGD方法中,虽然避开了运算成本大的问题,但对于大数据训练而言,SGD效果常不尽如人意,因为每一轮梯度更新都完全与上一轮的数据和梯度无关。随机平均梯度算法克服了这个问题,在内存中为每一个样本都维护一个旧的梯度,随机选择第p个样本来更新此样本的梯度,其他样本的梯度保持不变,然后求得所有梯度的平均值,进而更新了参数。
V t = β V t − 1 + ( 1 − β ) θ t V_{t}=\beta V_{t-1}+(1-\beta)\theta _{t} Vt=βVt−1+(1−β)θt
V t = 1 1 − β t [ β V t − 1 + ( 1 − β ) θ t ] ( V 0 = 0 ) V_{t}=\frac{1}{1-\beta ^{t}}[\beta V_{t-1}+(1-\beta)\theta _{t}]\\ (V_{0}=0) Vt=1−βt1[βVt−1+(1−β)θt](V0=0)
主要是对前期数据进行修正,当 t → ∞ t\to \infty t→∞时, β t → 0 \beta ^{t}\to0 βt→0,即对后期数据影响不大
引入物理学中的动量思想,加速梯度下降,梯度下降在不变的维度上,参数更新变快,梯度有所改变时,更新参数变慢,这样就能够加快收敛并且减少动荡
参数更新时在一定程度上保留之前更新的方向
v t + 1 = β v t + α ▽ J ( θ t ) θ t + 1 = θ t − v t + 1 v_{t+1}=\beta v_{t}+\alpha \triangledown J(\theta_{t})\\ \theta_{t+1}=\theta_{t}-v_{t+1} vt+1=βvt+α▽J(θt)θt+1=θt−vt+1
(1)特点:
momentum的改进,在梯度更新时做一个矫正,具体做法就是在当前的梯度J上添加上一时刻的动量
v t + 1 = β v t − α ▽ J ( θ t + β v t ) θ t + 1 = θ t + v t + 1 v_{t+1}=\beta v_{t}-\alpha \triangledown J(\theta_{t}+ \beta v_{t})\\ \theta_{t+1}=\theta_{t}+v_{t+1} vt+1=βvt−α▽J(θt+βvt)θt+1=θt+vt+1
缺点:
这个算法会导致运行速度巨慢无比,比momentum要慢两倍,因此在实际实现过程中几乎没人直接用这个算法,而都是采用了变形版本。
推导过程:
设 θ t ′ = θ t + β v t \theta'_{t}=\theta_{t}+ \beta v_{t} θt′=θt+βvt,得
θ t + 1 = θ t + β v t − α ▽ J ( θ t + β v t ) \theta_{t+1}=\theta_{t}+\beta v_{t}-\alpha \triangledown J(\theta_{t}+ \beta v_{t}) θt+1=θt+βvt−α▽J(θt+βvt)
⇒ θ t + 1 ′ − β v t + 1 = θ t ′ − α ▽ J ( θ t ′ ) \Rightarrow\theta'_{t+1}-\beta v_{t+1}=\theta'_{t}-\alpha \triangledown J(\theta'_{t}) ⇒θt+1′−βvt+1=θt′−α▽J(θt′)
⇒ θ t + 1 ′ = θ t ′ + β [ β v t − α ▽ J ( θ t + β v t ) ] − α ▽ J ( θ t ′ ) \Rightarrow\theta'_{t+1}=\theta'_{t}+\beta[\beta v_{t}-\alpha \triangledown J(\theta_{t}+ \beta v_{t})]-\alpha \triangledown J(\theta'_{t}) ⇒θt+1′=θt′+β[βvt−α▽J(θt+βvt)]−α▽J(θt′)
⇒ θ t + 1 ′ = θ t ′ + β 2 v t − α ( 1 + β ) ▽ J ( θ t ′ ) \Rightarrow\theta'_{t+1}=\theta'_{t}+\beta^{2}v_{t}-\alpha(1+\beta) \triangledown J(\theta'_{t}) ⇒θt+1′=θt′+β2vt−α(1+β)▽J(θt′)
⇒ θ t + 1 = θ t + β 2 v t − α ( 1 + β ) ▽ J ( θ t ) \Rightarrow\theta_{t+1}=\theta_{t}+\beta^{2}v_{t}-\alpha(1+\beta) \triangledown J(\theta_{t}) ⇒θt+1=θt+β2vt−α(1+β)▽J(θt)
变形版本:
v t + 1 = β 2 v t − α ( 1 + β ) ▽ J ( θ t ) θ t + 1 = θ t + v t + 1 v_{t+1}=\beta^{2}v_{t}-\alpha(1+\beta) \triangledown J(\theta_{t})\\ \theta_{t+1}=\theta_{t}+v_{t+1} vt+1=β2vt−α(1+β)▽J(θt)θt+1=θt+vt+1
Momentum:(蓝色)先更新梯度,然后在原来动量方向迈一大步
NAG:(绿色)先在原来动量方向(棕)迈一大步,然后算梯度(红),得到矫正之后的绿色线
Adadelta的一个特例,当ρ=0.5时,E就变为了求梯度平方和的平均数;如果再求根,就变成了RMS(均方根)
(1)特点:·RMSprop算是AdaGrad的一种发展,Adadelta的变体,效果趋于二者之间·适合处理非平稳目标,对RNN效果很好
g t = ▽ J ( θ t ) G t = G t − 1 + g t 2 θ t + 1 = θ t − α G t + ε g t g_{t}=\triangledown J(\theta_{t})\\ G_{t}=G_{t-1}+g_{t}^{2}\\ \theta_{t+1}=\theta_{t}-\frac{\alpha}{\sqrt{G_{t}+\varepsilon}} g_{t} gt=▽J(θt)Gt=Gt−1+gt2θt+1=θt−Gt+εαgt
其中 α \alpha α为学习率,一般取 0.01 0.01 0.01; ε \varepsilon ε是为了防止分母为0,一般取 1 0 − 7 10^{-7} 10−7
(1)优点:前期在参数空间更为平缓的方向,会取得更大的进步;对于梯度较大的参数,学习率会变得较小。而对于梯度较小的参数,则效果相反。这样就可以使得参数在平缓的地方下降的稍微快些,不至于徘徊不前。
(2)缺点:使得学习率过早,过量地减少;由于是累积梯度的平方,后期会导致梯度消失
AdaGrad的一个扩展
初 始 化 : E ( g 2 ) t = 0 = 0 , E ( h 2 ) t = 0 = 0 g t = ▽ J ( θ t ) E ( g 2 ) t = β E ( g 2 ) t − 1 + ( 1 − β ) g t 2 h t = E ( h 2 ) t − 1 + ε E ( g 2 ) t + ε g t E ( h 2 ) t = β E ( h 2 ) t − 1 + ( 1 − β ) h t 2 θ t + 1 = θ t − h t 初始化:E(g^{2})_{t=0}=0,E(h^{2})_{t=0}=0\\ g_{t}=\triangledown J(\theta_{t})\\ E(g^{2})_{t}=\beta E(g^{2})_{t-1}+(1-\beta) g_{t}^{2}\\ h_{t}= \frac {\sqrt {E(h^{2})_{t-1}+\varepsilon} }{\sqrt{E(g^{2})_{t}+\varepsilon }} g_{t}\\ E(h^{2})_{t}=\beta E(h^{2})_{t-1}+(1-\beta) h_{t}^{2}\\ \theta_{t+1}=\theta_{t}-h_{t} 初始化:E(g2)t=0=0,E(h2)t=0=0gt=▽J(θt)E(g2)t=βE(g2)t−1+(1−β)gt2ht=E(g2)t+εE(h2)t−1+εgtE(h2)t=βE(h2)t−1+(1−β)ht2θt+1=θt−ht
其中 ε \varepsilon ε是为了防止分母为0,一般取 1 0 − 6 10^{-6} 10−6
(1)特点:
初 始 化 : m 0 = 0 , v 0 = 0 g t = ▽ J ( θ t ) m t = 1 1 − β 1 t [ β 1 m t − 1 + ( 1 − β 1 ) g t ] v t = 1 1 − β 2 t [ β 2 v t − 1 + ( 1 − β 2 ) g t 2 ] θ t + 1 = θ t − α v t + ε m t 初始化:m_{0}=0,v_{0}=0\\ g_{t}=\triangledown J(\theta_{t})\\ m_{t}=\frac{1}{1-\beta_{1} ^{t}}[\beta_{1} m_{t-1}+(1-\beta_{1})g_{t}]\\ v_{t}=\frac{1}{1-\beta_{2} ^{t}}[\beta_{2} v_{t-1}+(1-\beta_{2})g_{t}^{2}]\\ \theta_{t+1}=\theta_{t}-\frac{\alpha}{\sqrt{v_{t}}+\varepsilon} m_{t} 初始化:m0=0,v0=0gt=▽J(θt)mt=1−β1t1[β1mt−1+(1−β1)gt]vt=1−β2t1[β2vt−1+(1−β2)gt2]θt+1=θt−vt+εαmt
其中 α \alpha α为学习率,一般取 0.001 0.001 0.001; β 1 \beta_{1} β1和 β 2 \beta_{2} β2为平滑常数或衰减速率,一般分别取 0.9 0.9 0.9和 0.999 0.999 0.999, ε \varepsilon ε是为了防止分母为0,一般取 1 0 − 8 10^{-8} 10−8
(1)说明:
(2)特点:
Adam加入学习率上限
Adam加入权重衰减
Adam中引入Nesterov加速效果
针对稀疏(sparse)张量的Adam
算法 | 优点 | 缺点 | 适用情况 |
---|---|---|---|
批量梯度下降 | 目标函数为凸函数时,可以找到全局最优值 | 收敛速度慢,需要用到全部数据,内存消耗大 | 不适用于大数据集,不能在线更新模型 |
随机梯度下降 | 避免冗余数据的干扰,收敛速度加快,能够在线学习 | 更新值的方差较大,收敛过程会产生波动,可能落入极小值,选择合适的学习率比较困难 | 适用于需要在线更新的模型,适用于大规模训练样本情况 |
小批量梯度下降 | 降低更新值的方差,收敛较为稳定 | 选择合适的学习率比较困难 | |
Momentum | 能够在相关方向加速SGD,抑制振荡,从而加快收敛 | 需要人工设定学习率 | 适用于有可靠的初始化参数 |
Nesterov | 梯度在大的跳跃后,进行计算对当前梯度进行校正 | 需要人工设定学习率 | |
Adagrad | 不需要对每个学习率手工地调节 | 仍依赖于人工设置一个全局学习率,学习率设置过大,对梯度的调节太大,中后期,梯度接近于0,使得训练提前结束 | 需要快速收敛,训练复杂网络时:适合处理稀疏梯度 |
Adadelta | 不需要预设一个默认学习率,训练初中期,加速效果不错,很快,可以避免参数更新时两边单位不统一的问题 | 训练后期,反复在局部最小值附近抖动 | 需要快速收敛,训练复杂网络时 |
RMSprop | 解决Adagrad激进的学习率缩减问题 | 依然依赖于全局学习率 | 需要快速收敛,训练复杂网络时;适合处理非平稳目标-对于RNN效果很好 |
Adam | 对内存需求较小,为不同的参数计算不同的自适应学习率 | 需要快速收敛,训练复杂网络时;善于处理稀疏梯度和处理非平稳目标的优点,也适用于大多非凸优化-适用于大数据集和高维空间 |
以上未完待更新,仅供个人学习,侵权联系删除,如有错误或不足之处可指出,以便改进。