一個神經網絡是一個遵循連接原則級聯構成的函數逼近器(function approximation)。這個function將輸入x轉化成輸出y。以image classification爲例,x是圖片,y是labels。
對於一個神經網絡的訓練,是指通過trail-and-error來獲得網絡中所有參數w的最優值。當網絡中所有參數都取得最優值時,該網絡針對某個損失函數可以在給定樣本集上得到最低loss。
這個訓練,也即參數估計,的過程,就是一個目標函數爲minimize loss function的優化過程。解優化的工具有很多,針對凸優化和非凸優化又可進行分類。由於神經網絡的參數較多以及其強非線性,導致其所構成的優化問題往往非凸(non-convex optmization)。解這種非凸優化的工具就是gradient descent(GD).注意,我們之所以要“估計”參數,即approximate the optimal set of weights,而不是直接求解出這組參數(analytical solution:令loss funciton的導數函數(if convex)=0,求出所有wi),是因爲 it is too complex to find the perfect analytical solution of all w with all the samples. Thus we find approximated solutions by an (numerical solution) iterative process-----GD optmization.
GD是一個迭代循環,trail-and-error,試錯的過程。對參數的估計和優化也是不積跬步無以至千里,每次update都是微調,積少成多。GD每次循環的操作有兩步:1. 計算網絡中每個參數對應的梯度;2. 按照該參數負梯度的方向更新每個參數。
- 其中第一步,即參數梯度的計算,用到的計數就是back propagation(BP)。BP就是以loss function爲起點,one operation at a time地依據複合函數求導的chian rule,將在起點處計算的gradient慢慢地反推流淌,流入網絡的每一個參數處。假設網絡中含有10K個參數w,那麼在BP時,每一個wi處計算得到的流入的梯度gi只是一個可正可負的實數;而這10K個gi組成的大vector G則是一個10K維的向量。這個向量定義在一個10K維的w(參數)空間。在這個空間中,損失函數L(w)作爲BP的梯度起點,會構成一個優化曲面(convex loss function會構成一個只有一個全局最優的碗形曲面,non-convex則會額外含有很多local optimal)。
- 在得到每個參數上的梯度gi後,即得到了梯度矩陣G,我們就進行第二步,參數更新。GD顧名思義,是沿着梯度下降的方向(即負梯度方向)進行每一次參數更新。梯度下降的幾何解釋就是在Loss function定義在w空間的曲面上,在某一點沿着該點梯度下降的方向微調一次。這個“點”從何而來呢?由於是10K維參數空間中的點。那麼一個點就對應一個10K vector,這個vector就是在此次update開始時我們網絡所有參數wi的現狀,也就此刻我們在空間中所處的位置。因此,10K的梯度vector G就指引了在10K空間中的這個點下降的方向。10K對10K,樂哉。
好,綜上,我們瞭解了BP與GD的關係:GD是一個優化算法,BP是一種梯度計算流程。在神經網絡的訓練中,BP是GD中的一個步驟。
那麼爲什麼BP適用於在神經網絡ANN中計算gradient呢?這是因爲ANN的連接屬性所構成的acyclic graph很適合與chain rule的實施。
接下來,介紹一下GD的兩大熱門問題:
1. GD的分類; 2. GD第二步,即參數update的不同策略(即不同優化器)。
1. GD的分類:依據每次BP時,BP起點處(即loss function)計算梯度所依據的樣本數量的不同而分類。
GD分爲Batch GD(BGD),Stochastic GD(SGD),還有Mini-batch GD(MBGD)。在神經網絡通過GD進行訓練時還會牽扯到的概念包括:
- epoch(把訓練集中所有的樣本都遍歷一遍算是完成一個epoch,可以理解爲訓練集上的一輪);
- batch size(一個mini-batch中隨機採樣多少個樣本);
- iteration,itrs(完成一個mini-batch的訓練即完成了一個iteration。一個epoch包含多個iteration)。
- Batch GD:用整個訓練集中的所有樣本各自計算所得的loss求平均,並依據此平均值計算BP gradient的起點來進行一次反傳update;一個epoch只是一次update,更新太慢,參數update不夠頻繁,不符合少量多次的原則。而且計算所得的gradient estiamte的值太過保守,那些少量但是難的sample所產生的大的畸變的gradient,被無情地average掉了,所以hard sample的特殊貢獻被抹殺了。然而,這些hard sample纔是最應該被着力update的東西(關於此,有專門的focal loss等hard smaple mining技術)。另外,由於所得梯度很平庸無奇,所以在local optiam的脫困能力不佳。
- Stochastic GD:隨機選擇訓練集中的一個樣本計算loss,並依據此平均值計算BP的graident起點進行一次反傳update;一個epoch會進行N次update,N是訓練集大小。把每個sample的個性無限放大。讓每個sample可以獨立地按照自己的loss結果取更新參數,讓網絡學會善待自己,但某些時候這也就產生了noisy gradient,因爲有些bad sample並不有助於網絡訓練。這時所得梯度有很強的fluctuation,增強了local optima的脫困能力,但是有可能出現在optima的oscillation。
- Mini-batch GD:隨機選擇batch size個樣本,分別計算loss後取平均,並依據此平均值計算BP的gradient的起點來進行一次反傳update;一個epoch進行N/batch size次update。取上述兩家之長。
上圖中藍線是BGD優化迭代的過程,紅線是SGD。可見BGD更穩健而SGD更躁動。
注意,無論是何種GD,即無論是用整個training set的全部samples,還是用一個batch的sample,還是隻用一個sample,GD都是用BP的手段在每次update時獲得了一個網絡中梯度的estimates(gradient estimates)。這就反映了神經網絡訓練的概率性。也即,BP,可以理解爲一個unbiased/biased gradeint estimator。
2. GD參數更新的不同策略:與GD分類無關,只關於learning rate和θ的計算有關。
GD的參數更新其實就是一條簡單的公式:是learning rate,是參數wi在第t+1次BP之後得到的它的gradient
有如下兩個思路來對上公式中的進行進化與改進:注意,兩個思路的底層核心都是accumulating gradient
(1). accumulating gradient directly for update--->Momentum, Nesterov;
(2). accumulating gradient for adaptive learing rate--->AdaGrad, RMSProp, Adam(adam優化器是1和2的融合)
(1)Accumulating gradient directly for update:所有wi公用同樣的learnig rate
重點講Momentum,Nesterov略。
原始的GD update有幾個缺點導致converge比較慢:1。 在優化曲面的谷底時梯度較小,所以每次update幅度(step size)較小導致overall所需的update次數增多;2. 在SGD時,當gradient出現fluctuation時,多次update之間左右搖擺,互相損傷,友軍火力。
綜上,提出不是每次update僅僅依靠此次BP計算所得的gradient,而是用一個整合了的歷史積累gradient進行update:
公式中v(“velocity”)是對自身的一次exponentially decaying moving average of negative gradeints的計算。然後用v值直接update參數。α參數控制accumulating的力度,越大說明積累地越充分。往往α設定爲0.9。
如上圖,每次momentum的update相當於是積累的gradient的update和本次計算所得gradient的update一次組合,可見綠線所示的組合update比其餘兩個的模長(step size)都要大,可以理解爲加快了參數更新。
具體地,模長的變化爲:
當α=0.9時,Momentum的每次update的step size是普通GD的10倍。
(2)Accumulating gradient for adaptive learing rate.
weight即feature:針對不同的feature(即weight)採用不同的(縮小的)learning rate。在CNN中,一個conv filter就是一個學到的feature template,所以一組weight就對應一個feature。DNN中,一個weight就對應一個neuron,即一個feature。當某個weight在某次BP時gradient較大,說明其對應的這個feature在這個或這組sample上產生了較大作用(loss),所以應當有針對性地對這個feature(weight)進行精細優化調整。
weight = feature的理論直觀理解如上圖。左圖中曲面上梯度分佈均勻,表明各個weight(即空間的各個基上的分量)相等的重要性,因此在某個等梯度線上任何位置到到optima的距離相等,所以用相等的step size可以同時到達optima;右圖,某些weight分量上梯度較大,其他則較小,導致優化曲面不對稱。從同一個橢球面的長軸處(該方向weight分量的梯度較小)比短軸處(該處weight分量的梯度較大)到達optima的距離較遠,所以需要較大的step size;而短軸處則需要較小的learning rate,因爲此處自身的g就大,如果也很大易導致fluctuation。
綜上,我們希望g大的weight分量的learning rate 相應減小。這就是adaptive learning rate的實質。具體地,learning rate按照g的平方減小。
AdaGrad:如下公式,r時accumulating factor over g的平方。
AdaGrad比較適合與convex optimization。在non-convex的情況下,AdaGrad對learning的削減過於激烈。
所以,在non-convex的情況下更適合與用RMSProp。
RMSProp:與AdaGrad直接accumulate g平方不同,RMSProp更溫和地accumulate an exponentially decaying avergae of g square。
與AdaGrad一樣。
Adam = Adaptive + momentum
adam優化器實際上時RMSProp + Momentum with bias correction terms for the first and second moments。
總結所有優化器,其實就是在上做文章。