漫談Capsule Network基本原理
半個多月前,Hinton的讓人期待已久的Dynamic Routing Between Capsules終于在arixv上公開,第一作者是Sara Sabour,據Hinton本人介紹,Sabour是伊朗人,本來想去華盛頓大學讀計算機視覺,但是簽證被美國拒絕了,于是Google的多倫多人工智能實驗室挖到了她,跟隨Hinton一起做Capsule Network方面的研究。
Dynamic Routing Between CapsulesMatrix Capsules with EM Routing
首先我們談談Hinton為什么要提出Capsule Network,傳統的圖像識別是使用CNN來做的(如下圖所示),CNN通常由卷積層和池化層共同構成,卷積層從原始圖像中提取每個局部的特征,池化層則負責將局部特征進行概括,最終模型通過softmax分類器輸出每個類別的概率分布。
CNN應用到圖像識別上似乎非常合理,而且實際表現也非常好,但是Hinton則認為CNN中的池化操作是一個災難,原因就在于池化操作只能給出粗略的位置信息,允許模型對一些小的空間上的變化視而不見,并不能精準地學習到不同物體的位置關聯,比如一個區域內的實體的位置、大小、方向甚至是變形度和紋理。雖然CNN可以識別一張正常的人臉,但是如果把人臉照片中的一只眼睛與嘴巴的位置對調一下,CNN還是會將其識別成人臉,這是不對的。雖然池化的本意是為了保持實體的位置、方向的不變性,但是實際中的簡單粗暴的取最大或取平均的池化操作會使得池化的效果事與愿違。
人類識別圖片是基于平移和旋轉將看到的圖片與大腦中已有的模式進行匹配,例如,對于一個雕像,無論以什么角度取拍照,人們都可以輕松識別出它就是一個雕像,但是這個對于CNN來說是十分困難的,為了解決這個問題,即更好地表示實體的各種空間屬性信息,Hinton在這篇文章中介紹了Capsule Network的概念。
Capsule Network的每一層是由很多Capsule構成的,一個Capsule可以輸出一個活動向量,該向量就代表著一個實體的存在,向量的方向代表著實體的屬性信息,向量的長度代表實體存在的概率,所以,即使實體在圖片中的位置或者方向發生了改變,則僅僅導致該向量的方向發生變化,而向量的長度沒有發生改變,也就是實體存在的概率沒有變化。
與傳統的神經元模型不同的是,傳統的神經元是通過將每個標量進行加權求和作為輸入,然后通過一個非線性激活函數(如sigmoid,tanh等等)映射到另外一個標量,而Capsule Network則是每一層都是由一些Capsule構成,其具體的工作原理可以分為以下幾個階段:
(1) 較低層的Capsule產生的活動向量u_i與一個權重矩陣W_ij相乘,得到了預測向量u_ij_hat,這個向量的含義就是根據低維特征預測得到高維特征的位置,舉個例子,如果要識別一輛馬車,那么某一層低維的特征是馬和車,那么根據馬就可以判斷馬車的總體位置,同樣也可以根據車來判斷馬車的位置,如果這兩個低維特征的判斷的馬車的位置完全一致的話,就可以認為這就是一輛馬車了;
(2) 如果用u表示上一層的所有Capsule的輸出矩陣,用v表示下一層的所有Capsule的輸出矩陣,由(1)知道,上一層的每一個Capsule的輸出向量u_i經過權重算出了預測向量u_ij_hat,那么接下來它需要把這個預測向量傳遞給下一層的每個Capsule,但不是完全對等地發給下一層的每一個Capsule,而是先要乘以耦合系數c_ij,這個耦合系數可以認為是代表低維特征對高維特征的預測程度,至于這個耦合系數c是怎么確定的,后文會詳細介紹iterative dynamic routing過程;
(3) 將傳送到下一層的第j個Capsule的所有信號求和,即s_j=SUM(c_ij×u_ij_hat),這一點和神經元模型中的w*x類似,只不過一個是標量運算,另一個是向量運算;
(4) 類似于神經元模型中的激活函數sigmoid將輸入映射到0~1的區間,這里作者采用了非線性的squashing函數來將較短的向量映射成長度接近于0的向量,將較長的向量映射成長度接近于1的向量,而方向始終保持不變,這個過程相當于是對預測向量做了歸一化,最終得到的v_j就是下一層第j個Capsule的輸出向量。
以上就是相鄰層之間的Capsule的活動向量的計算流程,接下來我們來看一下相鄰層的Capsule之間的耦合向量c_ij是如何確定的。
首先我們需要明白,既然是權重,那么對于上一層的Capsule i,它的所有c_ij之和必定等于1,并且c_ij的個數是等于下一層中Capsule的個數。這個c_ij是經過iterative dynamic routing算法確定的,dynamic routing算法的核心就是要求較淺層的Capsule的活動向量與較高層的Capsule的活動向量保持極高的相似度。
如上圖算法圖所示,第二行中的b_ij是一個未經歸一化的臨時累積變量,初始值為0,它的個數是由上一層和下一層的Capsule的個數決定的;每次迭代中,先將b經過softmax歸一化得到總和為1均為正數的系數c_ij,第五行和第六行是進行前向計算并經過squashing函數進行歸一化得到下一層的Capsule的輸出v_j,第七行是更新c_ij(即更新b_ij)的核心,新的b_ij等于舊的b_ij加上上一層的Capsule與下一層的Capsule的“相似度”。從圖中可以看到,這個迭代過程似乎沒有收斂條件,關于迭代次數,文中并沒有給出詳細的說明,而是指出了迭代次數越多則發生過擬合的概率越大,在MNIST手寫字體識別實驗中,迭代次數設置為3得到的性能較好。
上面講了這么多,僅僅說明了c_ij的確定算法,似乎還有一個問題沒有解決,那就是確定其他參數的值?回到老方法,文中依然采用了后向傳播算法來更新參數值,這就涉及到目標函數的確定。以MNIST手寫數字識別為例,由于輸出的類別是10,那么可以在最后一層中設置Capsule的個數為10,對于每個Capsule的loss可以按照如下公式進行計算,總loss就是把10個Capsule的loss求和即可。
除了介紹Capsule Network模型之外,文中還設計了一個基于卷積神經網絡的Capsule Network用于MNIST手寫字識別,如下圖所示是一個簡單三層結構的Capsule Network,一幅圖片首先經過一層CNN(卷積核大小為9×9,包含256個feature map,stride設置為1,激活函數為ReLU)得到局部特征作為初級Capsule的輸入,初級Capsule是一個包含32個feature map的卷積層,卷積核大小為9×9,stride為2,卷積神經元個數為8,也就是說這一層中一共有32×6×6個Capsule,并且每個Capsule的活動向量的維度是8,每個Capsule都是處在6×6的網格之中,它們彼此共享著它們的權重,并且卷積中用的激活函數就是前文說的squashing函數。最后一層DigitCaps是由10個Capsule組成的,每個Capsule的活動向量維度是16,在PrimaryCapsules與DigitCaps之間需要執行iterative dynamic routing算法來確定耦合系數c_ij,整個過程使用的是Adam優化算法來對參數進行更新。
文中僅僅使用了較小的數據集MNIST作為模型性能的評估,期待Capsule Network應用到更大規模機器學習任務上的表現,接下來幾期將繼續關注Capsule Network的研究進展及其在語音識別中的TensorFlow實踐。
-
Network
+關注
關注
0文章
64瀏覽量
29639 -
cnn
+關注
關注
3文章
352瀏覽量
22238
原文標題:漫談Capsule Network基本原理
文章出處:【微信號:DeepLearningDigest,微信公眾號:深度學習每日摘要】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論