CS231n 2017 Lecture 3: Loss Functions and Optimization 隨堂筆記

本筆記中的所有取自課件的多媒體版權屬於斯坦福大學。


回憶上次討論的線性分類問題,作為引入神經網路的基礎,它是屬於參數分類的一種,所有訓練數據中的經驗知識都體現在參數矩陣W中,而W可以通過訓練過程得到。線性分類是挺簡單,將一張圖片假設為x,將其拉成一個長向量32×32×3,還有一個參數矩陣W,把代表圖片像素的列向量當做輸入然後轉化為對應CIFAR-10中的10個分類的得分,當某一類的得分越高,那麼圖片就更可能是那一類。

上次的課只講了線性分類器的思想,還沒有講怎麼選擇W,怎麼使用訓練數據來得到W的最優取值。

下面是一個簡單的例子,有一個只有3張圖片的訓練集,接下來用某個W預測這些圖片的10個類別的得分。可以看到每張圖片的10個得分中,有的圖片得分高而有的圖片得分低。看最左邊的圖片,這是一隻喵,對人來說就很容易認出來。如果再看一下喵這個類別的得分,這個圖屬於喵的分類的得分是2.9,然而屬於青蛙分類得分的是3.78,因此這個分類器對這張圖來說不是很有效。對於車的例子,可以看到車的類別的得分是6,比其他的類別都要高,因此這個分類器對這張圖來說是有效。對第三張圖在青蛙這個分類里的得分是-4,比其他類別的都低很多,這看起來就很糟糕了。

用人工來判斷這些得分的好壞,這是不太現實的。如果有一個演算法自動決定哪些W是最優的,那就需要一個度量W好壞的方法。可以用一個損失函數把W當做輸入,然後根據得分來定量地估計W的好壞。這時候需要找到一個有效的方式來從W的可行域里,找到W取什麼值是最好的情況,這樣的過程就叫做優化過程。我們來看看當有三個樣例和三個類別時是怎麼具體操作的。對當前W的分類器,喵和青蛙都是分類錯的,汽車是分類對的,而且對於青蛙的分數是最低的。正式地說,損失函數是對於一些訓練數據集X和y,X是演算法的輸入,在圖片分類問題里,X其實是圖片每個像素點所構成的數據集,y是希望演算法預測出來的東西,通常稱為標籤或者目標。把損失函數記為 L_{i} ,同時有關於X的預測函數,這個函數是通過樣本X和權值矩陣W給出y的預測。在圖片分類問題中,就給出10個數字中的一個。損失函數,通過函數f給出預測的分數和真實的目標或者標籤y,可以定量地描述訓練樣本預測的好壞,最終的損失函數L是在整個數據集中N個樣本的損失函數總和的平均。用損失函數定量地描述出參數W是否令人滿意,然後在所有的W中找到在訓練集上損失函數極小化的W。

作為第一個具體的損失函數的例子,這裡介紹多分類SVM損失函數。多類別SVM是處理多分類時候的對二分類SVM的一種推廣。這個損失函數 L_{i} 的計算方式是,除了真實分類 y_{i} 以外,對所有的分類y都做進行加和,即是在所有錯誤的分類上求和,比較正確分類的分數和錯誤分類的分數。如果正確分類的分數比錯誤分類的分數要高出一定的安全間距(這個間距設為1),倘若真實分類的分數比其他任何錯誤分類的分數都要高很多,則損失為0。接下來吧圖片對每個錯誤分類的損失都加起來,就可以得到數據集中這個樣本的最終損失,在對整個訓練集取平均。

這種某個值和0比較取最大值的損失函數叫做合頁損失函數,這裡x軸表示 s_{y_{i}} ,是訓練樣本真實分類的分數,y軸是損失,可以看到隨著真實分類的分數提升,損失會呈現線性下降,一直到分數超過一個閾值,損失函數就會使0。(s是通過分類器預測出來的類別的分數, y_{i} 表示這個樣本正確的分類標籤,代表了訓練集的第i個樣本的真實類別的分數),如果真實類別的分數沒有比其他分類高很多,會得到一些損失,這當然是不好的情況。

下面代入真實的數字來計算這個例子中的多分類SVM損失函數的值,要記著我們要對所有不正確的分類全都循環一遍。在這裡對喵的圖片,喵是正確的分類,所以要對汽車和青蛙類別要做一遍運算。在比較車和喵的分數是我們會得到一些損失,因為車的分數比喵的要高,所以對這個類別我們得到2.9的損失值。在比較青蛙和喵的分數喵的得分超出青蛙得分1分以上,這兩個類別的損失為0。最後訓練樣例的多分類SVM損失函數是每一對這樣的類別構成的損失項的加和(2.9+0)。這也在一定程度上看到2.9是分類器對這個訓練樣例訓練得如何的一個度量指標。

類似地,計算車這個分類的多分類SVM損失函數的值。

最後計算青蛙這個分類的多分類SVM損失函數的值。

最後對於整個訓練數據集的損失函數是這些不同的樣例的損失函數的平均值,5.27反應了這個分類器在數據集上表現不好。為什麼加上1,這其實在一定程度上是一個任意的選擇,實際上就是一個出現在損失函數中的常數,這是一個可以任意選擇的值。我們不關心損失函數中分數的具體的值,我們只關心這些分數的相對差值,我們只需要正確分類的分數要遠遠大於不正確分類的分數。所以實際上如果吧整個W參數放大或者縮小,那麼所有分數都會相應地放大或者縮小,其實這裡選擇1並不重要,這個自由參數1會在這種縮放操作中被消去(具體的推導請看[講義](CS231n Convolutional Neural Networks for Visual Recognition))。

讓我們去考慮一些不同的問題,對於直觀地理解損失函數是如何運作是很有幫助的。第一個問題是如果稍微改變了汽車的分數,損失函數會發生什麼變化?其實稍微改變汽車的分數,損失函數將不會變化。因為合頁損失函數只關注正確的分數比不正確的分數大於1,但現在汽車的分數比其他的都要大,如果僅是稍微改變一點,那麼1的界限依然有效,損失函數並不會改變。我們仍然得到值為0的損失函數。

另外一個問題是SVM損失函數的最大最小值可能是多少?損失函數的最小值當然是0,如果對所有的分類的正確分數非常大,則可以得到所有分類的損失函數為0。在回想一下合頁損失函數,可以看到如果正確分類的分數,是絕對值非常大的負數,那可能會得到非常大的損失函數。綜上所述,最小值是0,最大值是無窮大。

下一個問題,當你初始化這些參數並開始訓練,通常先使用一些很小的隨機值來初始化W,結果分數在訓練的初期傾向於呈現較小的均勻分布的值,同時問題在於如果所有的分數都近乎為0,那當使用多分類SVM時損失函數預計會是分類的數量減去1。因為如果我們對所有不正確的類別都遍歷了一遍,那麼實際上遍歷了C-1個類別,在這些類別中的每一個的這兩個分數都差不多相同,所以就會得到一個值為1的損失項,因為存在著1的邊界,那就會得到C-1。這個結論實際上是有用的,這是因為有一個有用的調參策略,當使用這些方法的時候,在剛開始訓練的時候,你應該想到你預期的損失函數應該是多大。如果在剛開始訓練的時候損失函數在第一次迭代的時候並不等於C-1,那這時候就要去檢查代碼在哪裡出現了問題,所以這在實際應用中是一個有用的結論。

繼續下一個問題,如果將對於SVM的的所有分類分數求和會出現什麼?答案是損失函數增加了1,因為包含了 y_{i} ,這時候的損失函數值為 max(0,y_{i}-y_{i}+1)=1 。在實際應用中這麼做的原因在於,通常當損失函數為0的時候說明演算法很好,這時候你就不會再去探究同樣的分類器了。如果你實際上求和遍歷了所有的類別,但是忽略了正確的類別,那麼我們的最小損失函數為0。

還是繼續問題,如果我們使用平均值,而不是求和呢?答案是不會改變,所以分類的數量需要提前確定,當我們選擇數據集的時候,這只是將整個損失函數縮小了一個倍數,所以這並沒有什麼影響,這可以推出任何的縮放操作都不會有什麼影響,因為實際上並不在意真正的分數值或者是損失函數的真實值。

最後一個問題,如果我們改變損失函數的公式,在max上加上一個平方項,這還是同一個問題么?當然這會變得不同,所有這裡的想法在於我們用一種非線性的方法,當改變了在好和壞之間的權衡,所以實際上計算了另一種損失函數。關於合頁損失函數的平方項的想法有時候會在實際中應用,這是另一個技巧。當你針對你自己的問題,構成你自己的損失函數的時候。使用線性和平方的想法是量化我們關心多少的一種方法,關於不同類別的錯誤。

下面看到使用numpy的向量化編程,只用幾行代碼就能實現合頁損失函數,可以看到有一個很好的技巧是對應於正確的類我們可以把邊界值歸零,這是向量化編程的一個技巧可以只迭代一個類而不是所有,你只是把你想要跳過的那個清零然後計算總和。

關於合頁損失函數的另一個問題,假設你找到一個W讓損失函數的值為0,那是不是可以認為我們找到了一個相當棒的參數W。但是有一個問題是讓損失函數的值為0的W是否唯一,當然這樣的W不是唯一的。特別是因為我們只講了一點根據W把整個問題縮放的東西,你可以讓W放大兩倍,這也可以實現損失值為零。

再回到剛才的例子,我們將W放大兩倍,正確與錯誤的安全邊界值也會翻倍,所以如果所有這些安全邊際都大於1,就對其進行翻倍,其值也會大於1,因此損失函數依然為0。

那現在問題是我們應該如何在這些令損失函數為零的W中作出選擇。我們在這裡做的只是在數據上的損失計算,我們只希望讓分類器去試著找到可以擬合訓練集的W。但是實際上我們並不關心很多關於擬合訓練數據。機器學習的重點是使用訓練數據來找到一些分類器,然後將這個分類器應用在測試數據上,所以我們更關心分類器在測試集上的表現。

如果過分關注分類器在訓練集的擬合,就會出現一些尷尬的情況。下面是一個例子,假設有圖中的這些藍色的數據集,並為這些藍點擬合一些曲線。如果我們讓分類器做的唯一的事情是嘗試去擬合這些藍點,這個分類器可能是一條非常複雜的曲線去嘗試完美分類所有的訓練數據點。但是這樣做的會很不好,因為如果我們加入新的綠色的點,可以看到這條複雜的曲線是完全錯誤。實際上我們更喜歡綠色這條直線作為分類器。

這個在機器學習中是一個非常核心的基礎性問題,通常的解決方式是加入正則項。在這裡為損失函數添加一個附加的項。這是要分類器除了需要擬合訓練集之外,同時鼓勵模型以某種方式來選擇更簡單的W,這裡的簡單取決於任務的規模和使用的模型。這裡也體現了奧卡姆剃刀的理念,要讓一個理論的應用更廣泛,也就是說如果有多個可以解釋你觀察結果的假設,那你應該選擇最簡約的,因為這樣可以在以後將其用於解釋新的觀察結果。我們運用這種直觀的方式把這種思想應用在機器學習中,會直接假設正則項懲罰(記為R),這樣標準損失函數現在就有兩項,一個是損失值項和正則化項。這裡有一個超參數 lambda 用來平衡這兩個項。

實際上有很多不同類型的正則項,最常見的可能是L2正則項,但是還有很多你可能會看到的,這個L2正則項就是歐氏範數,其理念實際上是對權值向量的歐氏範數進行懲罰。有時候也會看到L1的正則項,是對權值向量的L1範數進行懲罰。L1正則項具有一些很好的性質,例如可以讓矩陣W變得稀疏。還有就是彈性網路正則化,這是L1和L2的組合。還有max norm正則化,懲罰的max norm不是L1或者L2範數。這些正則化是你看到的不僅僅是應用在深度學習,同時也在機器學習的的很多領域,甚至更廣泛地進行優化都有應用。在後面的課程中,也會看到一些更具體的正則化類型,例如Dropout,batch normalization。正則化的主要作用是為了減輕模型的複雜度,而不是去試圖擬合數據。

這裡有一些訓練樣本x,有兩個不同的W正在考慮,這裡x是一個包含四個1的4維向量。對於w我們來考慮兩種不同的可能性。第一種情形是W的第一個元素是1,另外三個元素都是0,另外一種情形是W的全部元素都是0.25。當進行線性分類的時候,我們真正討論的是x與W的點積結果,這時候兩種情形的W其實都是一樣的,因為和x點積的結果是一樣的。現在可以考慮一下那種情形下加入L2後的線性回歸模型會更好。當然是每個元素都是0.25的W的會更好,因為它具有較小的範數。在線性分類器中,W所反映的是x向量的值在多大程度上對輸出有影響,所以L2正則化的作用是,它更加能傳遞出x中不同元素值的影響,它的robust可能會更好,更多的考慮了W的整體分布,令所有的元素具有較小的複雜度。L1正則化則具有完全相反的解釋,當使用L1正則化的時候,我們更傾向於第一個元素為1,其他為0的W,L1正則化對複雜度具有不同的概念,即那個模型可能有較小的複雜度,在權值向量中,用數字0來描述模型的複雜度,L1更加喜歡稀疏解,傾向讓大部分W的元素接近於0。如何度量複雜度是視不同問題而定,針對模型和數據。

另外一個非常流行的選擇是除了多類別SVM損失函數之外,深度學習中另外一個常用的選擇是多項邏輯回歸或者叫softmax。這個損失函數在深度學習中使用得更為廣泛。當我們進行分類時,模型函數F輸出了10個數字,這些數字代表了這些類別的得分,在多類型SVM中我們並沒有針對類別的得分作出解釋,我們只是希望正確分類的分數要比不正確分類的分數要高才好。但是對於softmax函數,我們將賦予這些分數一些額外的含義,並且會利用這些按分數針對我們的類別去計算概率分布。在這個函數中我們將其指數化令到結果都為正,然後用將指數求和來進行歸一化,所以分數經過softmax函數處理後就可以得到概率分布。對所有的類別都有了對應的在0-1之間的概率,所有類別的概率和為1。我們將得到的概率值與目標值進行比較。如果真實的類別是喵,目標的概率分布就應把所有的概率擊中到喵上,所以喵的概率是1而其他類別是0。我們現在要做的事情是將softmax計算的結果去匹配上述的目標概率分布。這裡我們的損失函數就是正確類別概率的對數再取負值,我們希望概率接近1。同時log函數式一個單調函數,當針對正確類別的最大化 log;P ,意味著想要它變高,但是損失函數式用來度量不好的程度,所以對其取負值將求最大值變為求最小值。

現在又一次回到喵的例子,還是三個分數,但是現在不會直接使用這些分數,而是先將分數進行指數化處理,然後對其歸一化處理。現在的損失函數式 -log(0.13)

又是問題時間,首先softmax損失函數的最小值和最大值是多少?答案是最小值是0,最大值是無窮大,這裡我們希望不正確類別的概率是0,正確類別的概率是1,當類別是正確時,log函數中的自變數為1,1的對數是0,0再取負值還是0。但同時為了保證所有的東西都是正確的,分數必須是相當極端的趨向於無窮,因為這裡進行了指數化和歸一化處理,得到了一個0和1的概率分布。唯一的方法就是正確的分類取無窮大的分數,不正確的分類取負無窮大的分數。所以假設正確分類的概率質量函數為0,然後 log(0)log(0) 在數學上是無意義的,這裡講述的可能是極限的思想)是負無窮大,接著取負值後就變成正無窮大。但這種情況永遠不會出現,唯一能夠出現這個情況是概率為0,e的正確分類分值的指數是0,而這隻有在正確分類分值是負無窮時才會出現。

如果所有的s都小到近乎為0,那麼損失函數的值為多少?答案是 log(c) ,c是分類的類別。在使用softmax函數訓練模型,應該在第一次迭代中檢查,如果它不是 log(c) ,那可能出了問題,這可以用來作為一種檢查糾錯的機制。

現在來比較一下上面講過的這兩個損失函數。在線性分類分類方面,這個設定看起來是一樣的,我們將W和輸入向量相乘得到分值向量。這兩個函數的區別是我們如何來解釋這些分值來量化模型到底有多不好。所以對於多分類SVM,觀察的是正確和不正確分類的分值的邊際,而對於softmax函數或者交叉熵損失,是計算一個概率分布,然後查看正確分類的負對數概率。

當對比這兩個損失函數時是這麼想的,假設有一個例子,在多分類SVM損失函數中,當樣本中有車,那麼車的分值就會比其他不正確的分類的分值要高,即使車的分值稍微有所變化,也不會對結果產生根本的改變,因為多分類SVM唯一關心的是正確的分值要比不正確分值高出一個安全邊界。但是softmax就不一樣了,它的目標是將概率質量函數等於1,所以你給正確分類再高得分值同時給不正確分類再低的分值,softmax依然會在正確的分類上積累更多的概率質量。

下面是上述部分的一個小結。

優化問題可以是相像你走在一個大山谷,山谷中的景觀的每一點對應於參數W的一些設置,每個點的高度是這個W所帶來的損失,你在嘗試以某種方式找到這個山谷的底部。

在實踐中,我們想從某個解決方案開始,使用多種不同的迭代方法,然後逐步對它改造。可能一開始想到的辦法就是隨機搜索,這需要很多的權值隨機採樣,然後將其放入損失函數看看效果如何。

我們用隨機搜索來訓練一個線性分類器,對CIFAR-10有10個類別,所以把隨機概率設為10%。接下來隨機跑幾次得到的W是準確度達到15%。

現在再考慮一下,可能利用一下地形可能是個好的策略,你也許看不到一條直接到谷底的線路,但你可以觀察附近的地形,看看哪個方向的地面傾斜是朝著下山的方向並沿著該方向走一走,然後停下來不斷重複上面的步驟,這樣也許就能到達谷底了。這種簡單的方法就是在訓練大型神經網路、線性分類器上普遍使用。

微積分中,至少在一維上斜率就是函數的導數。如果有一個一維函數f將x作為標量,輸出的結果是曲線的高度,如果該曲線是連續可微分的,就可以計算曲線中的任意一點的斜率,如果向任何方向前進一步h,然後比較這一步前後函數差值,將步長趨向於0的時候,我們就可以到該點函數的斜率。現在推廣到多元函數,這是x是一個向量,多元函數的導數叫做梯度。所以梯度就是由偏導數組成的向量,梯度中的每個元素可以告訴我們相關方向上函數f的斜率。梯度指向函數增加最大的方向,相應地負梯度方向就是函數減少最大的方向。如果想要知道這個地形中任意方向的斜率,它就等於這一點上梯度和該點單位方向向量的點積。

在計算機中計算梯度的一個簡單的方法是有限差分法。這裡的左邊假設是當前權值向量的W,這時的損失函數的值是。計算有限差分的方法是將W的第一個元素加上一個很小的值h,然後用損失函數重新計算損失值。在這裡如果對第一個維度作出稍微的改變,損失值將會從1.2534降低到1.25322,然後使用這個有限差分在梯度的第一個維度實現有限差分逼近。

然後將第一個維度的值恢復至原樣,在第二個維度重複上述的操作。

接下來對每個維度都重複以上的操作。

先不考慮這個方法的效果如何,但你可以想到這個方法是非常的慢。如果你現在訓練的是一個大型的卷積神經網路,權值W的維度將會十分龐大,你要等上可能上億次的函數估計來得到一個梯度。

幸運的是你並不需要這麼做,感謝下面兩個大神,我們只要寫出損失函數的表達式,然後使用微積分神技,寫出梯度的表達式。比起使用有限差分法,使用微積分的計算分析方法將會非常的有效。它有如下優點,第一可以非常的精確,第二隻要計算一個表達式,所以速度會很快。

現在回到前面的例子,現在 dW 看上去是這樣的,與跌代計算所有W的維度不同,我們提前計算出W的梯度的表達式,再計算 dW 。在實際使用中,使用這種方法更好。

概括起來,在實際使用中可能不會使用數值梯度,但是數值梯度是簡單而且有意義。當計算梯度的時候,將總是使用解析梯度。然而有趣的是,數值梯度是非常有用的,可以用它來作為調試工具確保解析梯度是正確的。當你使用數值梯度進行檢查的時候,這個過程是非常的慢且不準確,所以你需要減少參數的數量,讓其可以在一個合理的時間內運行。

也許你看到下面只用了三行代碼就實現了梯度下降,但實際上它的計算量是非常的大,也是訓練複雜的深度學習演算法的核心。在梯度下降演算法中,首先初始化W為隨機值,然後計算損失和梯度,接著向梯度相反的方向更新權值,當我們向梯度減小的方向前進一小步並一直重複,直到最後網路收斂。其中步長或者叫做學習率是一個超參數,意味著每次計算梯度是在那個方向上前進多少距離。一般在訓練時,首先要做的事情是找到合適的步長或者學習率。

下面的圖片是用一個碗的形狀來表示損失函數,中心的紅色區域表示損失值較低,是我們優化的目標。而這些靠近邊緣的藍色和綠色區域表示較高的損失值,是我們要避免的。現在隨機初始化一個W,然後計算梯度的反方向,然後到達損失值最小的地方。

我們用損失函數,來計算分類器在訓練樣本的每一次迭代中表現有多不好,然後我們設定數據集的總誤差是整個訓練集誤差的平均值。但在實際中,N的值可能會非常的大,所以計算損失函數的計算成本會非常的高。因為梯度是一個線性運算符號,當嘗試計算表達式的梯度時,會發現損失函數的梯度值是每個單項誤差梯度值的總和。所以當要再次計算梯度,每一次迭代都考慮全部的N進行計算,這次很久才能更新一次W。所以在實際中我們會考慮使用隨機梯度下降,它不用計算整個訓練集的誤差和梯度值,而是在每一次迭代中選取一小部分訓練樣本作為mini batch。然後使用這個mini batch來估算誤差的總和以及實際梯度。因為這是隨機的,你可以把它當做對真是數值期望的一種蒙特卡洛估計。這裡僅增加了一行代碼,但是這讓我們的優化更加高效。

在實際操作中,如果直接輸入原始像素值放入線性分類器,表現會比較一般。所以當深度學習大規模流行之前,常用的方法是,首先拿到圖片計算其各種的特徵代表,例如計算與圖像有關的像素值,然後將不同的特徵向量合在一起得到圖像的特徵表述。現在這一關於圖像的特徵表述會作為線性分類器的輸入,而不是使用原始的像素值。

假設有一個訓練集如下圖左側所示,紅點分布在中間,藍色分布在紅點的周圍,對這樣的數據集是不能用一個線性決策邊界來將紅點從藍點中分開。但是如果採用一個靈活的特徵轉換,在這個例子中使用極坐標轉換。現在得到了轉換特徵,就可以吧複雜的數據集變為線性可分的。在這裡整個的技巧就是找到正確的特徵轉換,從而計算出所關心問題的正確特徵。而對圖像來說,將原始像素轉換到極坐標並不能起到什麼作用,但是你可以記下有可能起作用的圖像特徵表示。

一個特徵表示的簡單例子是顏色直方圖。獲取每個像素值對應的光譜,把它分到buckets中。將每一個像素都映射到這些buckets中。然後計算每一個不同的buckets中像素點出現的頻數。這個可以從全局上告訴我們圖像中有哪些顏色。比如這裡有一隻青蛙,特徵向量告訴我們這裡有很多的綠色,但沒有太多的紫色和紅色。

另外一種在神經網路興起前的常見的特徵向量是方向梯度直方圖,它嘗試獲取重要的有向邊緣,並且測量圖像中邊緣的局部方向。方向梯度直方圖首先獲取圖像,然後將圖像按照八個像素區域分為八份,在八個像素區域的每一個部分計算每個像素值的主要邊緣方向,把這些邊緣方向量化到幾個buckets鍾,並在每一個區域內計算不同的邊緣方向從而得到一個直方圖。現在的全特徵向量就是這些不同buckets的邊緣方向直方圖,這個直方圖是從圖像的八個區域得到的。這在某種程度上是因為之前看到的顏色直方圖分類器是從全局上看出圖像中存在哪些顏色,也可以看出圖像中有哪些不同類型的邊緣。即使是圖像的不同部分,不同區域內存在著哪些類型的邊緣都可以了解到。像下面的這隻青蛙,可以看見它坐在葉子上,這些葉子主要存在對角線的邊緣,如果要將這些方向梯度特徵的直方圖可視化,可以看見在這個區域里存在著大量的對角線邊緣。這是一種常見的用於目標識別的特徵表示。

另外一個特徵表示的例子是詞袋,這是從自然語言處理中獲得的靈感。如果用一個特徵向量表示一段話的方法是計算不同詞在這段話中出現的次數。簡單地吧文字類比於圖像是不容易的,因此需要定義視覺單詞字典。這裡採用的是兩個階段的方法,首先獲得一堆圖像並從這些圖像中進行小的隨機塊的採樣,然後用K-means等方法將它們聚合成簇來得到不同的cluster的中心,這些cluster的中心可能代表了圖像中視覺單詞的不同類型。現在看看下面的聚類的例子,從圖像中得到不同的圖像塊,可以看到在聚類之後,視覺單詞獲取了不同的顏色。現在來看看在數據驅動方式下從數據中獲得這些有效邊緣。一旦獲得了一系列的視覺單詞,就可以用這些視覺單詞來給圖像進行編碼,例如某個視覺單詞會在圖像中出現的次數。這給了我們關於圖像視覺外觀的不同的信息。

在5到10年前對圖像計算它的不同的特徵表示的差異,然後將這些特徵連接在一起放到這些線性分類器的特徵提取器中,接下來的想法是在提取這些特徵後讓它在訓練中不會被更新,而在訓練中只更新線性分類器如果它用於最重要的特徵。當使用卷積神經網路時,看上去也沒有多大的不同,唯一的差別就是不用提前記錄特徵而是直接從數據中學習特徵。所以將獲取的像素值作為卷積神技網路的輸入,經過多層的計算,最後會得到一些數據驅動的特徵表示類型。接下來在整個網路中訓練所有的權值。


推薦閱讀:

TAG:深度學習DeepLearning | 計算機視覺 |