cs231n第4節(jié)課筆記

激活函數(shù)
先介紹了幾種激活函數(shù),sigmoid不管輸入是多少,都會激活為正數(shù)(副作用?)
tanh解決了sigmoid的問題,擁有正負數(shù),但是飽和的時候梯度很小
ReLU解決了tanh的問題,梯度很大,但是左側沒有梯度(徹底飽和),(所以W的初始化要比0大一點點,像0.01左右的隨機數(shù))
Leaky ReLU解決了ReLU的問題,左側有梯度
ELU解決了Leaky的問題,輸出均值為0(Leaky呢?)
還有種非主流激活方式:maxout,有ReLU和Leaky ReLU的作用,但是要雙倍的參數(shù)量(很像水平細胞?)

數(shù)據(jù)預處理
減去均值圖像 [32,32,3]? (如Alex Net)
或減去3通道均值 [3,]? ?(如VGGNet)

權重初始化
W都=0,不好,一個隱藏層的所有神經(jīng)元都會學到一樣的參數(shù)
W都=0.01左右的隨機值,網(wǎng)絡層數(shù)少可以,網(wǎng)絡層數(shù)多,網(wǎng)絡深層輸出分布會接近0,即W的更新梯度會趨近于0,網(wǎng)絡會更新不了
W都=1左右的隨機值,網(wǎng)絡層數(shù)多,網(wǎng)絡深層輸出分布會趨近于-1和1,因為tanh會處于飽和狀態(tài),W的梯度會趨近于0,網(wǎng)絡幾乎更新不了
W=Xavier更新方法,除以輸入的根號值,網(wǎng)絡層數(shù)多,網(wǎng)絡深層輸出分布會維持在高斯正態(tài)分布,所以梯度很健康,網(wǎng)絡可以繼續(xù)更新,如果加了ReLU,那就再除以根號2,如果是tanh,那就不知道怎么樣再搞一搞。
BN(Batch Normalization),在FC層/Conv層后,激活函數(shù)層前加入,使即使在網(wǎng)絡深層輸出也依然塑造成高斯正態(tài)分布。要是tanh不喜歡單位高斯正態(tài)分布咋辦?那就加入2個參數(shù)調整BN的“w和b”,讓網(wǎng)絡自己具有“改變BN幅度或取消BN”的能力。有了BN,網(wǎng)絡對權重初始化的高度依賴就大大減弱了,基本上普通的W=0.01左右的隨機值可以勝任訓練。

照看網(wǎng)絡寶寶的學習過程
sanity check:不帶reg(reg=0)地前向傳播一次,看看loss(softmax):和預期相同
sanity check:帶小reg(=1e3)地前向傳播一次,看看loss:和預期相同,稍微大了一點
在20個訓練集樣本上訓練,看看能不能過擬合:loss很小,accuracy=100%,過擬合成功,網(wǎng)絡沒問題
lr(學習率)=1e-6試試看:loss幾乎沒動(訓練集精度在上升),看來需要讓學習率增大一點
lr(learning rate)=1e6試試看:loss得到了溢出NaN,意味著學習率太大了
lr=3e-3試試看:loss得到了inf,學習率還是太大了

超參數(shù)優(yōu)化
在log范圍搜索(epoch=5)
reg = 10 ** uniform(-5, 5)
lr = 10 ** uniform(-3, -6)
不要網(wǎng)格搜索,要隨機數(shù)搜索(因為一個超參可能比另一個超參重要得多)