吳恩達(dá):RMSprop
簡(jiǎn)介
RMSprop谅年,全稱Root Mean Square prop辩恼,是一種用于深度學(xué)習(xí)梯度計(jì)算的方法扒寄。要想理解RMSprop算法或杠,我們先從梯度下降開始說起哪怔。
梯度下降
我們來看一下張經(jīng)典的三維圖片
可以看到我們?cè)谏厦嫒魏我粋€(gè)點(diǎn)采用梯度下降以達(dá)到最低點(diǎn),得到水平方向的梯度將會(huì)是零。而垂直方向梯度則隨著接近最低點(diǎn)逐漸減小认境,最終達(dá)到最優(yōu)結(jié)果胚委。但是這是理想情況下的凸函數(shù),如果我們面對(duì)的是非凸函數(shù)叉信,如下圖所示:
在這種情況下亩冬,梯度方向和大小計(jì)算都將受到嚴(yán)重的干擾。此時(shí)硼身,隨機(jī)初始化的起始點(diǎn)所計(jì)算的梯度大小往往含有特別大的噪聲硅急,若直接采用計(jì)算出的梯度大小,就會(huì)出現(xiàn)以下問題:
-
鞍點(diǎn)(Saddle point)
從高處落入鞍點(diǎn)時(shí)佳遂,可能遇到的問題就是一個(gè)方向的梯度大营袜,另一個(gè)方向的梯度接近于0,導(dǎo)致在鞍點(diǎn)停留此擺動(dòng)而無法繼續(xù)靠近最優(yōu)點(diǎn)丑罪。實(shí)際上此時(shí)為0的梯度不該嚴(yán)格遵守连茧,因?yàn)閺某跏蓟降玫阶顑?yōu)解的過程中,大部分情況的梯度大小都并沒有直接為靠近最優(yōu)點(diǎn)服務(wù)巍糯。
- 高原(plateau)
而另一種情況就是在高損失區(qū)域出現(xiàn)平地啸驯,就好像在內(nèi)蒙古高原丟一個(gè)鐵球,它不會(huì)因?yàn)楦吆0味恢被渌盥停炊鴷?huì)因?yàn)槌霈F(xiàn)平原地區(qū)而保持靜止罚斗。平地導(dǎo)致各方向梯度均趨近于0,這種情況也將造成收斂困難宅楞。同樣针姿,我們可以認(rèn)為此時(shí)的梯度大小都并沒有直接為靠近最優(yōu)點(diǎn)服務(wù),需要作出優(yōu)化厌衙。
總的來說距淫,梯度太高或者太低,很可能就是局部造成的婶希,是對(duì)接近最優(yōu)點(diǎn)沒有意義的暫時(shí)結(jié)果榕暇。沒有大局觀需要宏觀調(diào)控。
優(yōu)化方法
Rprop算法
為了解決上面說到的梯度大小問題喻杈。為梯度增加上下限是有必要的彤枢。
假設(shè)為實(shí)際采用梯度大小,為學(xué)習(xí)率,為反向傳播計(jì)算得梯度大小筒饰。
若
若
直觀來說缴啡,梯度一直朝著某個(gè)方向前進(jìn)時(shí),會(huì)加一個(gè)上限瓷们,不讓梯度因?yàn)榫植慷盖投斐纱罅科钜嫡ぁ6霈F(xiàn)前面說到的兩種情況秒咐,某些方向梯度降到接近于0而無法收斂時(shí)。梯度將采用一個(gè)最小值碘裕,防止無法擺脫局部反镇。
從Rporp到RMSprop
Rporp常常運(yùn)用于全數(shù)據(jù)集的運(yùn)算,簡(jiǎn)單地說娘汞,為梯度添加最小限制的同時(shí)也減小了梯度的容錯(cuò)率歹茶。詳細(xì)地說,假設(shè)采用Mini Batch進(jìn)行10步梯度運(yùn)算你弦,得出前9步梯度為而最后1步梯度為惊豺,當(dāng)這種情況發(fā)生時(shí)最好的做法時(shí)正負(fù)梯度抵消,總梯度值盡量保持不變,而Rprop則會(huì)進(jìn)行9次梯度減少和一次梯度增加禽作,造成梯度的嚴(yán)重失衡(當(dāng)然這里取決于梯度上下限的設(shè)置尸昧,但是總能找到極端情況)。
為此旷偿,引入RMSprop:
其中是梯度, 作為一個(gè)值容器承載著梯度平方加權(quán)平均的結(jié)果烹俗,并且作為梯度縮放的因子。是學(xué)習(xí)率萍程, 則類似于動(dòng)量梯度下降法中的衰減因子幢妄,代表過去梯度對(duì)當(dāng)前梯度的影響,一般取值茫负。
這樣子蕉鸳,用梯度自身的大小約束自身避免過大或者過小,減少了人為干預(yù)和極端情況發(fā)生的可能忍法。在引入Mini Batch的同時(shí)不割裂各個(gè)Mini Batch之間的梯度關(guān)系潮尝,就從Rprop算法進(jìn)化到了RMSprop。
以上就是RMSprop的關(guān)鍵內(nèi)容饿序,下面是一些細(xì)節(jié)性的不重要內(nèi)容勉失,可以忽略
不重要的附錄:
- 中對(duì)梯度平方個(gè)人認(rèn)為是為了保證非負(fù)
- 的根號(hào)中,為了避免出現(xiàn)0原探,往往會(huì)加上極小值乱凿。
- 相關(guān)代碼塊:
Rprop關(guān)鍵代碼
for t in range(num_interations):
dw[t] = compute_gradient(x, y)
if dw[t] * dw[t - 1] > 0:
step_size = min(step_size * incFactor, step_size_max)
elif dw[t] * dw[t - 1] < 0:
step_size = max(step_size * decFactor, step_size_min)
w[t] = w[t - 1] - sign(dw[t]) * step_size
RMSprop關(guān)鍵代碼
drad_squared = 0
for _ in num_iterations:
dw = compute_gradients(x, y)
grad_squared = 0.9 * grads_squared + 0.1 * dx * dx
w = w - (lr / np.sqrt(grad_squared)) * dw
- 文章部分參考自外文博客