前言
梯度下降算法現(xiàn)在變的越來越流行,但是對(duì)于使用者來說表窘,它的優(yōu)化過程變的越來越黑盒。本文我們介紹下不通梯度下降算法的習(xí)性甜滨,使得我們能夠更好的使用它們乐严。本人每次復(fù)習(xí)這篇論文,或多或少都有一些收獲衣摩,基礎(chǔ)學(xué)習(xí)扎實(shí)了昂验,后面的使用才會(huì)得心應(yīng)手。
簡(jiǎn)介
梯度下降算法艾扮,不管在機(jī)器學(xué)習(xí)既琴,還是在神經(jīng)網(wǎng)絡(luò)中,都是很常見的優(yōu)化算法泡嘴。所以不通的深度學(xué)習(xí)框架實(shí)現(xiàn)了各種不通的梯度下降算法甫恩,但是各種算法的優(yōu)勢(shì)和劣勢(shì)對(duì)于普通的使用者來說是一個(gè)黑盒。
本文就是基于此來詳細(xì)解釋各種梯度算法的不同點(diǎn)酌予,以及它們的優(yōu)勢(shì)和劣勢(shì)磺箕。
梯度算法簡(jiǎn)單來說就是:
優(yōu)化目標(biāo)函數(shù)$J(\theta)$, 使得目標(biāo)函數(shù)達(dá)到最小值時(shí),求解得到參數(shù)$\theta \in R^d$
它的方式是首先求解梯度 $\nabla_{\theta} J(\theta)$, 然后每次往負(fù)梯度方向迭代一步抛虫,更新參數(shù)$\theta$.
各種梯度下降
目前常用的有3種梯度下降松靡,主要是根據(jù)計(jì)算梯度時(shí)使用的數(shù)據(jù)量。
batch gradient descent(BGD, 批量梯度下降)
每次計(jì)算梯度的時(shí)候都是使用全部的數(shù)據(jù):
http://latex.codecogs.com/svg.latex?\begin{bmatrix}1&x&x2\1&y&y2\1&z&z^2\\end{bmatrix}
http://latex.codecogs.com/svg.latex?a
這里可以看到每一步的參數(shù) $\theta$ 更新都需要計(jì)算全部的數(shù)據(jù)建椰,
所以BGD在數(shù)據(jù)量特別大的時(shí)候是很難處理的雕欺,同時(shí)也不能做到online更新model。
BGD在凸優(yōu)化里面能夠保證達(dá)到全局的最優(yōu)點(diǎn)广凸,如果在非凸優(yōu)化里面能夠達(dá)到局部最優(yōu)點(diǎn)阅茶。
Stochastic gradient descent(SGD, 隨機(jī)梯度下降)
SGD每次接收到一個(gè)訓(xùn)練數(shù)據(jù)$(x^{i}, y^{i})$時(shí),都需要計(jì)算梯度谅海,
然后更新模型參數(shù)脸哀,粒度非常小。
$\theta = \theta - \eta . \nabla_{\theta}J(\theta;x{i};y{i})$
SGD在大數(shù)據(jù)應(yīng)用上效果非常好扭吁,一方面它避免像BGD一樣冗余的計(jì)算撞蜂,因?yàn)槊恳淮斡?jì)算它都會(huì)去更新參數(shù)盲镶,所以收斂速度會(huì)快很多,而且它是實(shí)時(shí)更新參數(shù)蝌诡,所以可以用作online 訓(xùn)練溉贿,但是SGD在訓(xùn)練的時(shí)候,loss的波動(dòng)可能很大浦旱。
BGD最終會(huì)收斂到最優(yōu)點(diǎn)宇色,相對(duì)來說SGD是有波動(dòng)的,一方面颁湖,它有機(jī)會(huì)跳出當(dāng)前的局部最優(yōu)點(diǎn)宣蠕;另一方面,它可能會(huì)造成過擬合甥捺。但是只要保持學(xué)習(xí)率緩慢下降的情況下抢蚀,不管在凸優(yōu)化還是非凸優(yōu)化上面,SGD和BDG的效果可以等價(jià)镰禾。
Mini-batch gradient descent(MBGD)
MBGD是 BGD 和SGD的一個(gè)折中皿曲,它是每一個(gè)小批次計(jì)算一次梯度,更新一次參數(shù)
$$\theta = \theta - \eta . \nabla_{\theta}J(\theta;x{(i:i+n)};y{(i:i+n)})$$
它的好處
- 減少參數(shù)的更新次數(shù)吴侦,使得模型更佳穩(wěn)定屋休。
2)可以使用矩陣計(jì)算的形式,來優(yōu)化計(jì)算速度备韧。
常見的Mini-batch 大小一般是 50-256博投,但是和應(yīng)用有關(guān),比如圖像應(yīng)用的batch小點(diǎn)盯蝴,nlp任務(wù)的batch可以調(diào)整大些毅哗。
挑戰(zhàn)
雖然MBGD還可以,但是它不是凸優(yōu)化捧挺,有些問題需要處理
- 合適的學(xué)習(xí)率很難選擇虑绵,太小了迭代慢,太大了很容易波動(dòng)闽烙,甚至發(fā)散
- 預(yù)設(shè)學(xué)習(xí)率翅睛,比如:模擬退火,學(xué)習(xí)率衰減等黑竞,但是這個(gè)對(duì)數(shù)據(jù)集需要非常了解
- 對(duì)于每一步迭代捕发,所有的參數(shù)更新是共享同一學(xué)習(xí)率的,但是如果我們數(shù)據(jù)稀疏很魂,或者特征頻次很不同扎酷,我們不需要更新每一個(gè)參數(shù),對(duì)較少出現(xiàn)的特征更新幅度較大遏匆。
- 在神經(jīng)網(wǎng)絡(luò)中優(yōu)化高度非凸的代價(jià)函數(shù)的一個(gè)挑戰(zhàn)是法挨,避免局部的次最優(yōu)谁榜。這個(gè)難題不是局部最優(yōu)點(diǎn)帶來的,而是碰到非局部極值點(diǎn)的駐點(diǎn)凡纳,在某些維度它的梯度是上升的窃植,在某些維度,它的梯度是下降的荐糜。這些鞍點(diǎn)的從每個(gè)方向出發(fā)巷怜,它附近的error值都是一樣的,這就使得SGD非常難以從這樣的地方迭代出來暴氏。
梯度下降優(yōu)化算法
下面我們介紹多種優(yōu)化梯度的算法丛版,這里不介紹不適合大數(shù)據(jù)集和二次的算法。
Momentum(動(dòng)量偏序,慣性)
SGD在做梯度下降的時(shí)候,梯度陡的維度下降的幅度比梯度歡的維度更大胖替,這會(huì)導(dǎo)致一個(gè)問題研儒,在一個(gè)局部最優(yōu)點(diǎn)的附近,更新的方式是有點(diǎn)類似走“之”字行的緩慢前進(jìn)独令。如圖a所示端朵,垂直方向的梯度很陡,水平的很緩燃箭,這樣在更新的時(shí)候冲呢,往垂直方向的更新粒度大,但是水平方向很緩慢招狸。
[圖片上傳失敗...(image-4dfee6-1511578384244)]
為了解決這個(gè)問題敬拓,引入Momentum,也就是引入動(dòng)量來抑制震蕩裙戏,如圖b
$v_t = \gamma v_{t-1} + \eta \nabla_{\theta}J(\theta)$
$\theta=\theta-v_t$
通常$\gamma$設(shè)為0.9
它是通過保持上一步的梯度來實(shí)現(xiàn)抑制震蕩乘凸,效果如b所示。
物理上來說累榜,當(dāng)我們從山上扔一個(gè)球营勤,隨著球的下落,動(dòng)量是一直在增加的壹罚,
速度也是越來越快的葛作,直到極限速度,$\gamma$代表阻力因子猖凛。同樣的場(chǎng)景
適合解釋參數(shù)的更新赂蠢,如果梯度的方向相同,動(dòng)量$v_t$是增加的辨泳,相反客年,
動(dòng)量是降低的霞幅,這樣就可以起到加速和抑制震蕩的效果。
Nesterov accelerated gradient(Nesterov 加速梯度量瓜, NAG)
然而司恳,如果一個(gè)球任由它自己盲目的沿著斜坡下落,結(jié)果是很不理想的绍傲,因?yàn)榍蛟谄戮彽氐胤较侣涞穆痈担谄露傅牡胤较侣涞目欤@個(gè)和我們迭代參數(shù)的理想情況是相反的烫饼。我們期望的是在坡陡(梯度大)的地方迭代更慢猎塞。
NAG是解決這個(gè)問題的一種方式,使用動(dòng)量對(duì)我們的參數(shù)本身做一些修正杠纵,我們先預(yù)估參數(shù)應(yīng)該變成什么樣子荠耽?
按照慣性前進(jìn),我們會(huì)有有個(gè)參數(shù)update 后的預(yù)估位置比藻,
它可能是:$\theta-\gamma v_{t-1}$铝量,
然后在這個(gè)位置我們計(jì)算它的梯度,$\eta \nabla_{\theta}J(\theta-\gamma v_{t-1})$银亲,
這樣可以起到加速的作用慢叨。
整體的公式:
$$v_t = \gamma v_{t-1} + \eta \nabla_{\theta}J(\theta-\gamma v_{t-1})$$
$$\theta=\theta-v_t$$
[圖片上傳失敗...(image-44a45-1511578384244)]
解釋下這個(gè)圖:
原來梯度的方向:
如果按當(dāng)前的參數(shù)位置$\theta$來計(jì)算梯度,它是小的藍(lán)色的向量
然后保持動(dòng)量$\gamma v_{t-1}$是長(zhǎng)的藍(lán)色向量
NAG:
先保持動(dòng)量走一步:$\gamma v_{t-1}$為棕色的長(zhǎng)向量务蝠,和長(zhǎng)的藍(lán)色向量平行
在該位置的梯度為紅色的長(zhǎng)向量:$\eta \nabla_{\theta}J(\theta-\gamma v_{t-1})$
修正后的位置為左邊綠色向量指定的位置拍谐。
這種方式就可以提前修正梯度方向,避免單次走的太快以致偏差太大馏段,起到加速的作用
既然我們可以做到自適應(yīng)的根據(jù)梯度大小來調(diào)整迭代的大小來加速計(jì)算轩拨。
我們也應(yīng)該做到根據(jù)參數(shù)的重要性來獨(dú)立的更新每一個(gè)參數(shù)。
Adagrad
Adagrad是一種梯度下降的算法:它是通過學(xué)習(xí)率來作用到參數(shù)更新院喜,非頻繁更新的參數(shù)更新力度大些气嫁,相反更新力度小點(diǎn)。
所以這個(gè)非常實(shí)用于sparse數(shù)據(jù)够坐,
Dean et al 發(fā)現(xiàn)Adagrad在訓(xùn)練大數(shù)據(jù)集的時(shí)候可以極大的提升SGD的魯棒性寸宵,
用Adagrad去訓(xùn)練Glove word Embedding 對(duì)于新詞或者出現(xiàn)頻率低的詞效果很好
前面我們對(duì)所有的參數(shù)$\theta$共享一個(gè)學(xué)習(xí)率,Adagrad對(duì)于每個(gè)$\theta_i$都會(huì)訓(xùn)練出一個(gè)對(duì)應(yīng)的學(xué)習(xí)率元咙。
下面是計(jì)算過程:
首先計(jì)算參數(shù)$\theta_i$在step t的梯度:
$g_{t,i}=\nabla_{\theta_t}J(\theta_{t,i})$
普通的SGD對(duì)于每一個(gè)參數(shù)梯影,更新公式為:
$\theta_{t+1,i}=\theta_{t,i}-\eta.g_{t,i}$
在這里Adagrad 對(duì)學(xué)習(xí)率$\eta$進(jìn)行修正,這要視基于它過去已經(jīng)計(jì)算過的梯度:
$\theta_{t+1,i}=\theta_{t,i}-\frac{\eta}{\sqrt{G_{t,ii} + \epsilon}}.g_{t,i}$
$G_t \in R^{d x d}$ 是一個(gè)對(duì)角矩陣庶香,只用對(duì)角的$i,i$有數(shù)據(jù)
$G_{t,ii}=\sum_{0,t} g_{t,i}^2 $
所以這個(gè)值會(huì)一直越來越大
$\epsilon$是個(gè)平滑極小項(xiàng)委煤,避免出現(xiàn)除0的情況号杏,一般設(shè)為1e-8.
很奇怪的是荆萤,如果不加平方計(jì)算,效果很差七扰。
使用Adagrad的一個(gè)好處是,不需要很特意的去調(diào)整學(xué)習(xí)率陪白,
只要設(shè)置一個(gè)初始的$\eta$比如0.01颈走,然后就可以了,模型自己會(huì)調(diào)整咱士。
它的確定很明顯立由,需要計(jì)算累積的梯度平方和,這個(gè)值會(huì)越來越大序厉,
這回是的步長(zhǎng)一段時(shí)間后變得很小锐膜,這樣再訓(xùn)練下去就沒有什么意義了。
下面的方法來fix這個(gè)缺陷弛房。
Adadelta
Adadelta是Adagrad的擴(kuò)展道盏,它主要是決絕Adagrad的過度下降學(xué)習(xí)率。它們的不同是Adagrad累積所有歷史的梯度平方文捶,但是Adadelta只是考慮過去一段是時(shí)間的梯度平方和荷逞。
為了避免每次計(jì)算都需要存儲(chǔ)歷史$w$個(gè)梯度,做了一種變種的方式拄轻,
有點(diǎn)類似衰減 decay:
$E[g^2]t = \gamma E[g^2]{t-1} + (1-\gamma)g_t^2$
同樣$\gamma$可以設(shè)置為0.9,我們將整體公式列出來:
SGD 更新參數(shù):
$\Delta \theta_t=-\eta.g_{t,i} $
$\theta_{t+1}=\theta_t + \Delta \theta_t $
Adagrad更新參數(shù)的element-wise 方式:
$\Delta \theta_t=-\frac{\eta}{\sqrt{G_{t} + \epsilon}}\bigodot g_{t}$
Adadelta就是將$G_t$改為 $E[g^2]_t $,得到
$\Delta \theta_t=-\frac{\eta}{\sqrt{E[g^2]t + \epsilon}}\bigodot g{t}$
其實(shí) $E[g^2]_t $就是RMS(root mean squared)
$\Delta \theta_t=-\frac{\eta}{RMS(g)t}\bigodot g{t}$$
這個(gè)作者提到伟葫,像SGD恨搓,Momentum, 或者 Adagrad)的更新單元其實(shí)不適合Adadelta,
其實(shí)即使梯度再大筏养,只要學(xué)習(xí)率很小斧抱,那么參數(shù)更新的幅度就很小,所以學(xué)習(xí)率的調(diào)整應(yīng)該和參數(shù)的過去一段時(shí)間的調(diào)整幅度有關(guān)渐溶,而不是只是和梯度有關(guān)辉浦,所以我們引入另外一個(gè)累積公式為:
$E[\Delta \theta ^2]t = \gamma E[\Delta \theta ^2]{t-1} + (1-\gamma)\Delta \theta ^2$$
$$RMS[\Delta]_t=\sqrt{E[\Delta\theta^2]_t + \epsilon}$
這里$RMS[\Delta]t$依賴$\Delta \theta_t$是未知的,我們用$RMS[\Delta]{t-1}$近似代替
然后用 $\frac{RMS[\Delta \theta]{t-1}}{RMS[g]{t}}$ 來替代步長(zhǎng)$\eta$
物理上可以這么理解:
$\Delta \theta_t = \eta g_t$
$\eta = \frac{\Delta \theta_t}{g_t}$ 然后用$RMS[\Delta]{t-1}$近似$\Delta \theta_t$,用$RMS[g]{t}近似 $g_t$
最終得到:
$\Delta \theta_t=-\frac{RMS[\Delta \theta]{t-1}}{RMS[g]{t}} g_{t}$
$\theta_{t+1}=\theta_t + \Delta \theta_t $
所以用這種算法茎辐,我們連初始值都不需要了宪郊。
RMSprop
RMSprop是一種非公布的算法,是Hinton提出的
RMSprop 和 Adadelta是獨(dú)立提出的相同算法拖陆,他們都是用來解決Adagrad累積梯度平方和太快的問題:
$E[g^2]t= 0.9 E[g^2]{t-1} + 0.1 g_t^2 $
$\theta_{t+1}=\theta_{t} - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}}g_t$
建議 $\eta$設(shè)置為 0.001
Adam
Adaptive Moment Estimation 是兩外一種自適應(yīng)學(xué)習(xí)率算法弛槐,類似RMSprop 和 Adadelta,Adam還保存過去一段時(shí)間的梯度:
$m_t=\beta_1m_{t-1}+(1-\beta)g_t$
$v_t=\beta_2 v_{t-1}+(1-\beta_2)g_t^2$
$v_t$和上面的RMSprop類似依啰,$m_t$是額外需要記憶的東西,
他們分別可以看成是第一動(dòng)量(平均)乎串,第二動(dòng)量(方差),
因?yàn)?v_t$和$m_t$都是由0初始化的速警,Adam的作者觀察:
在0附近特別是開始的幾步叹誉,偏置非常大鸯两,特別是衰減率非常小的時(shí)候,
$\beta_1和\beta_2是接近1的數(shù)字$长豁。
為了修正這個(gè)偏置钧唐,作者稍微對(duì)這兩個(gè)動(dòng)量進(jìn)行修正,得到:
$m_t^1 = \frac{m_t}{1-\beta_1^t}$
$v_t^1 = \frac{v_t}{1-\beta_2^t}$
這里的$\beta_1^t$是$\beta_1的t次方$
然后利用這個(gè)$m_t^1$去更新參數(shù):
$\theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{v_t^1} + \epsilon}m_t^1 $
作者建議:$\beta_1=0.9$蕉斜, $\beta_2=0.999$, $\epsilon=10^{-8}$
原始論文:https://arxiv.org/pdf/1412.6980.pdf
[圖片上傳失敗...(image-acdba3-1511578384244)]
AdaMax
上面提到的$v_t$計(jì)算$g_t^2$的時(shí)候用的其實(shí)是l2范數(shù)計(jì)算逾柿,可以寫成形式:
$v_t=\beta_2 v_{t-1}+(1-\beta_2)|g_t|^2$
我們可以定義更加廣泛的形式:
$v_t=\beta_2^p v_{t-1} + (1-\beta_2p)|g_t|p$
這里使用的的是p范數(shù)。
這里我們引入一種無窮范數(shù)的形式宅此,AdaMax:
$u_t=\beta_2^{\infty}v_{t-1} + (1-\beta_2\infty)|g_t|\infty$
$=max(\beta_2.v_{t-1}, |g_t|)$
我們用$u_t$來代替Adam的$\sqrt(v_t^1 + \epsilon)$,得到:
$\theta_{t+1}=\theta_t-\frac{\eta}{u_t}m_t^1 $
$u_t$計(jì)算的時(shí)候取最大值机错,所有在接近于0的時(shí)候不會(huì)像Adam一樣有這么大的偏置。
Nadam
前面提到父腕,Adam 是RMSprop和動(dòng)量的結(jié)合算法弱匪,RMSprop保證學(xué)習(xí)率會(huì)根據(jù)最近幾步的梯度平方來衰減,這里我們?cè)僮律?jí)璧亮,對(duì)動(dòng)量使用NAG(Nesterov accelerated gradient),
首先我們回顧下動(dòng)量的更新方式:
Momentum:
$g_t=\nabla_{\theta_t}J(\theta_t)$
$m_t=\gamma m_{t-1}+\eta g_t$
$\theta_{t+1}=\theta_t-m_t$
$J$是我們的目標(biāo)函數(shù)萧诫,$\gamma$是動(dòng)量的衰減因子,$\eta$是步長(zhǎng)枝嘶,結(jié)合起來:
$\theta_{t+1}=\theta_t-\gamma m_{t-1}-\eta g_t$
NAG可以令我們走的更加精確帘饶,我們將NAG的特性加入上式得到:
NAG:
$g_t=\nabla_{\theta_t}J(\theta_t-\gamma m_{t-1})$
$m_t=\gamma m_{t-1} + \eta g_t$
$\theta_{t+1}=\theta_t-m_t$
NAG可以做些修改,因?yàn)镹AG中會(huì)迭代動(dòng)量?jī)纱危?br>
一次是計(jì)算$g_t$的時(shí)候群扶,一次是更新參數(shù)$\theta$的時(shí)候.修改后也是兩次及刻,
只是動(dòng)量更新兩次,一次時(shí)上面的第二個(gè)式子竞阐,預(yù)估當(dāng)前的動(dòng)量缴饭,
然后沿著這個(gè)步子,再更新一次的動(dòng)量骆莹,整體的式子為:
$g_t=\nabla_{\theta_t}J(\theta_t)$
$m_t=\gamma m_{t-1} + \eta g_t$
$\theta_{t+1}=\theta_t-(\gamma m_t + \eta g_t)$
這樣其實(shí)是起到加速的作用颗搂,這個(gè)我們也可以作用到Adam上面,
首先回顧下Adam算法:
$m_t=\beta_1 m_{t-1}+(1-\beta_1)g_t$
$m_t1=\frac{m_t}{1-\beta_1t}$
$\theta_{t+1}=\theta_t - \frac{\eta}{\sqrt{v_t^1} + \epsilon }m_t^1 $
把這些式子合并成一個(gè)式子:
$\theta_{t+1}=\theta_t -\frac{\eta}{\sqrt{v_t^1} + \epsilon } (\frac{\beta_1 m_{t-1}}{1-\beta_1^t} + \frac{(1-\beta_1)g_t}{1-\beta_1^t})$
我們注意到 $\frac{m_{t-1}}{1-\beta_1t}$就是$m_{t-1}1$,我們簡(jiǎn)化為
$\theta_{t+1}=\theta_t -\frac{\eta}{\sqrt{v_t^1} + \epsilon } (\beta_1 m_{t-1}^1 + \frac{(1-\beta_1)g_t}{1-\beta_1^t})$
這里我們像上面加速一樣幕垦,將上一步的$m_{t-1}^1$動(dòng)量丢氢,
直接用現(xiàn)在的預(yù)估來代替,起到加速的作用先改,很簡(jiǎn)單的替換卖丸,得到:
$\theta_{t+1}=\theta_t -\frac{\eta}{\sqrt{v_t^1} + \epsilon } (\beta_1 m_{t}^1 + \frac{(1-\beta_1)g_t}{1-\beta_1^t})$
算法可視化
[圖片上傳失敗...(image-315d2a-1511578384244)]
a. 這是一個(gè)loss 曲面,每種算法的起始點(diǎn)是一樣的盏道,每個(gè)算法的優(yōu)化路線是不一樣的稍浆,可以看到,Adagrad, Adadelta, 和 RMSprop 很快的就開始下降,momentum和 NAG就走了很多的彎路衅枫。
b. 展示的是算法如何逃離鞍點(diǎn)的情況嫁艇,這種鞍點(diǎn)啃可能是,一個(gè)維度的梯度是正的弦撩,其他維度的梯度是負(fù)的步咪。這種情形對(duì)于SGD來說是很難逃離的 ,圖中就可以看出益楼,SGD猾漫,Momentum,NAG都很難突破感凤,Adagrad, RMSprop, 和 Adadelta 很快找到負(fù)梯度方向了悯周。
該怎么選擇
如果數(shù)據(jù)分布很稀疏,最好選擇自適應(yīng)學(xué)習(xí)率的算法
RMSprop陪竿,Adadelta,Adam都是很相似的自適應(yīng)學(xué)習(xí)率的算法禽翼,總體來說Adam效果是最好的。
很有趣的是族跛,最近很多論文都是直接用SGD闰挡,沒有使用動(dòng)量和學(xué)習(xí)率調(diào)節(jié),像上面說的那樣礁哄,SGD可以找到一個(gè)最小值长酗,但是它可能很慢,對(duì)初始值的要求更高桐绒,也可能在鞍點(diǎn)就停止了夺脾。
反正如果在更深或者更復(fù)雜的網(wǎng)絡(luò),最好使用自適應(yīng)學(xué)習(xí)率的算法掏膏。
并行和分布式SGD
SGD的替代是逐步的劳翰,所以原始的SGD是很難做到并行的敦锌,下面的算法是關(guān)于SGD的并行和分布式化的馒疹。
Hogwild!
Hogwild!: A Lock-Free Approach to Parallelizing Stochastic Gradient Descent.它是一種多CPU的并行處理方式,共享一塊內(nèi)存乙墙,這些內(nèi)存是不加鎖的颖变,這個(gè)適合于數(shù)據(jù)參數(shù)比較稀疏,每個(gè)部分只更新內(nèi)存的一個(gè)獨(dú)立部分听想,
Downpour SGD
Downpour SGD是一種異步SGD腥刹,Google在Large Scale Distributed Deep NetworksDistBelief的時(shí)候提出來的,他們把數(shù)據(jù)分為幾個(gè)部分汉买,然后一個(gè)模型跑多份衔峰,然后每個(gè)模型將他們的參數(shù)發(fā)送給 parameter server。這個(gè)server可能是多機(jī)器的,每個(gè)機(jī)器復(fù)雜存儲(chǔ)和更新一部分參數(shù)垫卤。但是他們每一個(gè)模型之間是沒有通信和數(shù)據(jù)交換的威彰,這樣會(huì)帶來鼓勵(lì)和阻礙達(dá)到最優(yōu)。
延時(shí)容忍的SGD
Delay-Tolerant Algorithms for Asynchronous Distributed Online Learning論文中擴(kuò)展了AdaGrad穴肘,使它成為一種可容忍延時(shí)和并行的算法歇盼,據(jù)說不錯(cuò)。
TensorFlow
TensorFlow是google的開源機(jī)器學(xué)習(xí)框架评抚,它的分布式結(jié)構(gòu)豹缀,主要是將graph分成子圖的模式,然后通過rpc的機(jī)制通信慨代,傳遞參數(shù)更新邢笙。
SGD的其他優(yōu)化
訓(xùn)練數(shù)據(jù)亂序
使得模型不刻意去學(xué)習(xí)數(shù)據(jù)輸入的順序,特別是序列模型的時(shí)候
batch normalization
對(duì)每個(gè)min-batch 進(jìn)行歸一化鱼响,可以使我們更加自如的控制學(xué)習(xí)率鸣剪,使得對(duì)初始輸入不是很敏感,它還可以其他還可以起到正則化的作用丈积。
Early stop
loss 下降如果基本不動(dòng)筐骇,就早點(diǎn)停止吧
梯度噪音
對(duì)梯度加個(gè)噪音(比如正態(tài)分布的噪音):
$g_{t,i}=g_{t,i} + N(0, \sigma_t ^2)$
$\sigma_t2=\frac{\eta}{(1+t)\gamma}$
加上這個(gè)噪音,會(huì)使得網(wǎng)絡(luò)更加的穩(wěn)定江滨,還有可能更有機(jī)會(huì)逃離局部最優(yōu)铛纬。