此筆記基于斯坦福cs231n課程臭杰。
作者:武秉文Jerry,bingwenwu@foxmail.com
轉(zhuǎn)載請注明出處
目錄
- Intro to Linear classification
- Linear score function
- Interpreting a linear classifier
- Loss function
- Multiclass SVM
- Softmax classifier
- SVM vs Softmax
- Interactive Web Demo of Linear Classification
- Summary# 線性分類 Linear Classification
上一講說了圖片分類的問題窗轩,是從固定的類別目錄中為圖片分類一個(gè)唯一的標(biāo)簽舞痰。另外及穗,還介紹了k-NN分類器挚瘟,通過與訓(xùn)練集圖片進(jìn)行差異比對來預(yù)測標(biāo)簽。也看到k-NN有多不足: - 分類器必須記憶所有的訓(xùn)練數(shù)據(jù)用于預(yù)測圖片標(biāo)簽兴猩。所以當(dāng)數(shù)據(jù)量很大時(shí),效率很低早歇。
- 對測試圖片分類時(shí)需要的計(jì)算成本很大倾芝,因?yàn)橐退械挠?xùn)練圖片進(jìn)行比對。
Overview箭跳。我們現(xiàn)在要構(gòu)建一種更有效的方法去分類圖片便于我們最后擴(kuò)展到整合神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)晨另。這個(gè)方法有兩個(gè)主要部分:一個(gè)score function(分?jǐn)?shù)函數(shù))將原始數(shù)據(jù)映射到分類得分,一個(gè)loss function(損失函數(shù))量化預(yù)測分?jǐn)?shù)與實(shí)際值的一致性谱姓。然后借尿,我們將把它作為一個(gè)優(yōu)化問題,在這個(gè)問題中我們將最小化關(guān)于分?jǐn)?shù)函數(shù)參數(shù)的損失函數(shù)屉来。## 從圖片映射到標(biāo)簽得分 Parameterized mapping from images to label scores
這個(gè)方法的第一個(gè)組件是定義一個(gè)分?jǐn)?shù)函數(shù)能夠?qū)⒁粡垐D片的像素值映射成每一個(gè)類別的可能性得分路翻。我們會(huì)用一個(gè)完整的例子構(gòu)建該方法。像之前一樣我們定義一個(gè)圖片的訓(xùn)練集$x_i \in R^D$茄靠,每一張對應(yīng)一個(gè)標(biāo)簽$y_i$茂契。這里$i=1...N$并且$y_i \in 1...K$。我們有N個(gè)樣本(每一個(gè)樣本的維度是D)還有K個(gè)獨(dú)立的標(biāo)簽慨绳。例如掉冶,在CIFAR-10中我們有一個(gè)N = 50,000的訓(xùn)練集,每一個(gè)的D = 32 x 32 x 3 = 3072像素脐雪,K = 10厌小,因?yàn)橛惺畟€(gè)獨(dú)立的類別(dog,cat,car,etc)。我們現(xiàn)在定義分?jǐn)?shù)函數(shù)$f:R^D \mapsto R^K$將原始的圖片像素映射到類別分?jǐn)?shù)战秋。
線性分類璧亚。這里我們從最簡單的函數(shù)開始,即線性映射:$$f(x_i,W,b) = Wx_i+b$$ 在上面的等式中获询,我們假定圖片$x_i$所有的像素平鋪到了一個(gè)單獨(dú)的列向量 [D x 1]涨岁。矩陣W([K x D]),向量b([K x 1])是函數(shù)的參數(shù)吉嚣。在CIFAR-10中梢薪,$x_i$包含第i張圖片像素平鋪后的列向量[3072 x 1],W是[10 x 3072]尝哆,b是[10 x 1]秉撇,所以3072個(gè)數(shù)字作為原始像素值輸入到函數(shù)中然后輸出10個(gè)數(shù)字(類別分?jǐn)?shù))。參數(shù)W常常被稱為weights(權(quán)重),b是bias vector(調(diào)整向量)因?yàn)樗绊戄敵龅姆謹(jǐn)?shù)琐馆,但與$x_i$之間沒有關(guān)系规阀。但是,你經(jīng)常會(huì)聽到人們交替使用權(quán)重和參數(shù)這些術(shù)語瘦麸。
有一些要注意:
- 首先谁撼,單個(gè)矩陣乘積$Wx_i$可以有效的并行處理十個(gè)不同的類別,因?yàn)槊總€(gè)分類器是W中的一行滋饲。
- 我們將輸入數(shù)據(jù)$(x_i,y_i$當(dāng)做給定的厉碟,但我們可以控制參數(shù)W,b的值屠缭。我們的目的就是找到合適的參數(shù)值可以正確分類箍鼓。我們之后會(huì)討論具體的細(xì)節(jié),希望正確的類別分?jǐn)?shù)要高于其他不正確類別的分?jǐn)?shù)呵曹。
- 這個(gè)方法的一個(gè)優(yōu)點(diǎn)就是:訓(xùn)練集用來學(xué)習(xí)參數(shù)W款咖,b,但一旦訓(xùn)練完成奄喂,我們就可以完全拋棄訓(xùn)練集铐殃,只保留訓(xùn)練后的參數(shù)值。因?yàn)槲覀儨y試分類器時(shí)只需要調(diào)用這個(gè)函數(shù)就可以了跨新。
- 最后背稼,注意分類測試圖片包括矩陣乘法和加法,這比比較訓(xùn)練集和測試集圖片要快的多玻蝌。
預(yù)測:卷積神經(jīng)網(wǎng)絡(luò)將圖像像素精確地映射到如上所示的分?jǐn)?shù)蟹肘,但映射(f)將會(huì)更復(fù)雜并且將包含更多參數(shù)。## Interpreting a linear classifier
一個(gè)線性分類器通過3個(gè)顏色通道俯树,按照加權(quán)總和一張圖片所有的像素值去計(jì)算一個(gè)類別的分?jǐn)?shù)帘腹。取決于權(quán)重值的精確程度,這個(gè)函數(shù)有能力在圖像中某些位置喜歡或不喜歡(取決于每個(gè)權(quán)重的符號)某些顏色许饿。例如阳欲,如果圖像有很多藍(lán)色(可能對應(yīng)于水),那么“船”類就更有可能陋率。你可能會(huì)預(yù)期“船舶”分類器將在其藍(lán)色通道權(quán)重(存在藍(lán)色增加船舶分?jǐn)?shù))和紅色/綠色通道中的負(fù)權(quán)重(紅色/綠色存在會(huì)降低船的分?jǐn)?shù))球化。
一個(gè)映射圖片到類別分?jǐn)?shù)的例子如上。出于可視化的考慮瓦糟,我們假定這個(gè)圖片只有4個(gè)像素(4個(gè)黑白像素筒愚,我們?yōu)榱撕喕瘑栴}不考慮顏色通道),然后我們有三個(gè)類別分?jǐn)?shù)要計(jì)算(紅-貓菩浙,綠-狗巢掺,藍(lán)-船)句伶。(聲明:實(shí)際中,這里的顏色只是簡單表明3個(gè)類別陆淀,而不是RGB顏色)考余。我們把圖片像素拉伸為一個(gè)列向量,然后進(jìn)行矩陣乘法去得到每個(gè)類別的分?jǐn)?shù)轧苫。注意這里的權(quán)重W一點(diǎn)也不好:因?yàn)檫@個(gè)權(quán)重計(jì)算后貓的分?jǐn)?shù)很低楚堤,這里的權(quán)重表示圖片里更像一只狗。
Analogy of images as high-dimensional points含懊。因?yàn)閳D片被拉伸成了高維列向量钾军,我們可以把圖片轉(zhuǎn)為空間中的一個(gè)點(diǎn)(例如:每個(gè)CIFAR-10中的圖片都是在一個(gè)3072維度空間中的一點(diǎn))。類比一下绢要,整個(gè)數(shù)據(jù)集就是(有標(biāo)注的)一組點(diǎn)。
因?yàn)槲覀冇盟邢袼刂档募訖?quán)平均作為每個(gè)類別的分?jǐn)?shù)拗小,每個(gè)類別分?jǐn)?shù)是在這個(gè)空間中的一個(gè)線性函數(shù)重罪。所以我們不能可視化3072維度的空間,但是如果我們想象把它壓縮為一個(gè)二維空間哀九,那么我們可以嘗試可視化分類器做了什么:
如圖所示剿配,每張圖片就是坐標(biāo)中的一個(gè)點(diǎn),并且三個(gè)分類器也可視化出來了阅束。用車的分類器(紅色)為例呼胚,紅線表示空間中所有車分?jǐn)?shù)為0的點(diǎn),所以紅線右側(cè)是正分?jǐn)?shù)息裸,紅線左側(cè)是負(fù)分?jǐn)?shù)蝇更。
$W$中的每一行都是一個(gè)類別的分類器。這些$W$行內(nèi)的數(shù)字的幾何意義是如果改變某一行的值呼盆,在空間內(nèi)的這條線就會(huì)發(fā)生旋轉(zhuǎn)年扩。參數(shù)$b$,另一方法访圃,讓我們的分類器能夠翻譯這些線厨幻。比如,若沒有偏移參數(shù)腿时,輸入$x_i=0$况脆,無論權(quán)重參數(shù)怎樣,結(jié)果都是0批糟,所以所有的線都會(huì)過坐標(biāo)原點(diǎn)格了。
Interpretation of linear classifiers as template matching.
另一種對$W$中行向量的理解是每一行對應(yīng)一個(gè)類別的模板(或者有時(shí)稱為原型)。然后通過內(nèi)積(點(diǎn)積)逐一比較每個(gè)模板和圖像以找到最適合的圖像來獲得圖像的每個(gè)類別的分?jǐn)?shù)徽鼎。通過這個(gè)術(shù)語笆搓,線性分類器正在進(jìn)行模板匹配性湿。另一種想法是,我們?nèi)匀荒軌蛴行У氖褂米罱徛埽皇怯袔浊堄?xùn)練集圖片肤频,每個(gè)類別只使用一張圖片(盡管我們會(huì)學(xué)習(xí)它,但并不一定是訓(xùn)練集中的圖像)算墨,我們使用(負(fù))內(nèi)積作為距離而不是L1或者L2距離宵荒。
稍微向前跳一點(diǎn)內(nèi)容:在CIFAR-10學(xué)習(xí)的最后,形成了最終學(xué)習(xí)后的權(quán)重值净嘀。比如船的模板包括了很多藍(lán)色的像素报咳。這樣的模板因此就會(huì)在內(nèi)積計(jì)算時(shí)給海上船只的圖片一個(gè)高的分?jǐn)?shù)。
另外的挖藏,注意觀察馬的模板里似乎是一匹有兩個(gè)頭的馬暑刃,因?yàn)閿?shù)據(jù)集中的馬有朝向左邊,有朝向右邊膜眠。線性分類器會(huì)合并兩類馬到一個(gè)單獨(dú)的模板岩臣。Similarly, the car classifier seems to have merged several modes into a single template which has to identify cars from all sides, and of all colors. In particular, this template ended up being red, which hints that there are more red cars in the CIFAR-10 dataset than of any other color.所以線性分類器很難處理不同顏色的汽車,但是之后我們看到的神經(jīng)網(wǎng)絡(luò)能夠解決這個(gè)問題宵膨。往后看架谎,神經(jīng)網(wǎng)絡(luò)能夠在隱藏層中開發(fā)可以檢測特定車型的 中間神經(jīng)元(例如,面向左側(cè)的綠色汽車辟躏,面向前方的藍(lán)色汽車等)谷扣,并且下一層上的神經(jīng)元可以將這些通過各個(gè)汽車探測器的加權(quán)總和轉(zhuǎn)換成更準(zhǔn)確的汽車得分。
Bias trick捎琐。這里提出一個(gè)普遍的簡化方法去將兩個(gè)參數(shù)$W,b$作為一個(gè)參數(shù)会涎。回想分?jǐn)?shù)函數(shù)的定義:$$f(x_i,W,b) = Wx_i+b$$ 去獨(dú)立的跟蹤兩組參數(shù)$W,b$是有點(diǎn)困難的瑞凑。一個(gè)一般的技巧是將兩組參數(shù)合并為一個(gè)單獨(dú)的矩陣在塔,通過用一個(gè)額外的維度擴(kuò)展列向量$x_i$,然后將常數(shù)1作為默認(rèn)的偏移參數(shù)維度拨黔。用這額外的維度蛔溃,新的分?jǐn)?shù)函數(shù)可以簡化為一個(gè)獨(dú)立的矩陣乘法:$$f(x_i,W) = Wx_i$$ 拿CIFAR-10舉例,現(xiàn)在$x_i$是[3073 x 1]而不是[3072 x 1]篱蝇,$W$現(xiàn)在是[10 x 3073]而不是[10 x 3072]贺待。下圖可視化了這個(gè)過程:
技巧說明秧骑。進(jìn)行矩陣乘法酪碘,然后添加一個(gè)偏移向量相當(dāng)于所有輸入向量添加常數(shù)為1的偏差維度,并將權(quán)重矩陣擴(kuò)展1列-(偏差列向量)假夺。因此涧衙,如果我們通過向所有向量赴埃及數(shù)據(jù)來預(yù)處理我們的數(shù)據(jù)哪工,我們只需要學(xué)習(xí)一個(gè)單一的權(quán)重矩陣奥此,而不是兩個(gè)分別存儲(chǔ)了權(quán)重和偏差的矩陣。
Image data prepocessing雁比。上面的例子我們使用了像素的原始值(0到255)稚虎。在機(jī)器學(xué)習(xí)中,一個(gè)普遍的方法是對你的輸入數(shù)據(jù)進(jìn)行正則化(對于圖片而言偎捎,每個(gè)像素可以看做一個(gè)特征feature)蠢终。實(shí)際中,center your data(中心化數(shù)據(jù))是很重要的茴她,通過每個(gè)特征減去平均值寻拂。對于圖片而言,計(jì)算出“平均圖片”然后每個(gè)訓(xùn)練圖片都減去它丈牢,這樣所有的像素值范圍變成了[-127, 127]祭钉。更一般的處理是將輸入特征值范圍正則化成[-1, 1]。其中己沛,零均值居中是很重要的慌核,但知道理解了梯度下降時(shí)候才能證明這一點(diǎn)。
損失函數(shù)Loss function
之前我們定義了一個(gè)從像素值映射到類別分?jǐn)?shù)的函數(shù)泛粹,用一組權(quán)重$W$作為參數(shù)。我們不能控制給定的輸入數(shù)據(jù)的值$(x_i,y_i)$肮疗,但是我們可以控制權(quán)重的值晶姊,并且我們想合理的確定它們以至于能夠正確的進(jìn)行分類。
比如伪货,返回之前的例子们衙。貓圖片分類的例子,此時(shí)的權(quán)重一點(diǎn)都不好因?yàn)樨埛诸惖姆謹(jǐn)?shù)相比于其他兩類很低碱呼。我們將用損失函數(shù)(有時(shí)稱為成本函數(shù)cost function或者目標(biāo))的結(jié)果衡量結(jié)果的偏差程度蒙挑。直觀的說,如果我們對訓(xùn)練數(shù)據(jù)進(jìn)行 分類的工作做得不好愚臀,那么損失函數(shù)值會(huì)很高忆蚀,如果我們做得很好,損失函數(shù)值會(huì)很低姑裂。
多類別SVM Multiclass Support Vector Machine loss
有很多定義損失函數(shù)細(xì)節(jié)的方法馋袜。作為第一個(gè)例子我們首先使用一種常用的損失函數(shù)——Multiclass Support Vector Machine(SVM)。SVM損失函數(shù)“希望”每個(gè)圖像的正確類別的分?jǐn)?shù)高于不正確類別的某個(gè)固定邊界值$\Delta$舶斧。SVM“想要”某個(gè)結(jié)果欣鳖,因?yàn)檫@個(gè)結(jié)果會(huì)產(chǎn)生較低的損失(就是我們想要的)。
現(xiàn)在我們更加精確一點(diǎn)茴厉≡筇ǎ回想一下什荣,對于第i個(gè)樣本我們給定了圖片$x_i$的所有像素和正確分類的標(biāo)簽$y_i$。分?jǐn)?shù)函數(shù)輸入這些像素然后計(jì)算列向量$f(x_i,W)$作為類別分?jǐn)?shù)怀酷,我們將其縮寫為$s$(scores的縮寫)稻爬。比如,第j類的分?jǐn)?shù)是列向量的第j個(gè)元素:$s_j=f(x_i,W)j$胰坟。第i個(gè)樣本的多類SVM損失函數(shù)定義如下:$$L_i = \sum{j\neq y_i} \max(0, s_j - s_{y_i} + \Delta)$$ Example.假如我們有三個(gè)類別因篇,分?jǐn)?shù)為s = [13,-7,11],第一個(gè)類是正確的分類(即$y_i = 0$)笔横。同時(shí)假定$\Delta$(一個(gè)之后會(huì)討論的超參數(shù))為10竞滓。然后計(jì)算所有錯(cuò)誤類別的和,所以我們得到:$$L_i = \max(0, -7 - 13 + 10) + \max(0, 11 - 13 + 10)$$ 你可以看到第一項(xiàng)是0因?yàn)閇-7-13+10]是負(fù)數(shù)吹缔,max函數(shù)過后變成0.我們這一類的損失函數(shù)結(jié)果為0因?yàn)檎_類別分?jǐn)?shù)(13)比錯(cuò)誤類別分?jǐn)?shù)(-7)至少大10.實(shí)際上差別是20商佑,比10大多了但是SVM只關(guān)注差距至少10的;任何超過這個(gè)范圍的額外的差距都通過max函數(shù)看做0.第二項(xiàng)計(jì)算[11-13+10]的結(jié)果是8.即便正確結(jié)果分?jǐn)?shù)13比11大厢塘,但差距沒有到達(dá)10茶没,差距只有2,所以損失函數(shù)結(jié)果是8(即離邊界差距值差多少)晚碾∽グ耄總結(jié),SVM損失函數(shù)想要正確分類$y_i$的分?jǐn)?shù)至少比不正確類別的分?jǐn)?shù)高$\Delta$格嘁。如果不是的話笛求,我們將這些損失求和。
注意這個(gè)例子中我們使用線性分?jǐn)?shù)函數(shù)($f(x_i;W)=Wx_i$)糕簿,所以我們能夠重寫損失函數(shù)的等價(jià)表達(dá)式:$$L_i = \sum_{j\neq y_i} \max(0, w_j^T x_i - w_{y_i}^T x_i + \Delta)$$ $w_j$是$W$中的第j行轉(zhuǎn)置后的列向量探入。然而這不是必須的一旦我們考慮更加復(fù)雜的分?jǐn)?shù)函數(shù)$f$。
這部分我們最后要討論的術(shù)語是hinge loss(例子中的$max(0,-)$)懂诗。你會(huì)有時(shí)看到人們使用squared hinge loss SVM (or L2-SVM)蜂嗽,形式是$max(0,-)^2$,更加強(qiáng)烈的處理越界(平方而不是開方)殃恒。非平方版本更加標(biāo)準(zhǔn)植旧,但一些數(shù)據(jù)庫平方版本效果更加好。這些可以在交叉驗(yàn)證中確定离唐。
損失函數(shù)在訓(xùn)練集上量化我們對于預(yù)測結(jié)果的差異程度隆嗅。
多類支持向量機(jī)“希望”正確類的分?jǐn)?shù)比所有其他分?jǐn)?shù)至少高出邊界值$\Delta$。如果任何類別在紅色區(qū)域(或更高)內(nèi)有分?jǐn)?shù)侯繁,則會(huì)有累計(jì)損失胖喳。否則,損失就是0.我們的目標(biāo)是找到同時(shí)滿足訓(xùn)練數(shù)據(jù)中所有樣本的這個(gè)約束條件的權(quán)重贮竟,并給出盡可能低的總損失丽焊。
Regularization较剃。之前提出的損失函數(shù)有一個(gè)bug。假定我們有一個(gè)數(shù)據(jù)集和一組能夠正確分類每一個(gè)樣本的權(quán)重W(即$L_i=0$技健,對所有的i)写穴。這個(gè)問題就是W不一定是獨(dú)一無二的〈萍可能有很多相似的W能夠正確分類每一個(gè)樣本啊送。一個(gè)簡單的方法是如果一些參數(shù)W能夠正確分類每個(gè)樣本,那么$\lambda W$($\lambda > 1$)也會(huì)得到結(jié)果為0的損失函數(shù)欣孤。因?yàn)檫@種轉(zhuǎn)變統(tǒng)一延伸了所有得分的幅度馋没,因此也是它們的絕對差異。
換句話說降传,我們想能夠編碼一些傾向性篷朵,這樣能夠傾向于一組具體的權(quán)重W,去掉其他的模棱兩可的值婆排。我們能通過用regularizaion penalty $R(W)$ 擴(kuò)展損失函數(shù)去做到這點(diǎn)声旺。最常用的regularization penalty是L2形式,通過對所有參數(shù)的元素進(jìn)行平方懲罰阻止大的權(quán)重:$$R(W) = \sum_k\sum_l W_{k,l}^2$$ 在上面的表達(dá)式中段只,我們把W中每個(gè)元素的平方進(jìn)行求和腮猖。注意到regularization函數(shù)不是在數(shù)據(jù)集上定義的函數(shù),它只基于權(quán)重赞枕。包括規(guī)范化懲罰完成了完整的多類SVM損失函數(shù)澈缺,其由兩部分組成:數(shù)據(jù)損失(所有樣本的損失函數(shù)值$L_i$的平均值)和正則化損失。所有完整的多類別SVM形式如下:$$L = \underbrace{ \frac{1}{N} \sum_i L_i }\text{data loss} + \underbrace{ \lambda R(W) }\text{regularization loss} \\$$ 或者將其完全展開:$$L = \frac{1}{N} \sum_i \sum_{j\neq y_i} \left[ \max(0, f(x_i; W)j - f(x_i; W){y_i} + \Delta) \right] + \lambda \sum_k\sum_l W_{k,l}^2$$ N是訓(xùn)練樣本的數(shù)量鹦赎。如你所見谍椅,我們對損失對象附加了規(guī)范化懲罰误堡,權(quán)重由超參數(shù)$\lambda$決定古话。一般沒有直接的方法設(shè)置這個(gè)參數(shù),而是通過交叉驗(yàn)證確定锁施。
最吸引人的性質(zhì)是懲罰大的權(quán)重會(huì)提高一般性陪踩,因?yàn)樗馕吨魏蔚妮斎刖S度本身都無法對分?jǐn)?shù)產(chǎn)生大的印象。舉例悉抵,假定我們有一輸入向量$x = [1,1,1,1]$和兩個(gè)權(quán)重向量$w_1 = [1,0,0,0]$肩狂、$w_2 = [0.25,0.25,0.25,0.25]$±咽危可得$w_1^Tx = w_2^Tx=1$傻谁,所以兩個(gè)權(quán)重向量都產(chǎn)生了相同的點(diǎn)積,但是$w_1$的L2懲罰是1.0而$w_2$的L2懲罰只有0.25.因此列粪,根據(jù)L2懲罰审磁,權(quán)重向量$w_2$更好谈飒,因?yàn)長2懲罰更喜歡較小且更加分散的權(quán)重向量,因此鼓勵(lì)最終分類器將所有輸入維度都考慮到較小的數(shù)值而不是幾個(gè)輸入維度的值比較大态蒂。我們之后會(huì)看到杭措,這個(gè)效果能夠在測試集上提升一般性表現(xiàn),而且更加不容易overfitting(過擬合)
注意偏移量參數(shù)沒有這樣的效果钾恢,因?yàn)椴幌駲?quán)重手素,它們不控制輸入維度的影響程度。因此我們一般只規(guī)范化權(quán)重W而不是偏移量b瘩蚪。但是泉懦,實(shí)際上這通常只會(huì)產(chǎn)生微不足道的影響。最后請注意由于正則化懲罰募舟,我們永遠(yuǎn)無法在所有樣本中實(shí)現(xiàn)0.0的精確損失祠斧,因?yàn)檫@僅在W=0的時(shí)候才有可能。
代碼拱礁。這里是一個(gè)損失函數(shù)(沒有規(guī)范化)的Python實(shí)現(xiàn)琢锋,既有非列向量化版本,也有半向量化版本:
def L_i(x, y, W):
"""
unvectorized version. Compute the multiclass svm loss for a single example (x,y)
- x is a column vector representing an image (e.g. 3073 x 1 in CIFAR-10)
with an appended bias dimension in the 3073-rd position (i.e. bias trick)
- y is an integer giving index of correct class (e.g. between 0 and 9 in CIFAR-10)
- W is the weight matrix (e.g. 10 x 3073 in CIFAR-10)
"""
delta = 1.0 # see notes about delta later in this section
scores = W.dot(x) # scores becomes of size 10 x 1, the scores for each class
correct_class_score = scores[y]
D = W.shape[0] # number of classes, e.g. 10
loss_i = 0.0
for j in xrange(D): # iterate over all wrong classes
if j == y:
# skip for the true class to only loop over incorrect classes
continue
# accumulate loss for the i-th example
loss_i += max(0, scores[j] - correct_class_score + delta)
return loss_i
def L_i_vectorized(x, y, W):
"""
A faster half-vectorized implementation. half-vectorized
refers to the fact that for a single example the implementation contains
no for loops, but there is still one loop over the examples (outside this function)
"""
delta = 1.0
scores = W.dot(x)
# compute the margins for all classes in one vector operation
margins = np.maximum(0, scores - scores[y] + delta)
# on y-th position scores[y] - scores[y] canceled and gave delta. We want
# to ignore the y-th position and only consider margin on max wrong class
margins[y] = 0
loss_i = np.sum(margins)
return loss_i
def L(X, y, W):
"""
fully-vectorized implementation :
- X holds all the training examples as columns (e.g. 3073 x 50,000 in CIFAR-10)
- y is array of integers specifying correct class (e.g. 50,000-D array)
- W are weights (e.g. 10 x 3073)
"""
# evaluate loss over all examples in X without using any for loops
# left as exercise to reader in the assignment
從這一部分可以看出呢灶,SVM損失采用一種特定的方法來衡量訓(xùn)練數(shù)據(jù)預(yù)測與正確值標(biāo)簽的一致性吴超。另外,對訓(xùn)練集做出良好的預(yù)測相當(dāng)于使損失最小化鸯乃。
現(xiàn)在我們要做的就是想出一種求可以最小化損失的權(quán)重的方法鲸阻。
Parctical Considerations
設(shè)置$\Delta$。我們跳過了超參數(shù)和它的設(shè)定缨睡。它應(yīng)該設(shè)置為怎樣的值呢鸟悴?我們是否需要對它進(jìn)行交叉驗(yàn)證呢?事實(shí)證明在所有情況下奖年,$\Delta = 1$是安全可行的設(shè)置细诸。超參數(shù)$\Delta$和$\lambda$似乎是兩個(gè)不同的超參數(shù),但實(shí)際上他們控制著相同的權(quán)衡:在數(shù)據(jù)損失和規(guī)范化損失之間的權(quán)衡陋守。理解這一點(diǎn)的關(guān)鍵是權(quán)重W的大小對分?jǐn)?shù)有直接的影響(也就是他們之間的差異):隨著我們縮小W中的值震贵,分?jǐn)?shù)的差距也會(huì)縮小,隨著我們放大權(quán)重W水评,分?jǐn)?shù)差異也會(huì)變得更大猩系。因此,在分?jǐn)?shù)之間的邊界值的確切值(比如$\Delta = 1$,$\Delta = 100$)某種程度上沒有什么意義因?yàn)闄?quán)重可以隨意的壓縮或者放大差距中燥。因此寇甸,唯一的權(quán)衡就是我們允許權(quán)重如果變化(通過規(guī)范化程度$\lambda$)。
與二分SVM的關(guān)系。你之前可能了解過二分SVM拿霉,它對應(yīng)的第i個(gè)樣本的損失函數(shù)可以寫為:
$$L_i = C \max(0, 1 - y_i w^Tx_i) + R(W)$$
C是一個(gè)超參數(shù)式塌,$y_i \in { -1,1 }$∮呀可以將二分SVM看做多維SVM的一個(gè)特例(只有兩個(gè)類別)峰尝。C和$\lambda$控制著相同的權(quán)衡,并且它們之間的關(guān)系是$C \propto \frac{1}{\lambda}$收恢。
Softmax classifier
SVM是兩種最常用的分類器之一武学。另一個(gè)常用的選擇就是Softmax 分類器,它有一個(gè)不同的損失函數(shù)伦意。如果你之前聽過binary Logistic Regression classifier火窒,那么Softmax分類器就是將它擴(kuò)展到了多個(gè)類別。不同于SVM將輸出$f(x_i,W)$作為每個(gè)類別的分?jǐn)?shù)(未經(jīng)校準(zhǔn)而且難以轉(zhuǎn)化含義)驮肉。Softmax分類器給一個(gè)相對更加直接的輸出(正則類別概率)熏矿。在Softmax分類器中,映射函數(shù)$f(x_i;W)=Wx_i$不變离钝,但是我們現(xiàn)在將這些分?jǐn)?shù)轉(zhuǎn)化為每個(gè)類別的未正則化的log概率并且用cross-entropy loss代替hinge loss票编。
$$L_i = -\log\left(\frac{e^{f_{y_i}}}{ \sum_j e^{f_j} }\right) \hspace{0.5in} \text{or equivalently} \hspace{0.5in} L_i = -f_{y_i} + \log\sum_j e^{f_j}$$
我們用$f_j$表示第j個(gè)向量中的元素關(guān)于類別$f$的分?jǐn)?shù)。像之前一樣卵渴,數(shù)據(jù)集完整的損失是所有訓(xùn)練樣本的$L_i$平均值的規(guī)范化$R(W)$慧域。$f_j(z) = \frac{e^{z_j}}{\sum_k e^{z_k}}$ 就是softmax function:它將任意實(shí)數(shù)分?jǐn)?shù)(以$z$為單位),并將其壓縮到一個(gè)介于0和1之間的向量之和浪读,并使其和為1昔榴。
信息論角度。一個(gè)“真”概率分布$p$和一個(gè)似然估計(jì)分布$q$之間的交叉熵定義如下:
$$H(p,q) = - \sum_x p(x) \log q(x)$$
因此Softmax分類器就是在估計(jì)類別概率($q = e^{f_{y_i}} / \sum_j e^{f_j}$)和“真”概率分布之間最小化交叉熵碘橘。
Probabilistic interpretation互订。看下面的表達(dá)式:
$$P(y_i \mid x_i; W) = \frac{e^{f_{y_i}}}{\sum_j e^{f_j} }$$
能夠被理解成給定圖片$x_i$和權(quán)重參數(shù)$W$下正確標(biāo)簽$y_i$的條件概率痘拆。為了說明這點(diǎn)仰禽,記住Softmax分類器將輸出向量$f$的值變成非正則化的log概率。因此指數(shù)運(yùn)算后給出了(非正則化)概率错负,然后除法運(yùn)算實(shí)現(xiàn)了正則化以至于概率和為1坟瓢。因此在概率解釋中勇边,我們要最小化正確類別的負(fù)log概率犹撒,也可以理解為實(shí)現(xiàn)極大似然估計(jì)(maximum likelihood estimation)。這個(gè)觀點(diǎn)的一個(gè)好的特征就是我們現(xiàn)在可以將完全損失函數(shù)中的規(guī)范化項(xiàng)$R(W)$解釋為來自一個(gè)Gaussian prior的權(quán)重矩陣$W$粒褒,這個(gè)矩陣時(shí)通過Maximum a Posterior (MAP)estimation而不是MLE识颊。
Practical Issues:Numeric stability。當(dāng)實(shí)際寫Softmax函數(shù)的代碼時(shí),中間值$e^{f_{y_i}}$和$\sum_j e^{f_j}$因?yàn)橹笖?shù)計(jì)算會(huì)可能變得非常大祥款。除以一個(gè)非常大的數(shù)會(huì)不穩(wěn)定清笨,所以使用正則化技巧很重要。注意到如果我們在分子分母同時(shí)乘以一個(gè)常數(shù)$C$刃跛,我們可以得到下面的表達(dá)式:
$$\frac{e^{f_{y_i}}}{\sum_j e^{f_j}}
= \frac{Ce^{f_{y_i}}}{C\sum_j e^{f_j}}
= \frac{e^{f_{y_i} + \log C}}{\sum_j e^{f_j + \log C}}$$
我們可以任意選擇$C$的值抠艾。它不會(huì)改變結(jié)果你,但是我們可以使用這個(gè)值去提高計(jì)算穩(wěn)定性桨昙。一個(gè)常用的選擇是$\log C = -\max_j f_j$检号。這說明我們應(yīng)該移動(dòng)向量$f$中的值,使其最高值為0蛙酪。代碼如下:
f = np.array([123, 456, 789]) # example with 3 classes and each having large scores
p = np.exp(f) / np.sum(np.exp(f)) # Bad: Numeric problem, potential blowup
# instead: first shift the values of f so that the highest number is 0:
f -= np.max(f) # f becomes [-666, -333, 0]
p = np.exp(f) / np.sum(np.exp(f)) # safe to do, gives the correct answer
為了明確齐苛,SVM分類器使用hinge loss,或者有時(shí)叫做max-margin loss。Softmax 分類器使用cross-entropy loss桂塞。Softmax分類器名字來源于它使用的Softmax函數(shù)凹蜂,用來把原始類別分?jǐn)?shù)轉(zhuǎn)化成正則化的正數(shù)且求和為1,這樣交叉熵就可以被應(yīng)用阁危。
SVM vs. Softmax
一個(gè)可以幫助理解SVM和Softmax分類器的區(qū)別的圖片玛痊。
一個(gè)數(shù)據(jù)點(diǎn)的SVM和Softmax分類器之間的區(qū)別示例。在這兩種情況下狂打,我們都需要計(jì)算相同的分?jǐn)?shù)向量$f$(例如通過之前的矩陣乘法)卿啡。不同之處在于對$f$中分?jǐn)?shù)的理解:SVM將它們理解為類別的分?jǐn)?shù),他的損失函數(shù)讓正確的分類(類別2菱父,藍(lán)色)的分?jǐn)?shù)高于其他分類的分?jǐn)?shù)颈娜。Softmax分類器將分?jǐn)?shù)解釋為每個(gè)分類的(非正則化)的對數(shù)概率,然后讓正確分類的(正則化)對數(shù)概率高(相當(dāng)于它的負(fù)數(shù)最低)浙宜。對于Softmax分類器官辽,這個(gè)例子的最終損失是1.58(SVM)和1.04(注意這里1.04使用自然對數(shù)),但要注意這些數(shù)字是不可比較的粟瞬;它們只與在同一分類器和相同數(shù)據(jù)內(nèi)計(jì)算的損失有關(guān)同仆。
Softmax classifier provides "probailities" for each class。與計(jì)算未經(jīng)校準(zhǔn)且不易解釋所有類別分?jǐn)?shù)的SVM不同裙品,Softmax分類器允許我們計(jì)算所有標(biāo)簽的“概率”俗批。例如,給定一副圖像市怎,SVM分類器可能為“cat”岁忘,“dog”和“ship”類別提供分?jǐn)?shù)[12.5, 0.6, -23.0]。Softmax分類器可以改為計(jì)算三個(gè)標(biāo)簽的概率[0.9, 0.09, 0.0]区匠,這可以讓你解釋對每個(gè)類別的信心干像。然而,我們把“概率”一詞放在引號中的原因是,這些概率的峰值或擴(kuò)散直接取決于規(guī)范化化強(qiáng)度$\lambda$麻汰,這是你可以控制的參數(shù)速客。比如,假定三個(gè)類別的未正則化log概率是[1, -2, 0]五鲫。那么Softmax函數(shù)會(huì)計(jì)算:
$$[1, -2, 0] \rightarrow [e^1, e^{-2}, e^0] = [2.71, 0.14, 1] \rightarrow [0.7, 0.04, 0.26]$$
現(xiàn)在溺职,如果規(guī)范化強(qiáng)度$\lambda$比較高,那么權(quán)重$W$會(huì)被懲罰更多就變成更小的權(quán)重$W$了位喂。比如辅愿,假定權(quán)重小一半變成[0.5, -1, 0]。Softmax現(xiàn)在回計(jì)算:
$$[0.5, -1, 0] \rightarrow [e^{0.5}, e^{-1}, e^0] = [1.65, 0.37, 1] \rightarrow [0.55, 0.12, 0.33]$$
概率現(xiàn)在更加分散忆某。而且点待,由于非常強(qiáng)的規(guī)范化強(qiáng)度$\lambda$,在權(quán)重趨向于小數(shù)值的極限內(nèi)弃舒,輸出概率將接近均勻分布癞埠。因此,有Softmax分類器計(jì)算的概率更好的被認(rèn)為是置信度聋呢,同SVM一樣苗踪,分?jǐn)?shù)的排序是可以解釋的。
交互web demo
總結(jié)
- We defined a score function from image pixels to class scores (int this section, a linear function that depends on weights W and biases b).
- Unlike kNN classifier, the advantage of this parametric approach is that once we learn the parameters we can discard the training data. Additionally, the prediction for a new test iamge is fast since it requires a single matrix multiplication with W, not an exhaustive comparison to every single training example.
- We introduced the bias trick, which allows us to fold the bias vector into the weight matrix for convenience of only having to keep track of one parameter matrix.
- We defined a loss function (we introduced two commonly used losses for linear classifiers: the SVM and the Softmax) that measures how compatible a given set of parameters is with respect to the ground truth labels in the training dataset. We also saw that the loss function was defined in such way that making good predictions on the training data is equivalent to having a small loss.
下一步是如何有效的確定能給到最低損失的參數(shù)削锰。這個(gè)過程叫做optimization(優(yōu)化)通铲。