KNN和CNN

問題的來源

剛開始學習的時候,其實有一個問題一直沒想通。這個問題源自下面這張圖:

這張圖是CS231n介紹linear classifier的時候給的intuition。線性分類器其實和convNet的fc層是一樣的,這裡把fc層中的template描述成一個可以用來界定圖片類別的model(從用於與圖片進行匹配的角度,也可以叫做template)。但這個描述顯然不能讓人信服——template本身就是一張圖片,為什麼其他圖片在高維坐標表示中都是一個點,而template卻能作為一條呢『線』而存在?於是我按照自己理解重新做了一張圖。

在圖片的表徵上,我用了和原來一樣的坐標系,即每一個軸代表圖片在這一個pixel上的intensity value。因為template本身就是一張圖片,參考之前看計算神經科學的時候看到的分類方法,我考慮template為一個類似於「此類別中所有圖片平均值」的存在。但這個模型依然存在著顯而易見的問題——假設這個模型是對的,那麼linear classifier豈不是和knn沒有區別了?

說到這個,不得不先提一下knn。在cs231n中knn作為數據驅動的方法被作為引入。儘管對於圖像來說knn顯然是非常naive,但它的intuition還是很好的。也就是,能被分到一類的圖像一定在某一個特定的空間上有相似性,並且在這個空間的某些坐標上會有相近的值。即去比較兩張圖片是否相似性來確定它們的類別毫無問題,但直接拿原圖片去求L1/L2距離顯然不是一個很好的確定相似度的方法。

對於這一個問題,最後的結論是,linear classifier 在求差異性上確實用了和knn類似的方法。但鑒於linear classifier中template是learnable的,可以期待它能得到比knn那種直接用原圖的操作更好的結果。

從knn到cnn

根據上面提到的,從理論上講,更加科學的方法是找到某個特徵維度,把所有圖片都映射到這個維度,再來判斷差異性,就能得到非常準確的結果。

從這個角度看,cnn做的也就是對knn進行了這麼一個拓展。

cnn的fc層其實相當於兩張圖片在中心點對齊的地方進行correlation;對於沒有fc層的FCN來說,其卷積層也可以看成用feature filter和給定圖片進行匹配(輸出圖片的intensity代表了相似度)。因而上述層其實做了和knn一樣的事情,其本質操作的維度和方式仍然是pixel-wise的。

而cnn和knn的區別在於其在fc層之前還有很長的卷積層。卷積層的作用就是之前提到的:把圖片map到某些特徵維度(前向傳播)和不斷的調整以找到最準確的特徵維度(反向傳播)。事實上很多論文直接把卷積層的輸出結果稱為「feature map」,從這個角度看這些層做了什麼是顯而易見的。

總結而言,cnn做的事情是:

1. 將圖片進行映射,得到對應的feature map

2. 把這個feature map和learn到的over all feature of a class (template)進行差異度計算來的到該輸入圖片在各個class上的得分

推薦閱讀:

TAG:深度學習DeepLearning | 卷積神經網路CNN | 計算機視覺 |