CS231n 課後作業第二講:Assignment 2
CS231n 是斯坦福大學開設的計算機視覺與深度學習的入門課程,授課內容在國內外頗受好評。其配套的課後作業質量也頗高,因此雷鋒網 AI 研習社在近期的線上公開課上請來了一位技術大牛為大家來講解這門課的配套作業。
本文根據 AI 研習社公開課上的直播視頻內容整理而成,主要介紹 CS231n 課後作業第二套 Assignment 2 的完成思路與重點部分代碼實現。如果你還沒開始聽 CS231n,可直接點擊課程鏈接觀看回放視頻。
王煦中,CS 碩士,主要研究方向為自然語言處理與深度學習。知乎專欄喵神大人的深度工坊(http://t.cn/RTc9wfy)作者,日語及 ACGN 愛好者。
分享主題
CS231n 課後作業第二講 : Assignment 2(含代碼實現)作業鏈接:https://github.com/Observerspy/CS231n
分享提綱
Part 1 Fully-connected Neural Network
Part 2 Batch Normalization
Part 3 Dropout
Part 4 Convolutional Networks
Part 5 Tensorflow on CIFAR-10
第一部分分享主要是全連接神經網路,這裡主要是對代碼進行模塊化,把每一層都抽象出來,分別實現每一層的前向和反向部分,實現多層神經網路。第二和第三部分講的是神經網路中兩個的重要技巧,對網路訓練有很大的提升。本次作業中比較難的部分是卷積神經網路的實現,包括正向和反向的推導過程。
第一個部分是對代碼的模塊化處理,實現從兩層到多層神經網路。
關於 Update rules
第一個改變是加入了動量更新,也就是慣性。第二個是 RMSProp(自適應學習率),第三個是 Adam(兩者結合),其實是上面兩個方法的結合,如果拿不準使用哪個方法,就用 Adam。
為什麼需要 BN(Batch Normalization )?
傳統機器學習往往需要對輸入數據做一個歸一化,通常使用的是零均值和方差歸一,這樣會保證輸入的數據特徵會有比較好的分布,使得演算法可以比好好的學習。對於深度學習神經網路,使用 BN 使得每一層分布都保持在良好範圍內。
BN 的原理
在求均值,求方差,歸一化這三步做完之後,每一層的數據分布都是標準正太分布,導致其完全學習不到輸入數據的特徵。BN 第四步中最關鍵的是兩個參數,這兩個參數對歸一化後的分母進行縮放和平移,通過網路自己學習平移和縮放來保留一定的特徵。
訓練過程
前向就是計算 minibatch 的均值和方差,然後對 minibatch 做 normalize 和 scale、shift。測試的時候沒有 minibatch,通過使用基於 momentum 的指數衰減,從而估計出均值和方差。
反向過程
BN 的作用
可以有效減緩過擬合,減小不好的初始化影響,可以用大一點的學習率。通常放在激勵函數前效果好一點。
Dropout 原理
訓練時以概率 P 保留神經元,測試時所有神經元都參與。通常在測試的時候使用 inverted dropout 多移除一個 p 保證訓練預測分布的統一。
Dropout 的作用
可以有效緩解過擬合,通常 dropout 放在激勵函數的後面或者全連接層後。
接下里來看怎麼實現一個卷積神經網路
卷積神經網路通常有三個單元結構,分別是卷積核,激活函數,池化層。先看卷積核,首先明確輸入 x 和卷積核的形狀 (數量,通道,高,寬)。
卷積核
這裡的卷積和通信原理里的卷積還是稍有區別的,在這裡其實只是卷積核和相應的區域進行元素乘,然後求和,課程官網給的說明十分形象生動。
也就是每個卷積核分別在每個通道上和對應區域進行元素乘,然後求和,對應圖中:(-3(通道 1 元素乘後求和) + -1(通道 2 元素乘後求和) + 0 (通道 3 元素乘後求和))(三個通道求和) + 1(bias_0) = -3(out 的第一個格子里的值)
所以,關鍵問題就是根據步長如何確定 x 對應區域,這裡需要對 Hnew(下標 i)和 Wnew(下標 j)進行雙循環。選好區域直接和每個卷積(下標 k)核作元素乘就行了,注意 sum 的時候我們其實是在(C, H, W)上作的,因此 axis=(1, 2, 3)。這時候一個輸出 out[:, k , i, j] 就計算好了。
所以上述一共套了 i, j ,k 三層循環,循環完畢後 out 再加上 bias 就行了。注意 b 的形狀 (F,),因此要先把 b 擴展成和 out 一樣的形狀:b[None, :, None, None](None 相當於 np.newaxis)
以上就是前向計算,接下來是反向計算。
反向計算首先明確我們要求什麼。求 dx,dw 和 db。
卷積核的三個導數具體的求解過程,請關注 AI 慕課學院視頻回放(http://www.mooc.ai/open/course/440)。
池化層
pooling 同樣有步長,確定輸出形狀的公式,計算輸出形狀並初始化,max pooling 顧名思義就是取這個 pooling 大小區域內的 max 值。注意 axis=(2, 3)。
反向和 ReLU、DropOut 是類似的,也就是說只有剛才前向通過的才允許繼續傳遞梯度。
max_mask 形狀是 (HH, WW),為了和 x_padded_mask 形狀對應也要擴展。然後 dout 和這個 temp_binary_mask 元素乘即可。同樣注意 dout 是由 i,j 確定的,因此形狀需要擴展。
以前我們做的 BN 形狀是 (N, D),這裡不過是將 (N, C, H, W)reshape 為 (N*H*W, C)。
最後進入 TensorFlow
以上就是本次的課後作業指導分享。
AI 慕課學院提供本次視頻回放(http://www.mooc.ai/open/course/440),歡迎觀看。
NLP 工程師入門實踐班:基於深度學習的自然語言處理
三大模塊,五大應用,手把手快速入門 NLP
海外博士講師,豐富項目經驗
演算法 + 實踐,搭配典型行業應用
隨到隨學,專業社群,講師在線答疑
新人福利
關注 AI 研習社(okweiwu),回復1領取
【超過 1000G 神經網路 / AI / 大數據,教程,論文】
CS231n 2017 今天正式開課!雙語字幕版獨家上線!
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※基於結構化 SVM 進行序列標註
※用基於 TensorFlow 的強化學習在 Doom 中訓練 Agent
TAG:AI研習社 |