神经网络优化:指数衰减计算平均值(滑动平均)
Polyak平均會(huì)平均優(yōu)化算法在參數(shù)空間訪問(wèn)中的幾個(gè)點(diǎn)。如果t次迭代梯度下降訪問(wèn)了點(diǎn),那么Polyak平均算法的輸出是。
當(dāng)應(yīng)用Polyak平均于非凸問(wèn)題時(shí),通常會(huì)使用指數(shù)衰減計(jì)算平均值:
? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ?
1. 用滑動(dòng)平均估計(jì)局部均值
滑動(dòng)平均(exponential moving average),或者叫做指數(shù)加權(quán)平均(exponentially weighted moving average),可以用來(lái)估計(jì)變量的局部均值,使得變量的更新與一段時(shí)間內(nèi)的歷史取值有關(guān)。
變量在t時(shí)刻記為,為變量v在t時(shí)刻的取值,即在不使用滑動(dòng)平均模型時(shí),在使用滑動(dòng)平均模型后,的更新公式如下:
? ? ? ? ? ? ?? ? ? ? ?(1)
上式中,。 相當(dāng)于沒(méi)有使用滑動(dòng)平均。
假設(shè)起始,,之后每個(gè)時(shí)刻,依次對(duì)變量v進(jìn)行賦值,不使用滑動(dòng)平均和使用滑動(dòng)平均結(jié)果如下:
表 1
| t | 不使用滑動(dòng)平均模型,即給v直接賦值 | 使用滑動(dòng)平均模型,按照公式(1)更新v | 使用滑動(dòng)平均模型,按照公式(2)更新v |
| 0 | 0 | / | / |
| 1 | 10 | 1 | 10 |
| 2 | 20 | 2.9 | 13.6842 |
| 3 | 10 | 3.61 | 13.3210 |
| 4 | 0 | 3.249 | 9.4475 |
| 5 | 10 | 3.9241 | 9.5824 |
| 6 | 20 | 5.53169 | 11.8057 |
| 7 | 30 | 7.978521 | 15.2932 |
| 8 | 5 | 7.6806689 | 13.4859 |
| 9 | 0 | 6.91260201 | 11.2844 |
?
? ? ? ? ? ? ? ? ? ? ? ?圖 1:三種變量更新方式
Andrew Ng在Course 2 Improving Deep Neural?Networks中講到,t時(shí)刻變量v的滑動(dòng)平均值大致等于過(guò)去個(gè)時(shí)刻θ值的平均。這個(gè)結(jié)論在滑動(dòng)平均起始時(shí)相差比較大,所以有了Bias correction,將除以修正對(duì)均值的估計(jì)。
加入了Bias correction后,更新公式如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? (2)
t越大,越接近1,則公式(1)和(2)得到的結(jié)果將越來(lái)越近。
當(dāng)越大時(shí),滑動(dòng)平均得到的值越和θ的歷史值相關(guān)。如果,則大致等于過(guò)去10個(gè)θ值的平均;如果,則大致等于過(guò)去100個(gè)θ值的平均。
滑動(dòng)平均的好處:
占內(nèi)存少,不需要保存過(guò)去10個(gè)或者100個(gè)歷史θ值,就能夠估計(jì)其均值。(當(dāng)然,滑動(dòng)平均不如將歷史值全保存下來(lái)計(jì)算均值準(zhǔn)確,但后者占用更多內(nèi)存和計(jì)算成本更高)
?
2. TensorFlow中使用滑動(dòng)平均來(lái)更新變量(參數(shù))
滑動(dòng)平均可以看作是變量的過(guò)去一段時(shí)間取值的均值,相比對(duì)變量直接賦值而言,滑動(dòng)平均得到的值在圖像上更加平緩光滑,抖動(dòng)性更小,不會(huì)因?yàn)槟炒蔚漠惓H≈刀沟没瑒?dòng)平均值波動(dòng)很大,如圖 1所示。
TensorFlow 提供了 tf.train.ExponentialMovingAverage 來(lái)實(shí)現(xiàn)滑動(dòng)平均。在初始化 ExponentialMovingAverage 時(shí),需要提供一個(gè)衰減率(decay),即公式(1)(2)中的。這個(gè)衰減率將用于控制模型的更新速度。ExponentialMovingAverage 對(duì)每一個(gè)變量(variable)會(huì)維護(hù)一個(gè)影子變量(shadow_variable),這個(gè)影子變量的初始值就是相應(yīng)變量的初始值,而每次運(yùn)行變量更新時(shí),影子變量的值會(huì)更新為:
? ? ? ? ? ? ? ? ? ? ?? ?(3)
公式(3)中的 shadow_variable 就是公式(1)中的,公式(3)中的 variable 就是公式(1)中的,公式(3)中的 decay 就是公式(1)中的。
公式(3)中,decay 決定了影子變量的更新速度,decay 越大影子變量越趨于穩(wěn)定。在實(shí)際運(yùn)用中,decay一般會(huì)設(shè)成非常接近1的數(shù)(比如0.999或0.9999)。為了使得影子變量在訓(xùn)練前期可以更新更快,ExponentialMovingAverage 還提供了 num_updates 參數(shù)動(dòng)態(tài)設(shè)置 decay 的大小。如果在初始化 ExponentialMovingAverage 時(shí)提供了 num_updates 參數(shù),那么每次使用的衰減率將是:
? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? (4)
這一點(diǎn)其實(shí)和Bias correction很像。
?
3. 滑動(dòng)平均為什么在測(cè)試過(guò)程中被使用?
滑動(dòng)平均可以使模型在測(cè)試數(shù)據(jù)上更健壯(robust)。“采用隨機(jī)梯度下降算法訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),使用滑動(dòng)平均在很多應(yīng)用中都可以在一定程度上提高最終模型在測(cè)試數(shù)據(jù)上的表現(xiàn)。”?
對(duì)神經(jīng)網(wǎng)絡(luò)邊的權(quán)重 weights 使用滑動(dòng)平均,得到對(duì)應(yīng)的影子變量 shadow_weights。在訓(xùn)練過(guò)程仍然使用原來(lái)不帶滑動(dòng)平均的權(quán)重 weights,不然無(wú)法得到 weights 下一步更新的值,又怎么求下一步 weights 的影子變量 shadow_weights。之后在測(cè)試過(guò)程中使用 shadow_weights 來(lái)代替 weights 作為神經(jīng)網(wǎng)絡(luò)邊的權(quán)重,這樣在測(cè)試數(shù)據(jù)上效果更好。因?yàn)?shadow_weights 的更新更加平滑,對(duì)于隨機(jī)梯度下降而言,更平滑的更新說(shuō)明不會(huì)偏離最優(yōu)點(diǎn)很遠(yuǎn);對(duì)于梯度下降 batch gradient decent,我感覺(jué)影子變量作用不大,因?yàn)樘荻认陆档姆较蛞呀?jīng)是最優(yōu)的了,loss 一定減小;對(duì)于 mini-batch gradient decent,可以嘗試滑動(dòng)平均,畢竟 mini-batch gradient decent 對(duì)參數(shù)的更新也存在抖動(dòng)。
設(shè),一個(gè)更直觀的理解,在最后的1000次訓(xùn)練過(guò)程中,模型早已經(jīng)訓(xùn)練完成,正處于抖動(dòng)階段,而滑動(dòng)平均相當(dāng)于將最后的1000次抖動(dòng)進(jìn)行了平均,這樣得到的權(quán)重會(huì)更加robust。
??
References
Course 2 Improving Deep Neural?Networks?by Andrew Ng
http://www.cnblogs.com/wuliytTaotao/p/9479958.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的神经网络优化:指数衰减计算平均值(滑动平均)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度学习maxout单元
- 下一篇: 机器学习:Multinoulli分布与多