cs231n系列1-2: 線性分類(lèi):支持向量機(jī),Softmax

說(shuō)明

  1. 本系列文章翻譯斯坦福大學(xué)的課程:Convolutional Neural Networks for Visual Recognition的課程講義 原文地址:http://cs231n.github.io/。 最好有Python基礎(chǔ)(但不是必要的),Python的介紹見(jiàn)該課程的module0。

  2. 本節(jié)的code見(jiàn)地址:
    https://github.com/anthony123/cs231n/tree/master/module1-2

  3. 如果在code中發(fā)現(xiàn)bug或者有什么不清楚的地方,可以及時(shí)給我留言,因?yàn)閏ode沒(méi)有經(jīng)過(guò)很?chē)?yán)格的測(cè)試。

這節(jié)課的主要內(nèi)容:

  • 介紹線性分類(lèi)
  • 線性分?jǐn)?shù)函數(shù)
  • 解釋線性分類(lèi)器
  • 損失函數(shù)
    • 多類(lèi)別SVM
    • Softmax分類(lèi)器
    • SVM vs Softmax
  • 線性分類(lèi)的交互性網(wǎng)頁(yè)示例
  • 總結(jié)

線性分類(lèi)

上一節(jié)課介紹了線性分類(lèi)問(wèn)題,它從一個(gè)固定的標(biāo)簽集合中選擇一個(gè)標(biāo)簽,賦予一張圖片。而且,我們介紹了KNN分類(lèi)器,它通過(guò)將輸入圖像與訓(xùn)練集中的圖像比較的方法賦予圖像標(biāo)簽。我們知道,kNN有如下幾個(gè)缺點(diǎn):

  • 分類(lèi)器必須記住所有的訓(xùn)練數(shù)據(jù),并把它存儲(chǔ)起來(lái),將來(lái)與測(cè)試集中的圖像進(jìn)行比較。這種方式非常耗費(fèi)空間,因?yàn)橛?xùn)練集往往在GB數(shù)量級(jí)。
  • 對(duì)一張圖片進(jìn)行分類(lèi)非常耗費(fèi)時(shí)間,因?yàn)樗枰c訓(xùn)練集中所有的圖片進(jìn)行比較。

概要

我們將要開(kāi)發(fā)一個(gè)更強(qiáng)大的圖像分類(lèi)算法,它最終能夠被擴(kuò)展到整個(gè)神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)。這個(gè)算法有兩個(gè)主要的部分:1. 把原始數(shù)據(jù)映射到種類(lèi)分?jǐn)?shù)的分?jǐn)?shù)函數(shù);2.評(píng)估預(yù)測(cè)分?jǐn)?shù)與真實(shí)標(biāo)簽一致性的損失函數(shù)。我們最終會(huì)把分類(lèi)問(wèn)題看成一個(gè)優(yōu)化問(wèn)題,即通過(guò)改變分?jǐn)?shù)函數(shù)的參數(shù)來(lái)最小化損失函數(shù)。

圖像到標(biāo)簽分?jǐn)?shù)的參數(shù)化映射

這個(gè)算法的第一個(gè)組成部分是定義一個(gè)分?jǐn)?shù)函數(shù),它將圖像的像素值映射到對(duì)每個(gè)類(lèi)的置信分?jǐn)?shù)(confidence scores)。我們會(huì)以一個(gè)具體的例子來(lái)說(shuō)明。和以前一樣,我們假設(shè)一個(gè)圖片訓(xùn)練集 x_i ∈ R^D, 每張圖片都和一個(gè)標(biāo)簽 y_i,其中i=1…N,y_i∈1…K 相對(duì)應(yīng)。也就是說(shuō),我們有N個(gè)例子(每個(gè)有D個(gè)維度)和K個(gè)不同的種類(lèi)。比如,CIFAR-10測(cè)試集 N=50,000,每張圖片的維度D=32x32x3=3072,K=10,因?yàn)槲覀冇?0類(lèi)物品(狗,貓,車(chē)等)。我們現(xiàn)在定義一個(gè)分?jǐn)?shù)函數(shù)

它將圖像的原始像素映射到種類(lèi)分?jǐn)?shù)。

線性分類(lèi)器

我們從一個(gè)最簡(jiǎn)單的線性函數(shù)出發(fā),一個(gè)線性映射:

在上面的表達(dá)式中,我們假設(shè)圖像 Xi 所有的像素都放在一個(gè)行向量中,它的形狀為[Dx1]。矩陣W(大小為[KxD])和向量b(大小為[Kx1])都是函數(shù)的參數(shù),在CIFAR-10中,Xi 包含第i張圖片的所有像素,其大小為[3072x1], W的大小為[10x3072],b的大小為[10x1]。所以輸入3072個(gè)數(shù)字到函數(shù)中,輸出10個(gè)數(shù)字。W中的參數(shù)稱之為權(quán)重b稱之為偏置向量(bias vector),因?yàn)樗m然影響輸出,但是它并不和實(shí)際的數(shù)據(jù)交互。在實(shí)踐中,人們經(jīng)常將權(quán)重參數(shù)互換使用。

下面有幾件事情需要說(shuō)明一下:

  • 單獨(dú)的乘積 WXi 能夠并發(fā)地同時(shí)評(píng)估10個(gè)分類(lèi)器,其中,W的每一行是一個(gè)分類(lèi)器

  • 注意我們將輸入數(shù)據(jù)(Xi,yi)視作固定的,而我們可以控制W和b的值。我們的目標(biāo)是設(shè)置它們的值,使得對(duì)整個(gè)訓(xùn)練集圖片的預(yù)測(cè)和它們的真實(shí)標(biāo)簽盡可能一致。我們以后會(huì)討論如何做到這一點(diǎn),但是從直覺(jué)上說(shuō),我們希望正確的類(lèi)別分?jǐn)?shù)比錯(cuò)誤類(lèi)別的分?jǐn)?shù)要高。

  • 這個(gè)算法的一個(gè)優(yōu)點(diǎn)是訓(xùn)練集用來(lái)學(xué)習(xí)參數(shù)W,b,一旦學(xué)習(xí)結(jié)束,我們可以丟棄整個(gè)訓(xùn)練集,只保留學(xué)習(xí)的參數(shù)。測(cè)試圖片可以通過(guò)分?jǐn)?shù)函數(shù)的輸出結(jié)果來(lái)獲得分類(lèi)的標(biāo)簽。

  • 對(duì)測(cè)試圖片分類(lèi)只包括了一個(gè)簡(jiǎn)單的矩陣乘法和加法,它比將它與所有的訓(xùn)練集比較要快的多。

    卷積神經(jīng)網(wǎng)絡(luò)和上面描述的方法那樣,將圖像像素映射成類(lèi)別分?jǐn)?shù),但是映射函數(shù)(f)會(huì)更復(fù)雜,參數(shù)也會(huì)更多。

解釋線性分類(lèi)

線性分類(lèi)器通過(guò)求一張圖片三個(gè)通道所有像素的權(quán)重和來(lái)計(jì)算計(jì)算類(lèi)別分?jǐn)?shù)。 通過(guò)設(shè)置這些權(quán)重值,類(lèi)別函數(shù)可以“喜歡”或“不喜歡”圖片特定位置的像素顏色。比如, 你可以想象類(lèi)別為“船”的圖像,它周邊的藍(lán)色像素值比較高,所以你可以預(yù)期類(lèi)別船在藍(lán)色通道有很多正的權(quán)重(藍(lán)色的出現(xiàn)提高了類(lèi)別船的分?jǐn)?shù)),而在紅色/綠色通道有很多負(fù)的權(quán)重(紅色/綠色的出現(xiàn)降低了船的分?jǐn)?shù))。

將一張圖片映射到類(lèi)別分?jǐn)?shù)的一個(gè)例子。為了顯示的簡(jiǎn)單性,我們假設(shè)這張圖只有四個(gè)像素,三個(gè)類(lèi)別(紅色(貓), 綠色(狗)和藍(lán)色(船))。我們把圖像的像素放入一個(gè)列向量中,進(jìn)行矩陣乘法來(lái)獲得每個(gè)類(lèi)別的分?jǐn)?shù)。注意 這個(gè)W設(shè)置的并不好,把這張貓的圖片賦予貓類(lèi)別的分?jǐn)?shù)很低,而且這個(gè)參數(shù)W似乎認(rèn)為它更像一條狗

圖像與高維度點(diǎn)集的類(lèi)比

因?yàn)閳D像可以看成高維度的列向量,我們可以把每張圖看做成在這個(gè)空間中的一個(gè)點(diǎn)(比如, 在CIFAR-10中,圖像可以看做是3072維度上的一個(gè)點(diǎn)),所以整個(gè)數(shù)據(jù)集可以看成是一個(gè)點(diǎn)的集合。

因?yàn)槲覀儼杨?lèi)別的分?jǐn)?shù)看成這張圖片的所有像素權(quán)重和,那么每個(gè)類(lèi)別分?jǐn)?shù)可以看成是在這個(gè)空間內(nèi)的一個(gè)線性函數(shù)。我們無(wú)法直觀地感受3027維度的空間,但是如果我們能把所有的點(diǎn)放在二維空間內(nèi),那我們就可以直觀地看到這個(gè)分類(lèi)器做了些什么:

圖像空間的卡通展示,其中每張圖片是一個(gè)點(diǎn),三條直線表示三個(gè)分類(lèi)器。以汽車(chē)分類(lèi)器(紅色)為例:紅線表示所有汽車(chē)類(lèi)別分?jǐn)?shù)為0的點(diǎn)。紅色的箭頭表示增長(zhǎng)的方向,所以在紅色線的右邊的點(diǎn),其汽車(chē)類(lèi)別分?jǐn)?shù)為正(離的越遠(yuǎn),其類(lèi)別分?jǐn)?shù)值越高), 所有在紅色線左邊的點(diǎn),其汽車(chē)類(lèi)別分?jǐn)?shù)為負(fù)(離的越遠(yuǎn),其類(lèi)別分?jǐn)?shù)值越小)

我們知道, W的每一行都是一個(gè)類(lèi)別的分類(lèi),這些數(shù)字的幾何解釋是,當(dāng)我們改變W中一行中的某些數(shù)字,在像素空間中對(duì)應(yīng)的直線會(huì)沿不同方向上旋轉(zhuǎn)。偏置量b可以使得這些直線的位移發(fā)生變化。特別地,如果沒(méi)有偏置量,而且Xi=0,那么不管權(quán)重取什么值,得到的分?jǐn)?shù)都是0。所有的直線都被迫穿過(guò)原點(diǎn)。

把線性分類(lèi)器作為模型匹配的解釋

權(quán)重W的另外一個(gè)解釋是W的每一行都對(duì)應(yīng)于一個(gè)類(lèi)別的模型(有的時(shí)候也稱之為原型)。一個(gè)圖像的類(lèi)別分?jǐn)?shù)通過(guò)內(nèi)積來(lái)比較圖像與各個(gè)模型的匹配程度。使用這種術(shù)語(yǔ), 線性分類(lèi)器就是模型匹配,這些模型都是通過(guò)學(xué)習(xí)獲得的。另一種思考方式是它在做最近鄰分析。不同的是,之前是和訓(xùn)練集中所有的圖像進(jìn)行比較,現(xiàn)在只需要和一張圖像比較(這張圖片不一定是訓(xùn)練集中的一張圖片)。同時(shí),我們使用(負(fù))內(nèi)積來(lái)作為距離,而不是L1或者L2距離。

CIFAR-10的學(xué)習(xí)權(quán)重,以船類(lèi)別為例,與預(yù)期的一樣,船類(lèi)別包含許多藍(lán)色的像素,所以如果與在海洋中的船圖像做內(nèi)積,將會(huì)得到一個(gè)更高的類(lèi)別分?jǐn)?shù)。

從上圖我們可以觀察到,馬的模型好像包含一個(gè)雙頭馬,這是因?yàn)樵跀?shù)據(jù)集中馬既有朝左的,也有朝右的。線性分類(lèi)器把數(shù)據(jù)集中馬的這兩種模式都編碼到一個(gè)模型當(dāng)中。類(lèi)似的,車(chē)分類(lèi)器似乎融合了各個(gè)朝向和顏色的車(chē)。特別地, 這個(gè)車(chē)模型的顏色是紅色。說(shuō)明在CIFAR-10中,紅色的車(chē)遠(yuǎn)多于其他顏色的車(chē)。這個(gè)線性分類(lèi)器在分類(lèi)不同顏色的車(chē)時(shí)比較弱,在后面我們會(huì)看到神經(jīng)網(wǎng)絡(luò)可以使得我們很好地識(shí)別不同顏色的車(chē)。先劇透一下,神經(jīng)網(wǎng)絡(luò)可以在隱藏層里有中間的神經(jīng)網(wǎng)絡(luò),它可以識(shí)別特定模式的車(chē)(比如,朝左的綠色的車(chē), 朝前的藍(lán)色的車(chē)等)。而下一層的神經(jīng)元可以把這些特征都結(jié)合起來(lái),通過(guò)一個(gè)權(quán)重和,獲得一個(gè)更準(zhǔn)確的車(chē)類(lèi)別分?jǐn)?shù)。

偏置的小技巧

在繼續(xù)進(jìn)行下去之前,我們來(lái)講一個(gè)將W和b合并成一個(gè)參數(shù)的小技巧,回憶一下,我們將分?jǐn)?shù)函數(shù)定義為


我們之后會(huì)發(fā)現(xiàn)要記錄兩個(gè)參數(shù)W和b會(huì)有些麻煩,一個(gè)常用的小技巧是將W和B表示為一個(gè)矩陣,它通過(guò)將Xi擴(kuò)展一個(gè)維度,并且這個(gè)維度的值一直為1。增加一個(gè)維度之后,新的分?jǐn)?shù)函數(shù)將被簡(jiǎn)化為一個(gè)矩陣乘法:

以CIFAR-10為例,Xi 現(xiàn)在是[3073x1],而不是[3072x1](多出來(lái)的維度里面的值為1)。W現(xiàn)在是[10x3073]而不是[10x3072]。W中多出來(lái)的一列對(duì)應(yīng)于偏置值b。下面的圖示可以幫助理解:

偏置技巧的示意圖。先做一個(gè)矩陣乘法,然后在加上一個(gè)偏置向量(如左邊所示)與 如下做法是等價(jià)的,即在輸入向量中加入一個(gè)維度,將其值設(shè)為1,將權(quán)重矩陣也擴(kuò)充一列,將這列的值設(shè)為偏置向量的值,再將這兩個(gè)矩陣相乘。所以,如果我們對(duì)數(shù)據(jù)進(jìn)行以上的預(yù)處理,那么我們只需要操作一個(gè)單獨(dú)的矩陣了

圖像數(shù)據(jù)預(yù)處理

在上面的例子中,我們使用的是原始的像素值([0...255])。 在機(jī)器學(xué)習(xí)中,將輸入特征歸一化(在圖像的例子中,每個(gè)像素可以看做是一個(gè)特征)是一個(gè)常見(jiàn)的做法。特別地, 通過(guò)減去每個(gè)特征的平均值,將每個(gè)特征中心化非常重要。在圖像的領(lǐng)域中,對(duì)應(yīng)的做法是計(jì)算訓(xùn)練集的平均圖片,再將每張圖片減去這個(gè)平均圖片,就可以得到像素值在[-127,127]范圍內(nèi)的像素矩陣。更常見(jiàn)的做法是將像素值再縮放到[-1,1]的范圍內(nèi)。其中,零中心化非常重要,但是我們要等到我們理解了梯度下降的動(dòng)態(tài)性,我才會(huì)證明它的重要性。

損失函數(shù)

在上一節(jié)中我們通過(guò)權(quán)重W,定義了一個(gè)將像素值映射到類(lèi)別分?jǐn)?shù)的函數(shù)。我們無(wú)法改變數(shù)據(jù)值(Xi,yi),但是我們可以控制這些權(quán)重,我們想要通過(guò)設(shè)定它們的值,使得我們預(yù)測(cè)的類(lèi)別分?jǐn)?shù)能夠和真實(shí)的標(biāo)簽一致。

以之前的貓的例子為例,它的類(lèi)別函數(shù)在貓,狗和船類(lèi)別中做出預(yù)測(cè)。我們發(fā)現(xiàn)那個(gè)權(quán)重設(shè)置的并不好,我們輸入一只貓的像素,但是貓的類(lèi)別分?jǐn)?shù)(-96.8)并不比其他兩類(lèi)高(狗的分?jǐn)?shù)為437.9,船的分?jǐn)?shù)為61.95)。我們用損失函數(shù)(有時(shí)候也稱之為花費(fèi)函數(shù)或目標(biāo)函數(shù))測(cè)量我們對(duì)結(jié)果的不滿意。從直覺(jué)上來(lái)說(shuō),如果損失函數(shù)大,那么我們分類(lèi)結(jié)果不是很好,反之,如果分類(lèi)結(jié)果好,則損失函數(shù)的值就會(huì)很低。

多類(lèi)別支持向量機(jī)損失

有很多定義損失函數(shù)的方法,第一個(gè)例子是常用的損失函數(shù):多類(lèi)別支持向量機(jī)損失(Multiclass Support Vector Machine Loss)。SVM損失希望正確的類(lèi)別分?jǐn)?shù)比不正確的類(lèi)別分?jǐn)?shù)至少高Δ。有時(shí)候把損失函數(shù)做上面那樣的類(lèi)比是正確的,即SVM希望最終的損失值比較小。

現(xiàn)在我們具體來(lái)說(shuō)明,對(duì)于第i張圖片,我們已知這張圖片的所有像素Xi和它的類(lèi)別標(biāo)簽yi,分?jǐn)?shù)函數(shù)輸入圖像的像素,輸出一個(gè)類(lèi)別分?jǐn)?shù)的向量,我們用s表示。比如,第j個(gè)類(lèi)別的分?jǐn)?shù)我們可以表示為Sj, 那么第i張圖片的多類(lèi)別SVM損失可以表示為

例子

讓我們用一個(gè)例子來(lái)說(shuō)明。假設(shè)我們有三個(gè)類(lèi)別,它們的分?jǐn)?shù)是s=[13,-7,11]。其中 第一個(gè)類(lèi)別是正確的類(lèi)別。我們假設(shè)Δ(超參數(shù),后面我們會(huì)詳細(xì)討論)為10。上面的公式是把所有不正確的類(lèi)別分?jǐn)?shù)加起來(lái),我們得到兩項(xiàng):我們可以發(fā)現(xiàn)第一項(xiàng)等于零,因?yàn)閇-7-13+10]為負(fù)數(shù)。所以這一項(xiàng)的損失為0,因?yàn)檎_類(lèi)別的分?jǐn)?shù)(13)至少比不正確類(lèi)別分?jǐn)?shù)(-7)大10.實(shí)際上, 它們之間的差距是20,比10大得多。但是我們只關(guān)心它是否比10大。第二項(xiàng)[11-13+10]為8,雖然錯(cuò)誤類(lèi)別分?jǐn)?shù)比正確類(lèi)別分?jǐn)?shù)小,但是它們之間的差異小于10.所以SVM損失希望正確類(lèi)別的分?jǐn)?shù)至少比錯(cuò)誤類(lèi)別的分?jǐn)?shù)大Δ,如果不是這種情況,那么損失就會(huì)累積。

在這個(gè)特殊的例子中, 我們使用的是線性分?jǐn)?shù)函數(shù)f(xi;W) = Wxi,所以我們可以把損失函數(shù)改寫(xiě)為:

其中Wj是W的第j行。注意當(dāng)我們考慮更復(fù)雜的f時(shí),情況就會(huì)不同。

在結(jié)束這一節(jié)之前,我們?cè)俳榻B一個(gè)術(shù)語(yǔ):鉸鏈損失(hinge loss)。它指的就是max(0, -)定義的損失函數(shù)。你有時(shí)候會(huì)看到人們使用平方鉸鏈損失(或者L2-SVM),它使用max(0, -)^2來(lái)加強(qiáng)損失的程度。標(biāo)準(zhǔn)鉸鏈損失是一種常見(jiàn)的做法,但是有時(shí)候平方鉸鏈損失能達(dá)到更好的結(jié)果, 這可以通過(guò)交叉驗(yàn)證來(lái)決定。

損失函數(shù)用來(lái)把我們對(duì)測(cè)試集的測(cè)試不滿意度量化。

多類(lèi)別支持向量機(jī)“希望”正確類(lèi)別的分?jǐn)?shù)至少比其他的分?jǐn)?shù)高Δ, 任何在紅色區(qū)域的類(lèi)別分?jǐn)?shù)(或更高)都會(huì)累積損失值,其他情況,損失值為0。我們的目標(biāo)是找出一個(gè)權(quán)重值,使得在訓(xùn)練集中所有的圖像都滿足這個(gè)限制,并且整個(gè)損失越低越好。

正則項(xiàng)

我們上面給出的損失函數(shù)有一個(gè)錯(cuò)誤。假設(shè)我們有一個(gè)數(shù)據(jù)集和可以將每一類(lèi)都正確分類(lèi)參數(shù)W。那么這樣的W不是唯一的。還有很多相似的W可以將數(shù)據(jù)集中的例子正確分類(lèi)。一個(gè)簡(jiǎn)單的例子:如果W能夠正確地將例子分類(lèi),那么W的倍數(shù)λW(λ>1)也能使損失為0,因?yàn)檫@個(gè)變換將所有的分?jǐn)?shù)都增加了,它們的差異分?jǐn)?shù)也是。比如,如果一個(gè)正確的類(lèi)與一個(gè)最近的錯(cuò)誤的類(lèi)之間的差異分?jǐn)?shù)為15,那么把W中所有的權(quán)重乘2,新的差異就變?yōu)?0。
我們將通過(guò)一種方法使得W能夠去除這種不確定性。即通過(guò)在損失函數(shù)中增加正則懲罰(regularization penalty)R(W). 最常見(jiàn)的正則懲罰是L2,它通過(guò)逐元素的平方懲罰能夠識(shí)別數(shù)值較大的權(quán)重。公式如下:



在上面的表達(dá)式中,我們把W所有權(quán)重的平方加起來(lái)了。注意正則函數(shù)不是關(guān)于數(shù)據(jù)的函數(shù),它只基于權(quán)重。加入權(quán)重懲罰之后,多類(lèi)別支持向量機(jī)公式才完成了,它包括兩個(gè)部分:一個(gè)是數(shù)據(jù)損失(它是所有例子的平均損失),一個(gè)是正則損失。最終完整的多類(lèi)別SVM損失函數(shù)為:


或者把它擴(kuò)展為一個(gè)完整的形式:


其中N為訓(xùn)練例子的數(shù)目。你可以看到,我們將正則懲罰項(xiàng)加入到了損失函數(shù)中,并使用λ控制它的權(quán)重。沒(méi)有一個(gè)簡(jiǎn)單的方式設(shè)置這個(gè)超參數(shù),它經(jīng)常是使用交叉驗(yàn)證的方式來(lái)確定。

除了以上提到的原因外,加入正則項(xiàng)還有其他的好處。我們會(huì)在后面的內(nèi)容講到。例如,加入L2項(xiàng)可以使得SVM容易獲得最大的邊界(max margining)。
懲罰數(shù)值大的權(quán)重的一個(gè)最大的好處是可以提高可擴(kuò)展性。它意味著沒(méi)有一個(gè)單獨(dú)的輸入維度可以對(duì)結(jié)果產(chǎn)生過(guò)大的影響。比如:我們有一個(gè)輸入向量:x=[1,1,1,1]和兩個(gè)權(quán)重向量 w1=[1,0,0,0]和w2=[.25,.25,.25,.25]。它們都與輸入向量的點(diǎn)積都為1, 但是w1的L2懲罰項(xiàng)為1.0 而w2的L2懲罰項(xiàng)為0.25。因此,w2是更好的權(quán)重向量。直觀上,我們可以看出w2中權(quán)重值更小,也更分散,最終的分類(lèi)器也依賴于更多的權(quán)重。在之后的課程我們可以看到,這個(gè)行為可以增加可擴(kuò)展性,減少過(guò)度擬合。
注意偏置項(xiàng)并沒(méi)有相同的效果。因?yàn)椋幌駲?quán)重值,它們沒(méi)有控制輸入維度的影響力。因此,通常只對(duì)W進(jìn)行正則化。但是,在實(shí)踐中,如果也將偏置項(xiàng)正則化,影響也可以忽略不計(jì)。最后,由于我們加入了正則懲罰,損失項(xiàng)永遠(yuǎn)不可能達(dá)到0,除非W中的權(quán)重都為0.

代碼

這是用Python實(shí)現(xiàn)的損失函數(shù)的代碼(沒(méi)有正則項(xiàng)),既有非向量化也有半向量化形式:

def L_i(x,y,w):
    """
    非向量化版本。計(jì)算一個(gè)例子(x,y)的多類(lèi)別SVM損失。
    -X 表示一張圖片的列向量(比如,在CIFAR-10中為3073x1)
    -y 一個(gè)整數(shù),表示正確類(lèi)別的索引值(比如,在CIFAR-10中為0~9)
    -W 為權(quán)重矩陣(比如,在CIFAR-10中,表示10x3073)
    """
    delta = 1.0 
    scores = w.dot(x)   #每一類(lèi)的分?jǐn)?shù)
    correct_class_score = scores[y] 
    D = W.shape[0] 
    loss_i = 0.0
    
    for j in xrange(D): #遍歷所有的錯(cuò)誤種類(lèi)
        if j == y:
            continue    #跳過(guò)正確的種類(lèi)
            
        loss_i += max(0, socres[j] - correct_class_score + delta)
    return loss_i
    
def L_i_vertorized(x,y,W):
    """
    更快的,半向量化實(shí)現(xiàn)。半向量化是指一個(gè)單獨(dú)的例子中沒(méi)有for循環(huán),但是還是有一個(gè)大循環(huán)
    “””
    delta = 1.0
    scores = W.dot(x)
        
    #一個(gè)向量操作計(jì)算所有類(lèi)別的邊緣值
    margins = np.maximun(0, scores - scores[y] + delta)
        
    #把正確的邊緣值置0
    margins[y] = 0
    loss_i = np.sum(margins)
    return loss_i
        
def L(X,y,W):
    """
    全向量化,留給讀者完成
    """

這一節(jié)的主要內(nèi)容是SVM損失, 它使用一個(gè)方法來(lái)測(cè)量預(yù)測(cè)結(jié)果與真實(shí)標(biāo)簽的一致性。此外,對(duì)訓(xùn)練集做一個(gè)好的預(yù)測(cè)相當(dāng)于最小化損失值。

我們現(xiàn)在需要做的就是想出一種方法來(lái)求出使得損失最小化的權(quán)重值

實(shí)踐考慮

設(shè)置delta

我們沒(méi)有講解超參數(shù)Δ及如何設(shè)置它,我們必須要通過(guò)交叉驗(yàn)證的方式設(shè)置嗎?實(shí)際上,我們可以安全地將它的值設(shè)為1.0 。超參數(shù)Δ和λ看起來(lái)是兩個(gè)不同的參數(shù),其實(shí)它們都是用來(lái)控制一個(gè)平衡:即數(shù)據(jù)損失和正則項(xiàng)之間的平衡。理解這件事情的關(guān)鍵在于W的值直接影響了分?jǐn)?shù)值(進(jìn)而影響分?jǐn)?shù)之間的差異):當(dāng)我們減少W中所有的值,那么差異值就會(huì)減少,反之差異值就會(huì)增大。因此,分?jǐn)?shù)之間的邊緣值(比如:Δ=1 或Δ=100)在某種程度上是沒(méi)有意義的因?yàn)闄?quán)重值可以隨意增大或減少差異值。所以,真正的平衡點(diǎn)在于我們?cè)试S權(quán)重值增加到多大程度(通過(guò)正則項(xiàng)的參數(shù)λ)。

與二元SVM的關(guān)系

你可能之前接觸過(guò)二元SVM,第i個(gè)樣本的損失值可以寫(xiě)為:

其中,其中C是一個(gè)超參數(shù),y_i ∈{-1,1}。 你可以說(shuō)服自己,以上那個(gè)公式就是我們這節(jié)所講的公式的一個(gè)特殊的情況(種類(lèi)為2),同時(shí)上式中的C與我們公式的λ都是用來(lái)控制平衡,它們是倒數(shù)關(guān)系。

在基本式上優(yōu)化

如果你之前已經(jīng)有SVM的知識(shí),那么你可能聽(tīng)過(guò)核(kernel)對(duì)偶(dual)和SMO算法。但是這這個(gè)課堂我們只是求在沒(méi)有限制條件下的基本式優(yōu)化值,所以很多目標(biāo)函數(shù)都不可微(比如 MAX(x,y)函數(shù)不可微,因?yàn)楫?dāng)x=y時(shí),不可微)。但是在實(shí)踐中,這并不是一個(gè)問(wèn)題,因?yàn)槲覀兘?jīng)常用子梯度。

其他多種類(lèi)SVM公式

值得注意的是在這節(jié)課上呈現(xiàn)的多類(lèi)別SVM的公式只是多種多類(lèi)別SVM公式的一種,另外一種經(jīng)常使用的公式是OVA(One-Vs-All)SVM, 它給每個(gè)種類(lèi)及所有的種類(lèi)SVM訓(xùn)練二元的SVM。還有一種是AVA(All-As-All) SVM,相比OVA,我們的公式是一個(gè)更有效的公式。還有一種是結(jié)構(gòu)化SVM(structured SVM),它最大化正確類(lèi)別和最高的錯(cuò)誤類(lèi)別分?jǐn)?shù)之間的差異。理解他們之間的差異不是本門(mén)課的內(nèi)容,本節(jié)課使用的公式是一個(gè)比較安全的公式,但是最簡(jiǎn)單的OVA公式也能工作的很好。

Softmax Classifier

SVM是兩個(gè)最常見(jiàn)的分類(lèi)器之一。另外一個(gè)常見(jiàn)的選擇是Softmax 分類(lèi)器。如果你以前聽(tīng)過(guò)二元邏輯回歸分類(lèi)器的話,那么Softmax分類(lèi)器是擴(kuò)展到多種類(lèi)別的一個(gè)更一般化的版本。與SVM將f(xi,W)的結(jié)果看做成每個(gè)類(lèi)別的分?jǐn)?shù)不同,Softmax分類(lèi)器給出了一個(gè)更直覺(jué)化的結(jié)果,即使用概率論的知識(shí)解釋得到的結(jié)果。在softmax分類(lèi)器中,函數(shù)f(xi:W) = Wxi 保持不變,但是我們現(xiàn)在把這些分?jǐn)?shù)解釋為每一類(lèi)的未標(biāo)準(zhǔn)化的log可能性。并將鉸鏈損失替換為交織熵?fù)p失(cross-entropy loss),它的形式如下:



或者等價(jià)于

其中 fj 是指第j個(gè)類(lèi)別的分?jǐn)?shù)。和之前一樣,最終的損失值是Li的平均值加上一個(gè)正則項(xiàng)R(W). 函數(shù)



稱之為softmax函數(shù):它輸入一個(gè)任意的實(shí)數(shù)分?jǐn)?shù)組成的向量,把它變成數(shù)值在0~1,并且所有數(shù)值加起來(lái)為1的向量。涉及Softmax函數(shù)的完整的交叉熵?fù)p失函數(shù)第一次看可以有點(diǎn)嚇人,但是其實(shí)它非常容易理解。

信息論視角

真實(shí)的分布p與估計(jì)的分布q之間的交叉熵可以定義為:

Softmax分類(lèi)器就是用來(lái)最小化預(yù)測(cè)的類(lèi)別概率

與真實(shí)分布(這里指的是正確分類(lèi)的分布)之間的交叉熵。而且因?yàn)榻徊骒乜梢詫?xiě)成熵的形式, 而Kullback-Leibler散度可以寫(xiě)成

delta函數(shù)P的熵為0,這也等價(jià)于最小化兩個(gè)分布(距離)KL散度。換句話說(shuō),交叉熵的目標(biāo)就是希望預(yù)測(cè)的分布盡可能與正確分布一致。

概率解釋

仔細(xì)觀察下面這個(gè)表達(dá)式,我們可以發(fā)現(xiàn)

可以解釋為已知圖像xi和參數(shù)W,求它被賦予正確標(biāo)簽yi的(標(biāo)準(zhǔn)化)概率。我們已知Softmax分類(lèi)器將分?jǐn)?shù)解釋為一個(gè)非標(biāo)準(zhǔn)化的log概率向量f,除法操作是標(biāo)準(zhǔn)化操作,使得所有的概率加起來(lái)為1. 使用概率學(xué)的術(shù)語(yǔ),我們最小化正確類(lèi)別的負(fù)log可能性,它也可以被解釋為執(zhí)行最大似然估計(jì)(Maximum Likelyhood Estimation, MLE)。 這個(gè)視角的一個(gè)好的特征是我們現(xiàn)在可以把正則項(xiàng)R(W)解釋為關(guān)于W的高斯先驗(yàn)知識(shí)。所以我們不將它解釋我MLE,而是解釋為最大后驗(yàn)概率(maximum a posteriori, MAP)。我們講這些是為了使你們從直觀上更容易理解,但是關(guān)于這些細(xì)節(jié)卻超出了本書(shū)的范圍。

實(shí)踐問(wèn)題:數(shù)值穩(wěn)定

當(dāng)我們寫(xiě)代碼計(jì)算Softmax時(shí),中間變量





由于指數(shù)的原因,可能會(huì)很大。大數(shù)字之間的除法可能會(huì)不穩(wěn)定,所以使用一個(gè)標(biāo)準(zhǔn)化的技巧很重要。我們?nèi)绻诜肿雍头帜竿瑫r(shí)乘以一個(gè)常數(shù)C,并加在指數(shù)函數(shù)的參數(shù)上,我們可以得到下面等價(jià)的式子:

我們可以自由選擇C的數(shù)值而不會(huì)改變最終的結(jié)果,但是我們可以使用這個(gè)值來(lái)提高計(jì)算過(guò)程中的數(shù)值穩(wěn)定性。C的一個(gè)常見(jiàn)的選擇是設(shè)置為



這樣設(shè)置我們就可以把最大值設(shè)為0,在代碼中實(shí)現(xiàn)如下:

f = np.array([123,456,789]) #共有三個(gè)類(lèi)別,每一類(lèi)都有一個(gè)大的分?jǐn)?shù)
p = np.exp(f)/np.sum(np.exp(f)) #會(huì)出現(xiàn)數(shù)值問(wèn)題

# 我們將數(shù)值平移,使得最大數(shù)為0
f -= np.max(f)  #f 變成[-666,-333,0]
p -= np.exp(f) / np.sum(np.exp(f))  #很安全,能得到正確答案。

易混淆命名方式

準(zhǔn)確來(lái)說(shuō),SVM使用鉸鏈損失,有時(shí)也稱為最大邊界損失(max-margin loss)。Softmax分類(lèi)器使用交叉熵?fù)p失,Softmax分類(lèi)以Softmax函數(shù)命名,它可以將原始的類(lèi)別分?jǐn)?shù)轉(zhuǎn)換為總和為1的標(biāo)準(zhǔn)正數(shù)值,以便交叉熵能夠使用。所以,從技術(shù)上說(shuō),討論交叉損失是沒(méi)有意義的,因?yàn)樗皇莻€(gè)轉(zhuǎn)換函數(shù),但是為了方便,我們經(jīng)常這么使用。

SVM VS. Softmax

下面這張圖能夠幫你理清Softmax與SVM分類(lèi)器之間的區(qū)別

Softmax分類(lèi)器和SVM分類(lèi)器的例子

Softmax給每個(gè)類(lèi)別提供了“概率”解釋

不像SVM,很難準(zhǔn)確解釋每個(gè)類(lèi)別分?jǐn)?shù)的意義,Softmax分類(lèi)器允許我們計(jì)算所有標(biāo)簽的類(lèi)別。比如,輸入一張圖,SVM針對(duì)類(lèi)別貓,狗和船給出分?jǐn)?shù)[12.5, 0.6, -23.0]。而SVM分類(lèi)器能夠計(jì)算三個(gè)類(lèi)別的概率[0.9, 0.09, 0.01],這些概率可以用來(lái)解釋我們對(duì)將該圖分類(lèi)到每一類(lèi)的信心。我們將“概率”放入雙引號(hào)內(nèi),是因?yàn)楦怕实木酆匣蚍稚⒅苯尤Q于我們定義的正則參數(shù)λ,而這是我們可以控制的。比如,三個(gè)類(lèi)別的未標(biāo)準(zhǔn)化的log概率為[1,-2,0]。那么softmax函數(shù)會(huì)如下計(jì)算:


如果提高λ的值,那么對(duì)于W的懲罰會(huì)更多,這會(huì)導(dǎo)致W減少。比如,假設(shè)權(quán)重減少至一半[0.5, -1, 0] 那么Softmax的計(jì)算如下:

在這種情況下,概率值更加分散。而且,當(dāng)由于很大的正則參數(shù)λ導(dǎo)致了權(quán)重的值很小時(shí),最終輸出的概率可能會(huì)近似于均勻分布。所以,Softmax分類(lèi)器計(jì)算的是置信度(confidence),它們之間的順序是有意義的,但是數(shù)值卻不是真正意義上的概率。

在實(shí)踐中,SVM和Softmax效果相當(dāng)

SVM與Softmax的表現(xiàn)差別很小。不同的人對(duì)二者誰(shuí)表現(xiàn)好有不同的看法。與Softmax分類(lèi)器相比,SVM計(jì)算的是更局部的目標(biāo),它可以看成是一個(gè)缺點(diǎn),或者可以看成是一個(gè)特征。比如一個(gè)圖片例子的分?jǐn)?shù)向量為[10, -2, 3], 那么第一個(gè)類(lèi)別是正確的類(lèi)別。SVM(△=1)知道第一類(lèi)是正確答案,并且損失為0。所以SVM并不考慮各個(gè)分?jǐn)?shù)的細(xì)節(jié)。如果分?jǐn)?shù)矩陣被替換為[10,-100,-100]或者[10,9,9],對(duì)SVM來(lái)說(shuō),并沒(méi)有差別,因?yàn)閾p失值仍為0。然而 Softmax分類(lèi)器卻不是如此。相比[10,-100,-100],分?jǐn)?shù)向量[10,9,9]會(huì)累計(jì)更高的損失值。 也就是說(shuō),Softmax分類(lèi)器用于不會(huì)完全滿足生成的分?jǐn)?shù)值,正確類(lèi)別永遠(yuǎn)有一個(gè)更高的概率,而錯(cuò)誤類(lèi)別永遠(yuǎn)有一個(gè)更低的概率。所以損失值永遠(yuǎn)會(huì)偏大。比如,一輛小汽車(chē)分類(lèi)器可能會(huì)將大部分的努力放在與卡車(chē)區(qū)別開(kāi)來(lái),但這些努力不會(huì)影響對(duì)青蛙類(lèi)別的判斷,因?yàn)樗呀?jīng)被賦予了一個(gè)很低的值。

交互性網(wǎng)頁(yè)demo

一個(gè)線性分類(lèi)器的直觀的網(wǎng)頁(yè)交互例子

總結(jié)

  • 我們定義了一個(gè)分?jǐn)?shù)函數(shù),它可以將像素映射到類(lèi)別分?jǐn)?shù)(在這一節(jié)中,指的是一個(gè)線性函數(shù),它由W和b組成)。
  • 不像kNN分類(lèi)器,參數(shù)化方法的優(yōu)點(diǎn)在于一旦我們學(xué)習(xí)了這些參數(shù),那么我們可以丟棄訓(xùn)練集。而且,對(duì)一個(gè)新的測(cè)試圖片的預(yù)測(cè)很快,因?yàn)樗恍枰粋€(gè)與W的矩陣乘法,而不是與訓(xùn)練集中每一個(gè)例子比較。
  • 我們引入了偏置技巧,我們可以將偏置向量也放入W中,所以我們只需要一個(gè)矩陣就行。
  • 我們定義了一個(gè)損失函數(shù)(我們介紹了兩個(gè)線性函數(shù)的損失函數(shù)SVM和Softmax),它可以測(cè)量我們學(xué)習(xí)的參數(shù)是否可以準(zhǔn)確預(yù)測(cè)類(lèi)別。而且準(zhǔn)確預(yù)測(cè)以為損失量小。

我們現(xiàn)在看到一種基于參數(shù)的將圖片信息映射到類(lèi)別信息的方法,我們也已經(jīng)學(xué)習(xí)了兩種損失函數(shù)來(lái)測(cè)量預(yù)測(cè)效果。但是我們?nèi)绾握页鲞@些能給出最低損失是的參數(shù)呢? 這個(gè)過(guò)程稱之為優(yōu)化過(guò)程。這也是下一節(jié)課的內(nèi)容。

推薦閱讀:
Deep Learning using Linear Support Vector Machines from Charlie Tang 2013 presents some results claiming that the L2SVM outperforms Softmax.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容