史丹佛CS231n課程筆記純乾貨1

marsjhao發表於2020-04-06

CS231n的全稱是CS231n: Convolutional Neural Networks for Visual Recognition,即面向視覺識別的卷積神經網路。該課程是史丹佛大學計算機視覺實驗室推出的課程。目前大家說CS231n,大都指的是2016年冬季學期(一月到三月)的版本。

1. 分類器中L1和L2比較。

在面對兩個向量之間的差異時,L2比L1更加不能容忍這些差異,相對於1個巨大的差異,L2距離更傾向於接受多箇中等程度的差異。

2. k-Nearest Neighbor分類器存在以下不足

分類器必須記住所有訓練資料並將其儲存起來,以便於未來測試資料用於比較。這在儲存空間上是低效的,資料集的大小很容易就以GB計。對一個測試影像進行分類需要和所有訓練影像作比較,演算法計算資源耗費高

Nearest Neighbor分類器在某些特定情況(比如資料維度較低)下,可能是不錯的選擇。但是在實際的影像分類工作中,很少使用。

實際應用流程:

1) 預處理你的資料:對你資料中的特徵進行歸一化(normalize),讓其具有零平均值(zeromean)和單位方差(unit variance)。

2) 如果資料是高維資料,考慮使用降維方法,比如PCA或隨機投影

3) 將資料隨機分入訓練集和驗證集。按照一般規律,70%-90% 資料作為訓練集。如果需要預測的超引數很多,那麼就應該使用更大的驗證集來有效地估計它們。如果擔心驗證集數量不夠,那麼就嘗試交叉驗證方法。

4) 在驗證集上調優,嘗試足夠多的k值,嘗試L1和L2兩種範數計算方式。

5) 如果分類器跑得太慢,嘗試使用Approximate Nearest Neighbor庫(比如FLANN)來加速這個過程,其代價是降低一些準確率。

6) 對最優的超引數做記錄千萬不要在最終的分類器中使用驗證集資料,這樣做會破壞對於最優引數的估計。直接使用測試集來測試用最優引數設定好的最優模型,得到測試集資料的分類準確率,並以此作為你的kNN分類器在該資料上的效能表現。

3. 驗證集、交叉驗證集和超引數調優

特別注意:決不能使用測試集來進行調優測試資料集只使用一次,即在訓練完成後評價最終的模型時使用。調優策略從訓練集中取出一部分資料用來調優,我們稱之為驗證集(validation set。把訓練集分成訓練集和驗證集。使用驗證集來對所有超引數調優。最後只在測試集上跑一次並報告結果。

交叉驗證:

常用的資料分割模式。給出訓練集和測試集後,訓練集一般會被均分。這裡是分成5份。前面4份用來訓練,黃色那份用作驗證集調優。如果採取交叉驗證,那就各份輪流作為驗證集。最後模型訓練完畢,超引數都定好了,讓模型跑一次(而且只跑一次)測試集,以此測試結果評價演算法。

4. 線性分類器

將影像看做高維度的點:既然影像被伸展成為了一個高維度的列向量,那麼我們可以把影像看做這個高維度空間中的一個點(即每張影像是3072維空間中的一個點)。整個資料集就是一個點的集合,每個點都帶有1個分類標籤。

如下圖,影像空間的示意圖。其中每個影像是一個點,有3個分類器。以紅色的汽車分類器為例,紅線表示空間中汽車分類分數為0的點的集合,紅色的箭頭表示分值上升的方向。所有紅線右邊的點的分數值均為正,且線性升高。紅線左邊的點分值為負,且線性降低。

5. 損失函式

多類支援向量機損失Multiclass Support Vector Machine Loss

第i個資料中包含影像的畫素和代表正確類別的標籤。評分函式輸入畫素資料,然後通過公式來計算不同分類類別的分值。這裡我們將分值簡寫為s。比如,針對第j個類別的得分就是第j個元素:。針對第i個資料的多類SVM的損失函式定義如下:

SVM的損失函式想要正確分類類別的分數比不正確類別分數高,而且至少要高。如果不滿足這點,就開始計算損失值。

正則化(Regularization)

我們希望能向某些特定的權重W新增一些偏好,對其他權重則不新增,以此來消除模糊性。這一點是能夠實現的,方法是向損失函式增加一個正則化懲罰(regularization penalty)R(W)部分。最常用的正則化懲罰是L2正規化,L2正規化通過對所有引數進行逐元素的平方懲罰來抑制大數值的權重:

包含正則化懲罰後,就能夠給出完整的多類SVM損失函式了,它由兩個部分組成:資料損失(data loss),即所有樣例的的平均損失Li,以及正則化損失(regularization loss)。完整公式如下所示:

將其展開完整公式是:

Softmax分類器

交叉熵損失cross-entropy loss)。公式如下:

 或等價的 

在上式中,使用fj來表示分類評分向量f中的第j個元素。

SVM和Softmax的比較

Softmax分類器為每個分類提供了“可能性”。 softmax分類器算出來的概率最好是看成一種對於分類正確性的自信。和SVM一樣,數字間相互比較得出的大小順序是可以解釋的,但其絕對值則難以直觀解釋softmax分類器對於分數是永遠不會滿意的:正確分類總能得到更高的可能性,錯誤分類總能得到更低的可能性,損失值總是能夠更小。但是,SVM只要邊界值被滿足了就滿意了,不會超過限制去細微地操作具體分數。這可以被看做是SVM的一種特性。

更多關注:MNIST在TensorFlow上的Softmax迴歸模型實現

6. 梯度下降

梯度下降是對神經網路的損失函式最優化中最常用的方法。

小批量資料梯度下降(Mini-batch gradient descent):在大規模的應用中(比如ILSVRC挑戰賽),訓練資料可以達到百萬級量級。如果像這樣計算整個訓練集,來獲得僅僅一個引數的更新就太浪費了。一個常用的方法是計算訓練集中的小批量(batches)資料。

7. 梯度反向傳播

加法門單元把輸出的梯度相等地分發給它所有的輸入,這一行為與輸入值在前向傳播時的值無關。這是因為加法操作的區域性梯度都是簡單的+1,所以所有輸入的梯度實際上就等於輸出的梯度,因為乘以1.0保持不變。上例中,加法門把梯度2.00不變且相等地路由給了兩個輸入。

取最大值門單元對梯度做路由。和加法門不同,取最大值門將梯度轉給其中一個輸入,這個輸入是在前向傳播中值最大的那個輸入。這是因為在取最大值門中,最高值的區域性梯度是1.0,其餘的是0。上例中,取最大值門將梯度2.00轉給了z變數,因為z的值比w高,於是w的梯度保持為0。

乘法門單元相對不容易解釋。它的區域性梯度就是輸入值,但是是相互交換之後的,然後根據鏈式法則乘以輸出值的梯度。上例中,x的梯度是-4.00x2.00=-8.00。

8. 神經網路基本概念

一個兩層的神經網路計算公式是

非線性函式在神經網路的計算上是至關重要的,如果略去這一步,那麼兩個矩陣將會合二為一,對於分類的評分計算將重新變成關於輸入的線性函式。

二分類Softmax分類器。舉例來說,可以把看做其中一個分類的概率,其他分類的概率為,因為它們加起來必須為1。根據這種理解,可以得到交叉熵損失。然後將它最優化為二分類的Softmax分類器(也就是邏輯迴歸)

二分類SVM分類器。或者可以在神經元的輸出外增加一個最大邊界折葉損失(max-margin hinge loss)函式,將其訓練成一個二分類的支援向量機。

理解正則化。在SVM/Softmax的例子中,正則化損失從生物學角度可以看做逐漸遺忘,因為它的效果是讓所有突觸權重在引數更新過程中逐漸向著0變化。

9. 常用啟用函式

左邊是Sigmoid非線性函式,將實數壓縮到[0,1]之間。右邊是tanh函式,將實數壓縮到[-1,1]。

Sigmoid的兩個主要缺點Sigmoid函式飽和使梯度消失Sigmoid函式的輸出不是零中心的

Tanh:

左邊是ReLU(校正線性單元:Rectified Linear Unit)啟用函式,當x = 0時函式值為0。當x>0函式的斜率為1。右邊圖表指明使用ReLUtanh收斂快6

ReLU。在近些年ReLU變得非常流行。它的函式公式是。換句話說,這個啟用函式就是一個關於0的閾值(如上圖左側)。使用ReLU有以下一些優缺點:

優點1:相較於sigmoid和tanh函式,ReLU對於隨機梯度下降的收斂有巨大的加速作用。這是由它的線性,非飽和的公式導致的。

優點2:sigmoid和tanh神經元含有指數運算等耗費計算資源的操作,而ReLU可以簡單地通過對一個矩陣進行閾值計算得到。

缺點:在訓練的時候,ReLU單元比較脆弱並且可能死掉如果學習率設定得太高,可能會發現網路中40%的神經元都會死掉(在整個訓練集中這些神經元都不會被啟用)。通過合理設定學習率,這種情況的發生概率會降低。

Leaky ReLU。Leaky ReLU是為解決“ReLU死亡問題的嘗試。

Maxout。Maxout神經元就擁有ReLU單元的所有優點(線性操作和不飽和),而沒有它的缺點(死亡的ReLU單元)。然而和ReLU對比,它每個神經元的引數數量增加了一倍,這就導致整體引數的數量激增

最後需要注意一點:在同一個網路中混合使用不同型別的神經元是非常少見的,雖然沒有什麼根本性問題來禁止這樣做。

一句話ReLU非線性函式。注意設定好學習率,或許可以監控你的網路中死亡的神經元佔的比例。如果單元死亡問題困擾你,就試試Leaky ReLU或者Maxout,不要再用sigmoid了。也可以試試tanh,但是其效果應該不如ReLU或者Maxout。

10. 神經網路結構

最普通的層的型別是全連線層fully-connected layer

命名規則當我們說N層神經網路的時候,我們沒有把輸入層算入。

前向傳播。全連線層的前向傳播一般就是先進行一個矩陣乘法,然後加上偏置並運用啟用函式。

輸出層。和神經網路中其他層不同,輸出層的神經元一般是不會有啟用函式的(或者也可以認為它們有一個線性相等的啟用函式)。

卷積神經網路的情況卻不同,在卷積神經網路中,對於一個良好的識別系統來說,深度是一個極端重要的因素。

過擬合Overfitting是網路對資料中的噪聲有很強的擬合能力而沒有重視資料間(假設)的潛在基本關係。防止神經網路的過擬合有很多方法(L2正則化,dropout和輸入噪音等)。

不應該因為害怕出現過擬合而使用小網路。相反,應該進儘可能使用大網路,然後使用正則化技巧來控制過擬合。

相關文章