0 - 背景
Geoffrey Hinton是深度學習的開創者之一,反向傳播等神經網絡經典算法發明人,他在去年年底和他的團隊發表了兩篇論文,介紹了一種全新的神經網絡,這種網絡基於一種稱為膠囊(capsule)的結構,並且還發表了用來訓練膠囊網絡的囊間動態路由算法。
1 - 研究問題
傳統CNN存在着缺陷(下面會詳細說明),如何解決CNN的不足,Hinton提出了一種對於圖像處理更加有效的網絡——膠囊網絡,其綜合了CNN的優點的同時,考慮了CNN缺失的相對位置、角度等其他信息,從而使得識別效果有所提升。
2 - 研究動機
2.1 - CNN的缺陷
CNN着力於檢測圖像像素中的重要特征。考慮簡單的人臉檢測任務,一張臉是由代表臉型的橢圓、兩只眼睛、一個鼻子和一個嘴巴組成。而基於CNN的原理,只要存在這些對象就有一個很強的刺激,因此這些對象空間關系反而沒有那么重要。
如下圖,右圖不是人臉但都具備了人臉需要的對象,所以CNN有很大可能通過具有的對象激活了是人臉的判斷,從而使得結果判斷出錯。
重新審視CNN的工作方式,高層特征是低層特征組合的加權和,前一層的激活與下一層神經元的權重相乘並且相加,接着通過非線性激活函數進行激活。在這么一個架構中,高層特征和低層特征之間的位置關系變得模糊(我認為還是有一些的只是沒有很好的利用)。而CNN解決這個問題的方法是通過最大池化層或者或許的卷積層來擴大下續卷積核的視野(我認為最大池化層不管怎么說或多或少會丟掉信息甚至是重要信息)。
2.2 - 逆圖形法
計算機圖形學是基於幾何數據內部的分層表示來構造可視圖像,其結構考慮到了對象的相對位置,幾何化的對象間的相對位置關系和朝向以矩陣表示,特定的軟件接受這些表示作為輸入並將它們轉化為屏幕上的圖像(渲染)。
Hinton受此啟發,認為大腦所做的和渲染正好相反,稱為逆圖形,從眼睛接受的視覺信息中,大腦解析出其所在世界的分層表示,並嘗試匹配學習到的模式和存儲在大腦中的關系,從而有了辨識,注意到,大腦中的物體表示並不依賴視角。
因此,現在要考慮的是如何在神經網絡中建模這些分層關系。在計算機圖形學中,三維圖形中的三維對象之間的關系可以用位姿表示,位姿的本質是平移和旋轉。Hinton提出,保留對象部件之間的分層位姿關系對於正確分類和辨識對象來說很重要。膠囊網絡結合了對象之間的相對關系,在數值上表示為4維位姿矩陣。當模型有了位姿信息之后,可以很容易地理解它看到的是以前看到的東西而只是改變了視角而已。如下圖,人眼可以很容易分辨出是自由女神像,只是角度的不同,但CNN卻很難做到,而把位姿信息集合進去的膠囊網絡,也可以判別出是自由女神像的不同角度。
2.3 - 優點
- 由於膠囊網絡集合了位姿信息,因此其可以通過一小部分數據即學習出很好的表示效果,所以這一點也是相對於CNN的一大提升。舉個例子,為了識別手寫體數字,人腦需要幾十個最多幾百個例子,但是CNN卻需要幾萬規模的數據集才能訓練出好結果,這顯然還是太暴力了!
- 更加貼近人腦的思維方式,更好地建模神經網絡中內部知識表示的分層關系,膠囊背后的直覺非常簡單優雅。
2.4 - 缺點
- 膠囊網絡的當前實現比其他現代深度學習模型慢很多(我覺得是更新耦合系數以及卷積層疊加影響的),提高訓練效率是一大挑戰。
3 - 研究內容
3.1 - 膠囊是什么
摘抄Hinton等人的《Transforming Autoencoders》關於膠囊概念理解如下。
人工神經網絡不應當追求“神經元”活動中的視角不變性(使用單一的標量輸出來總結一個局部池中的重復特征檢測器的活動),而應當使用局部的“膠囊”,這些膠囊對其輸入執行一些相當復雜的內部計算,然后將這些計算的結果封裝成一個包含信息豐富的輸出的小向量。每個膠囊學習辨識一個有限的觀察條件和變形范圍內隱式定義的視覺實體,並輸出實體在有限范圍內存在的概率及一組“實例參數”,實例參數可能包括相對這個視覺實體的隱式定義的典型版本的精確的位姿、照明條件和變形信息。當膠囊工作正常時,視覺實體存在的概率具有局部不變性——當實體在膠囊覆蓋的有限范圍內的外觀流形上移動時,概率不會改變。實例參數卻是“等變的”——隨着觀察條件的變化,實體在外觀流形上移動時,實例參數也會相應地變化,因為實例參數表示實體在外觀流形上的內在坐標。
簡單來說,可以理解成:
- 人造神經元輸出單個標量。卷積網絡運用了卷積核從而使得將同個卷積核對於二維矩陣的各個區域計算出來的結果堆疊在一起形成了卷積層的輸出。
- 通過最大池化方法來實現視角不變性,因為最大池持續搜尋二維矩陣的區域,選取區域中最大的數字,所以滿足了我們想要的活動不變性(即我們略微調整輸入,輸出仍然一樣),換句話說,在輸入圖像上我們稍微變換一下我們想要檢測的對象,模型仍然能夠檢測到對象
- 池化層損失了有價值的信息,同時也沒有考慮到編碼特征間的相對空間關系,因此我們應該使用膠囊,所有膠囊檢測中的特征的狀態的重要信息,都將以向量形式被膠囊封裝(神經元是標量)
膠囊和人工神經元對比如下:
3.2 - 囊間動態路由算法
低層膠囊$i$需要決定如何將其輸出向量發送給高層膠囊$j$。低層膠囊改變標量權重$c_{ij}$,輸出向量乘以該權重后,發送給高層膠囊,作為高層膠囊的輸入。關於權重$c_{ij}$,需要知道有:
- 權重均為非負標量
- 對每個低層膠囊$i$而言,所有權重$c_{ij}$的總和等於1
- 對每個低層膠囊$i$而言,權重的數量等於高層膠囊的數量
- 這些權重由迭代動態路由算法確定
低層膠囊將其輸出發送給對此表示“同意”的高層膠囊,算法偽碼如下:
權重更新可以用如下圖來直觀理解。
其中兩個高層膠囊的輸出用紫色向量$v_1$和$v_2$表示,橙色向量表示接受自某個低層膠囊的輸入,其他黑色向量表示接受其他低層膠囊的輸入。左邊的紫色輸出$v_1$和橙色輸入$\hat{u_{1|1}}$指向相反的方向,所以它們並不相似,這意味着它們點積是負數,更新路由系數的時候將會減少$c_{11}$。右邊的紫色輸出$v_2$和橙色輸入$\hat{u_{2|1}}$指向相同方向,它們是相似的,因此更新參數的時候路由系數$c_{12}$會增加。在所有高層膠囊及其所有輸入上重復應用該過程,得到一個路由參數集合,達到來自低層膠囊的輸出和高層膠囊輸出的最佳匹配。
采用多少次路由迭代?論文在MNIST和CIFAR數據集上檢測了一定范圍內的數值,得到以下結論:
- 更多的迭代往往會導致過擬合
- 實踐中建議使用3次迭代
4 - 整體框架
CapsNet由兩部分組成:編碼器和解碼器。前3層是編碼器,后3層是解碼器:
- 第一層:卷積層
- 第二層:PrimaryCaps(主膠囊)層
- 第三層:DigitCaps(數字膠囊)層
- 第四層:第一個全連接層
- 第五層:第二個全連接層
- 第六層:第三個全連接層
4.1 - 編碼器
編碼器接受一張$28 \times 28$的MNIST數字圖像作為輸入,將它編碼為實例參數構成的16維向量。
4.1.1 - 卷積層
- 輸入:$28 \times 28$圖像(單色)
- 輸出:$20 \times 20 \times 256$張量
- 卷積核:256個步長為1的$9 \times 9 \times 1$的核
- 激活函數:ReLU
4.1.2 - PrimaryCaps層(32個膠囊)
- 輸入:$20 \times 20 \times 256$張量
- 輸出:$6 \times 6 \times 8 \times 32$張量(共有32個膠囊)
- 卷積核:8個步長為2的$9 \times 9 \times 256$的核/膠囊
4.1.3 - DigitCaps層(10個膠囊)
- 輸入:$6 \times 6 \times 8 \times 32$張量
- 輸出:$16 \times 10$矩陣
4.1.4 - 損失函數
4.2 - 解碼器
解碼器從正確的DigitCap中接受一個16維向量,並學習將其編碼為數字圖像(注意,訓練時候只采用正確的DigitCap向量,而忽略不正確的DigitCap)。解碼器用來作為正則子,它接受正確的DigitCap的輸出作為輸入,重建一張$28 \times 28$像素的圖像,損失函數為重建圖像和輸入圖像之間的歐式距離。解碼器強制膠囊學習對重建原始圖像有用的特征,重建圖像越接近輸入圖像越好,下面展示重建圖像的例子。
4.2.1 - 第一個全連接層
- 輸入:$16 \times 10$矩陣
- 輸出:512向量
4.2.2 - 第二個全連接層
- 輸入:512向量
- 輸出:1024向量
4.2.3 - 第三個全連接層
- 輸入:1024向量
- 輸出:784向量