cs231n 課程作業 Assignment 1

2021-07-27 00:03:38 字數 3016 閱讀 3952

趁著在學校的時間,跟著 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課程筆記翻譯 線性分...