0 - 背景
Geoffrey Hinton是深度學習的開創者之一,反向傳播等神經網絡經典算法發明人,他在去年年底和他的團隊發表了兩篇論文,介紹了一種全新的神經網絡,這種網絡基於一種稱為膠囊(capsule)的結構,並且還發表了用來訓練膠囊網絡的囊間動態路由算法。
1 - 研究問題
傳統CNN存在着缺陷(下面會詳細說明),如何解決CNN的不足,Hinton提出了一種對於圖像處理更加有效的網絡——膠囊網絡,其綜合了CNN的優點的同時,考慮了CNN缺失的相對位置、角度等其他信息,從而使得識別效果有所提升。
2 - 研究動機
2.1 - CNN的缺陷
CNN着力於檢測圖像像素中的重要特征。考慮簡單的人臉檢測任務,一張臉是由代表臉型的橢圓、兩只眼睛、一個鼻子和一個嘴巴組成。而基於CNN的原理,只要存在這些對象就有一個很強的刺激,因此這些對象空間關系反而沒有那么重要。
如下圖,右圖不是人臉但都具備了人臉需要的對象,所以CNN有很大可能通過具有的對象激活了是人臉的判斷,從而使得結果判斷出錯。
重新審視CNN的工作方式,高層特征是低層特征組合的加權和,前一層的激活與下一層神經元的權重相乘並且相加,接着通過非線性激活函數進行激活。在此設置中,組成更高級別特征的簡單特征之間沒有姿勢(平移和旋轉)關系。 CNN解決此問題的方法是使用最大池化或連續卷積層,以減少流經網絡的數據的空間大小,從而增加高層神經元的“感受野”,從而使它們能夠檢測出輸入圖像的較大區域中的高階特征。最大池化是使卷積網絡工作異常出色的關鍵,在許多領域都可以實現驚人的性能。但是,不要被它的性能所迷惑:盡管CNN的性能比之前的任何模型都要好,但是最大池化卻在丟失有價值的信息。Hinton本人說,“The pooling operation used in convolutional neural networks is a big mistake and the fact that it works so well is a disaster.”
關鍵問題
Internal data representation of a convolutional neural network does not take into account important spatial hierarchies between simple and complex objects.
2.2 - 思想來源
計算機圖形學是基於幾何數據內部的層次結構表示來構造可視圖像,其結構考慮到了對象的相對位置。內部表示形式以幾何對象和矩陣的陣列形式存儲在計算機的內存中,這些矩陣表示這些對象的相對位置和方向。然后,專用軟件將這種表示形式轉換為屏幕上的圖像。這稱為渲染。
Hinton受此啟發,認為大腦所做的和渲染正好相反,稱為逆圖形,從眼睛接受的視覺信息中,大腦解析出其所在世界的層次結構表示,並嘗試匹配學習到的模式和存儲在大腦中的關系,從而有了辨識,注意到,大腦中的物體表示並不依賴視角。
因此,現在要考慮的是如何在神經網絡中建模這些分層關系。在計算機圖形學中,三維圖形中的三維對象之間的關系可以用姿態(pose)表示,位姿的本質是平移和旋轉。Hinton提出,保留對象部件之間的分層位姿關系對於正確分類和辨識對象來說很重要。膠囊網絡結合了對象之間的相對關系,在數值上表示為4維位姿矩陣。當模型有了位姿信息之后,可以很容易地理解它看到的是以前看到的東西而只是改變了視角而已。如下圖,人眼可以很容易分辨出是自由女神像,只是角度的不同,但CNN卻很難做到,而把位姿信息集合進去的膠囊網絡,也可以判別出是自由女神像的不同角度。
2.3 - 優點
- 由於膠囊網絡集合了位姿信息,因此其可以通過一小部分數據即學習出很好的表示效果,所以這一點也是相對於CNN的一大提升。舉個例子,為了識別手寫體數字,人腦需要幾十個最多幾百個例子,但是CNN卻需要幾萬規模的數據集才能訓練出好結果,這顯然還是太暴力了!
- 更加貼近人腦的思維方式,更好地建模神經網絡中內部知識表示的分層關系,膠囊背后的直覺非常簡單優雅。
2.4 - 缺點
- 膠囊網絡計算效率低,但是最近的論文 Linformer: Self-Attention with Linear Complexit 只需要線性的時間復雜度。
3 - 研究內容
3.1 - 膠囊是什么
摘抄Hinton等人的《Transforming Auto-encoders》關於膠囊概念理解如下。
人工神經網絡不應當追求“神經元”活動中的視角不變性(使用單一的標量輸出來總結一個局部池中的重復特征檢測器的活動),而應當使用局部的“膠囊”,這些膠囊對其輸入執行一些相當復雜的內部計算,然后將這些計算的結果封裝成一個包含信息豐富的輸出的小向量。每個膠囊學習辨識一個有限的觀察條件和變形范圍內隱式定義的視覺實體,並輸出實體在有限范圍內存在的概率及一組“實例參數”,實例參數可能包括相對這個視覺實體的隱式定義的典型版本的精確的位姿、照明條件和變形信息。當膠囊工作正常時,視覺實體存在的概率具有局部不變性——當實體在膠囊覆蓋的有限范圍內的外觀流形上移動時,概率不會改變。實例參數卻是“等變的”——隨着觀察條件的變化,實體在外觀流形上移動時,實例參數也會相應地變化,因為實例參數表示實體在外觀流形上的內在坐標。
簡單來說,可以理解成:
- 人造神經元輸出單個標量。卷積網絡運用了卷積核從而使得將同個卷積核對於二維矩陣的各個區域計算出來的結果堆疊在一起形成了卷積層的輸出。
- 通過最大池化方法來實現視角不變性,因為最大池持續搜尋二維矩陣的區域,選取區域中最大的數字,所以滿足了我們想要的活動不變性(即我們略微調整輸入,輸出仍然一樣),換句話說,在輸入圖像上我們稍微變換一下我們想要檢測的對象,模型仍然能夠檢測到對象
- 池化層損失了有價值的信息,同時也沒有考慮到編碼特征間的相對空間關系,因此我們應該使用膠囊,所有膠囊檢測中的特征的狀態的重要信息,都將以向量形式被膠囊封裝(神經元是標量)
膠囊和人工神經元對比如下:
3.2 - 囊間動態路由算法
低層膠囊需要決定如何將其輸出向量發送給高層膠囊。低層膠囊改變標量權重,輸出向量乘以該權重后,發送給高層膠囊,作為高層膠囊的輸入。關於權重,需要知道有:
- 權重均為非負標量
- 對每個低層膠囊而言,所有權重總和等於1
- 對每個低層膠囊而言,權重的數量等於高層膠囊的數量
- 這些權重由迭代動態路由算法確定
低層膠囊將其輸出發送給對此表示“同意”的高層膠囊,算法偽碼如下:
權重更新可以用如下圖來直觀理解。
其中兩個高層膠囊的輸出用紫色向量表示,橙色向量表示接受自某個低層膠囊的輸入,其他黑色向量表示接受其他低層膠囊的輸入。左邊的紫色輸出和橙色輸入指向相反的方向,所以它們並不相似,這意味着它們點積是負數,更新路由系數的時候將會減少。右邊的紫色輸出和橙色輸入指向相同方向,它們是相似的,因此更新參數的時候路由系數會增加。在所有高層膠囊及其所有輸入上重復應用該過程,得到一個路由參數集合,達到來自低層膠囊的輸出和高層膠囊輸出的最佳匹配。
采用多少次路由迭代?論文在MNIST和CIFAR數據集上檢測了一定范圍內的數值,得到以下結論:
- 更多的迭代往往會導致過擬合
- 實踐中建議使用3次迭代
4 - 整體框架
CapsNet由兩部分組成:編碼器和解碼器。前3層是編碼器,后3層是解碼器:
- 第一層:卷積層
- 第二層:PrimaryCaps(主膠囊)層
- 第三層:DigitCaps(數字膠囊)層
- 第四層:第一個全連接層
- 第五層:第二個全連接層
- 第六層:第三個全連接層
4.1 - 編碼器
編碼器接受一張28×2828×28的MNIST數字圖像作為輸入,將它編碼為實例參數構成的16維向量。
4.1.1 - 卷積層
- 輸入:28 x 28 x1
- 輸出:20 × 20 × 256
- 卷積核:256個步長為1的9 × 9的核
- 激活函數:ReLU
- 參數數量:(9 x 9 + 1) x 256 = 20992
4.1.2 - PrimaryCaps層(32個膠囊)
- 輸入:20 × 20 × 256
- 輸出:6 × 6 × 8 × 32
- 卷積核:8個步長為2的9×9×256的核/膠囊
- 參數數量:(9 x 9 x 256 + 1) x 8 x 32 = 5308672
- 具體:該層有32個主膠囊,通過256個9 x 9的kernel(每8個的結果匯成一個capsule),stride為2,得到PrimaryCaps維度為6 x 6 x 8 x 32(6 x 6是卷積結果,8是capsule的維度,32是channel數).所以這里 \(u_{i}, i \in[1,32 \times 6 \times 6], v_{j}, j \in[1,10] \)
4.1.3 - DigitCaps層(10個膠囊)
- 輸入:6 × 6 × 8 × 32
- 輸出:16 × 10 每一行就是 \(v_{j}\),共10個數字膠囊,相當於每個 \(v_{j}\)都是由8塊膠囊層,每層32個6 x 6維的膠囊通過dynamic routing求和搞出來的。
- 參數數量:1152 x 8 x 16 + 1152 + 1152 = 1497600
- 細節:可以將其視為6x6x32 個8維向量,總共是1152個輸入向量。根據膠囊的內部工作原理,這些輸入向量中的每個向量都有其自己的8x16權重矩陣,該矩陣將8維輸入空間映射到16維膠囊輸出空間。因此,每個膠囊有1152個矩陣,以及動態路由中使用的1152 c系數和1152 b系數。
4.1.4 - 損失函數
4.2 - 解碼器
decoder是為了reconstruction loss,只考慮最后的activity vector(所屬的那一類),mask掉其他,並將其通過3層全連接網絡重構出原始圖像,並將其和原始圖像對比算出一個loss,將這個作為一個regularization的方法加在總的損失上。它接受正確的DigitCap的輸出作為輸入,重建一張28×28像素的圖像,損失函數為重建圖像和輸入圖像之間的歐式距離。解碼器強制膠囊學習對重建原始圖像有用的特征,重建圖像越接近輸入圖像越好,下面展示重建圖像的例子。
4.2.1 - 第一個全連接層
- 輸入:16×10
- 輸出:512
- 參數數量:(16 x 10 + 1) x 512 = 82432
4.2.2 - 第二個全連接層
- 輸入:512
- 輸出:1024
- 參數數量:(512 + 1) x 1024 = 525312
4.2.3 - 第三個全連接層
- 輸入:1024
- 輸出:784 (用來返回 28 x 28反編碼的圖片)
- 參數數量:(1024 + 1) x 784 = 803600