一、概述
在上一講中,Andrej總結說在沒有loss function
的情況下,我們在用肉眼觀察哪些分數是好的,哪些分數是壞的,如下圖。
圖中,cat
的預測分數不是很好,2.9
的分數比一些分數高,但是比deer
,dog
等的低;car
的預測分數則很好,比所有其他分數都高;而frog
的預測分數糟透了,比大部分的分數都要低。
這個lecture中講的是用loss function
來量化分數的好壞,並用optimizer
來優化W
和b
,使loss
最小化。
二、Loss Functions
下面介紹了兩種loss function
,SVM Cost
和Softmax Cost(Cross-entropy cost)
。
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
相加,然後取平均值。在上圖中,也就是說,這一組
W
和b
,作用在input image
上之後,通過SVM Cost
得到了一個loss
值,這個值是4.6
。問題:爲什麼不能讓j = yi?(j,和yi是svm cost公式中的兩個腳標,上面的圖片中有)
因爲如果
j = yi
,sj - syi = 0
,max
之後得到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
的值,不利於模型的測試表現,因爲只有部分訓練數據的特種被捕捉。我的理解是,比如這裏,如果car
的W
的值很大很大,遠大於其他類型的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
應該讓A
和B
兩部分都最小,而不是單單滿足讓A
最小。這就達到了讓
W
最優的結果。用圖來解釋一下。
上圖中,對於
x
有兩組w
,w1
和w2
。這兩組w
作用於x
之後,loss
都是相同的。但是如果加上了regularization
,w2
是更好的選擇。因爲
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這個模型,讓模型在測試和實際應用中有更好的表現。
Softmax Cost (Cross-entropy Cost)
Softmax
和SVM
計算空間距離的方式不同,計算的是每個預測分數的概率分佈。如果預測越準確,Softmax
的結果越小,反之越大,我們要做的同樣是最小化Softmax
的結果。Softmax
是更加常用的loss function
。計算例子如下。根據公式首先計算
e
爲底每個分數的指數的結果(紅色框)。然後
normalize
每一個分數(每個分數除以紅色框中所有數值之和),得到綠色框中的數值。最後對每個數值做
log
並取反,就是最終結果。如圖,
cat
的Softmax Cost
就是0.89
,我們要想辦法最小化這個loss
。問題:loss function的最大最小值是多少?
最大值是無窮大,最小值是0。
問題:W被初始化成很小的值是,所有的分數都約等於0,這時的loss是多少?
是 -log(1 / N),N是預測類型的個數。同樣可以用來檢查
W
初始化後網絡是否工作正常。SVM vs. Softmax
上圖總結了一下兩種
loss function
的計算方式。下圖給出了兩種
loss function
的不同點。問題:如果將上圖中其中一組數據(比如第三組[10, -100, -100])中的數值增加或者減小,兩個loss function有什麼變化?
SVM不會有任何變化,因爲SVM考慮的只是兩個點之間的距離(sj - syi,可以這麼想吧),只要這個距離是負數,那麼max之後,都是0;但是Softmax會變化,因爲Softmax考慮的是每個點的概率,增加或者減小數值,都會影響到最後的概率。
上圖是Andrej寫的一個觀察
W
,b
和loss
的一個demo,點這裏過去看看~
三、Optimization
首先回顧以下上面的內容。
這是Optimization
進行至前的所有步驟:
* input是`(x, y)`,`score function`算出了每一個類型的預測分數;
* 然後通過任意一個`loss function`,上面是`Softmax`,下面是`SVM`計算出麼一個分數的`loss`;
* 最後加總所有的`loss`,求平均值,再加上`regularization function`。
接下來就是進行optimize
的時候了。optimization
有很多種方法,一種比一種好,可以看成是方法的一種演進。
Random Search
由網絡隨機分配
W
,然後找到能夠最小化loss
的W
。相當於是瞎猜。
可以看到用這種方式最終的結果是很慘烈的。
用這種方式選出的
W
在最終測試的時候準確率只有%15,最好的成績是%95左右。optimize
的過程,可以想象成上圖中的情形。你處於山坡上,眼睛被矇住了。你只有一個高度儀,你可以知道任意點上的loss
,你的目標是走到谷底。Random Search
就是隨機往一個方向走,這是個很爛的主意。Numerical Gradient
Numerical Gradient
的方法是,計算每一個點上的斜率(坡度),這個斜率就是gradient
。這個gradient
的值,能告訴我我的這一步,是在往上走還是往下走,當然往下走是我想要的。下圖是
Numerical Gradient
的簡單Python實現。其實就是翻譯了求導數的公式(上上張圖中的),循環每一個
W
然後求出導數,即gradient
。下面給出了計算例子。
圖上的公式的解釋可以是這樣。我在現有
W
的基礎上,往任意方向上走很小的一步(0.0001),然後計算這一步的loss
,是1.25322
;原有W
上的loss
是1.25347
,loss
減少了,根據公式算出來,第一個W
在往任意方向走了0.0001
這一小步之後的gradient
是-2.5
,因爲是負的,所以這一步是往下走的(借用上面的例子,就是我在往山下走,這正是我想要的);以此類推。直到計算出每一個
W
的gradient
。這種方法的缺陷是:
如果用在真正實踐中,Convnet會有上千萬的參數(W),一個一個計算gradient效率低下。
並且這挺蠢的,因爲
loss function
整體是和W
相關的,我們要minimize loss
,就是要找到loss function
相對於W
的導數(gradient)即可,如下圖。want
的部分,就是我們想要的。沒有必要對整個W vector
依次做導數的數學計算,所有W
對於最終loss
的貢獻都已經包含在loss function
中了,因此只需要計算loss function
相對於W
的gradient
即可,也就是下面的Analytic Gradient
方式。Analytic Gradient
使用微積分的方式來計算,如圖:
使用這種方式的效率大大高於
Numerical gradient
。但同時這種方式很容易出錯。因爲在寫公式的過程中很容易犯錯誤。因此,再實踐中,一般用Analytic Gradient
來操作,但是用Numerical Gradient
來檢查計算是否正確,這過程叫做Gradient Check
。話說是這樣,但是真正實踐中,用到
Numerical
太浪費時間了吧…以後再體會,現在還沒有看到過有用這個方式去檢查正確與否的…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
降到最低。Mini-batch Gradient Descent
Mini-batch Gradient Descent
是一種訓練方式。相比於一下子用所有的數據去訓練一個神經網絡,採用Mini-batch
分批訓練的方式得到了更好的訓練效果。每個
Mini-batch
都選用了有利於GPU
內存大小的數值,32/64/128/256
等。ImgNet
冠軍Krizhevsky
訓練他的Convnet時用了256 size
的Mini-batch
。下圖是選擇
Mini-batch
訓練時產生的loss
的圖示。這裏的
loss
看起來不是一條直線,而上下都有很多噪音是因爲沒有使用整個數據集去訓練的緣故。因爲每個Mini-batch
的訓練質量不同,這是造成噪音的原因。並且這條
loss
下降曲線的形狀和W
的初始化相關,如果W
初始化得好,這條曲線下降得會比較平緩,不會看到太多急速下降的部分。Learning Rate
Learning Rate
的選擇是很重要的,下圖顯示了不同的Learning Rate
對訓練產生的不同效果。十分高的
Learning Rate
,loss
直接爆掉了,會一直上升。太高的
Learning Rate
,loss
一開始會下降,但是很快會到達一個平原區域,不再下降,這個時候網絡已經停止學習了。過低的
Learning Rate
,loss
下降的過於緩慢,網絡的效率不高,要花很久很久的時間才能把loss
降下來,並且效果也不一定很理想。正確的
Learning Rate
,loss
下降很快,但是又不會迅速進入平原區域,同時訓練效率也很高,不需要訓練很長的時間。
四、總結
這一集講了如何使用loss function
來量化loss
,並且使用optimizer
來更新W
的值,使loss
最小化。