CS231N-Lecture3 Loss Functions and Optimization

一、概述

在上一講中,Andrej總結說在沒有loss function的情況下,我們在用肉眼觀察哪些分數是好的,哪些分數是壞的,如下圖。

圖中,cat的預測分數不是很好,2.9的分數比一些分數高,但是比deerdog等的低;car的預測分數則很好,比所有其他分數都高;而frog的預測分數糟透了,比大部分的分數都要低。

這個lecture中講的是用loss function來量化分數的好壞,並用optimizer來優化Wb,使loss最小化。

二、Loss Functions

下面介紹了兩種loss functionSVM CostSoftmax Cost(Cross-entropy cost)

  1. Multiclass SVM Cost

    將所有不正確類型的分數和正確類型的分數的差 + 1之後的值,和0取最大值,最後將這些最大值相加,就是SVM Cost

    1) SVM Cost如何計算

    下圖是三個示例,具體展示SVM Cost是如何計算的。

    視頻中對爲什麼+1作了一些解釋,但是不是很明白。還需要體會一下。1可以理解爲是一個安全閥值。由於W可以初始化成大一些或者小一些,這是隨機的。因此最終的預測分數也可以或大或小,因爲W的緣故。這個1可能也是爲了增加隨機性而加上去的。Andrej說,選擇1而是任意的,也就是說,你可以+2,+100,都是可以的,但是不能是0,和負數,這個也還不是很明白,有待體會。但是可能就像learning rate一樣,太大了模型就不能和訓練數據擬合了。這個1也可以想象成可以調整的hyper parameter,雖然最後Andrej說了這個不是hyper parameter

    在真正使用中,loss的值應該是將三個類型的loss相加,然後取平均值。

    在上圖中,也就是說,這一組Wb,作用在input image上之後,通過SVM Cost得到了一個loss值,這個值是4.6

    問題:爲什麼不能讓j = yi?(j,和yi是svm cost公式中的兩個腳標,上面的圖片中有)

    因爲如果j = yisj - syi = 0max之後得到1,那麼最終的loss都會+1,增大了的loss的數值。

    問題:loss的最大最小值可以是多少?

    最大值是無窮大,最小值是0。

    問題:如果W在初始化的時候都是很小的值,那麼所有類型的score都約等於0,在上圖的情況下,loss是多少?

    loss是2;通用的公式是,第一次計算出來的loss應該是預測類型的個數 - 1。我們應該用這個規律來檢查W初始化了之後,神經網絡第一次的運行是否正確。在只有三個類型的例子中,如果初始化了之後,第一次計算得到的loss大致上在2左右,那麼說明一切基本正常,至少沒有很大問題;但是如果這個數值大大偏離了2,那就要檢查一下網絡中會有很大的問題。

    Hinge Loss and Squared Hinge Loss

    上圖中,上一個公式被稱作Hinge Loss,相應的,下面一個就是Squared Hinge Loss。這兩個計算loss的方法可以被理解成是一個hyper parameter。通常出現的是Hinge Loss,但是再某些數據集中,Squared Hinge Loss的表現會相對較好。

    SVM Cost的簡單Python實現

    上圖中,margins[y] = 0一行,就是在解決上文中提到的“問題:爲什麼不能讓j = yi?”這個問題。要將j = yi時計算的到的1抹平爲0,不讓其對loss產生任何影響。

    下圖是最終應用的時候的SVM Cost Loss Function

    2) SVM Cost的問題

    下面考慮SVM Cost的一個問題。

    如果找到了一個W,能讓L = 0,那麼這個W是唯一的嗎?

    答案是,W不是唯一的。

    如果將W設置成很大很大,在下圖中,汽車那一欄的分差就會越來越大(比較上下兩個計算公式裏面的數值),那麼max函數中的負數會越來越小,最終的L都是0。

    意思是car這個類型使用的W可以是一個很大很大的數值,同時令最終的loss L = 0。但是這個W不會是唯一的。還有很多的比這個W小的W,也就是W的子集,也能使L = 0。這個屬性不是很好。這個屬性不好在於,過於集中的,不夠分散的W的值,不利於模型的測試表現,因爲只有部分訓練數據的特種被捕捉。我的理解是,比如這裏,如果carW的值很大很大,遠大於其他類型的W的值,那麼這個模型最終只會對汽車分類成功率很高,而對其他的類型的分類成功率很低。

    爲了解決這個問題,要引入Weight regularization。目的是爲了找到我們期望中的W,不要讓W在上述的問題中過於的大,或者過於的小。

    3) Weight regularization

    loss function的最後,加上一個lambda乘以關於W的一個regularization函數R

    regularization function的作用是衡量W的友好(niceness)程度。

    上圖中的L2 Regularization是最常用的。原理是求出所有的W的平方和,然後加在loss function後面。

    那麼在最後用optimizer來最小化loss的時候,loss function中加號兩邊的部分是相互制約的(用A,B兩部分代替)。

    一方面,網絡選擇的W應該讓AB兩部分都最小,而不是單單滿足讓A最小。

    這就達到了讓W最優的結果。

    用圖來解釋一下。

    上圖中,對於x有兩組ww1w2。這兩組w作用於x之後,loss都是相同的。但是如果加上了regularizationw2是更好的選擇。

    因爲w2的平方和小於w1的平方和。並且,w2的分佈更加均勻。那麼x中更多的特徵都被捕捉利用了(4個),而w1只捕捉利用了1個特徵值。最後測試的時候,選用w2的結果會好於w1的結果。

    要注意的是,加上regularization function之後,可能在訓練的時候,模型表現的會糟糕一點。但是在測試的時候,模型的表現往往會比沒有正規化的時候好。

    下面是Andrej對於regularization在圖片分類器中的作用的解釋:

    Regularization會考慮W作用於input x的所有維度情況,而不會只集中考慮W作用於input x的一個或者部分維度的情況;在圖片分類的例子中,regularization可以讓模型更好的適應所有的input x的特徵(像素),在達到同樣預測分數或者loss的效果的前提下,能夠考慮更多的特徵,可能也更加有利於generalize這個模型,讓模型在測試和實際應用中有更好的表現。

  2. Softmax Cost (Cross-entropy Cost)

    SoftmaxSVM計算空間距離的方式不同,計算的是每個預測分數的概率分佈。如果預測越準確,Softmax的結果越小,反之越大,我們要做的同樣是最小化Softmax的結果。

    Softmax是更加常用的loss function。計算例子如下。

    根據公式首先計算e爲底每個分數的指數的結果(紅色框)。

    然後normalize每一個分數(每個分數除以紅色框中所有數值之和),得到綠色框中的數值。

    最後對每個數值做log並取反,就是最終結果。

    如圖,catSoftmax Cost就是0.89,我們要想辦法最小化這個loss

    問題:loss function的最大最小值是多少?

    最大值是無窮大,最小值是0。

    問題:W被初始化成很小的值是,所有的分數都約等於0,這時的loss是多少?

    是 -log(1 / N),N是預測類型的個數。同樣可以用來檢查W初始化後網絡是否工作正常。

  3. SVM vs. Softmax

    上圖總結了一下兩種loss function的計算方式。

    下圖給出了兩種loss function的不同點。

    問題:如果將上圖中其中一組數據(比如第三組[10, -100, -100])中的數值增加或者減小,兩個loss function有什麼變化?

    SVM不會有任何變化,因爲SVM考慮的只是兩個點之間的距離(sj - syi,可以這麼想吧),只要這個距離是負數,那麼max之後,都是0;但是Softmax會變化,因爲Softmax考慮的是每個點的概率,增加或者減小數值,都會影響到最後的概率。

    上圖是Andrej寫的一個觀察W,bloss的一個demo,點這裏過去看看~

三、Optimization

首先回顧以下上面的內容。

這是Optimization進行至前的所有步驟:

* input是`(x, y)`,`score function`算出了每一個類型的預測分數;

* 然後通過任意一個`loss function`,上面是`Softmax`,下面是`SVM`計算出麼一個分數的`loss`;

* 最後加總所有的`loss`,求平均值,再加上`regularization function`。 

接下來就是進行optimize的時候了。optimization有很多種方法,一種比一種好,可以看成是方法的一種演進。

  1. Random Search

    由網絡隨機分配W,然後找到能夠最小化lossW

    相當於是瞎猜。

    可以看到用這種方式最終的結果是很慘烈的。

    用這種方式選出的W在最終測試的時候準確率只有%15,最好的成績是%95左右。

    optimize的過程,可以想象成上圖中的情形。你處於山坡上,眼睛被矇住了。你只有一個高度儀,你可以知道任意點上的loss,你的目標是走到谷底。

    Random Search就是隨機往一個方向走,這是個很爛的主意。

  2. Numerical Gradient

    Numerical Gradient的方法是,計算每一個點上的斜率(坡度),這個斜率就是gradient。這個gradient的值,能告訴我我的這一步,是在往上走還是往下走,當然往下走是我想要的。

    下圖是Numerical Gradient的簡單Python實現。

    其實就是翻譯了求導數的公式(上上張圖中的),循環每一個W然後求出導數,即gradient

    下面給出了計算例子。

    圖上的公式的解釋可以是這樣。我在現有W的基礎上,往任意方向上走很小的一步(0.0001),然後計算這一步的loss,是1.25322;原有W上的loss1.25347loss減少了,根據公式算出來,第一個W在往任意方向走了0.0001這一小步之後的gradient-2.5,因爲是負的,所以這一步是往下走的(借用上面的例子,就是我在往山下走,這正是我想要的);以此類推。

    直到計算出每一個Wgradient

    這種方法的缺陷是:

    如果用在真正實踐中,Convnet會有上千萬的參數(W),一個一個計算gradient效率低下。

    並且這挺蠢的,因爲loss function整體是和W相關的,我們要minimize loss,就是要找到loss function相對於W的導數(gradient)即可,如下圖。

    want的部分,就是我們想要的。沒有必要對整個W vector依次做導數的數學計算,所有W對於最終loss的貢獻都已經包含在loss function中了,因此只需要計算loss function相對於Wgradient即可,也就是下面的Analytic Gradient方式。

  3. Analytic Gradient

    使用微積分的方式來計算,如圖:

    使用這種方式的效率大大高於Numerical gradient。但同時這種方式很容易出錯。因爲在寫公式的過程中很容易犯錯誤。因此,再實踐中,一般用Analytic Gradient來操作,但是用Numerical Gradient來檢查計算是否正確,這過程叫做Gradient Check

    話說是這樣,但是真正實踐中,用到Numerical太浪費時間了吧…以後再體會,現在還沒有看到過有用這個方式去檢查正確與否的…

  4. Gradient Descent

    Gradient Descent就是調整W的過程了。計算出gradient之後,要用這個gradient,乘以step_size或者learning_rate,然後取負數。

    取負數是因爲,最初計算導數的時候,相對於loss都是增量的,要取反才能讓loss減小。

    圖中,step_size或者learning_rate,以及regularization function中的lambda,是很重要的hyper parameter,需要好好選擇才能取得很好的訓練效果。

    下圖是高維空間在二維空間的展示,闡述了gradient如果讓loss降到最低。

    圖中的藍色部分是loss最低的區域,W就是要沿着negative gradient direction這個方向走,才能讓loss降到最低。

  5. Mini-batch Gradient Descent

    Mini-batch Gradient Descent是一種訓練方式。相比於一下子用所有的數據去訓練一個神經網絡,採用Mini-batch分批訓練的方式得到了更好的訓練效果。

    每個Mini-batch都選用了有利於GPU內存大小的數值,32/64/128/256等。

    ImgNet冠軍Krizhevsky訓練他的Convnet時用了256 sizeMini-batch

    下圖是選擇Mini-batch訓練時產生的loss的圖示。

    這裏的loss看起來不是一條直線,而上下都有很多噪音是因爲沒有使用整個數據集去訓練的緣故。因爲每個Mini-batch的訓練質量不同,這是造成噪音的原因。

    並且這條loss下降曲線的形狀和W的初始化相關,如果W初始化得好,這條曲線下降得會比較平緩,不會看到太多急速下降的部分。

  6. Learning Rate

    Learning Rate的選擇是很重要的,下圖顯示了不同的Learning Rate對訓練產生的不同效果。

    這裏寫圖片描述

    十分高的Learning Rateloss直接爆掉了,會一直上升。

    太高的Learning Rateloss一開始會下降,但是很快會到達一個平原區域,不再下降,這個時候網絡已經停止學習了。

    過低的Learning Rateloss下降的過於緩慢,網絡的效率不高,要花很久很久的時間才能把loss降下來,並且效果也不一定很理想。

    正確的Learning Rateloss下降很快,但是又不會迅速進入平原區域,同時訓練效率也很高,不需要訓練很長的時間。

四、總結

這一集講了如何使用loss function來量化loss,並且使用optimizer來更新W的值,使loss最小化。

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