點擊上方「專知」關注獲取專業AI知識!
【導讀】10月26日,深度學習元老Geoffrey Hinton和他的團隊NIPS2017 Capsule論文《Dynamic Routing Between Capsules》在arxiv上發表,介紹了全新的膠囊網絡模型,以及相應的囊間動態路由算法。今天,Capsule Networks視頻教程放出了,專知內容組對這個視頻教程,進行了解讀,請大家查看,並多交流指正!
▌視頻
先看下Aurélien Géron介紹 Capsule Networks的視頻教程(英文字幕)
▌PPT
由於筆者能力有限,本篇所有備註皆為專知內容組成員根據講者視頻和PPT內容自行補全,不代表講者本人的立場與觀點。
膠囊網絡
Capsule Networks
你好! 我是AurélienGéron,在這個視頻中,我將告訴你們關於膠囊網絡,一個神經網絡的新架構。 Geoffrey Hinton幾年前就有膠囊網絡的想法,他在2011年發表了一篇文章,介紹了許多重要的想法,他還是很難讓這些想法實現,但直到現在。
幾周前,在2017年10月,一篇名為「動態路由膠囊」 由作者Sara Sabour,NicholasFrosst,當然還有Geoffrey Hinton一起發表了。
連結是:https://arxiv.org/abs/1710.09829
他們在MNIST數據集上達到了最先進的性能,並且在高度重疊的數字上表現出比卷積神經網絡好得多的結果。 那麼膠囊網絡究竟是什麼?
在計算機圖形學中,你表達一個場景都是從抽象的表示開始。
例如,位置x=20和y=30的矩形,旋轉16°,等等。每個對象類型都有不同的實例化參數。然後你調用一些渲染函數,然後你得到一個圖像。
逆向圖形,只是上面抽象表示的一個逆向過程。你從一個圖像開始,你試著找出它包含的對象,以及它們的實例化參數是什麼。
一個膠囊網絡基本上是一個試圖執行反向圖形解析的神經網絡。
它由許多膠囊組成。一個膠囊是一個函數,它試圖在給特定位置的目標預測它的存在性以及實例化參數。
例如,上面的網絡包含50個膠囊。 箭頭表示這些膠囊的輸出向量。 膠囊輸出許多向量。 黑色箭頭對應於試圖找到矩形的膠囊,而藍色箭頭則表示膠囊尋找三角形的輸出。激活向量的長度表示膠囊正在查找的物體確實存在的估計概率。
你可以看到大多數箭頭很小,這意味著膠囊沒有檢測到任何東西,但是兩個箭頭相當長。 這意味著在這些位置的膠囊非常有自信能夠找到他們要尋找的東西,在這個情況下是矩形和三角形。
接下來,激活向量的方向編碼對象的實例化參數,例如在這個情況下,對象的旋轉,但也可能是它的厚度,它是如何拉伸或傾斜的,它的確切位置(可能有輕微的翻轉),等等。為了簡單起見,我只關注旋轉參數,但在真實的膠囊網絡中,激活向量可能有5, 10個維度或更多。
實際上,實現這一點的一個好方法是首先應用一對卷積層,就像在常規的卷積神經網絡中一樣。這將輸出一個包含一堆特徵映射的數組。 然後你可以重塑這個數組來獲得每個位置的一組向量。
例如,假設卷積圖層輸出一個包含18個特徵圖(2×9)的數組,則可以輕鬆地重新組合這個數組以獲得每個位置9個維度的2個向量。 你也可以得到3個6維的向量,等等。
這看起來像在這裡在每個位置用兩個向量表示的膠囊網絡。最後一步是確保沒有向量長度大於1,因為向量的長度意味著代表一個概率,它不能大於1。
為此,我們應用一個squashing(壓扁)函數。它保留了矢量的方向,但將它壓扁,以確保它的長度在0到1之間。
膠囊網絡的一個關鍵特性是在網絡中保存關於物體位置和姿態的詳細信息。例如,如果我稍微旋轉一下圖像,注意激活向量也會稍微改變,對吧?這叫做equivariance。
在常規的卷積神經網絡中,通常會有多個匯聚層,不幸的是,這些匯聚層的操作往往會丟失很多信息,比如目標對象的準確位置和姿態。如果你只是想要對整個圖像進行分類,就算丟失這些信息也沒什麼大不了的,但是這些丟失的信息對你進行精確的圖像分割或對象檢測(這需要精確的位置和姿勢)等任務是非常重要的。
膠囊的equivariance等變特性使得它在這些任務上都有非常有前景。
好了,現在讓我們來看看膠囊網絡如何處理由層次結構組成的對象。
例如,考慮一個船,它的位置為x=22,y=28,旋轉16°。
這艘船是由幾個部件組成的。在當前演示的情況下,也就是說船由一個矩形和一個三角形組成。
現在我們要做相反的事情,我們需要逆向圖形,所以我們想要從圖像到這個完整的層次結構的部件和它們的實例化參數。
同樣,我們也可以繪製一個房子,使用相同的部分,一個矩形和一個三角形,但這次以不同的方式組織。
所以關鍵是要試著從這個包含一個矩形和一個三角形的圖像,找出這個位置和這個方向,並且說明它們是船的一部分,而不是房子。來讓我們弄清楚它將如何做到這一點。第一步(之前我們已經看到過):我們運行一對卷積層,我們將輸出重構以得到向量,然後將它們歸一化。這就得到了主膠囊的輸出。
我們已經有第一層了。下一步是則是展示膠囊網絡的魔力和複雜性的一步了。第一層中的每個膠囊試圖預測下一層中每個膠囊的輸出。你可能想停下來想一想這意味著什麼。
第一層膠囊試圖預測第二層膠囊將輸出什麼。
例如,讓我們考慮檢測矩形的膠囊。我會稱之為矩形膠囊。
假設下一層只有兩個膠囊,房子膠囊和船膠囊。由於矩形膠囊檢測到一個旋轉了16°的矩形,所以房子膠囊將檢測到一個旋轉了16°的房子,這是有道理的,船膠囊也會檢測到旋轉了16°的船。 這與矩形的方向是一致的。
所以,為了做出這個預測,矩形膠囊所做的就是簡單地計算一個變換矩陣W_i,j與它自己的激活向量u_i的點積。在訓練期間,網絡將逐漸學習第一層和第二層中的每對膠囊的變換矩陣。 換句話說,它將學習所有的部分 - 整體關係,例如牆和屋頂之間的角度,等等。
現在讓我們看看三角形的膠囊是什麼。
這一次,它更有趣了:給定三角形的旋轉角度,它預測房子的膠囊會檢測到一個倒置的房子,並且船膠囊會探測到一艘船旋轉16°。這些位置與三角形的旋轉角度是一致的。
現在我們有一堆預測輸出,也就是圖上的四個,我們下一步用它們做什麼呢?
正如你所看到的,矩形膠囊和三角膠囊在船膠囊的輸出方面有著強烈的一致性。
換言之,矩形膠囊和三角膠囊都同意船會以什麼樣的形式輸出來。
然而,矩形膠囊和三角膠囊他們倆完全不同意房子膠囊會產出什麼,從圖中可以看出房子的輸出方向是一上一下的。。
因此,可以很合理的假設矩形和三角形是船的一部分,而不是房子的一部分。
既然我們知道矩形和三角形是船的一部分,矩形膠囊和三角膠囊的輸出也就是真的只關注船膠囊,所以就沒有必要發送這些輸出到任何其他膠囊,這樣只會增加噪音。這叫做同意協議路由。它有幾個好處:
首先,由於一個膠囊的輸出僅路由到下一層的想對應的膠囊中,所以下一層的這些膠囊將得到更清晰的輸入信號,同時也更能準確地確定物體的姿態。
第二,通過查看激活的路徑,您可以輕鬆地查看部件的層次結構,並確切地知道哪個部分屬於哪個對象(如矩形屬於小船或者三角形屬於船等等)。
最後,按同意協議路由幫助解析那些有重疊對象的擁擠場景(我們將在幾個幻燈片中看到)。
但是首先,讓我們看看協議是如何在膠囊網絡中實現的。
在這裡,我把船的各種姿態都表示出來,正如低層次的膠囊可能會預測的那樣。
例如,這些圓圈中的一個可能代表矩形膠囊對船的最可能姿勢的看法,而另一個圓圈可能代表三角膠囊的想法,如果我們假設有許多其他低層的膠囊,然後我們可能就會有有大量用於船膠囊的預測向量。
在這個例子中,有兩個姿態參數:一個代表旋轉角度,另一個代表船的大小。正如我前面提到的,姿態參數可以捕獲許多不同類型的視覺特徵,如傾斜、厚度或精確定位。
所以我們做的第一件事,就是計算所有這些預測的平均值。然後我們就得到了一個平均向量。下一步是度量每個預測向量與平均向量之間的距離。我在這裡會用歐氏距離做演示,但膠囊網絡實際使用點積。
隨後我們要測量每個預測向量與平均預測向量的一致性程度。
利用這個計算出的一致性程度值,我們可以相應地更新每個預測向量的權重。
注意,遠離平均值的預測向量現在有一個非常小的重量,在圖中可以看到顏色比較淺。而最接近平均值的向量有更大的權重,我們用黑色來代表。
現在我們可以再一次計算均值(或者說,加權平均數),你會注意到跟上圖相比它稍微向聚類的中心移動。
接下來,我們可以再次更新權重,現在聚類中的大部分向量變黑了,
我們可以再次更新平均值。我們可以重複這個過程幾次,在實踐中,3到5次迭代通常是足夠的。我想這可能提醒你,如果你知道k-均值聚類算法的話,就很容易明白這是我們如何找到這個所有向量都任何的聚類的。現在讓我們看看整個算法在細節方面的工作原理。
首先,對於每個預測的輸出,我們首先設置原始路由權重b_i,j等於0。
接下來對於每個基本的膠囊,我們將為應用softmax函數對他們的初始權重進行歸一化。這樣就得出了了每個預測輸出的實際路由權重,在本例中是0.5。
接下來,我們計算下一層的每個膠囊的預測的加權和。
這可能會使向量長於1,所以通常會用到歸一化函數。
然後,我們現在有了房子膠囊和船艙的實際輸出。但這不是最終的輸出,這僅僅是第一輪的第一次迭代。
現在我們可以看到哪些預測是最準確的。例如,矩形膠囊對船艙的輸出做出了很好的預測。看上去它真的很接近。
這是通過計算預測輸出向量û_j |i和實際乘積向量v_j的點積來估計的。這個點積操作被簡單地添加到預測輸出的原始路由權重b_i,j中。所以這個特定的預測輸出的權重增加了。
當預測的結果是一個強烈的同意時,這個點積也會很大,所以好的預測將有更高的權重。
另一方面,長方形膠囊對房子膠囊的輸出作出了相當糟糕的預測,所以這種情況下的點積將相當小,這個預測向量的原始路由權重不會增長太多。
接下來,我們再次更新路由權值計算的原始權重的softmax函數。
正如你所看到的,矩形膠囊對船膠囊的預測矢量從初始的0.5更新到現在的0.8,而對房子膠囊的預測矢量下降到0.2。所以它的大部分輸出現在去了船膠囊,而不是房子膠囊。
我們重複以上的操作再次計算下一層膠囊預測的輸出向量的加權和,也就是對下一層是房子膠囊和船膠囊的預測。此時,房子膠囊得到很少的輸入,它的輸出是一個很小的向量。
另一方面船膠囊得到很多輸入,它的輸出向量遠遠長於1,所以我們又把它壓扁(歸一化)了。
至此第二輪就結束了,正如你所看到的,在幾次迭代中,我們已經可以排除房屋並且清楚地挑選出船。也許一兩個回合之後,我們可以停下來,繼續以同樣的方式進入下一個膠囊層。
正如我前面提到的,通過協議來處理擁擠重疊的場景是非常有用的,如圖中所示的場景。
該圖像的一種解釋是(可以看到圖像中有一點模糊),你可以在中間看到一個倒掛的房子 。
在這種情況下,就沒法解釋底部矩形或頂部三角形,也沒有辦法解釋它們到底屬於哪個位置。
解釋圖像的最好方法是,在頂部有一個房子,底部有一艘船。並通過協議的路由傾向於選擇這個解決方案,因為它使所有的膠囊都狀態最佳,每一個都對下一層的膠囊進行完美的預測。這樣就可以消除歧義了。
Okay,既然你知道膠囊網絡是如何工作的,那麼你可以用一個膠囊網絡做什麼?
首先,你可以創建一個好的圖像分類器。只需要在最頂層為每一個類分配一個膠囊,這幾乎就是這個網絡的全部內容了。
你只需要再添加一個用來計算頂層激活向量長度的層,這一層灰給出了每一類的估計概率。然後和常規的分類神經網絡一樣,你可以通過最小化交叉熵損失來訓練網絡,這樣你就可以完成了一個圖像分類器。
然而,在論文中,他們使用了一個邊緣(margin)損失,使得對圖像進行多分類成為可能。
因此,簡單來說,這個邊緣損失就是下面這樣的:如果圖像中存在出現了第k類的對象,那麼相應這個類的頂層膠囊應該輸出一個長度至少為0.9的向量。這樣才足夠長到確信是這一類。
相反,如果圖像中沒有第k類的對象,則該膠囊將輸出一個短向量,該向量的平方長度小於0.1。因此,總損失是所有類損失的總和。
在論文中,他們還在膠囊網絡頂端添加了一個解碼器網絡。它只有3個全連接層,並且在輸出層中有一個sigmoid激活函數。它通過最小化重建圖像和輸入圖像之間的平方差,來重構輸入圖像。
全部損失是我們先前討論的邊緣損失,加上重建損失(為確保邊緣損失佔主導地位,應大幅度減少重建損失)。應用這種重建損失的好處是,它迫使網絡保存重建圖像所需的所有信息,直至膠囊網絡的頂層及其輸出層。這種約束的行為有點像正則化:它減少了過度擬合的風險,有助於模型泛化到新的實例。
就這樣,你知道一個膠囊網絡是如何工作的,以及如何去訓練它。接下來,讓我們看看論文中展示的一些有趣的結果。
這是文中的圖1,展示了對於MNIST數據集的完全膠囊網絡。你可以看到前兩個正則卷積層,其輸出被重新構建和壓縮,以獲得主膠囊的激活向量。這些初級膠囊按照6 6的網格進行組織,在這個網格中每一個cell有32個初級膠囊,每個膠囊的主要輸出8維向量。
因此,第一層膠囊全連接成10個輸出膠囊,輸出16維向量。這些向量的長度用來計算邊緣損失。
這是論文中的圖2,展示了膠囊網絡頂層的解碼器。它是由兩個全連接的ReLU層加上一個全連接的sigmoid層組成,該解碼器輸出784個數字,對應重構圖像的像素個數(圖像是28x28=784像素)。
重建圖像與輸入圖像的平方差是重建損失。
這是論文中的圖4。膠囊網絡的一個優點是激活向量通常是可解釋的。例如,該圖展示了當逐漸修改頂層膠囊輸出的16個維度中的一個時,所得到的重建圖像。你可以看到第一個維度似乎代表尺度和厚度,第四個維度表示局部傾斜,第五個維度表示數字的寬度加上輕微的平移得到確切的位置。
因此,可以很清楚大部分參數分別是表示什麼的。
最後,讓我們總結一下膠囊網絡的利弊。膠囊網絡已經達到對MNIST數據集的最佳精度。在CIFAR10數據集上的表現還可以繼續提升,也是是很值得期待的。 膠囊網絡需要較少的訓練數據。它提供等變映射,這意味著位置和姿態信息得以保存。這在圖像分割和目標檢測領域是非常有前景的。
路由協議算法對於處理擁擠的場景具有很好的效果。路由樹還映射目標的部分的層次結構,因此每個部分都分配給一個整體。它對旋轉、平移和其他仿射變換有很強的健壯性。激活向可解釋性也比較好。最後,這是Hinton大神的idea,前瞻性是毋庸置疑的.
然而,該網絡有一些缺點:首先,如前面所提到在CIFAR10數據集上的準確性還不高。另外,現在還不清楚膠囊網絡是否可以建模規模較大的圖像,如ImageNet數據集,準確度是多少?膠囊網絡也很慢,在很大程度上是因為具有內部循環的路由協議算法。
最後,在給定的位置上只有一個給定類型的膠囊,因此如果一個膠囊網絡彼此之間太接近,就不可能檢測到同一類型的兩個對象。這被稱為膠囊擁擠,而且在人類的視覺中也能觀察到。
我強烈建議你看一看膠囊網絡實現代碼,如這裡列出的(連結將在下面的視頻中描述)。花點時間,你應該可以理解代碼的所有內容。
實施膠囊網絡的主要困難是,它包含了路由協議算法形成的內迴路。在Keras的代碼實現和tensorflow實現可以比PyTorch麻煩一點,不過也是可以做到的。如果你沒有特別的語言偏好,那麼pytorch代碼是最容易理解的。
NIPS 2017 Paper:
* Dynamic Routing Between Capsules,
* by Sara Sabour, Nicholas Frosst, Geoffrey E. Hinton
* https://arxiv.org/abs/1710.09829
The 2011 paper: * Transforming Autoencoders
* by Geoffrey E. Hinton, Alex Krizhevsky and Sida D.Wang
* https://goo.gl/ARSWM6
CapsNet implementations:
* Keras w/ TensorFlow backend: https://github.com/XifengGuo/CapsNet-keras.
* TensorFlow: https://github.com/naturomics/CapsNet-Tensorflow
* PyTorch: https://github.com/gram-ai/capsule-networks
這就是我本節課講的所有內容,希望你喜歡這個視頻。如果你喜歡,請關注、分享、評論、訂閱、blablabla。這是我的第一個真正的YouTube視頻,如果你發現它有用,我可能會做更多。
如果你想了解更多關於機器學習、深度學習和深入的學習,你可能想讀機器學習與我自己實現的scikit學習TensorFlow O'Reilly的書。它涵蓋了非常多的話題,有很多的實例代碼,你可以在我的GitHub帳戶中找到,在這裡留下視頻連結。今天就到這裡,下次再見!
▌論文信息
Dynamic Routing Between Capsules
論文地址:https://arxiv.org/pdf/1710.09829.pdf
摘要:Capsule 是一組神經元,其活動向量(activity vector)表示特定實體類型的實例化參數,如對象或對象部分。我們使用活動向量的長度表徵實體存在的概率,向量方向表示實例化參數。同一水平的活躍 capsule 通過變換矩陣對更高級別的 capsule 的實例化參數進行預測。當多個預測相同時,更高級別的 capsule 變得活躍。我們展示了判別式訓練的多層 capsule 系統在 MNIST 數據集上達到了最好的性能效果,比識別高度重疊數字的卷積網絡的性能優越很多。為了達到這些結果,我們使用迭代的路由協議機制:較低級別的 capsule 偏向於將輸出發送至高級別的 capsule,有了來自低級別 capsule 的預測,高級別 capsule 的活動向量具備較大的標量積。
以前專知也報導過膠囊網絡模型相關信息,具體如下:
特別提示-Capsule Networks 教程PPT下載:
請關注專知公眾號(掃一掃最下面專知二維碼,或者點擊上方藍色專知),
請登錄專知,獲取更多AI知識資料,PC登錄www.zhuanzhi.ai或者點擊閱讀原文,註冊登錄,頂端搜索主題,查看獲得對應主題知識等資料!如下圖所示~
請掃描專知小助手,加入專知主題群(請備註主題類型:AI、NLP、CV、 KG等,或者加小助手諮詢入群)交流~
專知薈萃知識資料全集獲取(關注本公眾號-專知,獲取下載連結),請查看:
【專知薈萃01】深度學習知識資料大全集(入門/進階/論文/代碼/數據/綜述/領域專家等)(附pdf下載)
【專知薈萃02】自然語言處理NLP知識資料大全集(入門/進階/論文/Toolkit/數據/綜述/專家等)(附pdf下載)
【專知薈萃03】知識圖譜KG知識資料全集(入門/進階/論文/代碼/數據/綜述/專家等)(附pdf下載)
【專知薈萃04】自動問答QA知識資料全集(入門/進階/論文/代碼/數據/綜述/專家等)(附pdf下載)
【專知薈萃05】聊天機器人Chatbot知識資料全集(入門/進階/論文/軟體/數據/專家等)(附pdf下載)
【專知薈萃06】計算機視覺CV知識資料大全集(入門/進階/論文/課程/會議/專家等)(附pdf下載)
更多請點擊查看:【專知薈萃集合】人工智慧領域主題知識資料全集[ 持續更新中](入門/進階/論文/綜述/視頻/專家等,附查看)