0
雷鋒網(wǎng) AI 科技評論按:本門課程是李飛飛主講的斯坦福 CS231n 計算機視覺課程,吉林大學珠海學院的趙一帆進行了筆記方面的整理。筆記如有出錯,請及時告知。本文對應章節(jié):數(shù)據(jù)驅動的圖像分類方式:K 最近鄰與線性分類器。上一章節(jié):計算機視覺歷史回顧與介紹
回到圖片上來討論KNN:
可以看到,它實際上表現(xiàn)的不是很好。這里標記了紅色和綠色,圖像分類正確與否取決于它的最近鄰值,可以看到 KNN 的表現(xiàn)效果不是很好,但如果使用一個更大的 K 值,那么投票操作的結果就可能會達到前三名或者前五名,甚至包括所有的數(shù)據(jù)范圍。
用這種方法來檢索相鄰數(shù)據(jù)時,可以想象到這樣會對噪聲產(chǎn)生更大的魯棒性。還有另外一個選擇,就是當使用 K-近鄰算法時,確定應該如何比較相對鄰近數(shù)據(jù)距離值傳遞不同。
對于迄今為止的例子,已經(jīng)展示了已經(jīng)討論過的 L1 距離,它是像素之間絕對值的總和,另一種常見的選擇是 L2 距離,也是歐式距離,即取平方和的平方根,并把這個作為距離。
選擇不同的距離度量實際上是一個非常有趣的話題,因為在不同維度里,會在預測的空間里對底層的幾何或拓撲結構做出不同的假設。
相對于下面所示的 L1 距離和 L2 距離實際上是一個根據(jù)距離的這個圍繞著原點的方形和圓,這個方形上的每一個點在 L1 上是與原點等距的,而距離上類似的會是一個圓,它看起來像你所期望的。
這兩種方法之間特別指出一件有趣的問題:
L1 距離取決于你選擇的坐標系統(tǒng),如果你選擇坐標軸,將會改變點之間的 L1 距離,而改變坐標軸對 L2 距離毫無影響,無論在怎么樣的坐標下,L2 距離是一個確定的值。
如果輸入一些特征向量,向量中的一些值有一些重要意義的任務,那么 L1 也許會更加適合。
但如果它只是某個空間中的一個通用向量,而不知道其中的不同元素的意義,那么 L2 會更適合些。
還有一點:
通過使用不同的距離度量,可以將 K-最近鄰分類器泛化到許多不同的數(shù)據(jù)類型上,而不僅僅是向量,不僅僅是圖像。例如,假設想對文本進行分類,那么只需要用 KNN 指定一個距離函數(shù),這個函數(shù)可以測量兩段話或者兩段話之間的距離。因此,簡單的通過指定不同的距離度量,便可以很好地將這個算法應用在基本上任何類型的數(shù)據(jù)上。
選擇不同的距離度量在幾何學中是一個有趣的問題。
在左邊可以看到一組 L1 距離,右側是使用 L2 距離。
可以看出,分類器的決策邊界其實是相差很大的:
L1 的決策邊界趨向于隨坐標軸,這是因為 L1 取決于對坐標的選擇;
L2 對距離的排序并不會受到坐標的影響,只是把邊界放置在存在最自然的地方。
如何根據(jù)問題和數(shù)據(jù)來確定這些超參數(shù)?
選擇能對訓練集給出高準確率、表現(xiàn)最佳的超參數(shù)。這其實是一種非常糟糕的想法,千萬不要這么做。
例如,在之前的 K-最近鄰分類算法中,假設 K=1,總能完美分類訓練數(shù)據(jù),所以如果采用這一策略總是選擇 K=1,但是正如之前案例所見的,在實踐中讓 K 取更大的值,盡管會在訓練集中分錯個別數(shù)據(jù),但對于在訓練集中未出現(xiàn)過的數(shù)據(jù)分類性能更佳,歸根到機器學習中,關心的并不是要盡可能擬合訓練集,而是要讓分類器在訓練集以外的未知數(shù)據(jù)上表現(xiàn)更好。
另一個想法是把數(shù)據(jù)分成兩部分,一部分是訓練集,另一部分是測試集,然后在訓練集上用不同的超參數(shù)來訓練算法,然后將訓練好的分類器用在測試集上,再選擇一組在測試集上表現(xiàn)最好的超參數(shù)。
這似乎是個合理的策略,但事實上也非常糟糕。因為機器學習的目的是了解算法表現(xiàn)如何,所以測試集只是一種預估的方法,即在沒遇到的數(shù)據(jù)上算法表現(xiàn)會如何,如果采用這種不同的超參數(shù)訓練不同算法的策略,然后選擇在測試集上表現(xiàn)最好的超參數(shù),那么很有可能選擇了一組超參數(shù),只是讓算法在這組測試集上表現(xiàn)良好,但是這組測試集的表現(xiàn)無法代表在權限的未見過的數(shù)據(jù)上的表現(xiàn)。
更常見的做法是將數(shù)據(jù)分為三組:大部分作為訓練集,然后一個驗證集,一個測試集。在訓練集上用不同的超參數(shù)訓練,在驗證集上進行評估,然后選擇一組評估最好的參數(shù),然后再把這組數(shù)據(jù)放到測試集中跑一跑,這才是要寫到論文中的數(shù)據(jù),這才是算法在未見過的新數(shù)據(jù)上的表現(xiàn)。
還有一個設計超參數(shù)的方法是交叉驗證。
這個在小數(shù)據(jù)集上比較常用,在深度學習中并不怎么常用。它的理念是,取出測試集數(shù)據(jù),將整個數(shù)據(jù)集保留部分作為最后使用的測試集,對于剩余的數(shù)據(jù)分成很多份,在這種情況下,輪流將每一份都當做驗證集。
經(jīng)過交叉驗證,會得到這樣一張圖:
x 軸表示 K-近鄰分類器中參數(shù) K 值,y 軸表示分類器對于不同 K 在數(shù)據(jù)上的準確率。在這個例子中,用了 5 次交叉驗證,也就是說對于每個 K 值,都對算法做了 5 次測試來了解表現(xiàn)如何。
使用 K 次交叉驗證也許是一個量化它的好方法,可以觀察到算法在不同驗證集上表現(xiàn)的方差,同時,不光是知道哪樣更好,還能看到算法效果的分布。
其實,KNN 在圖像分類中很少用到,原因包括剛才談到的所有問題。一是它在測試時運算時間很長,這和剛剛提到的要求不符;另一個問題在于,像歐幾里得距離或者 L1 距離這樣的衡量標準用在比較圖片上實在不太合適。這種向量化的距離函數(shù)不太適合表示圖像之間視覺的相似度。
圖中左邊圖的女生和右邊三張經(jīng)過不同處理的圖片,如果計算他們和原圖的歐式距離,會得到相同的答案,這并不是想要的??梢愿杏X出來 L2 不適合表示圖像之間視覺感知的差異。
還有一個問題稱之為維度災難,如果還記得對 K 近鄰的描述,它有點像訓練點把樣本空間分成幾塊,這意味著,如果希望分類器有更好的結果,需要訓練數(shù)據(jù)能夠密集地分布在空間中。否則最鄰近點的實際距離可能會很遠。
問題在于,要想要密集分布在空間中的數(shù)據(jù),意味著需要指數(shù)倍地訓練數(shù)據(jù)。
小結:
我們介紹了 KNN 做圖像分類的基本思路,借助訓練集的圖片和相應的標記,我們可以預測測試集中數(shù)據(jù)的分類。
下面將介紹神經(jīng)網(wǎng)絡,通常會把神經(jīng)網(wǎng)絡比喻為玩樂高。
可以將不同種類的神經(jīng)網(wǎng)絡組件組合在一起,來構建不同的大型卷積網(wǎng)絡,它是在不同類型的深度學習應用中看到的最基本的構建塊之一。這類有關神經(jīng)網(wǎng)絡的模塊化性質的例子來自于圖像字幕實驗室的一些研究。
輸入一副圖片,然后輸出用于描述圖像的描述性的句子。這類工作是由一個關注圖像的卷積神經(jīng)網(wǎng)絡和一個只關注語言的循環(huán)神經(jīng)網(wǎng)絡組成的,把這兩個網(wǎng)絡放在一起訓練最后得到一個超級厲害的系統(tǒng)來做一些偉大的事情。
線性分類器是這種參數(shù)模型最簡單的例子:
參數(shù)模型實際上有兩個不同的部分,以這張圖片為例子,一組是左邊的貓,還有一組是權重參數(shù),通常叫做 W,有時也叫做 θ。現(xiàn)在要寫一些包含了輸入數(shù)據(jù) x 和參數(shù) θ 的函數(shù),就會輸出 10 個數(shù)字對應 CIFAR-10 中對應的 10 個類別所對應的分數(shù)。根據(jù)上述描述,比如說貓的分數(shù)更大,表面輸入 x 是貓的可能性更大。
在最近鄰算法的設置中沒有參數(shù),取而代之的是通常會保留所有種類的訓練集并在測試中使用。但是現(xiàn)在,在一個參數(shù)化的方法中,將對訓練數(shù)據(jù)進行總結,并把所有的知識用到這些參數(shù) W 中,在測試的時候,不再需要實際的訓練數(shù)據(jù),只需要用到參數(shù) W,這使得模型更有效率,甚至可以運行在手機這樣的小設備上。
在深度學習中,整個描述都是關于函數(shù) F 的正確結構,可以發(fā)揮想象來編寫不同的函數(shù)形式,用不同的、復雜的方式組合權重和數(shù)據(jù),這樣可以對應不同的神經(jīng)網(wǎng)絡體系結構。
所以 F(X)=Wx 是一個最簡單的線性分類器,如果能把上述方程的維度解出來,前提是圖像是 32*32*3 的輸入值,要取這些值然后把它們展開成一個 3072 項長列向量,想要得出 10 個類的得分。對于該圖像,想要最終得到 10 個數(shù)字,從而給出每個類別對應得分情況,也就是說,現(xiàn)在 W 是 10*3072 的矩陣,X 是 3072*10 的矩陣,因此,一旦這兩項相乘,就會得到一個列向量,給 10 個類的分數(shù)。
通常會添加一個偏置項,它是一個 10 元素的常向量,它不與訓練數(shù)據(jù)交互,而只會給一些數(shù)據(jù)獨立的偏置值。
這里有一個簡單的例子。左邊是一個簡單的圖像,所以線性分類器的工作是把 2*2 的圖像拉伸成一個有四個元素的列向量。
假設這里例子中只有三類,現(xiàn)在權重矩陣是 3*4,可以把線性分類理解為幾乎是一種模板匹配的方法,這個矩陣中的每一行對應于圖像的某個模板。根據(jù)輸入矩陣行列之間的乘積或者點積,從而得到圖像的像素點。計算這個點積,可以得到在這個類模板和圖像的像素之間,有一個相似之處,然后偏置給這個數(shù)據(jù)對立縮放比例以及每個類的偏置移量。
如果根據(jù)這個模板匹配的觀點,考慮分類器,實際上,可以取這個權重矩陣的行向量,并且將他們還原為圖像。這個例子中,在圖像上訓練好一個線性分類器,下方是數(shù)據(jù)集中訓練到的權重矩陣中的行向量對應于 10 個類別相關的可視化結果。
舉例來說,飛機類別的模板似乎由中間類似藍色斑點狀圖形和藍色背景組成,這就產(chǎn)生一種飛機的線性分類器可能在尋找藍色圖形和斑點狀圖形的感覺,然后這些行為使得這個分類器更像飛機。車子類別的模板能夠看到在中間有一個紅色斑點狀物體以及在頂部是一個擋風玻璃的藍色斑點狀物體。
但這些看起來很奇怪,它不像一個真正的東西,所以就存在這樣一個問題,線性分類器每個類別只能學習一個模板,如果這個類別出現(xiàn)了某種類型的變體,那么它將嘗試求取所有那些不同變體的平均值,并且只使用一個單獨的模板來識別其中的每一類別。
另一個關于分類器的觀點:
回歸到圖像,作為點和高緯空間的概念,可以想象成每一張圖像都是高維空間中一個點,現(xiàn)在這個分類器在這些線性決策邊界上嘗試畫一個線性分類面來劃分一個類別和剩余其他類別。在左上角,看到用來訓練的飛機樣例,通過訓練,這個分類器會嘗試繪制這條藍色直線用以劃分飛機與其他類別。
如果觀察訓練過程,這些線條會隨機地開始,然后快速變換,試圖將數(shù)據(jù)正確區(qū)分開。
但是當從這個高維空間角度來考慮線性分類器,就能再次看到線性分類器中可能出現(xiàn)的問題:
要構造一個線性分類器完全失效數(shù)據(jù)樣例并不難。在左邊,假設有一個兩類別的數(shù)據(jù)集,這些數(shù)據(jù)可能全部,也可能部分是人為的。數(shù)據(jù)集有紅色和藍色兩類,藍色類是圖像中像素的數(shù)量,這個數(shù)字大于 0 并且是奇數(shù),任何像素個數(shù)大于 0 的圖像都歸為紅色類別。
如果真的去畫這些不同的決策區(qū)域,能看到奇數(shù)像素點的藍色類別在平面上有兩個象限,甚至是兩個相反的象限。所以,沒有辦法畫出一條獨立的直線來劃分藍色和紅色,這是線性分類器的困境。
線性分類器難以解決的其他情況是多分類問題。在右側,可能藍色類別存在于三個不同的象限,然后其他所有都是另外一個類別。所以對于在之前的例子中看到的像馬匹這樣的東西,當然在現(xiàn)實中某種情況下也會出現(xiàn),在馬匹的像素空間中,可能一個頭向左看,另一個頭向右看。目前還沒有較好的方法可以在這兩個類別之間繪制一條單獨的線性邊界。
當有多模態(tài)數(shù)據(jù)時,這也是線性分類器可能有困境的地方。
線性分類器存在很多問題,但它是一個超級簡單的算法,易于使用和理解。
(完)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權禁止轉載。詳情見轉載須知。