学习总结
(1)adam和dropout是算法岗面试的常考题,下面的问题是源自斯坦福大学NLP的CS224n作业assignment3的2道题。深度学习的优化算法一般分为两类:1)调整学习率,使得优化更加稳定;2)梯度估计修正,优化训练速度。
(2)看adam论文中的伪代码(上图):
从while循环往下看,第一行是更新step,
第二行是计算梯度,
第三行计算一阶矩的估计,即mean均值
第四行计算二阶距的估计,即variance,和方差类似,都是二阶距的一种。
第五、六行则是对mean和var进行校正,因为mean和var的初始值为0,所以它们会向0偏置,这样处理后会减少这种偏置影响。
第七行是梯度下降。注意alpha后的梯度是用一阶距和二阶距估计的。
零、各类优化算法
0.1 框架梳理优化算法
各类深度学习的优化算法的演变过程:SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 这样的历程。
优化算法的框架:
首先定义:待优化的参数为w,目标函数为f(w),初始的学习速率为
α
\alpha
α,现在要开始迭代优化,在每个epoch t中:
- 计算目标函数关于当前参数的梯度: g t = ∇ f ( w t ) g_{t}=\nabla f\left(w_{t}\right) gt=∇f(wt)
- 根据历史梯度计算一阶动量和二阶动量: m t = ϕ ( g 1 , g 2 , ⋯ , g t ) ; V t = ψ ( g 1 , g 2 , ⋯ , g t ) m_{t}=\phi\left(g_{1}, g_{2}, \cdots, g_{t}\right) ; V_{t}=\psi\left(g_{1}, g_{2}, \cdots, g_{t}\right) mt=ϕ(g1,g2,⋯,gt);Vt=ψ(g1,g2,⋯,gt)
- 计算当前时刻的下降梯度: η t = α ⋅ m t / V t \eta_{t}=\alpha \cdot m_{t} / \sqrt{V_{t}} ηt=α⋅mt/Vt
- 根据梯度下降进行更新: w t + 1 = w t − η t w_{t+1}=w_{t}-\eta_{t} wt+1=wt−ηt
根据上面总结的优化算法框架,我们在来具体地回顾SGD、SGD with momentum、SGD with Nesterov acceleration、AdaGrad、AdaDelta / RMSPProp、Adam等等。
一、Adam
(1)回顾随机梯度下降SGD: θ ← θ − α ∇ θ J minibatch ( θ ) \boldsymbol{\theta} \leftarrow \boldsymbol{\theta}-\alpha \nabla_{\boldsymbol{\theta}} J_{\text {minibatch }}(\boldsymbol{\theta}) θ←θ−α∇θJminibatch (θ)
其中:
- θ \theta θ包含模型的所有的参数;
- J J J是损失函数,而 J minibatch ( θ ) J_{\text {minibatch }}(\boldsymbol{\theta}) Jminibatch (θ)是minibatch数据对应参数的损失函数。
- α \alpha α是学习速率
而adam的优化器,则是加了2个步骤:
1.1 步骤1
(1)首先是用了一个动量trick(使用m),即对梯度的滑动平均值 m ← β 1 m + ( 1 − β 1 ) ∇ θ J minibatch ( θ ) θ ← θ − α m \begin{aligned} \mathbf{m} & \leftarrow \beta_{1} \mathbf{m}+\left(1-\beta_{1}\right) \nabla_{\boldsymbol{\theta}} J_{\text {minibatch }}(\boldsymbol{\theta}) \\ \boldsymbol{\theta} & \leftarrow \boldsymbol{\theta}-\alpha \mathbf{m} \end{aligned} mθ←β1m+(1−β1)∇θJminibatch (θ)←θ−αm
其中: β 1 \beta_{1} β1是0-1之间值的超参数(一般设置为0.9)。
问:简要解释(不需要数学证明,给出大概解释)如何使用动量m阻止更新的变化,为啥这种低方差有利于学习。
答:动量m实际上是真实梯度的指数移动平均(exponential moving average,这里简称EMA),可以平滑一系列噪声梯度,防止更新变化频繁。当噪声梯度较大时,学习过程会在其中来回跳跃,导致较迟收敛。因此,低方差更新能助于找到局部最小值(local minima)。
1.2 步骤2
adam用自适应学习速率扩展动量概念,通过跟踪 v v v (梯度大小的滚动平均值)来扩展自适应学习速率的概念。 m ← β 1 m + ( 1 − β 1 ) ∇ θ J minibatch ( θ ) v ← β 2 v + ( 1 − β 2 ) ( ∇ θ J minibatch ( θ ) ⊙ ∇ θ J minibatch ( θ ) ) θ ← θ − α m / v \begin{aligned} \mathbf{m} & \leftarrow \beta_{1} \mathbf{m}+\left(1-\beta_{1}\right) \nabla_{\boldsymbol{\theta}} J_{\text {minibatch }}(\boldsymbol{\theta}) \\ \mathbf{v} & \leftarrow \beta_{2} \mathbf{v}+\left(1-\beta_{2}\right)\left(\nabla_{\boldsymbol{\theta}} J_{\text {minibatch }}(\boldsymbol{\theta}) \odot \nabla_{\boldsymbol{\theta}} J_{\text {minibatch }}(\boldsymbol{\theta})\right) \\ \boldsymbol{\theta} & \leftarrow \boldsymbol{\theta}-\alpha \mathbf{m} / \sqrt{\mathbf{v}} \end{aligned} mvθ←β1m+(1−β1)∇θJminibatch (θ)←β2v+(1−β2)(∇θJminibatch (θ)⊙∇θJminibatch (θ))←θ−αm/v
其中:
- ⊙ \odot ⊙ 和 / / / 分别是按照元素进行相乘和相除。
- β 2 \beta_{2} β2是0-1之间值的超参数(一般设置为0.99)。
问:adam加上 v \sqrt{\mathbf{v}} v后,哪些参数会得到更大的更新?为啥有助于学习呢?
答: v v v 实际上是指数移动平均(EMA)的梯度的elementwise square。 v \sqrt{\mathbf{v}} v可看作是EMA的绝对值或者是动量momentum m的magnitude。对 m m m进行标准化(即 m / v m/\sqrt{\mathbf{v}} m/v操作),使得大的数变小,小的数变大。这样能给模型参数,小梯度,更大的参数更新,从而能够更快的收敛。
二、Dropout
dropout是一种正则化技术,在训练过程中,dropout随机地将 h h h 隐藏层中的参数置为0(该动作的概率为 p drop p_{\text {drop }} pdrop ),然后用 h h h乘常数 γ \gamma γ: h d r o p = γ d ⊙ h \mathbf{h}_{\mathrm{drop}}=\gamma \mathbf{d} \odot \mathbf{h} hdrop=γd⊙h
其中:
- d ∈ { 0 , 1 } D h \mathbf{d} \in\{0,1\}^{D_{h}} d∈{0,1}Dh( D h D_h Dh是向量 h h h的size,即mask向量的shape和向量h相同)是一个掩码向量,有 p drop p_{\text {drop }} pdrop 的概率元素为0,有 1 − p drop 1-p_{\text {drop }} 1−pdrop 的概率元素为1。
-
γ
\gamma
γ的作用是是让
p
drop
p_{\text {drop }}
pdrop 的数学期望为h,即:
E p drop [ h drop ] i = h i \mathbb{E}_{p_{\text {drop }}}\left[\mathbf{h}_{\text {drop }}\right]_{i}=h_{i} Epdrop [hdrop ]i=hi其中: i ∈ { 1 , … , D h } i \in\left\{1, \ldots, D_{h}\right\} i∈{1,…,Dh}
2.1 问题1
问题1:
γ
\gamma
γ 和
p
drop
p_{\text {drop }}
pdrop 之间存在什么样的等式?简要证明。
答:
E
p
drop
[
h
drop
]
i
=
p
d
i
=
0
(
0
)
+
p
d
i
=
1
γ
h
i
=
(
1
−
p
drop
)
γ
h
i
=
h
i
.
E_{p_{\text {drop }}}\left[h_{\text {drop }}\right]_{i}=p_{d_{i}=0}(0)+p_{d_{i}=1} \gamma h_{i}=\left(1-p_{\text {drop }}\right) \gamma h_{i}=h_{i} .
Epdrop [hdrop ]i=pdi=0(0)+pdi=1γhi=(1−pdrop )γhi=hi.
因此:
γ
=
1
1
−
p
drop
\gamma=\frac{1}{1-p_{\text {drop }}}
γ=1−pdrop 1
2.2 问题2
问题2:为啥在训练时加入dropout,而在测试阶段不用加入dropout?
答:dropout是一种正则化技术。在训练过程中,模型参数在不退出的情况下容易对某些特征进行过拟合,且相邻参数之间存在高度依赖性。在这种情况下,模型是脆弱和过度拟合的,不能处理分布外的未见数据。Dropout可以在训练过程中通过消零梯度来随机切断参数(权重)之间的连接。因此,dropout可以降低参数之间的依赖程度,使训练后的模型具有更好的鲁棒性和泛化能力。在评估过程中,我们需要参数和一致输出之间的所有连接,所以不需要使用dropout。
Reference
(1)Dropout的理解:https://zhuanlan.zhihu.com/p/409517373
(2)https://blog.csdn.net/weixin_42017042/article/details/104529455
(3)https://segmentfault.com/a/1190000012668819
(4)一个框架看懂优化算法之异同 SGD/AdaGrad/Adam