432
技術社區[雲棲]
Reddit 討論:Hinton的Capsule網絡真的比CNN效果更好嗎?
首先,capsule 的概念與卷積的概念大部分是獨立的。例如,你可以有一個完全連接的capsule網絡。但是,它們確實使用了卷積,而且也被與CNN進行比較。但是,我將在接下來解釋中抽象出卷積,因為這會分散我們的核心思想。
因為capsule網絡與傳統的神經網絡相比是如此的不同,以至於很難理解它們之間的差異。在這裏我將詳細介紹capsule網絡的細節,然後總結一下不同之處。
首先,我們可以看看capsule的動機(從Hinton的談話中摘出來的)。CNN的過濾器所做的就是檢測源圖像中是否存在特定的模式/特性。 我們通常希望並行地在源圖像的同一個patch上堆疊多個過濾器,這樣就可以在同一個patch檢測多個特征。
但是,請注意,由於堆疊的過濾器數量的線性因子,這個維度會增加很多。為了減少網絡的維度,同時允許使用更多的過濾器,我們可以應用max-pooling,這樣就可以得到一個神經元,它在語義上的意思是“這個區域某處有一個特征X。”但是,請注意,這個特征的精確位置已經被丟棄。在許多層重複這個操作,我們實際上丟失了許多關於特征精確位置的信息。
另一個稍微切向的動機是:如果一個人被展示一個鼻子,它就可以對眼睛、嘴、耳朵等部位的大約位置進行反向工程,從而預測整個臉部的位置和方向。如果我們看到一個鼻子,並預測了臉部的位置;但是假如看到一個嘴巴,基於它預測的臉部位置就會稍微不同,看起來會很奇怪。如果我們僅僅使用1/0來檢測特征(鼻子,嘴巴)的存在,我們可能會被引導去相信這兩者在正確位置的組合就可以預測出一張臉。但實際不是這樣,我們也需要知道它們的方向。
想法:在檢測特性的基礎上,我們可以輸出額外的2個值,對應該特性被檢測到的X和Y位置。但是方向呢?我們需要一種更通用的方式來封裝這些信息。一個更好的想法是:我們可以讓神經網絡學習一種方法來表示這個位置/方向信息本身!這就是capsule網絡的由來。
1)標量vs向量的輸入和輸出
神經元從上一層接收一堆標量,並輸出一個標量。一個capsule是從上一層獲取一堆向量,並輸出一個向量。
如果你仔細閱讀了,你可能已經注意到(1)實際上並沒有完全改變網絡。假設我被允許任意地將前一層的神經元組合在一起,將來自當前層的神經元組合在一起,將它們稱為向量,並沒有什麼區別。這裏,我們將輸入設為向量,對它應用一個矩陣(matrix),然後做一個加權和。這與簡單地將輸入激活作為一個巨大的向量,然後再應用一個更大的矩陣相比,沒有什麼不同。
2)擠壓函數
引入擠壓函數(squash function)是真正的區別。但現在,仍然是一個任意非線性。你可以想象一個奇怪的網絡,它在兩個層之間變換,一個變換向量,另一個對這些向量做加權和(這實際上是另一個線性變換!),然後擠壓。結合(1)和(2),這意味著我們的網絡使用的是不同於一般類型的非線性。
3)capsule之間的routing
這就是capsule網絡如此與眾不同的原因。與普通的層相比,capsule層是完全不同的。首先,我們轉換輸入向量來得到預測向量。然後我們將children capsule分配給parent capsule,它的總預測向量與它自己的預測向量有很大的一致,從而可以對預測向量進行加權和。然後把它拿出來,進行擠壓(squash)。
原文發布時間為:2017-11-11
本文作者:GraceFu
本文來自雲棲社區合作夥伴新智元,了解相關信息可以關注“AI_era”微信公眾號
原文鏈接:Reddit 討論:Hinton的Capsule網絡真的比CNN效果更好嗎?
最後更新:2017-11-13 10:34:02