2017CS231n筆記_S3損失函數和優化

目錄

S3.1損失函數

S3.2優化


S3.1損失函數

背景

假設有3張圖像的訓練集,S2.3中使用某個W來進行對圖像進行預測,得到了這三張圖像分別在10個分類上的得分。得分即是模型的預測值或者輸出值。

損失函數(loss function)

損失函數用於度量模型權重W的好壞。損失函數將W作爲輸入,然後得到一個損失值,定量的估計W的好壞。依據損失函數,就可以評估W是好是壞。使用L_{i}(\hat{y},y)表示樣本的損失函數,其中\hat{y}以及s是模型的輸出,設\hat{y}=s=f(x_{i},W)y是樣本的標籤。則整個數據集的損失L是:

L=\frac{1}{N}\sum_{i}^{N}L_{i}(f(x_{i},W),y_{i})

其中N是樣本集的個數。假如W使得L爲0,那麼2W,3W同樣使得L爲0。由於使得L爲0的W不唯一,那麼就需要一個準則來確定選擇哪個W。爲了防止模型過度擬合訓練數據從而導致測試集表現不好,在L上加入正則項R(W)。這促使模型以某種方式選擇更簡單的W。這裏的簡單取決於任務的規模和模型的種類。同時也體現了奧卡姆剃刀原則。因此,整個數據集的損失L爲:

L=\frac{1}{N}\sum_{i}^{N}L_{i}(f(x_{i},W),y_{i})+\lambda R(W)

其中\lambda是平衡數據方面損失和正則項的超參數。這個參數是需要在實際中進行調整的。歸一化函數在後面會詳細講解。

對於圖像分類任務來說,有多個不同的損失函數L_{i}(\hat{y},y)。這裏給出兩種損失函數。一種是多分類SVM損失函數,另一種是Softmax損失函數。

1.hinge loss(多分類SVM損失函數)

多分類SVM是處理多分類的SVM。使用C表示類別個數。對於一幅圖像,使用c表示該圖像真實的類,s_{j}表示該圖像在其他類的得分,s_{c}表示該圖像在真實的類的得分。則損失函數L_{i}爲:

L_{i}=\sum_{j\neq c}^{C}\left\{\begin{matrix} 0 & if s_{c}>s_{j}+1\\ s_{j} -s_{c}+1& otherwise \end{matrix}\right.=\sum_{j\neq c}^{C}max(0,s_{j} -s_{c}+1)

函數中的1是截斷值(閾值)。閾值的選擇並不是很重要。當某個得分有一點點改變時,由於閾值的存在,損失函數的值不會改變。該損失函數是在所有錯誤的分類上做和,將正確分類的分數和錯誤分類的分數進行比較 。如果在所有類別上,正確分類的分數比錯誤分類的分數高出某個安全的邊距(1),則損失爲0。損失函數的最小值爲0,最大值爲無窮大。該損失關心這個分數的相對差值。希望正確類別的輸出值遠大於不正確類別的輸出值。考慮以下情況:

  • 假設最開始使用很小的值來初始化W,並且開始訓練,這樣的話,訓練初期,模型的得分是較小的符合平均分佈的值。當所有的得分接近爲0時,損失函數的值爲C-1。
  • 如果將損失函數由求和變爲求平均的話,損失函數的值不變。
  • 如果在max上加個平方,那麼損失函數的值會變。損失函數量化不同的錯誤有多壞。加平方,是指同樣的錯誤會更加的不好。是否加平方,需要看當時的應用。

2.cross-entropy loss(Softmax)

在實際中,更常用的是交叉熵損失。先使用多項邏輯斯蒂迴歸(multinomial logistic regression)或者Softmax(概率分佈函數)來對得分進行轉換。在SVM中,類別的得分是沒有意義的。而在Softmax中,爲這些得分添加了一些其他的含義。Softmax將所有的輸出得分轉化爲0-1之間的概率值,所有的概率值之和爲1。該函數的形式爲:

P(Y=k|X=x_{i})=\frac{e^{s_{k}}}{\sum_{j}^{C}e^{s_{j}}}

損失函數L_{i}有很多,比如計算KL散度或者最大似然,這裏使用如下形式:

L_{i}=-logP(Y=y_{i}|X=x_{i})=-log(\frac{e^{s_{k}}}{\sum_{j}^{C}e^{s_{j}}})

該損失函數希望正確類別對應的概率值應該較高並且接近於1。

歸一化方法

歸一化是爲了減輕模型的複雜度,而不是去試圖擬合數據。常見的歸一化項R(W)有:

L2歸一化和L1歸一化的區別在於:L2希望W矩陣更均勻。L1則希望W矩陣更加稀疏。它們對於模型的複雜度有不同的度量方式。


S3.2優化

優化定義

用一種有效的方式,來從W的可行域中,找到最優的W,使得模型的效果最好,使得L最小。在大型深度學習網絡以及線性分類器中常使用梯度下降方法。在深度學習中,計算函數的梯度,然後用這些梯度迭代更新參數W。

斜率以及梯度

  • 當樣本x是一維的標量,斜率是損失函數的導數。
  • 當樣本x是多維向量時,每一維的偏導所組成的向量,稱爲梯度。梯度和x具有相同的形狀。梯度中的每個元素都爲損失函數在相關方向上的斜率。梯度指向損失函數函數增加最快的方向,相應的,負梯度方向就指向損失函數降低最快的方向。

梯度的計算方法

  • 有限差分法(數值梯度)。該方法是最簡單,但速度很慢。因爲深度網絡中損失函數的計算十分複雜,且模型輸入很多,參數也很多。
  • 解析梯度法。給定損失函數,使用微積分方法,求出梯度的表達式。好處是:非常準確;只需計算梯度的表達式,所以很快。

注意:在實際中使用解析梯度。但數值梯度是一個很簡單的調試工具,用於判斷梯度的表達式是否準確。當使用數值梯度進行檢查時,計算十分緩慢,並且不準確。同時減少問題的參數數量,使得能夠在合理的時間內運行。

優化方法

a.梯度下降方法

該方法步驟爲:初始化W爲隨機值;計算損失值和梯度值;向梯度相反的方向更新權重值。不停地計算梯度和更新參數直到網絡收斂(相關代碼如下所示,代碼來自CS231n視頻)。步長(step_size,也叫學習率)是計算新權重的一個超參數。該參數表示每次更新權重時,在那個方向前進多少距離。學習率是在訓練中首先要調整的參數,隨後是模型的大小,正則化參數。找到合適的步長,是首先要做的事情。該方法的一些改進有:帶動量的梯度下降,Adam優化器。

while True:
  weights_grad = evaluate_gradient(loss_fun, data, weights)
  weights += -step_size * weights_grad 

當訓練樣本格式N很大時,損失函數的計算會十分耗時。因爲梯度是線性運算符,因此誤差函數的梯度值是每個單項梯度誤差梯度值的總和,如下圖所示。這樣的話,在計算梯度時,也十分耗時。所以在實際中,使用隨機梯度下降方法。

b.隨機梯度下降法

隨機梯度下降方法(Stochastic Gradient Descent,SGD)步驟如代碼所示。首先從全部訓練集中採樣,形成小批量樣本minibatch,一般minibatch的樣本個數爲2的冪次方,如32/64/128。使用minibatch計算損失以及梯度。這個損失是全部損失的一個估計值。

while True:
  data_batch = sample_training_data(data, 256)  #sample 256 examples
  weights_grad = evaluate_gradient(loss_fun, data_batch, weights)
  weights += -step_size * weights_grad  #perform parameter update

 圖像特徵

在深度神經網絡之前,一般使用兩步走的策略來進行圖像分類。該策略就是首先從圖像中進行特徵提取或者廣義的特徵映射。這樣做的原因是使得在特徵空間,樣本更容易被區分開。再將特徵輸入到線性分類器或者SVM中進行分類。常見的特徵有顏色直方圖,HOG(方向梯度直方圖),詞袋(Bag of Words)。顏色直方圖在全局上看出圖像中存在哪些顏色。HOG可以看出圖像中有哪些不同類型的邊緣,是一個經常用於目標識別的特徵表示。詞袋是從自然語言處理獲得的靈感。詞袋的關鍵在於定義視覺單詞詞典。首先從圖片中進行小的隨機塊採樣,形成圖像塊集合,然後用K-means等聚類方法將它們聚合成簇,從而得到不同的簇類中心,即爲視覺單詞詞典。兩步走的策略是先學習特徵,在訓練時更新分類器。而對於深度卷積神經網絡來說,並不先學習特徵,而是在訓練時直接從數據中學習特徵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章