-
1 # Deeplearning初學者
-
2 # 北航秦曾昌
在機器學習中,為了最佳化目標函式,就需要設計合適的最佳化演算法,來即準確又有效率的實現最最佳化。常用的有一階最佳化演算法梯度下降法,二階的最佳化演算法有牛頓法等。
而對於神經網路,特別深度神經網路,由於其結構複雜,引數眾多等等。比起傳統的機器學習方法,最佳化起來十分困難,因此人們就提出了各種神經網路的最佳化演算法。
神經網路中最佳化中最重要的思想就是梯度資訊的反向傳播。具體的步驟就是:先透過正向傳播,由輸入得到預測結果,然後把預測結果和真實結果之間的殘差(可以是均方差、交叉熵等),根據鏈式求導法則,將梯度反向傳導到各個引數中,來對引數進行更新。
最常用的就是隨機梯度下降(SGD)的方法,如下面的公式所示:
引數更新的方式就是當前值減去學習率乘以當前引數的梯度。
隨機梯度下降這種方式更新方式簡單直接,在小資料集以及簡單的網路結構中常常使用。但是對於複雜網路如CNN、RNN等,SGD的方法會導致最佳化時波動很大,收斂的速度很慢,而且容易陷入區域性最優。這時就需要對其進行進一步的改進和最佳化。
主要從兩方面來最佳化:自適應的學習率以及更準確的梯度方向。
1. 更準確的梯度
首先是基於動量的方法(Momentum):其思想很簡單,就是對SGD最佳化時,高頻微小的波動進行平滑,從而加速最佳化過程。方法就來源於物理中的動量,將引數的最佳化過程中,累計了一定的動能,因此不容易改變更新的方向,最終的更新方向和大小是由過去的梯度和當前梯度共同決定的。
就好比一個小球在向下滾動的過程中(即引數最佳化的過程),如果遇到平坦的地方,不會馬上停下來,而是還會向前繼續滾動。Momentum的方法不僅有助於加快學習速度,也可以有效避免落入區域性最優點如鞍點。
但是基於動量的更新方式,容易錯過最優點,因為其動能會導致其在最優點附近反覆的震盪,甚至直接越過最優點。因此人們又提出了改進的方法就是Nesterov Momentum。
其改進的地方就是,在Momentum的基礎上,讓小球先試探性地,靠著已有的動能向前一動一步,然後計算出移動後的梯度,用這個梯度來更新當前的引數。從而使得小球擁有了提前感知周圍環境的資訊。這樣靠近最優點的時候,就能讓小球放慢速度。
2. 自適應學習率
因為不同的引數,其重要性和每次更新幅度不同。對於不常變化的引數,需要其學習率大一些,能夠從個別樣本中學習到更多的資訊;而對於頻繁更新變化的引數,已經積累了大量關於樣本的資訊,不希望它對單個樣本過於敏感,因此希望更新幅度小一些。
最經典的就是Adagrad,利用了歷史梯度的平方和,來調整引數的學習率,使得頻繁更新的引數學習率更低;而少更新的引數學習率高。
但是Adagrad又一個缺陷就是隨著Vt逐步累積增大,會導致學習率越來越小,最終停止更新。因此又提出了改進的RMSprop。同Momentum方法類似,為了防止出現學習率過小,只計算出各個時刻梯度的滑動平均值,視窗大小為1/(1-beta2)
在總結上述演算法的基礎上,就出現了Adam演算法,即結合了RMSprop和Momentum的最佳化方法:
回覆列表
可以參照各大深度學習框架裡的最佳化器。比如我常用的tensorflow
貌似基本上都是基於梯度下降吧,梯度下降,隨機剃度下降,動量剃度下降,牛頓法,擬牛頓法。。。好多呢,基本上都是為了解決避免收斂與區域性極小值點,或者是自適應學習速率,才衍生出這麼多演算法的吧。。。我不專業。。。。