膠囊網絡——Capsule Network

膠囊網絡——Capsule Network

做者:林澤龍html

1. 背景介紹

CNN 在處理圖像分類問題上表現很是出色,已經完成了不少難以想象的任務,而且在一些項目上超過了人類,對整個機器學習的領域產生了重大的影響。而 CNN 的本質由大量的向量和矩陣的相乘或者相加,所以神經網絡的計算消耗很是大,因此將一張圖片上所有像素信息傳遞到下一層運算是十分困難的,因此出現了「卷積」和「池化」這種方法,可以在不損失數據本質的狀況下幫咱們簡化神經網絡的計算。
誠然, CNN 在分類和數據集很是接近的圖像時,實驗的效果很是好,但若是圖像存在翻轉、傾斜或任何其它方向性問題時,卷積神經網絡的表現就比較糟糕了。經過在訓練期間爲同一圖像翻轉和平移能夠解決這個問題(數據加強)。而問題的本質是網絡中的濾波器以比較精細的級別上理解圖像。舉一個簡單的例子,對於一張人臉而言,它的組成部分包括面部輪廓,兩個眼睛,一個鼻子和一張嘴巴。對於CNN而言,這些部分就足以識別一張人臉。然而,這些組成部分的相對位置以及朝向就沒有那麼重要。
這些主要的緣由是人類在識別圖像的時候,是遵守樹形的方式,由上而下展開式的,而CNN則是經過一層層的過濾,將信息一步步由下而上的進行抽象。這是膠囊網絡做者認爲的人與CNN神經網絡的最大區別。
本文基於一篇在2017年由 Hinton 等人發表的一篇文章Dynamic Routing Between Capsules,該文章介紹了一種神經網絡能夠彌補 CNN 沒法處理圖片位置方向等缺點。相比於 CNN 該網絡更接近於人類的圖像識別原理。

圖 1:人類識別圖像與 CNN 的區別前端

2. 膠囊網絡是如何工做的

膠囊網絡和傳統的人工神經網絡最根本的區別在於網絡的單元結構。對於傳統神經網絡而言,神經元的計算可分爲如下三個步驟:git

  1. 對輸入進行標量加權計算。
  2. 對加權後的輸入標量進行求和。
  3. 標量到標量的非線性化。

而對於膠囊而言,它的計算分如下四個步驟:github

  1. 對輸入向量作乘法,其中 $v_1$ 和 $v_2$ 分別來自與前面的 capsule 的輸出,在單個 capsule 內部,對 $v_1$ 和 $v_2$ 分別乘上 $w_1$ 和 $w_2$ 獲得了 新的 $u_1$ 和 $u_2$ 。
  2. 對輸入向量進行標量加權,令$u_1$與$c_1$相乘,$u_2$與$c_2$相乘,其中$c_1$和$c_2$均爲標量,且$c_1 + C_2 = 1$。
  3. 對獲得向量求和,獲得$s=c_1 u_1 +c_2u_2$。
  4. 向量到向量的非線性化,將獲得的結果向量 $s$ 進行轉換,即經過函數 $Squash(s)= \cfrac{||s||^2}{1+||s||^2} \cfrac{s}{||s||}$獲得結果 $s$,做爲這個capsule 的輸出,且這個結果 $v$ 能夠做爲下一個 capsule 的輸入。

圖 2:單個膠囊的運算方式算法

3. 膠囊網絡的細節

3.1 膠囊網絡的動態尋路算法

上一章咱們瞭解膠囊網絡工做的整體方式,這一章咱們來關注膠囊內部的參數是如何進行更新的,首先咱們來看論文裏關於此算法的僞代碼介紹:
圖 3:單個膠囊內的參數更新網絡

第一行代碼:全部L層的膠囊和輸入 $u_i$ ,還有迭代次數 $r$ 其中 $u_i$ 爲輸入向量 $u_i$ 與權重 $w_i$ 相乘獲得的結果。第二行代碼:開闢了新的一組臨時變量 $b_{ij}$ ,每個標量 $b_{ij}$ 初始值爲0,且與 $c_{ij}$ 一一對應,在迭代結束後,這個變量將被存儲在 $c_{ij}$ 中。第三行代碼:咱們要設定一個 iterations 即內部的迭代次數(超參數),而後開始迭代。第四行代碼:首先令全部的 $c=softmax(b)$ ,所以確保了全部的 $ci$ 和爲1且爲非負值,第一次全部的 $c$ 值相同。第五行代碼:令 $s_i=u_ic_i$,這一步只是簡單的運算。第六行代碼:咱們將上一步的結果傳入 Squash 函數(第二章中已介紹)作非線性化,從而確保向量的方向是保持不變的,並把全部輸入向量都集合到一塊兒,且將向量的數值量級保持與以前膠囊一致。第七行代碼:咱們將更新向量 $b_{ij}$ 。這是動態尋路算法的最關鍵一步。它將高層膠囊的輸出和低層膠囊的輸出作點積,從而擴大那些和高層膠囊輸出方向一致的向量。架構

下圖爲 iterations = 3 時的算法圖解:

圖 4:迭代次數等於三時動態尋路算法app

如上圖所示 $b_0^1$ 和 $b_0^2 $ 爲0,所以 $c_1^1$ 和 $c_1^2$ 的值爲1/2,$s^1=u_1c_1^1+u_2c_2^2$ ,$a^1 = squash(s^1)$,而後新一輪的 $b_i^r=b_i^{r-1}+a^ru^i$ 結果做爲下一輪 $c_j^i$的值,迭代次數過完後將結果 $a^3$ 做爲輸出 $v$ 。機器學習

3.2 動態尋路算法直觀上的理解

其中兩個高層膠囊的輸出用紫色向量 $v_1 v_2$ 表示,橙色向量表示接受自某個低層膠囊的輸入,其餘黑色向量表示接受其餘低層膠囊的輸入。左邊的紫色輸出 $v_1$ 和橙色輸入 $u_1$ 指向相反的方向,因此它們並不類似,這意味着它們點積是負數,更新路由係數的時候將會減小$c_1^1$。右邊的紫色輸出 $v_2$ 和橙色輸入 $u_2$ 指向相同方向,它們是類似的,所以更新參數的時候路由係數 $c_1^2$ 會增長。在全部高層膠囊及其全部輸入上重複應用該過程,獲得一個路由參數集合,達到來自低層膠囊的輸出和高層膠囊輸出的最佳匹配。函數


圖 5:尋路算法直觀上的理解

4. 論文中的網絡結構

4. 1 訓練的網絡結構

論文用 minst 的數據集上的 CapsNet 架構以下圖所示。架構能夠簡單的表示爲僅有兩個卷積層和一個全鏈接層組成。Conv1有256個9×9個卷積核,步長爲1和ReLU激活。該層將像素的強度轉換爲以後會用於做爲基本膠囊輸入的局部特徵探測器的激活。

圖 6:訓練的網絡結構

第一層爲卷積層:輸入:28×28圖像(單色),輸出:20×20×256張量,卷積核:256個步長爲1的9×9×1的核,激活函數:ReLU。
第二層爲 primarycaps 層:輸入:20×20×256張量,輸出:6×6×8×32張量(共有32個膠囊),卷積核:8個步長爲2的9×9×256的核/膠囊。
第三層爲 DigitCaps 層:輸入:6×6×8×32張量(每一個膠囊輸出的是8維的向量),輸出:16×10 矩陣(10個膠囊)。

4. 2 重構的網絡結構

重構器從正確的 DigitCap 中選擇一個16維向量,並學習將其編碼爲數字圖像(注意,訓練時候只採用正確的 DigitCap 向量,而忽略不正確的 DigitCap )。它接受正確的DigitCap的輸出做爲輸入,重建一張28×28像素的圖像,損失函數爲重建圖像和輸入圖像之間的歐式距離。解碼器強制膠囊學習對重建原始圖像有用的特徵,重建圖像越接近輸入圖像越好,下面展現重構的網絡結構(最終的輸出28*28)和重建圖像的例子(l,p,r對應了標籤,預測,重構目標)。
圖 7:重構的網絡結構圖 8:初始圖像和重構圖像

5. 小結

膠囊網絡在現在卷積網絡難以提高的階段能夠算是一種革命性的網絡架構,神經元的輸出從一個標量變成了一組向量,這如同讓網絡流動起來了。每個識別子結構的膠囊,使原始圖形中的細節高度的保真,而這個保真,又是從複雜結構裏直接進化獲得的。經過重構原圖,模型作到了在視角變換後,經過網絡結構的改變,給出相同的結果。另外須要指出的是,CNN和膠囊神經網絡並非互斥的,網絡的底層也能夠是卷積式的,畢竟膠囊網絡善於的是在已抽象信息中用更少的比特作到高保真的重述。

膠囊網絡 demo 地址:https://momodel.cn/workspace/5da92fb8ce9f60807bbe6d33/app

6. 參考資料

論文地址:Dynamic Routing Between Capsules
博客園:CapsNet膠囊網絡(理解)
github:A Keras implementation of CapsNet
github:CapsNet-Tensorflow

關於咱們

Mo(網址:momodel.cn)是一個支持 Python 的人工智能在線建模平臺,能幫助你快速開發、訓練並部署模型。


Mo 人工智能俱樂部 是由網站的研發與產品設計團隊發起、致力於下降人工智能開發與使用門檻的俱樂部。團隊具有大數據處理分析、可視化與數據建模經驗,已承擔多領域智能項目,具有從底層到前端的全線設計開發能力。主要研究方向爲大數據管理分析與人工智能技術,並以此來促進數據驅動的科學研究。

目前俱樂部每週六在杭州舉辦以機器學習爲主題的線下技術沙龍活動,不按期進行論文分享與學術交流。但願能匯聚來自各行各業對人工智能感興趣的朋友,不斷交流共同成長,推進人工智能民主化、應用普及化。
image.png

相關文章
相關標籤/搜索