趁著在學校的時間,跟著 cs231n 的課程做了一下作業,感覺收穫特別大,現在彙總在部落格裡。下面是一些官方的課程資料:
網頁備註
課程主頁
主頁課程介紹,瀏覽器也可以跑深度學習
課程官方筆記
貌似要 fq 軟體支援
syllabus
還有一些其他有用的非官方資料:
網頁備註
課程中文翻譯
網易雲課堂提供
作業參考
來自 github@lightaime 的**
我的作業**請參考 github@halfish/cs231n
完成 這裡 的課程筆記中 module 1: neural networks 的閱讀。作業要求見 assignment #1: image classification, knn, svm, softmax, neural network,主要需要完成 knn,svm,softmax分類器,還有乙個兩層的神經網路分類器的實現。
課程設定的很合理,需要依次完成兩層迴圈、一層迴圈,最後完全用 numpy 的矩陣操作來實現邏輯。有點麻煩,但是都是因為對 numpy 不太熟悉,邏輯上其實沒有什麼難點。函式 compute_distances_no_loops 的三行** 有點一時難以想到,不過看了別人**也就很好理解了。
支援向量機和後面的 softmax 分類器都是線性模型,這裡只是損失函式不同罷了。閱讀文件 linear classification: support vector machine, softmax 大概就知道什麼線性模型了。
對於 svm 而言,分類器輸入樣本 xi
後,對第
j 個 類別的評分是: sj
=f(x
i,w)
j如果是 multiclass svm loss,具體對第
i 個樣本的損失為: li
=∑j≠
yimax(0,
sj−s
yi+δ
)當然,損失應該還包括正則化項,比較簡單就略過了。
反向傳播就比較麻煩一點,因為要用隨機梯度下降的迭代方法,所以要計算梯度。讀完文件 optimization: stochastic gradient descent,可以找到 svm 的梯度是:⎧⎩
⎨⎪⎪⎪
⎪⎪⎪∇
wyil
i=∇w
jli=
−⎛⎝∑
j≠yi
1(wt
jxi−
wtyi
xi+δ
>0)
⎞⎠xi
1(wt
jxi−
wtyi
xi+δ
>0)
xij=
yij≠
yi具體需要完成 svm.ipynb 中的**,具體的理論推導得出的梯度計算是否正確,會有 gradient check 的數值計算方式來檢查。
softmax 是和 svm 一起對比介紹的,只是把 hinge loss 換成 cross-entropy loss,即交叉熵損失而已,如下:li
=−log⎛⎝e
fyi∑
jefj
⎞⎠or equivalentlyli
=−fy
i+log∑je
fj而要算梯度就麻煩一點,課程文件裡也沒有給公式,我推了一下寫在下邊,如果有錯誤請讀者批評指正,⎧⎩
⎨⎪⎪⎪
⎪⎪⎪⎪
⎪⎪⎪∇
wyil
i=∇w
jli=
−xi+
efyi
∑jef
jxie
fj∑j
efjx
ij=y
ij≠y
i 在 putting it together: minimal neural network case study 裡,構造了乙個二維的資料集,用 softmax 和 2-layer neural network 來做實驗。完成 softmax.ipynb 的時候,計算 loss 和梯度都可以參考這篇筆記。
補充解釋一下,前面的 loss function 是怎麼來的呢?其實就是交叉熵。回憶一下交叉熵的公式,h(
p,q)
=−∑j
pjlogq
j ,其中向量
p 是原始的分布,這裡指的是 ground-truth label,具體是 one-hot 編碼結果。
q則是模型**的輸出,可以看做是對 qj
=efj
∑jef
j ,由於
p 裡面一堆的零,那麼顯然只有 label 那項會保留下來。所以最後的結果就是 li
。再考慮交叉熵,因為 h(
p,q)
=h(p
)+dk
l(p∥
q),而 h(
p)=0
,所以最小化交叉熵,其實就是最小化 kl
散度。也就是想讓兩個分布盡量相同。
上面是資訊理論的角度來看 softmax,其實也可以用概率的角度來解釋,即把結果看做是對每個類別**分類的概率值,p(
yi|x
i;w)
=efy
i∑je
fj,因為有歸一化的步驟,所以可以看做合法的概率值。
這部分內容較多一點,要完成三個文件,
前向傳播和計算 loss 的邏輯和 softmax 分類器差不多,難點在於梯度的計算。因為要涉及矩陣對矩陣的梯度計算。可以參考課程筆記中 gradients for vectorized operations 的內容。總結起來就是,通過矩陣的維度匹配來記憶梯度的計算規則。後向傳播的梯度也是一層層計算下去的。注意 relu 的導數,我寫作了:dhidden[hidden_layer <= 1e-5] = 0
,裡面的1e-5
而不是0
,是為了避免精度損失帶來的計算誤差。
完成 two_layer_net.ipynb 中的**。
這裡講的是提取特徵,要補全的**也是用來找最優引數的,模型的**要跑很久而且感覺用處不大,所以就懶得寫了。
後面的兩次作業的博文見:
CS231n 課程作業 環境搭建(0806)
anaconda指的是乙個開源的python發行版本,包括conda python以及一大堆安裝好的工具包,比如 numpy pandas等 第一次安裝,選擇了python 3.8 64位 可能會因為版本過新出現問題trying 在安裝時,選擇了新增環境變數,竟然不推薦,那麼記住這件事,後面通過其他...
CS231n課程筆記翻譯
賀完結!cs231n官方筆記授權翻譯總集篇發布 智慧型單元 知乎專欄 cs231n課程筆記翻譯 影象分類筆記 上 智慧型單元 知乎專欄 cs231n課程筆記翻譯 影象分類筆記 下 智慧型單元 知乎專欄 cs231n課程筆記翻譯 線性分類筆記 上 智慧型單元 知乎專欄 cs231n課程筆記翻譯 線性分...
CS231n課程筆記翻譯
賀完結!cs231n官方筆記授權翻譯總集篇發布 智慧型單元 知乎專欄 cs231n課程筆記翻譯 影象分類筆記 上 智慧型單元 知乎專欄 cs231n課程筆記翻譯 影象分類筆記 下 智慧型單元 知乎專欄 cs231n課程筆記翻譯 線性分類筆記 上 智慧型單元 知乎專欄 cs231n課程筆記翻譯 線性分...