2017CS231n李飛飛深度視覺識別筆記(三)——損失函數和優化

第三章 損失函數和優化

課時1 損失函數

    在上一章的課程中,我們討論了識別問題,並嘗試了數據驅動的方式,講到了圖像分類的難點在哪裏;同時討論了K近鄰分類器以便作爲介紹數據驅動理念的一個簡單例子,最後還討論了交叉驗證以及如何把數據劃分爲訓練集、驗證集和測試集來設置超參數,線性分類作爲我們引入神經網絡的第一項基石。

    這一節中我們將解決:如何給數據集選擇一個正確的權重W以及怎麼用訓練數據來得到W的最優值。

    對於下面的分類的得分結果:

    我們可以很容易的看到對第一幅圖貓的得分只有2.9,比其他的都要低很多,這是一個不好的結果;而對第二幅圖汽車的得分有6.04,是最高的,這是一個正確的結果;所以這些人眼看一下這些分數就知道哪些是好、哪些是壞,但是如果寫算法來自動決定哪些W是最優的,就需要一個度量任意W的的好壞的方法。

    可以用一個函數把W當做輸入,然後看一下得分,定量地估計W的好壞,這個函數被稱爲損失函數。

    有了損失函數的概念後,就可以定量地衡量任意一個W到底是好是壞,要找到一種有效的方式從W的可行域裏找到W取什麼值是不壞的情況,這個過程將是一個優化過程。

    下面來看一個具體的例子:

    在這個例子中,目前貓的分類不對,汽車的分類正確,而青蛙是徹底分類錯了。

    正式一點來說,一般所謂的損失函數,比如說有一些訓練數據集x和y,通常又N個樣本,其中x是算法的輸入,在圖片分類問題裏,x其實是圖片每個像素點所構成的數據集,y是希望預測出來的東西,通常稱之爲標籤或目標。我們把最終的損失函數定義爲

多分類SVM損失函數:

    接下來介紹一下多分類SVM損失函數,多類別SVM是在處理多分類問題時的對二元SVM的一種推廣。在二元SVM中,只有兩個類,每個樣本x要麼被分類成正例,要麼被分類成負例;現在如果有10個類別了,就需要將二元的思想推廣到多分類中。看一下損失函數對單個類的計算方式:

    問題:這個公式到底是在計算什麼?

    這個損失是在說如果真實分類的分數比其他分數高很多,這是正確的情況,那要高出多少呢?高出一個安全的邊距;如果真實分類的分數不能夠比其他分類高出那麼多,那就會得到損失,這是不好的情況。

    S是通過分類器預測出來的不同類的分數,而這個整數表示這個樣本正確的分類標籤,所以表示訓練集的第i個樣本的真實分類的分數。這種損失函數也可以說成是一個合頁損失函數,畫出的圖像如下:

    這裏的x軸表示,是訓練樣本的真實分類的分數;y軸則表示損失;可以看到隨着真實分類的分數的提升,損失會線性下降,一直到分數超過了一個閾值,損失函數就變成0,此時已經成功的對這個樣本進行了分類。

    接下來對剛纔例子中的三個樣本進行損失的計算:

    (1)對第一個訓練樣本進行多分類SVM損失函數的計算,得到損失值2.9

   這也從一定程度上表明這個損失值2.9是分類器對這個個訓練樣例訓練的多好的一個量化衡量指標。

    (2)對第二個訓練樣本進行多分類SVM損失函數的計算,得到損失值0

    (3)對第三個訓練樣本進行多分類SVM損失函數的計算,得到損失值12.9

    問題:爲什麼要選擇加上1這個數?

    其實在一定程度上是一個任意的選擇,這實際上就是一個出現在損失函數中的常數,我們並不真正關心損失函數中分數的絕對值,關心的只是這些分數的相對差值,需要的是正確的分數遠遠大於不正確的分數,所以實際上如果把整個W參數放大或縮小,那麼所有的分數都會放大或縮小。

    算出了3個樣本的損失值之後,最終對於整個訓練數據集的損失函數是這些不同案例的損失函數的平均值:

    這一定程度上就是我們的量化衡量,5.27反應了我們的分類器在數據集上有多不好。

    問題:如果稍稍改變汽車的分數,損失函數會發生什麼變化?

    答:如果汽車的分數發生輕微變化,損失函數將不會變化。SVM損失函數只關注於正確的分數比不正確的分數大過1,在案例中的這種情況,汽車的分數比其他的都要大,所以儘管汽車的分數發生輕微變化,那麼1的界限依然奏效,損失函數也就不會變化。

    問題:損失函數的可能的最大最小值是多少?

    答:最小值是0,可以想象所有的分類,如果它們的正確分數都非常大,那麼得到的所有分類的損失函數爲0,那麼總的損失函數也就爲0;最大值是無窮大,可以從合頁損失函數這個圖像看出,正確分數越低,損失函數結果也就趨向於無窮大。

    問題:當初始化這些參數並且從頭開始訓練,通常先用一些很小的隨機值來初始化W,分數的結果在訓練初期傾向於呈現較小的均勻分佈的值,如果所有的分數近乎爲0,並且差不多相等,那麼使用SVM時的損失函數預計如何?

    答:分數的數量減去1。因爲如果對所有不正確的類別遍歷了一遍,那麼實際上遍歷了C-1個類別,這些類別中的每一個,這兩個分數差不多相同,那麼就會得到一個值爲1的損失項,所以將會得到C-1。

    問題:如果將對於SVM的所有錯誤分數求和會發生什麼?將所有正確分數求和會發生什麼?將所有的都求和呢?

    答:損失函數增加1。同時在實際應用中這麼做的原因在於通常損失函數爲0的時候說明算法很好,所以沒有損失什麼。

    問題:如果使用平均值而不是求和呢?

    答:損失函數不會改變。分類的數量需要提前確定,當選擇數據集的時候,因爲這只是將整個損失函數縮小了一個倍數,所以並沒有什麼影響。

    問題:如果改變損失函數的公式,在max上加上一個平方項,,這會成爲另一個不同的分類算法嗎?

    答:會變成不同的分類算法。這裏的想法在於我們用一種非線性的方法改變了在好和壞之間的權衡,所以實際上計算了另一種損失函數。

    下面是一些向量化的代碼片段:

    關於損失函數的另一個問題,假設找到一個W的損失值爲0,那麼具備損失值爲0的W到底是不是唯一的呢?

    當然不是唯一的,特別是我們談到的關於把整個問題擴大或縮小的事情,取決於W,可以拿W乘以2,這個兩倍的W也將實現0損失;那麼分類器是如何在這些0值的損失函數間做出選擇呢?

    下面給出是更廣義的機器學習的概念,假設有這樣的數據集:

    並且這裏爲訓練數據擬合了一些曲線,如果告訴分類器做的唯一的事情是嘗試擬合訓練數據,它可能會具有非常曲折的曲線,嘗試完美的分類所有的訓練數據點,但我們實際關心的是測試數據的性能,事實上,期望的分類器可能預測的是下圖中綠色的直線,而並不是完美的擬合訓練數據。

    這在機器學習領域是一個非常核心的基礎性問題,通常的解決方式是正則化,所以在這裏要爲損失函數添加一個附加的正則化項:

    一般的是讓模型以這種方式選擇更簡單的W;這樣一來,標準的損失函數就有了兩個項:數據丟失項和正則化項。

    實際上,有很多不同的類型正在實踐中使用正則化的方法,常見的有:

    但是這些正則化不僅僅是深度學習領域,同時也有機器學習的很多領域,甚至更廣泛的進行優化;例如:脫網、批量歸一化、隨機深度。正則化的宏觀理念就是對模型做的任何事情主要目的是爲了減輕模型的複雜度,而不是去試圖擬合數據。

    問題:L2正則化如何度量複雜性的模型?

    通過以下的具體例子來闡述:假設有一些訓練樣本x,有兩個不同的W供選擇,當進行線性分類時,真正討論的是x與W的點乘結果,而兩種乘積的結果是相同的,那麼哪種情形下的L2迴歸性會好一些呢?

    W2的L2迴歸性好一些,它具有比較小的範數,所以L2迴歸可以用一種相對粗糙的方式去度量分類器的複雜性,L2正則化的作用是它更能夠傳遞x中不同元素值的影響,它的魯棒性可能更好一點;L1正則化是相反的,使用L1正則化則更傾向於選擇W1(傾向於讓大部分元素接近0);所以問題是如何度量複雜度,它視不同問題而定,針對特殊的模型和數據及不同的設置,思考複雜度該如何度量;L1度量複雜度的方式可能是非零元素的個數,而L2更多考慮的是W整體分佈,所以它具有更小的複雜性。

多項邏輯迴歸損失函數(Softmax):

    除了多分類SVM損失函數之外,深度學習中另一個流行的選擇是多項邏輯迴歸損失函數或者叫Softmax損失函數。

    針對SVM分類器,只是想要正確分類的分數比不正確類別的得分要高才好,並沒有對這些得分做過多的解釋;但對於多項邏輯迴歸損失函數,將賦予這些分數一些額外的含義,並且利用這些分數針對類別去計算概率分佈。

    現在我們要做的是促使計算得到的概率分佈,就是通過Softmax計算的結果去匹配目標概率分佈,即正確的類別應該具有幾乎所有的概率()。

    損失函數就是:,(真實類別的概率對數再取負值),用Softmax對分數進行轉化處理並得到正確類別的損失函數是:

    下面用一個實際的案例體會它的用處:

    還是回到貓咪的例子中,這裏並不是直接把分數放在損失函數裏,而是將它們進行指數化處理,然後對他們進行歸一化以保證它們的和是1,接着求出損失函數的結果。

    這就是Softmax損失函數,也被稱爲多項式迴歸邏輯損失函數。

    問題:Softamx損失函數的最大值和最小值是多少?

    答:最小值是0,最大值是無窮大。希望針對正確的類別概率是1而不正確的概率是0,如果是這樣,那麼log函數裏的自變量就會是1,即真實類別所對應的概率,損失函數值就爲0;同樣,當log函數裏的值是0時,損失函數值就趨向於無窮大,但基本不會出現這樣的情況。

    問題:如果所有的分數都很小,近乎爲0,那麼損失值是多少?

    答:損失值是logC。這是一個很好的糾錯機制,如果用這個softmax損失來訓練一個模型,應該在第一次迭代中檢查,不是logC的話就是出了問題。

Svm損失函數與Softmax損失函數的對比:

    區別是如何解釋這些分值進而量化度量到底有多壞?

    對於svm是深入研究觀察正確分類分值和不正確分類分分值的邊距,而對於softmax是打算去計算一個概率分佈,然後查看負對數概率正確的分類:

    在實際應用中這兩個損失函數之間的差別是很有趣的,svm會得到這個數據點超過閾值要正確分類,然後不再關心這個數據點,而softmax總是試圖不斷提高每一個數據點都會越來越好。

    回顧一下整個過程:

    上述圖中的內容是一個通用的概述,那麼如何才能真正發現一個W使損失最小化,這就是優化的問題了。

優化:

    (1)在實踐中,傾向於從某個解決方案開始,使用多種不同的迭代方法,然後逐步對它進行改進,一種方法就是隨機搜索:需要有很多的權重值隨機採樣,然後將它們輸入損失函數,看看效果如何,但這不是一個好的方法。

    (2)另一種方法是梯度下降:梯度是偏導數的向量,它指向函數增加最快的方向,相應的負梯度方向就指向了函數下降最快的方向;梯度給出了函數當前點的一階線性逼近,很多深度學習應用都是在計算函數的梯度,然後利用這些梯度迭代更新參數向量。

    使用有限差分的方法計算梯度,如下圖中的過程:


    可以想象如果這裏的卷積神經網絡非常大,那麼計算函數f會很慢,所以在實際應用中,並不會使用有限差分的計算方法,相應的使用微積分的方法只需要寫出損失函數的表達式就能很快計算出梯度。

    總結:

    (1)使用數值梯度的方法:近似值、速度慢、容易寫;

    (2)使用分析梯度的方法:精確值、速度快、容易出錯。

    所以,在實踐中總是使用分析梯度,但在梯度檢查的時候使用數值梯度。梯度下降算法(隨機梯度下降等)在吳恩達機器學習中有詳細的講解,這裏不再贅述;一些高級的梯度下降法比如帶動量的梯度下降、adam優化器在接下來的學習中在詳細講解。

    隨機梯度下降:它並非計算整個訓練集的誤差和梯度值,而是在每次迭代中,選取一小部分訓練樣本稱爲minibatch,然後利用這minibatch來估算誤差總和以及實際梯度。


    可以點進網站http://vision.stanford.edu/teaching/cs231n-demos/linear-classify/;自己動手體驗一下,它有助於幫助建立對線性分類器的直覺以及對如何使用梯度下降來訓練有直觀的感受。

圖像特徵:

    接下來介紹另一個概念:圖像特徵。

    此前講到的線性分類器是將原始像素取出,將這些原始像素直接傳入線性分類器,但是實際操作中,直接輸入原始像素值傳遞給線性分類器的表現不是很好;所以,當使用神經網絡大規模運用之前常用的方式是兩步走策略:首先,計算圖片的各種特徵代表,例如計算與圖片形象有關的數值;接着,將不同的特徵向量合到一塊,得到圖像的特徵表述;然後將圖像的特徵表述作爲輸入源傳入到線性分類器。

    對於不能用一個決策邊界劃分的數據集,如果採用一個靈活的特徵轉換,得到它的轉換特徵,就可以把複雜的數據集變成線性可分,就可以用線性分類器正確分類。

    下面介紹幾個特徵表示的例子:

    (1)一個特徵表示非常簡單的例子就是顏色直方圖:

    獲取每個像素值對應的光譜,把它分到柱狀內,將每個像素都映射到這些柱狀裏,然後計算出每個不同柱狀中像素點出現的頻次,就可以知道圖像的顏色狀況。

    (2)另一個例子:在神經網絡興起之前,一個常用的特徵向量就是方向梯度直方圖,由Hubel和Wiesel發現的人類視覺系統中,邊緣非常重要;而特徵表示的有向梯度直方圖就是嘗試這樣的方法,測量圖像中邊緣的局部方向,如下圖所示:

    (3)還有一個特徵表示的例子就是詞袋;這是從自然語言處理中獲得的靈感,用一個特徵向量表示一段話的方式是計算不同詞在這段胡中出現的次數;將這種方式應用於圖像,將圖像轉換爲一段話並不容易,所以要定義一個視覺單詞字典。

    方法:首先獲得一堆圖像,從這些圖像中進行小的隨機快的採樣,然後用K均值等方法將它們聚合成簇,得到不同的簇中心,這些簇中心可能代表了圖像中視覺單詞的不同類型;接着就可以利用這些視覺單詞給圖像進行編碼,記錄它們出現在圖像中的次數。

    相比於以上的這種特徵表示的方法,卷積神經網絡的方法會更直接更有效率,下一章中將從細節上討論這個問題,引入神經網絡並探討反向傳播算法。

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