CapsNet入門系列番外:基於TensorFlow實現膠囊網路
作者:Debarko De
編譯:weakish
編者按:全棧開發者Debarko De簡明扼要地介紹了膠囊網路的概念,同時給出了基於numpy和TensorFlow的膠囊網路實現。
什麼是膠囊網路?什麼是膠囊?膠囊網路比卷積神經網路(CNN)更好嗎?本文將討論這些關於Hinton提出的CapsNet(膠囊網路)的話題。
注意,本文討論的不是製藥學中的膠囊,而是神經網路和機器學習中的膠囊。
閱讀本文前,你需要對CNN有基本的了解,否則建議你先看下我之前寫的Deep Learning for Noobs。下面我將稍稍溫習下與本文相關的CNN的知識,這樣你能更容易理解下文CNN與CapsNet的對比。閑話就不多說了,讓我們開始吧。
基本上,CNN是堆疊一大堆神經元構成的系統。CNN很擅長處理圖像分類問題。讓神經網路映射一張圖像的所有像素,從算力上來講,太昂貴了。而卷積在保留數據本質的前提下大大簡化了計算。基本上,卷積是一大堆矩陣乘法,再將乘積相加。
圖像傳入網路後,一組核或過濾器掃描圖像並進行卷積操作,從而創建特徵映射。這些特徵接著傳給之後的激活層和池化層。取決於網路的層數,這一組合可能反覆堆疊。激活網路給網路帶來了一些非線性(比如ReLU)。池化(比如最大池化)有助於減少訓練時間。池化的想法是為每個子區域創建「概要」。同時池化也提供了一些目標檢測的位置和平移不變性。網路的最後是一個分類器,比如softmax分類器,分類器返回類別。訓練基於對應標註數據的錯誤進行反向傳播。在這一步驟中,非線性有助於解決梯度衰減問題。
CNN有什麼問題?
在分類非常接近數據集的圖像時,CNN表現極為出色。但CNN在顛倒、傾斜或其他朝向不同的圖像上表現很差。訓練時添加同一圖像的不同變體可以解決這一問題。在CNN中,每層對圖像的理解粒度更粗。舉個例子,假設你試圖分類船和馬。最內層(第一層)理解細小的曲線和邊緣。第二層可能理解直線或小形狀,例如船的桅杆和整個尾巴的曲線。更高層開始理解更複雜的形狀,例如整條尾巴或船體。最後層嘗試總覽全圖(例如整條船或整匹馬)。我們在每層之後使用池化,以便在合理的時間內完成計算,但本質上池化同時丟失了位置信息。
畸形變換
池化有助於建立位置不變性。否則CNN將只能擬合非常接近訓練集的圖像或數據。這樣的不變性同時導致具備船的部件但順序錯誤的圖像被誤認為船。所以系統會把上圖右側的圖像誤認為船,而人類則能很清楚地觀察到兩者的區別。另外,池化也有助於建立比例不變性。
比例不變性
池化本來是用來引入位置、朝向、比例不變性的,然而這一方法非常粗糙。事實上池化加入了各種位置不變性,以致將部件順序錯誤的圖像也誤認為船了。我們需要的不是不變性,而是等價性。不變性使CNN可以容忍視角中的小變動,而等價性使CNN理解朝向和比例變動,並相應地適應圖像,從而不損失圖像的空間位置信息。CNN會減少自身尺寸以檢測較小的船。這導向了最近發展出的膠囊網路。
什麼是膠囊網路?
Sara Sabour、Nicholas Frost、Geoffrey Hinton在2017年10月發表了論文Dynamic Routing Between Capsules。當深度學習的祖父之一Geoffrey Hinton發表了一篇論文,這論文註定會是一項重大突破。整個深度學習社區都為此瘋狂。這篇論文討論了膠囊、膠囊網路以及在MNIST上的試驗。MNIST是已標註的手寫數字圖像數據集。相比當前最先進的CNN,膠囊網路在重疊數字上的表現明顯提升。論文的作者提出人腦有一個稱為「膠囊」的模塊,這些膠囊特別擅長處理不同的視覺刺激,以及編碼位姿(位置、尺寸、朝向)、變形、速度、反射率、色調、紋理等信息。大腦肯定具備「路由」低層視覺信息至最擅長處理該信息的卷囊的機制。
膠囊網路架構
膠囊是一組嵌套的神經網路層。在通常的神經網路中,你不斷添加更多層。在膠囊網路中,你會在單個網路層中加入更多的層。換句話說,在一個神經網路層中嵌套另一個。膠囊中的神經元的狀態刻畫了圖像中的一個實體的上述屬性。膠囊輸出一個表示實體存在性的向量。向量的朝向表示實體的屬性。向量發送至神經網路中所有可能的親本膠囊。膠囊可以為每個可能的親本計算出一個預測向量,預測向量是通過將自身權重乘以權重矩陣得出的。預測向量乘積標量最大的親本膠囊的聯繫將增強,而剩下的親本膠囊聯繫將減弱。這一基於合意的路由方法比諸如最大池化之類的現有機制更優越。最大池化路由基於低層網路檢測出的最強烈的特徵。動態路由之外,膠囊網路給膠囊加上了squash函數。squash屬於非線性函數。與CNN給每個網路層添加squash函數不同,膠囊網路給每組嵌套的網路層添加squash函數,從而將squash函數應用到每個膠囊的輸出向量。
論文引入了一個全新的squash函數(見上圖)。ReLU及類似的非線性函數在單個神經元上表現良好,不過論文發現在膠囊上squash函數表現最好。squash函數壓縮膠囊的輸出向量的長度:當向量較小時,結果為0;當向量較大時,結果為1。動態路由增加了一些額外的運算開銷,但毫無疑問帶來了優勢。
當然我們也要注意,這篇論文剛發不久,膠囊的概念還沒有經過全面的測試。它在MNIST數據集上表現良好,但在其他更多種類、更大的數據集上的表現還有待證明。在論文發布的幾天之內,就有人提出一些意見。
當前的膠囊網路實現還有改進的空間。不過別忘了Hinton的論文一開始就提到了:
這篇論文的目標不是探索整個空間,而是簡單地展示一個相當直接的實現表現良好,同時動態路由有所裨益。
好了,我們已經談了夠多理論了。讓我們找點樂子,構建一個膠囊網路。我將引領你閱讀一些為MNIST數據配置一個膠囊網路的代碼。我會在代碼里加上注釋,這樣你可以逐行理解這些代碼是如何工作的。本文將包括兩個重要的代碼片段。其餘代碼見GitHub倉庫:
上面是一整個膠囊層。堆疊膠囊層以構成膠囊網路。
完整代碼(含訓練和驗證模型)見此(https://github.com/debarko/CapsNet-Tensorflow)。代碼以Apache 2.0許可發布。我參考了naturomics的代碼(https://github.com/naturomics)。
總結
我們介紹了膠囊網路的概念以及如何實現膠囊網路。我們嘗試理解膠囊是高層的嵌套神經網路層。我們也查看了膠囊網路是如何交付朝向和其他不變性的——對圖像中的每個實體而言,保持空間配置的等價性。我確信存在一些本文沒有回答的問題,其中最主要的大概是膠囊及其最佳實現。不過本文是解釋這一主題的初步嘗試。如果你有任何疑問,請評論。我會盡我所能回答。
原文地址:https://hackernoon.com/what-is-a-capsnet-or-capsule-network-2bfbe48769cc
TAG:全球大搜羅 |