Part 1
一.Activation Function激活函數(shù)
當激活函數(shù)是線性的時候,兩層的神經(jīng)網(wǎng)絡(luò)就可以逼近所有的函數(shù)了茸炒。激活函數(shù)的作用就是給network加入非線性因素愕乎,因為線性模型盡管組合還是一個線性模型阵苇,對于數(shù)據(jù)的表達和分類效果不強。詳情
常用的激活函數(shù):
1.sigmoid函數(shù)存在三個問題:
1)當數(shù)據(jù)正太大和負太小時會陷入飽和感论,也就是梯度為0绅项,這時候back propagation的時候數(shù)據(jù)為0,kill了這個gradients
2)sigmoid輸出不是以0為中心的比肄。這會導(dǎo)致數(shù)據(jù)進入神經(jīng)元的時候是正的快耿,那么w計算出的梯度也會始終都是正的。而我們通常使用這種zigzag path去逼近最佳向量芳绩。
3)exp計算比較非時間
2.tanh函數(shù):比sigmoid好的地方是他是零均值的掀亥。
3.LeRU函數(shù)是今年受歡迎的一種函數(shù),存在幾個優(yōu)點:
1)在正區(qū)域不會飽和
2)計算更方便
3)收斂起來比sigmoid/tanh更快
但是缺點是在負區(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(歸一化)识脆,也有進行PCA和whitening的。但是對于image來說,一般采取兩種:
- 減掉mean image
- 減掉每個channel的mean
數(shù)據(jù)預(yù)處理可以很好的減低分類損失對于weight matrix的敏感度灼捂。比如下面离例,左邊直線稍微擺動影響要比右邊大很多。在深度學(xué)習中悉稠,也要保證第一層均值不為0宫蛆,方差不為0
三.權(quán)值初始化
常見的權(quán)值初始化方式:隨機小數(shù)。隨機小數(shù)又有好幾種設(shè)置:
- 全為0:代價函數(shù)將不會減少的猛,而且訓(xùn)練效果和預(yù)測效果都不好耀盗。這是因為權(quán)值設(shè)置全為0的網(wǎng)絡(luò)是對稱的,也就是說任一層的每個神經(jīng)單元將學(xué)習相同的權(quán)值卦尊,最終學(xué)習的結(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層之后進行淌友,在nonlinearity之前進行。
進行批量歸一化的步驟是:
- 對數(shù)據(jù)的每一維都計算平均值E和方差R骇陈。這樣當我們需要的時候也可以復(fù)原原來的數(shù)據(jù)
- 使用下面的公式進行歸一化:
五.調(diào)控學(xué)習過程
學(xué)習過程:
- 預(yù)處理數(shù)據(jù)
- 選擇框架震庭,多少層,多少個neuron
- 通過增加正則項你雌,看loss是否提高的方式來判斷l(xiāng)oss計算是否合理器联。
- 首先選擇少量數(shù)據(jù)訓(xùn)練,保證能過擬合這些數(shù)據(jù)婿崭,然后再加全量數(shù)據(jù)
- 學(xué)習率選擇:太小則loss更新很慢拨拓,太大loss會爆炸。通常的學(xué)習率在[1e-3,1e-5]之間氓栈。
六.Hyperparameter Optimization
當我們在進行參數(shù)調(diào)優(yōu)時渣磷,Random Layout有時會比Grid Layout更有效,因為這樣能增加達到較優(yōu)值的可能性授瘦。
七.Fancier optimization
1.帶沖量的SGD
前面我們使用了SGD來求得目標函數(shù)的最小值醋界,但是SGD存在著一些問題:
- 當loss在一個方向上變化快,一個方向上變化慢的時候提完,梯度會進入到曲折中形纺。
- 容易陷入局部最優(yōu)解和鞍點
為了解決這個問題,提出了一種更有效的方法徒欣,就是在SGD的基礎(chǔ)上加上一個沖量逐样。
這里的rho是摩擦系數(shù),通常取0.95或0.9。通過這種操作脂新,在最小點和鞍點的時候秽澳,就算梯度為0,沖量也不為0戏羽,可以沖過最小點和鞍點担神。
還有更好的是Nesterov Momentum:
2.RMSProp
RMSProp是AdaGrad的變體,解決了AdaGrad對于局部最小值學(xué)習率逐漸下降直到為0的問題始花。
3.Adam算法:Adam是上面幾種算法的集合妄讯。
4.learning rate decay
先不用decay,然后看看學(xué)習率酷宵,再加上學(xué)習率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都是一次隨機選擇,這樣就相當于一個超級巨大的網(wǎng)絡(luò)庫進行訓(xùn)練朦前。
但是Dropout在測試的時候就不是特別的好介杆,因為需要減少這種隨機性,否則會對測試結(jié)果造成不必要的改變韭寸。這樣就需要一些處理春哨。
先對簡單的加以判斷,對于一個簡單的x+y--> a的網(wǎng)絡(luò)恩伺,測試時我們就只想得到w1x+w2y的均值赴背,但是在訓(xùn)練時由于Dropout選擇不同,均值就只有1/2(w1x+w2y)莫其。所以我們就想到能不能再測試的時候乘以癞尚,或者訓(xùn)練的時候除以dropout概率。當然更傾向于訓(xùn)練的時候除以概率乱陡,因為訓(xùn)練可以在高配置機器上長時間運行浇揩。
九.Transfer Learning遷移學(xué)習
遷移學(xué)習其實就是當我們遇到的問題和數(shù)據(jù)跟原有的一些問題和數(shù)據(jù)有聯(lián)系的時候應(yīng)該怎么利用好原來的數(shù)據(jù)。比如憨颠,當我們想要處理一些自己的動植物的圖片胳徽,只要使用好ImageNet預(yù)訓(xùn)練的模型积锅,在最上面加個線性分類器就行了。
cs231n assignment實現(xiàn)在這:https://github.com/oubindo/cs231n-cnn