說明:
本系列文章翻譯斯坦福大學(xué)的課程:Convolutional Neural Networks for Visual Recognition的課程講義 原文地址:http://cs231n.github.io/。 最好有Python基礎(chǔ)(但不是必要的),Python的介紹見該課程的module0。
本節(jié)的code見地址:
https://github.com/anthony123/cs231n/tree/master/module1-2如果在code中發(fā)現(xiàn)bug或者有什么不清楚的地方,可以及時給我留言,因為code沒有經(jīng)過很嚴(yán)格的測試。
這節(jié)課的主要內(nèi)容:
- 介紹線性分類
- 線性分?jǐn)?shù)函數(shù)
- 解釋線性分類器
- 損失函數(shù)
- 多類別SVM
- Softmax分類器
- SVM vs Softmax
- 線性分類的交互性網(wǎng)頁示例
- 總結(jié)
線性分類
上一節(jié)課介紹了線性分類問題,它從一個固定的標(biāo)簽集合中選擇一個標(biāo)簽,賦予一張圖片。而且,我們介紹了KNN分類器,它通過將輸入圖像與訓(xùn)練集中的圖像比較的方法賦予圖像標(biāo)簽。我們知道,kNN有如下幾個缺點:
- 分類器必須記住所有的訓(xùn)練數(shù)據(jù),并把它存儲起來,將來與測試集中的圖像進(jìn)行比較。這種方式非常耗費空間,因為訓(xùn)練集往往在GB數(shù)量級。
- 對一張圖片進(jìn)行分類非常耗費時間,因為它需要與訓(xùn)練集中所有的圖片進(jìn)行比較。
概要
我們將要開發(fā)一個更強大的圖像分類算法,它最終能夠被擴(kuò)展到整個神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)。這個算法有兩個主要的部分:1. 把原始數(shù)據(jù)映射到種類分?jǐn)?shù)的分?jǐn)?shù)函數(shù);2.評估預(yù)測分?jǐn)?shù)與真實標(biāo)簽一致性的損失函數(shù)。我們最終會把分類問題看成一個優(yōu)化問題,即通過改變分?jǐn)?shù)函數(shù)的參數(shù)來最小化損失函數(shù)。
圖像到標(biāo)簽分?jǐn)?shù)的參數(shù)化映射
這個算法的第一個組成部分是定義一個分?jǐn)?shù)函數(shù),它將圖像的像素值映射到對每個類的置信分?jǐn)?shù)(confidence scores)。我們會以一個具體的例子來說明。和以前一樣,我們假設(shè)一個圖片訓(xùn)練集 x_i ∈ R^D, 每張圖片都和一個標(biāo)簽 y_i,其中i=1…N,y_i∈1…K 相對應(yīng)。也就是說,我們有N個例子(每個有D個維度)和K個不同的種類。比如,CIFAR-10測試集 N=50,000,每張圖片的維度D=32x32x3=3072,K=10,因為我們有10類物品(狗,貓,車等)。我們現(xiàn)在定義一個分?jǐn)?shù)函數(shù)

它將圖像的原始像素映射到種類分?jǐn)?shù)。
線性分類器
我們從一個最簡單的線性函數(shù)出發(fā),一個線性映射:

在上面的表達(dá)式中,我們假設(shè)圖像 Xi 所有的像素都放在一個行向量中,它的形狀為[Dx1]。矩陣W(大小為[KxD])和向量b(大小為[Kx1])都是函數(shù)的參數(shù),在CIFAR-10中,Xi 包含第i張圖片的所有像素,其大小為[3072x1], W的大小為[10x3072],b的大小為[10x1]。所以輸入3072個數(shù)字到函數(shù)中,輸出10個數(shù)字。W中的參數(shù)稱之為權(quán)重, b稱之為偏置向量(bias vector),因為它雖然影響輸出,但是它并不和實際的數(shù)據(jù)交互。在實踐中,人們經(jīng)常將權(quán)重和參數(shù)互換使用。
下面有幾件事情需要說明一下:
單獨的乘積 WXi 能夠并發(fā)地同時評估10個分類器,其中,W的每一行是一個分類器
注意我們將輸入數(shù)據(jù)(Xi,yi)視作固定的,而我們可以控制W和b的值。我們的目標(biāo)是設(shè)置它們的值,使得對整個訓(xùn)練集圖片的預(yù)測和它們的真實標(biāo)簽盡可能一致。我們以后會討論如何做到這一點,但是從直覺上說,我們希望正確的類別分?jǐn)?shù)比錯誤類別的分?jǐn)?shù)要高。
這個算法的一個優(yōu)點是訓(xùn)練集用來學(xué)習(xí)參數(shù)W,b,一旦學(xué)習(xí)結(jié)束,我們可以丟棄整個訓(xùn)練集,只保留學(xué)習(xí)的參數(shù)。測試圖片可以通過分?jǐn)?shù)函數(shù)的輸出結(jié)果來獲得分類的標(biāo)簽。
-
對測試圖片分類只包括了一個簡單的矩陣乘法和加法,它比將它與所有的訓(xùn)練集比較要快的多。
卷積神經(jīng)網(wǎng)絡(luò)和上面描述的方法那樣,將圖像像素映射成類別分?jǐn)?shù),但是映射函數(shù)(f)會更復(fù)雜,參數(shù)也會更多。
解釋線性分類
線性分類器通過求一張圖片三個通道所有像素的權(quán)重和來計算計算類別分?jǐn)?shù)。 通過設(shè)置這些權(quán)重值,類別函數(shù)可以“喜歡”或“不喜歡”圖片特定位置的像素顏色。比如, 你可以想象類別為“船”的圖像,它周邊的藍(lán)色像素值比較高,所以你可以預(yù)期類別船在藍(lán)色通道有很多正的權(quán)重(藍(lán)色的出現(xiàn)提高了類別船的分?jǐn)?shù)),而在紅色/綠色通道有很多負(fù)的權(quán)重(紅色/綠色的出現(xiàn)降低了船的分?jǐn)?shù))。

圖像與高維度點集的類比
因為圖像可以看成高維度的列向量,我們可以把每張圖看做成在這個空間中的一個點(比如, 在CIFAR-10中,圖像可以看做是3072維度上的一個點),所以整個數(shù)據(jù)集可以看成是一個點的集合。
因為我們把類別的分?jǐn)?shù)看成這張圖片的所有像素權(quán)重和,那么每個類別分?jǐn)?shù)可以看成是在這個空間內(nèi)的一個線性函數(shù)。我們無法直觀地感受3027維度的空間,但是如果我們能把所有的點放在二維空間內(nèi),那我們就可以直觀地看到這個分類器做了些什么:

我們知道, W的每一行都是一個類別的分類,這些數(shù)字的幾何解釋是,當(dāng)我們改變W中一行中的某些數(shù)字,在像素空間中對應(yīng)的直線會沿不同方向上旋轉(zhuǎn)。偏置量b可以使得這些直線的位移發(fā)生變化。特別地,如果沒有偏置量,而且Xi=0,那么不管權(quán)重取什么值,得到的分?jǐn)?shù)都是0。所有的直線都被迫穿過原點。
把線性分類器作為模型匹配的解釋
權(quán)重W的另外一個解釋是W的每一行都對應(yīng)于一個類別的模型(有的時候也稱之為原型)。一個圖像的類別分?jǐn)?shù)通過內(nèi)積來比較圖像與各個模型的匹配程度。使用這種術(shù)語, 線性分類器就是模型匹配,這些模型都是通過學(xué)習(xí)獲得的。另一種思考方式是它在做最近鄰分析。不同的是,之前是和訓(xùn)練集中所有的圖像進(jìn)行比較,現(xiàn)在只需要和一張圖像比較(這張圖片不一定是訓(xùn)練集中的一張圖片)。同時,我們使用(負(fù))內(nèi)積來作為距離,而不是L1或者L2距離。

從上圖我們可以觀察到,馬的模型好像包含一個雙頭馬,這是因為在數(shù)據(jù)集中馬既有朝左的,也有朝右的。線性分類器把數(shù)據(jù)集中馬的這兩種模式都編碼到一個模型當(dāng)中。類似的,車分類器似乎融合了各個朝向和顏色的車。特別地, 這個車模型的顏色是紅色。說明在CIFAR-10中,紅色的車遠(yuǎn)多于其他顏色的車。這個線性分類器在分類不同顏色的車時比較弱,在后面我們會看到神經(jīng)網(wǎng)絡(luò)可以使得我們很好地識別不同顏色的車。先劇透一下,神經(jīng)網(wǎng)絡(luò)可以在隱藏層里有中間的神經(jīng)網(wǎng)絡(luò),它可以識別特定模式的車(比如,朝左的綠色的車, 朝前的藍(lán)色的車等)。而下一層的神經(jīng)元可以把這些特征都結(jié)合起來,通過一個權(quán)重和,獲得一個更準(zhǔn)確的車類別分?jǐn)?shù)。
偏置的小技巧
在繼續(xù)進(jìn)行下去之前,我們來講一個將W和b合并成一個參數(shù)的小技巧,回憶一下,我們將分?jǐn)?shù)函數(shù)定義為

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

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

圖像數(shù)據(jù)預(yù)處理
在上面的例子中,我們使用的是原始的像素值([0...255])。 在機(jī)器學(xué)習(xí)中,將輸入特征歸一化(在圖像的例子中,每個像素可以看做是一個特征)是一個常見的做法。特別地, 通過減去每個特征的平均值,將每個特征中心化非常重要。在圖像的領(lǐng)域中,對應(yīng)的做法是計算訓(xùn)練集的平均圖片,再將每張圖片減去這個平均圖片,就可以得到像素值在[-127,127]范圍內(nèi)的像素矩陣。更常見的做法是將像素值再縮放到[-1,1]的范圍內(nèi)。其中,零中心化非常重要,但是我們要等到我們理解了梯度下降的動態(tài)性,我才會證明它的重要性。
損失函數(shù)
在上一節(jié)中我們通過權(quán)重W,定義了一個將像素值映射到類別分?jǐn)?shù)的函數(shù)。我們無法改變數(shù)據(jù)值(Xi,yi),但是我們可以控制這些權(quán)重,我們想要通過設(shè)定它們的值,使得我們預(yù)測的類別分?jǐn)?shù)能夠和真實的標(biāo)簽一致。
以之前的貓的例子為例,它的類別函數(shù)在貓,狗和船類別中做出預(yù)測。我們發(fā)現(xiàn)那個權(quán)重設(shè)置的并不好,我們輸入一只貓的像素,但是貓的類別分?jǐn)?shù)(-96.8)并不比其他兩類高(狗的分?jǐn)?shù)為437.9,船的分?jǐn)?shù)為61.95)。我們用損失函數(shù)(有時候也稱之為花費函數(shù)或目標(biāo)函數(shù))測量我們對結(jié)果的不滿意。從直覺上來說,如果損失函數(shù)大,那么我們分類結(jié)果不是很好,反之,如果分類結(jié)果好,則損失函數(shù)的值就會很低。
多類別支持向量機(jī)損失
有很多定義損失函數(shù)的方法,第一個例子是常用的損失函數(shù):多類別支持向量機(jī)損失(Multiclass Support Vector Machine Loss)。SVM損失希望正確的類別分?jǐn)?shù)比不正確的類別分?jǐn)?shù)至少高Δ。有時候把損失函數(shù)做上面那樣的類比是正確的,即SVM希望最終的損失值比較小。
現(xiàn)在我們具體來說明,對于第i張圖片,我們已知這張圖片的所有像素Xi和它的類別標(biāo)簽yi,分?jǐn)?shù)函數(shù)輸入圖像的像素,輸出一個類別分?jǐn)?shù)的向量,我們用s表示。比如,第j個類別的分?jǐn)?shù)我們可以表示為Sj, 那么第i張圖片的多類別SVM損失可以表示為

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

其中Wj是W的第j行。注意當(dāng)我們考慮更復(fù)雜的f時,情況就會不同。
在結(jié)束這一節(jié)之前,我們再介紹一個術(shù)語:鉸鏈損失(hinge loss)。它指的就是max(0, -)定義的損失函數(shù)。你有時候會看到人們使用平方鉸鏈損失(或者L2-SVM),它使用max(0, -)^2來加強損失的程度。標(biāo)準(zhǔn)鉸鏈損失是一種常見的做法,但是有時候平方鉸鏈損失能達(dá)到更好的結(jié)果, 這可以通過交叉驗證來決定。
損失函數(shù)用來把我們對測試集的測試不滿意度量化。

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

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

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

其中N為訓(xùn)練例子的數(shù)目。你可以看到,我們將正則懲罰項加入到了損失函數(shù)中,并使用λ控制它的權(quán)重。沒有一個簡單的方式設(shè)置這個超參數(shù),它經(jīng)常是使用交叉驗證的方式來確定。
除了以上提到的原因外,加入正則項還有其他的好處。我們會在后面的內(nèi)容講到。例如,加入L2項可以使得SVM容易獲得最大的邊界(max margining)。
懲罰數(shù)值大的權(quán)重的一個最大的好處是可以提高可擴(kuò)展性。它意味著沒有一個單獨的輸入維度可以對結(jié)果產(chǎn)生過大的影響。比如:我們有一個輸入向量:x=[1,1,1,1]和兩個權(quán)重向量 w1=[1,0,0,0]和w2=[.25,.25,.25,.25]。它們都與輸入向量的點積都為1, 但是w1的L2懲罰項為1.0 而w2的L2懲罰項為0.25。因此,w2是更好的權(quán)重向量。直觀上,我們可以看出w2中權(quán)重值更小,也更分散,最終的分類器也依賴于更多的權(quán)重。在之后的課程我們可以看到,這個行為可以增加可擴(kuò)展性,減少過度擬合。
注意偏置項并沒有相同的效果。因為,不像權(quán)重值,它們沒有控制輸入維度的影響力。因此,通常只對W進(jìn)行正則化。但是,在實踐中,如果也將偏置項正則化,影響也可以忽略不計。最后,由于我們加入了正則懲罰,損失項永遠(yuǎn)不可能達(dá)到0,除非W中的權(quán)重都為0.
代碼
這是用Python實現(xiàn)的損失函數(shù)的代碼(沒有正則項),既有非向量化也有半向量化形式:
def L_i(x,y,w):
"""
非向量化版本。計算一個例子(x,y)的多類別SVM損失。
-X 表示一張圖片的列向量(比如,在CIFAR-10中為3073x1)
-y 一個整數(shù),表示正確類別的索引值(比如,在CIFAR-10中為0~9)
-W 為權(quán)重矩陣(比如,在CIFAR-10中,表示10x3073)
"""
delta = 1.0
scores = w.dot(x) #每一類的分?jǐn)?shù)
correct_class_score = scores[y]
D = W.shape[0]
loss_i = 0.0
for j in xrange(D): #遍歷所有的錯誤種類
if j == y:
continue #跳過正確的種類
loss_i += max(0, socres[j] - correct_class_score + delta)
return loss_i
def L_i_vertorized(x,y,W):
"""
更快的,半向量化實現(xiàn)。半向量化是指一個單獨的例子中沒有for循環(huán),但是還是有一個大循環(huán)
“””
delta = 1.0
scores = W.dot(x)
#一個向量操作計算所有類別的邊緣值
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損失, 它使用一個方法來測量預(yù)測結(jié)果與真實標(biāo)簽的一致性。此外,對訓(xùn)練集做一個好的預(yù)測相當(dāng)于最小化損失值。
我們現(xiàn)在需要做的就是想出一種方法來求出使得損失最小化的權(quán)重值
實踐考慮
設(shè)置delta
我們沒有講解超參數(shù)Δ及如何設(shè)置它,我們必須要通過交叉驗證的方式設(shè)置嗎?實際上,我們可以安全地將它的值設(shè)為1.0 。超參數(shù)Δ和λ看起來是兩個不同的參數(shù),其實它們都是用來控制一個平衡:即數(shù)據(jù)損失和正則項之間的平衡。理解這件事情的關(guān)鍵在于W的值直接影響了分?jǐn)?shù)值(進(jìn)而影響分?jǐn)?shù)之間的差異):當(dāng)我們減少W中所有的值,那么差異值就會減少,反之差異值就會增大。因此,分?jǐn)?shù)之間的邊緣值(比如:Δ=1 或Δ=100)在某種程度上是沒有意義的因為權(quán)重值可以隨意增大或減少差異值。所以,真正的平衡點在于我們允許權(quán)重值增加到多大程度(通過正則項的參數(shù)λ)。
與二元SVM的關(guān)系
你可能之前接觸過二元SVM,第i個樣本的損失值可以寫為:

其中,其中C是一個超參數(shù),y_i ∈{-1,1}。 你可以說服自己,以上那個公式就是我們這節(jié)所講的公式的一個特殊的情況(種類為2),同時上式中的C與我們公式的λ都是用來控制平衡,它們是倒數(shù)關(guān)系。
在基本式上優(yōu)化
如果你之前已經(jīng)有SVM的知識,那么你可能聽過核(kernel)對偶(dual)和SMO算法。但是這這個課堂我們只是求在沒有限制條件下的基本式優(yōu)化值,所以很多目標(biāo)函數(shù)都不可微(比如 MAX(x,y)函數(shù)不可微,因為當(dāng)x=y時,不可微)。但是在實踐中,這并不是一個問題,因為我們經(jīng)常用子梯度。
其他多種類SVM公式
值得注意的是在這節(jié)課上呈現(xiàn)的多類別SVM的公式只是多種多類別SVM公式的一種,另外一種經(jīng)常使用的公式是OVA(One-Vs-All)SVM, 它給每個種類及所有的種類SVM訓(xùn)練二元的SVM。還有一種是AVA(All-As-All) SVM,相比OVA,我們的公式是一個更有效的公式。還有一種是結(jié)構(gòu)化SVM(structured SVM),它最大化正確類別和最高的錯誤類別分?jǐn)?shù)之間的差異。理解他們之間的差異不是本門課的內(nèi)容,本節(jié)課使用的公式是一個比較安全的公式,但是最簡單的OVA公式也能工作的很好。
Softmax Classifier
SVM是兩個最常見的分類器之一。另外一個常見的選擇是Softmax 分類器。如果你以前聽過二元邏輯回歸分類器的話,那么Softmax分類器是擴(kuò)展到多種類別的一個更一般化的版本。與SVM將f(xi,W)的結(jié)果看做成每個類別的分?jǐn)?shù)不同,Softmax分類器給出了一個更直覺化的結(jié)果,即使用概率論的知識解釋得到的結(jié)果。在softmax分類器中,函數(shù)f(xi:W) = Wxi 保持不變,但是我們現(xiàn)在把這些分?jǐn)?shù)解釋為每一類的未標(biāo)準(zhǔn)化的log可能性。并將鉸鏈損失替換為交織熵?fù)p失(cross-entropy loss),它的形式如下:

或者等價于

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

稱之為softmax函數(shù):它輸入一個任意的實數(shù)分?jǐn)?shù)組成的向量,把它變成數(shù)值在0~1,并且所有數(shù)值加起來為1的向量。涉及Softmax函數(shù)的完整的交叉熵?fù)p失函數(shù)第一次看可以有點嚇人,但是其實它非常容易理解。
信息論視角
真實的分布p與估計的分布q之間的交叉熵可以定義為:

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

與真實分布(這里指的是正確分類的分布)之間的交叉熵。而且因為交叉熵可以寫成熵的形式, 而Kullback-Leibler散度可以寫成

delta函數(shù)P的熵為0,這也等價于最小化兩個分布(距離)KL散度。換句話說,交叉熵的目標(biāo)就是希望預(yù)測的分布盡可能與正確分布一致。
概率解釋
仔細(xì)觀察下面這個表達(dá)式,我們可以發(fā)現(xiàn)

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

和

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

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

這樣設(shè)置我們就可以把最大值設(shè)為0,在代碼中實現(xiàn)如下:
f = np.array([123,456,789]) #共有三個類別,每一類都有一個大的分?jǐn)?shù)
p = np.exp(f)/np.sum(np.exp(f)) #會出現(xiàn)數(shù)值問題
# 我們將數(shù)值平移,使得最大數(shù)為0
f -= np.max(f) #f 變成[-666,-333,0]
p -= np.exp(f) / np.sum(np.exp(f)) #很安全,能得到正確答案。
易混淆命名方式
準(zhǔn)確來說,SVM使用鉸鏈損失,有時也稱為最大邊界損失(max-margin loss)。Softmax分類器使用交叉熵?fù)p失,Softmax分類以Softmax函數(shù)命名,它可以將原始的類別分?jǐn)?shù)轉(zhuǎn)換為總和為1的標(biāo)準(zhǔn)正數(shù)值,以便交叉熵能夠使用。所以,從技術(shù)上說,討論交叉損失是沒有意義的,因為它只是個轉(zhuǎn)換函數(shù),但是為了方便,我們經(jīng)常這么使用。
SVM VS. Softmax
下面這張圖能夠幫你理清Softmax與SVM分類器之間的區(qū)別

Softmax給每個類別提供了“概率”解釋
不像SVM,很難準(zhǔn)確解釋每個類別分?jǐn)?shù)的意義,Softmax分類器允許我們計算所有標(biāo)簽的類別。比如,輸入一張圖,SVM針對類別貓,狗和船給出分?jǐn)?shù)[12.5, 0.6, -23.0]。而SVM分類器能夠計算三個類別的概率[0.9, 0.09, 0.01],這些概率可以用來解釋我們對將該圖分類到每一類的信心。我們將“概率”放入雙引號內(nèi),是因為概率的聚合或分散直接取決于我們定義的正則參數(shù)λ,而這是我們可以控制的。比如,三個類別的未標(biāo)準(zhǔn)化的log概率為[1,-2,0]。那么softmax函數(shù)會如下計算:

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

在這種情況下,概率值更加分散。而且,當(dāng)由于很大的正則參數(shù)λ導(dǎo)致了權(quán)重的值很小時,最終輸出的概率可能會近似于均勻分布。所以,Softmax分類器計算的是置信度(confidence),它們之間的順序是有意義的,但是數(shù)值卻不是真正意義上的概率。
在實踐中,SVM和Softmax效果相當(dāng)
SVM與Softmax的表現(xiàn)差別很小。不同的人對二者誰表現(xiàn)好有不同的看法。與Softmax分類器相比,SVM計算的是更局部的目標(biāo),它可以看成是一個缺點,或者可以看成是一個特征。比如一個圖片例子的分?jǐn)?shù)向量為[10, -2, 3], 那么第一個類別是正確的類別。SVM(△=1)知道第一類是正確答案,并且損失為0。所以SVM并不考慮各個分?jǐn)?shù)的細(xì)節(jié)。如果分?jǐn)?shù)矩陣被替換為[10,-100,-100]或者[10,9,9],對SVM來說,并沒有差別,因為損失值仍為0。然而 Softmax分類器卻不是如此。相比[10,-100,-100],分?jǐn)?shù)向量[10,9,9]會累計更高的損失值。 也就是說,Softmax分類器用于不會完全滿足生成的分?jǐn)?shù)值,正確類別永遠(yuǎn)有一個更高的概率,而錯誤類別永遠(yuǎn)有一個更低的概率。所以損失值永遠(yuǎn)會偏大。比如,一輛小汽車分類器可能會將大部分的努力放在與卡車區(qū)別開來,但這些努力不會影響對青蛙類別的判斷,因為它已經(jīng)被賦予了一個很低的值。
交互性網(wǎng)頁demo

總結(jié)
- 我們定義了一個分?jǐn)?shù)函數(shù),它可以將像素映射到類別分?jǐn)?shù)(在這一節(jié)中,指的是一個線性函數(shù),它由W和b組成)。
- 不像kNN分類器,參數(shù)化方法的優(yōu)點在于一旦我們學(xué)習(xí)了這些參數(shù),那么我們可以丟棄訓(xùn)練集。而且,對一個新的測試圖片的預(yù)測很快,因為它只需要一個與W的矩陣乘法,而不是與訓(xùn)練集中每一個例子比較。
- 我們引入了偏置技巧,我們可以將偏置向量也放入W中,所以我們只需要一個矩陣就行。
- 我們定義了一個損失函數(shù)(我們介紹了兩個線性函數(shù)的損失函數(shù)SVM和Softmax),它可以測量我們學(xué)習(xí)的參數(shù)是否可以準(zhǔn)確預(yù)測類別。而且準(zhǔn)確預(yù)測以為損失量小。
我們現(xiàn)在看到一種基于參數(shù)的將圖片信息映射到類別信息的方法,我們也已經(jīng)學(xué)習(xí)了兩種損失函數(shù)來測量預(yù)測效果。但是我們?nèi)绾握页鲞@些能給出最低損失是的參數(shù)呢? 這個過程稱之為優(yōu)化過程。這也是下一節(jié)課的內(nèi)容。
推薦閱讀:
Deep Learning using Linear Support Vector Machines from Charlie Tang 2013 presents some results claiming that the L2SVM outperforms Softmax.
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 前言: 以斯坦福cs231n課程的python編程任務(wù)為主線,展開對該課程主要內(nèi)容的理解和部分?jǐn)?shù)學(xué)推導(dǎo)。該課程的學(xué)...
- 機(jī)器學(xué)習(xí)是做NLP和計算機(jī)視覺這類應(yīng)用算法的基礎(chǔ),雖然現(xiàn)在深度學(xué)習(xí)模型大行其道,但是懂一些傳統(tǒng)算法的原理和它們之間...
- 注:題中所指的『機(jī)器學(xué)習(xí)』不包括『深度學(xué)習(xí)』。本篇文章以理論推導(dǎo)為主,不涉及代碼實現(xiàn)。 前些日子定下了未來三年左右...
- 說明: 本系列文章翻譯斯坦福大學(xué)的課程:Convolutional Neural Networks for Vis...
- 說明: 本系列文章翻譯斯坦福大學(xué)的課程:Convolutional Neural Networks for Vis...