說明:
本系列文章翻譯斯坦福大學(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有如下幾個缺點(diǎn):
- 分類器必須記住所有的訓(xùn)練數(shù)據(jù)饥脑,并把它存儲起來,將來與測試集中的圖像進(jìn)行比較懦冰。這種方式非常耗費(fèi)空間,因為訓(xùn)練集往往在GB數(shù)量級谣沸。
- 對一張圖片進(jìn)行分類非常耗費(fèi)時間刷钢,因為它需要與訓(xùn)練集中所有的圖片進(jìn)行比較。
概要
我們將要開發(fā)一個更強(qiáng)大的圖像分類算法乳附,它最終能夠被擴(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ù)互換使用坐求。
下面有幾件事情需要說明一下:
單獨(dú)的乘積 WXi 能夠并發(fā)地同時評估10個分類器蚕泽,其中,W的每一行是一個分類器
注意我們將輸入數(shù)據(jù)(Xi,yi)視作固定的桥嗤,而我們可以控制W和b的值须妻。我們的目標(biāo)是設(shè)置它們的值,使得對整個訓(xùn)練集圖片的預(yù)測和它們的真實標(biāo)簽盡可能一致泛领。我們以后會討論如何做到這一點(diǎn)荒吏,但是從直覺上說,我們希望正確的類別分?jǐn)?shù)比錯誤類別的分?jǐn)?shù)要高渊鞋。
這個算法的一個優(yōu)點(diǎn)是訓(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ù))根时。
圖像與高維度點(diǎn)集的類比
因為圖像可以看成高維度的列向量宜咒,我們可以把每張圖看做成在這個空間中的一個點(diǎn)(比如, 在CIFAR-10中把鉴,圖像可以看做是3072維度上的一個點(diǎn))荧呐,所以整個數(shù)據(jù)集可以看成是一個點(diǎn)的集合。
因為我們把類別的分?jǐn)?shù)看成這張圖片的所有像素權(quán)重和纸镊,那么每個類別分?jǐn)?shù)可以看成是在這個空間內(nèi)的一個線性函數(shù)。我們無法直觀地感受3027維度的空間概疆,但是如果我們能把所有的點(diǎn)放在二維空間內(nèi)逗威,那我們就可以直觀地看到這個分類器做了些什么:
我們知道计螺, W的每一行都是一個類別的分類夯尽,這些數(shù)字的幾何解釋是,當(dāng)我們改變W中一行中的某些數(shù)字登馒,在像素空間中對應(yīng)的直線會沿不同方向上旋轉(zhuǎn)匙握。偏置量b可以使得這些直線的位移發(fā)生變化。特別地陈轿,如果沒有偏置量圈纺,而且Xi=0,那么不管權(quán)重取什么值麦射,得到的分?jǐn)?shù)都是0蛾娶。所有的直線都被迫穿過原點(diǎn)。
把線性分類器作為模型匹配的解釋
權(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ù)(有時候也稱之為花費(fèi)函數(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來加強(qiáng)損失的程度眠屎。標(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ò)展性绢片。它意味著沒有一個單獨(dú)的輸入維度可以對結(jié)果產(chǎn)生過大的影響。比如:我們有一個輸入向量:x=[1,1,1,1]和兩個權(quán)重向量 w1=[1,0,0,0]和w2=[.25,.25,.25,.25]岛琼。它們都與輸入向量的點(diǎn)積都為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)。半向量化是指一個單獨(dú)的例子中沒有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)重值可以隨意增大或減少差異值栗精。所以闯参,真正的平衡點(diǎ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ù)第一次看可以有點(diǎn)嚇人,但是其實它非常容易理解习瑰。
信息論視角
真實的分布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)妖爷,它可以看成是一個缺點(diǎn)蝶涩,或者可以看成是一個特征。比如一個圖片例子的分?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)點(diǎn)在于一旦我們學(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.