一、概述
這一集講了一些列不同的梯度下降算法,做了一些比較。
之後,講到了Dropout
機制,隨機關閉一些neuron
的訓練方式可以使整個模型更加有效。
然後講到了一點關於Model Ensemble
的技巧。
最後,做了一個Convnet
的引入,介紹了Convnet
的歷史起源,以及後人的一些成就。
二、梯度下降算法
SGD
SGD
(Stochastic Gradient Descent
)就是之前一直在用的這種更新Weight
的方式。如圖。現實當中,
sgd
是最慢的下降算法。先來看看問題所在。如圖。假設
loss function
映射成是一個垂直面上很深,但是水平面上很淺的地形。這樣說好抽象,就想象成一個V
字形好了。現在我就在這個V
字的左半坡上。假設我往下走一步的話,我在垂直方向上下降的距離,會大於我在水平方向上前進的距離。又因爲我因此,sgd
會造成如下的問題,我在下降的過程中走很多的彎路,上下上下不斷調整。如下圖。而每次在水平方向上前進的距離越大,我就能越快到達那個笑臉,也就是
loss
最低點。sgd
的前進路線浪費了很多時間。Momentum
Momentum
的方法,借用了物理中的加速度的概念。把整個loss function
想象成一個碗,一個球從一側滑落,朝最底部的會有一個加速度和摩擦力的累加。因此,當這個球找到一個下降的方向時,速度就會累加,並越來越快。如圖。上圖中,
learning_rate * dx
就是標準的sgd
,是一個下降的速度,mu * v
就相當於摩擦力。因爲速度不能一直累加。如果一直累加,球根本停不下來,會over shot
偏離目標。v
就是要一直累加的下降加速度,用v
去更新W
。mu
通常設置成0.5 - 0.9
之間的數值。v
通常初始化成0
。Nesterov Momentum
下圖是一個普通的
momentum
下降。gradient step
就是learning_rate * dx
;momentum step
就是v
;因此最終這次下降的值就是兩個向量和actual step
。nesterov momentum
就是在momentum
的基礎上,多想一步,在momentum step
的盡頭,考慮下一步該怎麼走。如下圖。公式上唯一的區別就是在計算
dx
的時候要計算d(x + mu * vt-1)
。因此要有一個變量保留一下上一次的速率。如下圖。將
替換成
然後進行代數運算就可以得到最後的下降公式
nag
(Nesterov Accelerated Gradient
)通常比momentum
表現好一些。AdaGrad
adagrad
所做的就是將歷史的gradient
平方都累加起來,然後在update
的階段,按照比例來縮放一下。這樣做就好像我記錄下來之前所有走過的方向,然後綜合一下,往某一個方向走一步。從代碼看,我走的每一步距離都是在減小的。因此
adagrad
也有一個問題。在訓練大規模的神經網絡的時候,因爲
cache
是隨時間一直不斷增加的,因此總有一個時刻,gradient
會是0
。這時模型就停止學習了。爲了解決這個問題,
Tieleman and Hinton
提出了RMSProp
。RMSProp
如上圖,爲了避免
cache
過大,引入了一個leaky
機制,就像leaky relu
那樣。這個decay_rate
能保證cache
不會一直增大,避免了模型停止學習的困境。Adam
Adam
的思想是將RMSprop
和momentum
結合起來。m
是momentum
的計算方式,v
是RMSProp
的計算方式。
然後在update
的時候,將兩個變量代入到公式中。以上就是常用的梯度下降算法。目前爲止,表現最好的是
Adam
,可以嘗試使用在各種模型當中。其他梯度下降算法
上圖中的牛頓法,也能用於梯度下降的計算。牛頓法的還能在沒有
learning_rate
的情況下最小化loss
。大致的原理就是,我在下降的時候,如果有辦法知道這個
loss function
的最低點在哪,那麼我就能一步就到達這個最低點了。但是牛頓法貌似涉及整個黑賽矩陣的反轉,算法複雜度十分的高。雖然有
BGFS
和L-BGFS
做優化,但是在實踐中使用很罕見。最佳實踐
在實踐中,絕大多數情況下默認選擇
Adam
作爲梯度下降算法。如果內存等計算資源允許做全數據集的訓練(
full batch updates
),可以嘗試以下L-BGFS
。同時,可以利用
Model Ensemble
的原理。訓練多個獨立的模型,在測試階段,取所有模型分數的平均數。同樣的,取一個模型的多個
checkpoint
的平均值,也能使訓練結果有所提升。最後,可以保留一份運行時的參數的平均值用於測試,往往結果比原有的參數好。操作如下圖。
關於泰勒公式和牛頓法,繼續查資料學習體會一下,這裏還沒來得及深究。
三、Learning Rate的選擇
幾乎所有的梯度算法都用learning_rate
做hyperparameter
。因此選擇一個好的learning_rate
對於模型的訓練來說很重要。
上圖問,圖中最好的learning_rate
是哪一個?
不要說是紅色的。這個問題視具體情況而定。
在選擇learning_rate
時,一開始選擇一個高數值的lr
。可以看到high learning rate
的曲線可以使loss
急速下降,但是之後就到達一個瓶頸。
然後,運用下圖的幾種方法之一,來不斷削減lr
,再不斷進行訓練。
四、Dropout
Dropout
指的是,在forward pass
的過程當中,設置一個二進制的開關(就是隨機一個數字,然後和一個門檻做比較),以這樣的方式,隨機選擇一些neuron
將其值設置爲0
,也就是將其關閉或者說成丟棄dropout
。
實現方式如下。
Dropout的好處
做了
Dropout
之後,首先可以避免模型的overfitting
,因爲每次dropout
之後,模型的參數都變少了,參數越少,overfitting
的可能性越低。其次,
dropout
能讓模型有冗餘的能力。這個是我翻譯的,比較抽象。存儲中有冗餘代表數據更加安全,神經網絡中有冗餘,應該代表着神經網絡的能力越強大。用下圖說明。上圖中,如果沒有
dropout
的時候,模型有所有的5
個參數作爲判斷這張圖片是否是貓的依據,然後打分。如果使用了dropout
,意味着有隨機的幾個參數會被丟棄(置爲0
),這裏是有3
個參數被丟棄了,那麼這個模型只能依賴2
個參數來判斷這張圖片是否是貓。如果模型能夠在這樣的參數很少的苛刻的情況下訓練,並且做出正確的判斷。那麼這個模型在測試的時候的能力,肯定是高於沒有
dropout
的模型的。另外,使用
dropout
就是在使用model ensemble
。每一次dropout
,就訓練了一個sub neural network
,這些子神經網絡都共享着一份參數W
。如下圖。測試階段
在測試階段的時候,最好能夠整合所有的噪音(這點沒有懂誒,什麼是噪音…),在隨機
dropout
掉一些neuron
之後多次進行forward pass
,最後求出所有預測的平均值。也可以不使用
dropout
了,直接全開neuron
,然後只做一次forward pass
,然後求所有預測的平均值。如下圖。Dropout注意事項
如上圖,假設這個三個節點的模型設置了有
%50
的neuron
會被dropout
,那麼在訓練階段有dropout
的一個輸出x
,和測試階段沒有dropout
的輸出x
會是什麼關係?答案是,測試階段的
x
會是訓練階段x
的兩倍左右。如下圖。代碼實現如下,可以在測試(
predict
)的時候,將兩個參數H1
和H2
減半,才能得到和訓練階段一樣的輸出。可以像上圖一樣,在訓練階段
dropout
,在測試階段做scale
,將輸出減半。更加常用的是
invert dropout
,如下圖。在訓練階段將輸出除以
dropout
的概率,測試階段保持不變。
五、Convolutional Neural Network
歷史
convnet
起源於1959
年,Hubel & Wiesel
這兩人在研究貓的大腦神經對特定圖像的反應。他們發現貓的大腦對圖像在特定朝向上,神經元會被激活。
基於此他們建立了視覺區域中的位置和大腦皮質上的神經元是有地形上的映射的理論。
又基於這個理論,他們創建了視覺神經成像的層級關係。
成像,是從簡單到複雜逐級深入的。
前期工作
convnet
最早期的工作,是Fukushima
於1980年做出的。他的工作建立在Hubel & Wiesel
的理論之上。他建立一個稱爲
Neurocognitron
的神經網絡,當時還沒有backprop
的技術,只有forward pass
。直到1998年的時候,
LeCun, Bottou, Bengio, Haffner
開始了帶有backprop
的convnet
。2012年的時候,
Alex Krizhevsky, Sutskever, Hinton
,創建了Deep
。
Convolutional Neural NetworksAlexnet
與前人的不同在於,擁有了更大的數據集,並且使用了GPU
計算,但是在網絡架構方面,沒有太大的差別。