
Part 1
一.Activation Function激活函數(shù)

當(dāng)激活函數(shù)是線性的時候,兩層的神經(jīng)網(wǎng)絡(luò)就可以逼近所有的函數(shù)了。激活函數(shù)的作用就是給network加入非線性因素,因為線性模型盡管組合還是一個線性模型,對于數(shù)據(jù)的表達(dá)和分類效果不強。詳情
常用的激活函數(shù):

1.sigmoid函數(shù)存在三個問題:
1)當(dāng)數(shù)據(jù)正太大和負(fù)太小時會陷入飽和,也就是梯度為0,這時候back propagation的時候數(shù)據(jù)為0,kill了這個gradients
2)sigmoid輸出不是以0為中心的。這會導(dǎo)致數(shù)據(jù)進(jìn)入神經(jīng)元的時候是正的,那么w計算出的梯度也會始終都是正的。而我們通常使用這種zigzag path去逼近最佳向量。

3)exp計算比較非時間
2.tanh函數(shù):比sigmoid好的地方是他是零均值的。
3.LeRU函數(shù)是今年受歡迎的一種函數(shù),存在幾個優(yōu)點:
1)在正區(qū)域不會飽和
2)計算更方便
3)收斂起來比sigmoid/tanh更快
但是缺點是在負(fù)區(qū)域還是會飽和,并且很容易就die了。舉個例子,一個非常大的梯度流過一個 ReLU 神經(jīng)元,更新過參數(shù)之后,這個神經(jīng)元再也不會對任何數(shù)據(jù)有激活現(xiàn)象了。實際操作中,learning rate較大時神經(jīng)元容易die,較小時發(fā)生的較少。

4.Leaky-ReLU,P-ReLU,R-ReLU
這些都是ReLU的變體,為了解決dying ReLU的問題。最終效果眾說紛紜。
5.Maxout:ReLU和Leaky-ReLU的泛化形式,不會飽和也不會die。缺點是參數(shù)被double了。
如何選擇激活函數(shù)?
- 如果使用ReLU,那么一定要小心設(shè)置 learning rate,而且要注意不要讓你的網(wǎng)絡(luò)出現(xiàn)很多 “dead” 神經(jīng)元,如果這個問題不好解決,那么可以試試 Leaky ReLU、PReLU 或者 Maxout.
- 最好不要用 sigmoid,你可以試試 tanh,不過可以預(yù)期它的效果會比不上 ReLU 和 Maxout.
- 很少會把各種激活函數(shù)串起來在一個網(wǎng)絡(luò)中使用的。
二.數(shù)據(jù)預(yù)處理
常見的數(shù)據(jù)預(yù)處理方式有zero-centered(減去平均值)和normalized(歸一化),也有進(jìn)行PCA和whitening的。但是對于image來說,一般采取兩種:
- 減掉mean image
- 減掉每個channel的mean
數(shù)據(jù)預(yù)處理可以很好的減低分類損失對于weight matrix的敏感度。比如下面,左邊直線稍微擺動影響要比右邊大很多。在深度學(xué)習(xí)中,也要保證第一層均值不為0,方差不為0

三.權(quán)值初始化
常見的權(quán)值初始化方式:隨機小數(shù)。隨機小數(shù)又有好幾種設(shè)置:
- 全為0:代價函數(shù)將不會減少,而且訓(xùn)練效果和預(yù)測效果都不好。這是因為權(quán)值設(shè)置全為0的網(wǎng)絡(luò)是對稱的,也就是說任一層的每個神經(jīng)單元將學(xué)習(xí)相同的權(quán)值,最終學(xué)習(xí)的結(jié)果也是線性的,因此效果甚至還沒有單個線性回歸分類的效果有效。
- 初始化為大值:代價函數(shù)非常大,幾乎所有的神經(jīng)都會飽和為1或-1,最終梯度值為0
通常我們會使用Xavier initialization。
W = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in)
四.Batch Normalization
歸一化操作通常在FC或conv層之后進(jìn)行,在nonlinearity之前進(jìn)行。

進(jìn)行批量歸一化的步驟是:
- 對數(shù)據(jù)的每一維都計算平均值E和方差R。這樣當(dāng)我們需要的時候也可以復(fù)原原來的數(shù)據(jù)
- 使用下面的公式進(jìn)行歸一化:
image
五.調(diào)控學(xué)習(xí)過程
學(xué)習(xí)過程:
- 預(yù)處理數(shù)據(jù)
- 選擇框架,多少層,多少個neuron
- 通過增加正則項,看loss是否提高的方式來判斷l(xiāng)oss計算是否合理。
- 首先選擇少量數(shù)據(jù)訓(xùn)練,保證能過擬合這些數(shù)據(jù),然后再加全量數(shù)據(jù)
- 學(xué)習(xí)率選擇:太小則loss更新很慢,太大loss會爆炸。通常的學(xué)習(xí)率在[1e-3,1e-5]之間。
六.Hyperparameter Optimization
當(dāng)我們在進(jìn)行參數(shù)調(diào)優(yōu)時,Random Layout有時會比Grid Layout更有效,因為這樣能增加達(dá)到較優(yōu)值的可能性。

七.Fancier optimization
1.帶沖量的SGD
前面我們使用了SGD來求得目標(biāo)函數(shù)的最小值,但是SGD存在著一些問題:
- 當(dāng)loss在一個方向上變化快,一個方向上變化慢的時候,梯度會進(jìn)入到曲折中。
image - 容易陷入局部最優(yōu)解和鞍點
為了解決這個問題,提出了一種更有效的方法,就是在SGD的基礎(chǔ)上加上一個沖量。

這里的rho是摩擦系數(shù),通常取0.95或0.9。通過這種操作,在最小點和鞍點的時候,就算梯度為0,沖量也不為0,可以沖過最小點和鞍點。
還有更好的是Nesterov Momentum:

2.RMSProp
RMSProp是AdaGrad的變體,解決了AdaGrad對于局部最小值學(xué)習(xí)率逐漸下降直到為0的問題。

3.Adam算法:Adam是上面幾種算法的集合。

4.learning rate decay
先不用decay,然后看看學(xué)習(xí)率,再加上學(xué)習(xí)率decay,觀看效果
八.Regularition
正則是提高算法性能的方法。常見的有L2,L1和Elastic net.

但是這個正則法在大型神經(jīng)網(wǎng)絡(luò)中不能實現(xiàn)。大型網(wǎng)絡(luò)中通常使用的是Dropout。
Dropout是在一個網(wǎng)絡(luò)層(通常選擇FC層)中隨機的選擇部分節(jié)點,將他們的激活函數(shù)設(shè)置為0。

這樣的好處有兩點:
- 通過將部分神經(jīng)元置零,可以避免特征之間的互相適應(yīng),一定程度上減少了過擬合。
- 每一次Dropout都是一次隨機選擇,這樣就相當(dāng)于一個超級巨大的網(wǎng)絡(luò)庫進(jìn)行訓(xùn)練。
但是Dropout在測試的時候就不是特別的好,因為需要減少這種隨機性,否則會對測試結(jié)果造成不必要的改變。這樣就需要一些處理。
先對簡單的加以判斷,對于一個簡單的x+y--> a的網(wǎng)絡(luò),測試時我們就只想得到w1x+w2y的均值,但是在訓(xùn)練時由于Dropout選擇不同,均值就只有1/2(w1x+w2y)。所以我們就想到能不能再測試的時候乘以,或者訓(xùn)練的時候除以dropout概率。當(dāng)然更傾向于訓(xùn)練的時候除以概率,因為訓(xùn)練可以在高配置機器上長時間運行。
九.Transfer Learning遷移學(xué)習(xí)
遷移學(xué)習(xí)其實就是當(dāng)我們遇到的問題和數(shù)據(jù)跟原有的一些問題和數(shù)據(jù)有聯(lián)系的時候應(yīng)該怎么利用好原來的數(shù)據(jù)。比如,當(dāng)我們想要處理一些自己的動植物的圖片,只要使用好ImageNet預(yù)訓(xùn)練的模型,在最上面加個線性分類器就行了。

cs231n assignment實現(xiàn)在這:https://github.com/oubindo/cs231n-cnn

