1. Mini-batch decent方法

1.1. Batch vs. mini-batch

Batch:利用矢量化编程的方法,对整个训练集运用梯度下降法。梯度每下降一小步,都要处理整个训练集。这样的效率比较慢。
Mini-batch:将训练集拆分为更小的训练集,成为小批量训练集(mini-batch)
Mini-batch t: X{t},Y{t} X { t } , Y { t } <script type="math/tex" id="MathJax-Element-15">X^{\{t\}},Y^{\{t\}}</script>
对每个mini-batch都进行一次完整的前向和反向传播过程,当对所有的mini-batch都进行了前向和反向过程后,我们称完成了对训练集的一次遍历(epoch)。
Batch gradient descent,原则上cost应该是单调下降(除非learning rate太大了);Mini-batch gradient descent,整体趋势下降,但是局部是振荡的。

1.2. Choosing mini-batch size

  • 如果mini-batch size=m: 等价于batch gradient descent,一般可以收敛到全局最小值点;
  • 如果mini-batch size=1:等价于stochastic gradient descent,不一定收敛到全局最小值点,一般会在该点处振荡。
    如果训练集较小(<2000),就使用batch gradient descent;否则,可以选择64到512之间(2的幂数)的mini-batch size。确保可以放入CPU/GPU的内存中

2. 指数加权平均方法(exponentially weighted averages)


图2.1 指数加权平均例子-寻找温度趋势

v0v1v2v3⋮=0=0.9v0+0.1θ1=0.9v1+0.1θ2=0.9v2+0.1θ3(2-1) (2-1) v 0 = 0 v 1 = 0.9 v 0 + 0.1 θ 1 v 2 = 0.9 v 1 + 0.1 θ 2 v 3 = 0.9 v 2 + 0.1 θ 3 ⋮
<script type="math/tex; mode=display" id="MathJax-Element-16"> \begin{align*} v_0&=0\\ v_1&=0.9v_0+0.1\theta_1\\ v_2&=0.9v_1+0.1\theta_2\\ v_3&=0.9v_2+0.1\theta_3\\ \vdots\\ \tag{2-1} \end{align*} </script>
第t天的指数平均值的通项公式:
vt=βvt−1+(1−β)θt=(1−β)(θt+βθt−1+⋯+βkθt−k+⋯+βt−1θ1)(2-2) (2-2) v t = β v t − 1 + ( 1 − β ) θ t = ( 1 − β ) ( θ t + β θ t − 1 + ⋯ + β k θ t − k + ⋯ + β t − 1 θ 1 )
<script type="math/tex; mode=display" id="MathJax-Element-17"> \begin{align*} v_t&=\beta v_{t-1}+(1-\beta)\theta_t \\ &=(1-\beta)\left(\theta_t+\beta\theta_{t-1}+\cdots+\beta^{k}\theta_{t-k}+\cdots+\beta^{t-1}\theta_{1}\right) \\ \tag{2-2} \end{align*} </script>
近似公式:
vt≈11−β days′ temperature(2-3) (2-3) v t ≈ 1 1 − β   d a y s ′   t e m p e r a t u r e
<script type="math/tex; mode=display" id="MathJax-Element-18"> v_t\approx \frac{1}{1-\beta}\ days'\ temperature\tag{2-3} </script>
如图2.2所示,当 β β <script type="math/tex" id="MathJax-Element-19">\beta</script>增大时,曲线向右平移(绿线); β β <script type="math/tex" id="MathJax-Element-20">\beta</script>减小时,曲线振荡加剧(黄线),

图2.2 β大小对曲线形状的影响

2.1. Bias Correction(偏差修正)

原因: v0=0 v 0 = 0 <script type="math/tex" id="MathJax-Element-21">v_0=0</script>导致初始阶段的点估计不准
解决方法:用 vt1−βt v t 1 − β t <script type="math/tex" id="MathJax-Element-22">\frac{v_t}{1-\beta^t}</script>代替 vt v t <script type="math/tex" id="MathJax-Element-23">v_t</script>

3. Gradient descent with momentum(动量梯度下降)

背景问题:当目标函数的等高线为图3.1所示时,梯度下降的过程中可能会发生振荡:


图3.1 梯度下降振荡的例子>

Momentum:
On iteration t:
  Compute dw,db d w , d b <script type="math/tex" id="MathJax-Element-24">dw,db</script> on current mini-batch.
vdwvdbwb=βvdw+(1−β)dw=βvdb+(1−β)db:=w−αvdw;:=b−αvdb(3-1) (3-1) v d w = β v d w + ( 1 − β ) d w v d b = β v d b + ( 1 − β ) d b w := w − α v d w ; b := b − α v d b
<script type="math/tex; mode=display" id="MathJax-Element-25"> \begin{align*} v_{dw}&=\beta v_{dw}+(1-\beta)dw \\ v_{db}&=\beta v_{db}+(1-\beta)db \\ w&:=w-\alpha v_{dw};\\ b&:=b-\alpha v_{db}\\ \tag{3-1} \end{align*} </script>
采用前面提到的指数加权平均可以使梯度的下降过程更平滑。
一般 β β <script type="math/tex" id="MathJax-Element-26">\beta</script>取0.9就好,而且实际中一般不用修正偏差,因为迭代几步后偏差就自动减小很多了。

4. RMSprop(Root Mean Square prop,均方根传递)

On iteration t:
  Compute dw,db d w , d b <script type="math/tex" id="MathJax-Element-27">dw,db</script> on current mini-batch.

sdwsdbwb=βsdw+(1−β)dw2=βsdb+(1−β)db2:=w−αdwsdw−−−√;:=b−αdbsdb−−−√(4-1) (4-1) s d w = β s d w + ( 1 − β ) d w 2 s d b = β s d b + ( 1 − β ) d b 2 w := w − α d w s d w ; b := b − α d b s d b
<script type="math/tex; mode=display" id="MathJax-Element-28"> \begin{align*} s_{dw}&=\beta s_{dw}+(1-\beta)dw^2 \\ s_{db}&=\beta s_{db}+(1-\beta)db^2 \\ w&:=w-\alpha \frac{dw}{\sqrt{ s_{dw}}};\\ b&:=b-\alpha \frac{db}{\sqrt{ s_{db}}}\\ \tag{4-1} \end{align*} </script>
垂直方向除以一个较大的数,水平方向除以一个较小的数(假设b是垂直方向,w是水平方向)。为了防止分母出现零的情况,可以在分母加上一个小的 ϵ ϵ <script type="math/tex" id="MathJax-Element-29">\epsilon</script>

5. Adam优化算法

Adam的本质是将动量和RMSprop结合起来。
vdw=0,sdw=0.vdb=0,sdb=0. v d w = 0 , s d w = 0. v d b = 0 , s d b = 0. <script type="math/tex" id="MathJax-Element-30">v_{dw}=0,s_{dw}=0.v_{db}=0,s_{db}=0.</script>
On iteration t:
  Compute dw,db d w , d b <script type="math/tex" id="MathJax-Element-31">dw,db</script> on current mini-batch.

vdwvdbsdwsdbVcorrecteddwScorrecteddwwb=β1vdw+(1−β1)dw=β1vdb+(1−β1)db=β2sdw+(1−β2)dw2=β2sdb+(1−β2)db2=vdw/(1−βt1),Vcorrecteddb=vdb/(1−βt1)=sdw/(1−βt2),Scorrecteddb=sdb/(1−βt2):=w−αVcorrecteddwScorrecteddw−−−−−−−√;:=b−αVcorrecteddbScorrecteddb−−−−−−−√(5-1) (5-1) v d w = β 1 v d w + ( 1 − β 1 ) d w v d b = β 1 v d b + ( 1 − β 1 ) d b s d w = β 2 s d w + ( 1 − β 2 ) d w 2 s d b = β 2 s d b + ( 1 − β 2 ) d b 2 V d w c o r r e c t e d = v d w / ( 1 − β 1 t ) , V d b c o r r e c t e d = v d b / ( 1 − β 1 t ) S d w c o r r e c t e d = s d w / ( 1 − β 2 t ) , S d b c o r r e c t e d = s d b / ( 1 − β 2 t ) w := w − α V d w c o r r e c t e d S d w c o r r e c t e d ; b := b − α V d b c o r r e c t e d S d b c o r r e c t e d
<script type="math/tex; mode=display" id="MathJax-Element-32"> \begin{align*} v_{dw}&=\beta_1 v_{dw}+(1-\beta_1)dw \\ v_{db}&=\beta_1 v_{db}+(1-\beta_1)db \\ s_{dw}&=\beta_2 s_{dw}+(1-\beta_2)dw^2 \\ s_{db}&=\beta_2 s_{db}+(1-\beta_2)db^2 \\ V_{dw}^{corrected}&=v_{dw}/\left(1-\beta_1^t\right),V_{db}^{corrected}=v_{db}/\left(1-\beta_1^t\right)\\ S_{dw}^{corrected}&=s_{dw}/\left(1-\beta_2^t\right),S_{db}^{corrected}=s_{db}/\left(1-\beta_2^t\right)\\ w&:=w-\alpha \frac{V_{dw}^{corrected}}{\sqrt{ S_{dw}^{corrected}}};\\ b&:=b-\alpha \frac{V_{db}^{corrected}}{\sqrt{ S_{db}^{corrected}}}\\ \tag{5-1} \end{align*} </script>
超参数:
α α <script type="math/tex" id="MathJax-Element-33">\alpha</script>:人工调整
β1:0.9 β 1 : 0.9 <script type="math/tex" id="MathJax-Element-34">\beta_1:0.9</script>, (dw) ( d w ) <script type="math/tex" id="MathJax-Element-35">(dw)</script>
β2:0.999 β 2 : 0.999 <script type="math/tex" id="MathJax-Element-36">\beta_2:0.999</script>, (dw2) ( d w 2 ) <script type="math/tex" id="MathJax-Element-37">(dw^2)</script>
ϵ ϵ <script type="math/tex" id="MathJax-Element-38">\epsilon</script>: 10−8 10 − 8 <script type="math/tex" id="MathJax-Element-39">10^{-8}</script>

6. 学习率衰减(learning rate decay)


图6.1 固定学习率导致不能完全收敛的示意图

解决方法:让学习率 α α <script type="math/tex" id="MathJax-Element-40">\alpha</script>逐渐下降。
下降的形式:
- α=11+decay−rate ∗ epoch−num α = 1 1 + d e c a y − r a t e   ∗   e p o c h − n u m <script type="math/tex" id="MathJax-Element-41">\alpha=\frac{1}{1+decay-rate\ *\ epoch-num}</script>
- α=0.95epoch−num⋅α0 α = 0.95 e p o c h − n u m ⋅ α 0 <script type="math/tex" id="MathJax-Element-42">\alpha=0.95^{epoch-num}\cdot\alpha_0</script>
- α=ke√poch−numα0 α = k e p o c h − n u m α 0 <script type="math/tex" id="MathJax-Element-43">\alpha=\frac{k}{\sqrt epoch-num}\alpha_0</script>
- …

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐