1. 程式人生 > >關於膠囊之間的動態路由的理解(基於Hinton的膠囊網路)

關於膠囊之間的動態路由的理解(基於Hinton的膠囊網路)

本文介紹了由Sara Sabour,Nicholas Frosst和Geoffrey Hinton所著的論文“膠囊之間的動態路由”。在這篇文章中,我們將描述膠囊的基本概念,並應用膠囊網路(capsnet)檢測MNIST資料集中的數字。在本文最後的第三部分中,我們對其做一個具體的實現。程式碼實現來源於xifengguo,基於Tensorflow的Keras。

CNN所面臨的挑戰

在深度學習中,一個神經元的啟用水平通常被解釋為檢測到特定特徵的可能性。



如果我們將畢加索的肖像畫“Portrait of woman in d`hermine pass”輸入到一個CNN分類器,那麼此分類器有多大機率將其識別 為一個真正的人臉?



CNN擅長檢測特徵,但對於特徵(透視、大小、方向)之間的空間關係檢測效果較差。例如,下面的圖片可能會欺騙一個簡單的 CNN模型,使其認為這是一個很好的素描的人的臉。



一個簡單的CNN模型可以正確地提取鼻子、眼睛和嘴巴的特徵,但在進行面部檢測時會錯誤地啟用神經元。由於沒有實現空間方向和大小的匹配,人臉檢測的啟用值會變得過高。



現在,我們假設每個神經元包含特徵的可能性和屬性。例如,它輸出一個包含(可能性,方向,大小)的向量。利用這種空間資訊,我們可以檢測出鼻子、眼睛和耳朵等特徵在方向和大小上的一致性,從而輸出一個低得多的面部檢測啟用值。




論文中並沒有使用術語Neurons,而是使用了Capsules來表明膠囊輸出一個向量,而不是一個單一的標量值。

同變性

從概念上講,CNN模型使用多個神經元和層來捕獲不同的特徵變數:



一個膠囊網路共享相同的膠囊來檢測一個簡單網路中的多個變體。



同變性是可以相互變換的物件的檢測。直觀地說,一個膠囊檢測到臉右旋轉20°(或左旋轉20°),並不是通過匹配一個右旋轉20°的變體來識別到臉部。通過迫使模型在膠囊中學習特徵變數,我們可以用較少的訓練資料更有效地推斷可能的變體。

MNIST資料集包含55000個訓練資料,即每位數5500個樣本。然而,小孩子們不太可能閱讀大量的樣本來學習數字識別。我們現有的深度學習模型包括CNN在利用資料時顯得效率低下。

With feature property as part of the information extracted by capsules, we may generalize the model better without an over extensive amount of labeled data.

膠囊(Capsule)

A capsule is a group of neurons that not only capture the likelihood but also the parameters of the specific feature.

例如,下面的第一行表示由神經元檢測到數字“7”的概率。一個二維膠囊由2個神經元組成。這個膠囊輸出一個二維向量來檢測數字“7”。對於第一張影象的第二排,它輸出向量v=(0,0.9)。向量的大小||v||=02+0.92=0.9對應檢測到“7”的概率。每一行的第二個影象看起來更像是“1”而不是“7”。因此,其相應的可能性為“7”的概率更小(更小的標量值或向量大小但方向相同)。



在第三行中,我們將影象旋轉20°。該膠囊將產生相同大小但不同方向的向量。這裡,向量的角度代表“7”的旋轉角度。我們可以想象,完全可以在一個膠囊中再增加2個神經元來捕捉大小和寬度。



We call the output vector of a capsule as the activity vector with magnitude represents the probability of detecting a feature and its orientation represents its parameters (properties).

動態路由

動態路由將膠囊分組形成父膠囊,並計算膠囊的輸出。

直覺

我們收集了3個不同大小和方向的相似草圖,並以畫素為單位測量了嘴巴和眼睛的水平寬度。其中s(1)=(100,66),s(2)=(200,131),s(3)=(50,33).




假設Wm=2,We=3,對於s(1)我們得到一個來自嘴巴和眼睛的投票:
這裡寫圖片描述
我們看到vm(1)ve(1)非常相似。當我們用其他的草圖重複此操作時,得到了同樣的發現。因此,嘴巴膠囊和眼睛膠囊可能與父膠囊緊密相關,寬度約為200畫素。從經驗來看,人臉是嘴巴的2倍寬(Wm=2),一隻眼睛的3倍寬(We=3)。所以我們檢測到的父膠囊是一個人臉膠囊。當然,我們可以通過新增更多的屬性,如高度或顏色,使其更準確。在動態路由中,我們用一個變換矩陣W去轉換輸入膠囊的向量,構成一個投票,並用相似的投票分組。這些選票最終成為父膠囊的輸出向量。那麼我們怎麼得到W呢?只需在深度學習方法中進行:通過成本函式反向傳播。

計算膠囊輸出

對於一個膠囊來說,輸入ui和輸出vj都是向量。



我們將變換矩陣Wij與前一層膠囊的輸出ui相乘。例如,對於一個p×k矩陣,將ui 轉換為u^j|i,維度從k變為p,((p×k)×(k×1)p×1)。然後根據權重cij計算加權和sj
這裡寫圖片描述
cij為耦合係數,通過迭代的動態路由(將在下面討論)過程計算得到,並且規定jcij和為1,從概念上講,cij 衡量膠囊i有多大可能啟用膠囊j

對於sj的啟用函式,我們採用squashing而不是ReLU,所以膠囊的最終輸出向量vj的長度在0到1之間。該函式將小向量壓縮為零,大向量壓縮為單位向量。
這裡寫圖片描述

迭代的動態路由

在膠囊中,我們通過迭代的動態路由計算中間值