膠囊網(wǎng)絡(luò)(CapsNet)是一種新的熱門的神經(jīng)網(wǎng)絡(luò)架構(gòu)。它可能對深度學習帶來深遠的影響,特別是對計算機視覺領(lǐng)域。等一下!計算機視覺不是差不多已經(jīng)被解決了嗎?我們不是已經(jīng)看到了多種卷積神經(jīng)網(wǎng)絡(luò)(CNN)的神奇案例?它們不是已經(jīng)在計算機視覺任務(wù)(例如分類、定位、物體檢測、語義分割或?qū)嵗指?,見圖1)上實現(xiàn)超越人類的水平了嗎?

圖1 一些主要的計算機視覺任務(wù)。當前,每種任務(wù)都需要一個不一樣的CNN架構(gòu)。比如分類里的ResNet,物體檢測里的YOLO,實例分割里的Mask R-CNN等。圖片由Aurélien Géron提供
恩,是的。我們已經(jīng)見到了很多神奇的CNN,但是。
- 它們需要非常多的圖片進行訓練(或重復使用了已用海量數(shù)據(jù)訓練過的神經(jīng)網(wǎng)絡(luò)的一部分)。 而CapsNet使用少得多的訓練數(shù)據(jù)就能泛化。
- CNN們并不能很好地應(yīng)對模糊性,但CapsNet可以。所以它能在非常擁擠的場景里也表現(xiàn)得很好(盡管它目前還需要解決背景圖的問題)。
- CNN會在池化層理丟失大量的信息,從而降低了空間分辨率(見圖2),這就導致對于輸入的微小變化,其輸出幾乎是不變的。在諸如語義分割這樣的場景里,這會是一個問題,因為細節(jié)信息必須要在網(wǎng)絡(luò)里被保留。現(xiàn)在,這一問題已經(jīng)被通過在CNN里構(gòu)建復雜的架構(gòu)來恢復這些損失的信息所解決。在CapNet里面,細節(jié)的姿態(tài)信息(比如對象的準確位置、旋轉(zhuǎn)、厚度、傾斜度、尺寸等)會在網(wǎng)絡(luò)里被保存下來,不用先丟失再恢復。輸入上微小的變化會帶來輸出上的小變化,信息被保存。這被稱為“等變的”。這就讓CapsNet能使用一個簡單和統(tǒng)一的架構(gòu)來應(yīng)對不同的視覺任務(wù)。
- 最后,CNN需要額外的組件來自動識別每個小部分屬于哪個物體(例如這條腿屬于這只羊)。而CapsNet則可以給你這些部分的層級結(jié)構(gòu)。

圖2 DeepLab2的圖像分割管道,來自Liang-Chieh Chen等。注意這里面CNN的輸出(右上角圖)是非常得粗糙。這就需要一些額外的步驟來恢復丟失的細節(jié)。圖片來自論文《DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs》,獲作者友情授權(quán)使用??梢圆榭碨. Chilamkurthy的這篇很棒的博文來了解語義分割的神經(jīng)網(wǎng)絡(luò)的架構(gòu)有多么復雜多樣
CapsNet是在2011年在Geoffrey Hinton等人的一篇名為《Transforming Autoencoders》的論文中首次出現(xiàn)。但僅在幾個月前(即2017年11月),Sara Sabour、Nicholas Frosst和Geoffrey Hinton發(fā)表了一篇名為《Dynamic Routing between Capsules》的論文,其中介紹了CapsNet架構(gòu)。該架構(gòu)在MNIST(著名的手寫數(shù)字圖像數(shù)據(jù)集)上達到了最先進的性能,并且在MultiMNIST數(shù)據(jù)集(一種有重疊的不同數(shù)字組的手寫數(shù)字的變體)上獲得了比CNN好得多的結(jié)果。見圖3。

圖3 MultiMNIST圖片(白色)和由CapsNet重構(gòu)后的結(jié)果(紅色和綠色)?!癛”=重構(gòu)后的結(jié)果;“L”=標注。例如,對第一個樣例(左上角)的預測是準確的,重構(gòu)的結(jié)果也對。但是在第五個例子里,預測(5,7)是錯的,不是(5,0)。因此,5被正確地重構(gòu)了,但是0沒有。圖片來自論文《Dynamic routing between capsules》,作者友情授權(quán)使用
盡管有上述這些優(yōu)點,但CapsNet還遠未到完美的程度。首先,它們在更大的圖片上(例如CIFAR10或ImageNet數(shù)據(jù)集里)還沒有CNN的表現(xiàn)好。另外,CapsNet的計算量很大,同時它還不能區(qū)分靠的很近的相同的物體(這被稱為“擁擠問題”,人類也有這個問題)。但是這里的關(guān)鍵點是膠囊網(wǎng)絡(luò)是非常有希望的,看起來只要做一些修改就能讓膠囊網(wǎng)絡(luò)充分釋放它們的潛能。畢竟現(xiàn)代CNN在1998年就被發(fā)明了,但也要經(jīng)過幾次改進,直到2012年的ImageNet大賽上才達到業(yè)界領(lǐng)先水平。
那么,到底CapsNet是什么?
簡而言之,一個膠囊網(wǎng)絡(luò)是由膠囊而不是由神經(jīng)元構(gòu)成。一個膠囊是一小群神經(jīng)元,它們可以學習在一個圖片的一定區(qū)域內(nèi)檢查一個特定的對象(比如,一個矩形)。它的輸出是一個向量(例如,一個8維的向量)。每個向量的長度代表了物體是否存在的估計概率[1],它的方向(例如在8維空間里)記錄了物體的姿態(tài)參數(shù)(比如,精確的位置、旋轉(zhuǎn)等)。如果物體有稍微的變化(比如,移動、旋轉(zhuǎn)、尺寸變化等),膠囊將也會輸出一個長度相同但是方向稍微變化的向量。因此膠囊是等變的。
和常規(guī)神經(jīng)網(wǎng)絡(luò)很類似,CapsNet也是由多層構(gòu)成(見圖4)。處于最底層的膠囊被稱為向量膠囊:它們每個都只用圖片的一小部分區(qū)域作為輸入(稱為感知域),然后試圖去探測某個特殊的模式(例如,一個矩形)是否存在,以及姿態(tài)如何。在更高層的膠囊(稱為路由膠囊)則是探測更大和更復雜的物體,比如船等。

圖4 一個兩層的CapsNet。在本例里,向量膠囊層有兩個5x5膠囊的特征圖。其中第二個膠囊層有兩組3x3膠囊的特征圖。每個膠囊輸出一個向量。每個箭頭代表不同的膠囊的輸出。藍色的箭頭代表那些檢測三角形的膠囊的輸出;黑色箭頭代表試圖檢測矩形的膠囊的輸出。圖片由Aurélien Géron提供
向量膠囊層是用幾個常規(guī)卷積層實現(xiàn)。例如在這篇論文里,他們使用兩個卷積層輸出256個包含標量的6×6特征圖。然后把這個輸出變形成32個包含8維向量的6×6特征圖。最后,他們使用一個新奇的壓縮函數(shù)來確保這些向量的長度都是在0到1(來代表概率)之間。就這楊,它們就產(chǎn)生了向量膠囊的輸出。
下一層的膠囊也試圖去檢測物體和它們的姿態(tài),但是它們的工作機制很不一樣。它們使用的是一種叫按一致性路由的算法。這里是CapsNet的主要魅力所在。先讓我們看一個例子。
假設(shè)我們只有兩個向量膠囊:一個識別矩形的膠囊和一個識別三角形的膠囊,而且假定他們都能檢測到相應(yīng)的形狀。矩形和三角形可以是房子或是船的一部分(見圖5)。根據(jù)矩形的姿態(tài),它們都是稍微向右旋轉(zhuǎn)了一點,那么房子和船也都會向右旋轉(zhuǎn)了一點。根據(jù)三角形的姿態(tài),這個房子幾乎完全是上下顛倒的,而船則是稍微向右旋轉(zhuǎn)了一點。注意在這里,整體的形狀和整體與部分的關(guān)系都是在訓練中學習的?,F(xiàn)在可以看到矩形和三角形在船上的姿態(tài)是一致的,而在房子上的姿態(tài)則非常不一致。因此,很有可能這里的矩形和三角形是同一條船上的一部分,而房子上則不是。

圖5 按一致性路由。第一步——基于對象的部分是否存在和姿態(tài)來預測對象是否存在及其姿態(tài),接著查看預測間的一致性。圖片由Aurélien Géron提供
因為我們現(xiàn)在已經(jīng)很有信心地知道矩形和三角形是船的一部分,所以把矩形和三角形的輸出更多指向船的膠囊而更少指向房子的膠囊就順理成章了。用這個方法,船的膠囊將會獲得更多的有用輸入信號,而房子的膠囊則接收更少的噪音。對每一個連接,按一致性路由算法會維護一個路由權(quán)重(見圖6):它對于一致的會增加權(quán)重,而對于不一致的則降低權(quán)重。

圖6 按一致性路由。第二步——更新路由權(quán)重。圖片由Aurélien Géron提供
這個按一致性路由算法會涉及到一些循環(huán):一致性檢測和路由權(quán)重更新(值得注意的是,這一步驟會在每次預測時發(fā)生,不只是一次,也不只是在訓練時)。這一算法對于擁擠的場景特別有用。例如圖7里的場景是比較模糊的,因為你能看到中間有一個上下顛倒的房子,但這樣會讓上面的三角形和下面的矩形無法得到解釋。按一致性路由算法更有可能收斂到一個更好的解釋:下面是一條船,而上面是一個房子。這樣模糊性就“可以被解釋了”:下面的矩形最好是被看成一條船的一部分,同時這樣也解釋了下面的三角形。一旦下面的兩個部分被解釋好了,剩下的部分就很容易地被解釋成一個房子。

圖7 按一致性路由可以分解擁擠的場景,例如這里的圖片。因為它可能會被錯誤地解釋為中間是一個上下顛倒的房子和兩個無法解釋的部分。相反的,下面的矩形會被路由給船,而這也就把下面的三角形帶進了船。一旦這個船被解釋清楚,那么就能很容易地解釋上面的兩個部分是一個房子了。圖片由Aurélien Géron提供
就是這些!你現(xiàn)在知道CapsNet背后的關(guān)鍵原理了!如果你想了解更多的細節(jié),可以查看我的兩個關(guān)于CapsNet的視頻(一個是關(guān)于它的架構(gòu),另外一個是如何實現(xiàn)它)和帶有我的注釋的這個用TensorFlow實現(xiàn)的膠囊網(wǎng)絡(luò)(Jupyter Notebook文件)。請隨意對視頻和GitHub上的文件進行評論,或是通過我的Twitter賬號@aureliengeron聯(lián)絡(luò)我。希望你覺得這個博文對你有幫助。
[1] 這是由S. Sabour、N. Frosst和G. Hinton發(fā)表的論文《Dynamic routing with capsules》里提出的最初的架構(gòu)。但是在文章發(fā)表后他們又提出了一個更通用的架構(gòu)。其中物體出現(xiàn)的概率以及姿態(tài)參數(shù)都在輸出向量里按不同的方式編碼了。不過核心的觀點還是沒有改變。
Aurélien Géron
Aurélien Géron是一名機器學習咨詢師,還是O’Reilly圖書《Hands-on Machine Learning with Scikit-Learn and TensorFlow》的作者。他在谷歌期時,曾在2013到2016年間領(lǐng)導了YouTube的視頻分類團隊。Géron在2002到2012年創(chuàng)立了Wifirst公司并擔任CTO。在法國,Wifirst是一家領(lǐng)先的無線服務(wù)供應(yīng)商。在2001年,Géron創(chuàng)立了Polyconseil并擔任CTO。這家公司現(xiàn)在管理著共享電汽車服務(wù)Autolib。在此之前,他作為軟件工程師在多個領(lǐng)域工作,包括金融、防務(wù)、醫(yī)療保健等。

