一起讀 Dynamic Routing Between Capsules

Paper 原文連結:
https://arxiv.org/abs/1710.09829

前言

在這篇 paper 中,作者做出了一項主要假設:「在針對影像中單一個位置進行解析時,我們獲得的資訊不會僅限於物體的種類辨識與物體具有的特性,這裡假設人類的多層級視覺系統可以建立類似 parsing tree 的結構。」

這個 parsing tree 較低階層節點的輸出可以支持較高階層的節點做出決策,當數個與較高階層的節點有路由 ( route ) 的低階層節點都支持某種發現、觀點時,才能讓較高階層的節點作出較強的決斷,並通過多層次的 parsing tree 做出最終預測。

而這些高低階層 capsule 之間的 route 則是在訓練過程中透過 agreement 產生,也就是論文中提到的「 Routing-by-agreement 」,在這個架構中, agreement 的計算方式是透過將前一層 capsule 的輸出向量與後一層 capsule 的輸出向量進行內積得到,代表他們所要偵測的目標有關聯性。

小編註: agreement 的概念有些抽象,小編個人理解為「關聯性」,跟 CNN 的「將較低階層的 feature 合成較高階層的 feature 」是相同的概念。

這篇 "Dynamic Routing Between Capsules" 就是專注於如何建立、訓練這樣的 parsing tree ,並與 CNN 做結合。

Capsules inside the parsing tree

這個 parsing tree 的每個節點都是由一個膠囊 ( capsule ) 組成,每個 capsule 目標是偵測目標物件 ( instantiation / entity ) 的特性,個別 capsule 的輸出為一個向量,我們希望這個向量的長度與方向能分別具備特殊意義:

  1. 長度:此 capsule 所偵測的物件存在的機率
  2. 方向:偵測的物件所具有的特性 (例如:位置、大小、材質 ... )

而這篇 paper 的另一個重點是提出了「 Routing-by-agreement」的機制,也就是在較低階層的 capsule 需要與較高階層的 capsule 有較高的內積值 ( i.e. 彼此輸出的向量在方向上相近 ) ,意即較低階層的 capsule 所偵測的目標能夠真正幫助較高階層的 capsule 做出決策時,才會在訓練過程中持續加強兩者之間的路由 ( route ) 。

小編註:為了方便理解,個人建議可以把個別 capsule 視為類似 fully-connected layer 的一個 node ,不同之處在於, fully-connected layer 的輸出是純量,但 capsule 的輸出是向量。

計算細節

小編註:如果只想快速了解 capsule 的特性與優勢的話,可以考慮先跳到「在 MNIST 上的實驗結果」段落 🙂

前面提到的是 "Dynamic Routing Between Capsules" 的基礎假設與目標,事實上為了達到這些目的,可以有很多種設計與實作方式,而這篇 paper 的目的並不是試著找出最好的實作方式,而是提出一種最簡單、直覺的實作方式,並證明「動態路由規劃」 ( dynamic routing ) 是有用的。

以下針對這個實作方式的所有 notation 進行拆解:

小編註:以下固定 capsule j 為較高階層的 capsule ,而 capsule i 為較 capsule j 低一階層的 capsule 。


輸出向量 Output vector (\text{v}_j)

也就是個別 capsule 的輸出,用來幫助較高階層的 capsule 進行決策。

為了讓個別 capsule 的輸出向量能表示機率,這邊採用一種非線性的「擠壓」 ( squashing ) ,將個別 capsule 的輸出 ( \text{v}_j ) 限縮在「接近 0 」與「略小於 1 」的區間中,如下式:

     \begin{align*} \text{v}_j = \frac{||\text{s}_j||^2}{1+||\text{s}_j||^2}\frac{\text{s}_j}{||\text{s}_j||} \end{align*}

其中 \text{v}_j 代表 capsule j 的輸出,而 \text{s}_j 代表 capsule j 所接受到「總輸入」。


總輸入 Total input (\text{s}_j)

總輸入 \text{s}_j 是透過將所有「有把輸入傳至 capsule j 的 capsule i 的預測向量 ( \hat{\text{u}}_{j|i} ) ( prediction vector ) 」進行 weighted sum 所得到的,目的是對所有較低階層的 capsules i 的預測進行結算,如下式:

     \begin{align*} \text{s}_j = \sum_i c_{ij} \; \hat{\text{u}}_{j|i} \end{align*}

{\hat{\text{u}}}_{j|i}{c}_{ij} 分別是將較下階層 capsule i 的輸出向量進行整合的參數,以下對個別進行說明。


預測向量 Prediction vector (\hat{\text{u}}_{j|i})

這與較低階層的 capsule i 輸出向量 (\text{u}_i) 並不一樣,是透過 capsule i 與 capsule j 之間路由所帶的一個 matrix \text{W}_{ij}\text{u}_i 相乘得到,如下式:

     \begin{align*} \hat{\text{u}}_{j|i} = \text{W}_{ij} \; \text{u}_i \end{align*}

要特別注意的是 "j|i" 的部分,這代表著對於不同的 capsule j ,看到同一個 capsule i 的 prediction 是不同的。

小編註: \text{u}_i\text{v}_j 的意義是一樣的,推測作者為了方便區分 capsule i 與 capsule j 的上下階層關係,而將 notation 分別寫作 \text{u}_i\text{v}_j )

小編註:\text{W}_{ij}的概念應與 fully-connected layer 類似。不同的是, fully-connected layer 的每個前一層 node 輸出是純量,所以每一個 connection 上帶的變數也都是純量。但這邊前一層 capsule 的輸出是向量,所以每一個 route 上面帶的變數是一個矩陣和一個純量權重。


耦合係數 Coupling coefficient (c_{ij})

c_{ij} 是耦合係數 ( coupling coefficient ) ,主要作用是在進行預測時,決定較低階層的 capsule i 的輸出對較高階層的 capsule j 的影響力。

在我們最一開始所做的假設與目標中,我們希望當 capsule i 與 capsule j 的 agreement 高時,這個係數可以有相對高的數值,意即讓 capsule i 的輸出能 route 到 capsule j ,並支持 capsule j 做出對應的預測。反之,若是 capsule i 與 j 之間完全沒有關聯性,我們預期對應的 c_{ij} 數值會非常低。

此係數在迭代訓練時透過 routing logits 求得,如下式:

     \begin{align*} c_{ij} = \frac{\text{exp}(b_{ij})}{\sum_k{\text{exp}(b_{ik})}} \end{align*}

小編註:上式其實就是 softmax


Routing logits (b_{ij})

這個數值初始值均為 0 ,意即所有 capsule j 的較下階級 capsules i 們具有相同的 c_{ij} ,也就是個別 capsule i 對 capsule j 的影響力相同。

在迭代訓練過程中會受到 agreement ( a_{ij} ) 影響,逐漸提升或降低,同時影響 c_{ij} 的數值,提升或降低個別 capsule i 對 capsule j 的影響力,也就是本篇論文標題的 dynamic routing 的精神。


一致性 Agreement (a_{ij})

回歸到我們最開頭所提到的,我們希望只有真的與 capsule j 有 agreement 、且此這個 agreement 藉由向量的內積大小來衡量,所以可以得到下式:

     \begin{align*} a_{ij} = \text{v}_j \cdot \hat{\text{u}}_{j|i} \end{align*}

這個 agreement a_{ij} 會被視為 log likelihood 使用,在迭代訓練時不斷加在 routing logits 上,並影響耦合係數 c_{ij} 的高低。


訓練

小編註:在訓練的過程中, network 內部的參數與 routing iteration 是分開來訓練的,在後面的實驗中,作者只有在整個訓練過程中進行 1 次或是 3 次的 routing iteration 。

以下為原論文 routing iteration 的 pseudo code:

也就是:

  • 收集前一層的 prediction vector \hat{\text{u}}_{j|i}
  • 將所有 routing logit b_{ij} 初始為 0
  • 在 r 個訓練迭代中:
    • 根據 routing logits \textbf{b}_i 計算 coupling coefficient \textbf{c}_{i}
      > 小編註:這邊的 \textbf{b}_i\textbf{c}_j 是向量,前面的 b_{ij}c_{ij} 則是純量
    • 對個別 capsule j ,用已知的 c_{ij}\hat{\text{u}}_{j|i} 計算 total input \text{s}_j
    • 對個別 capsule j ,用已知的 \text{s}_j 計算 output vector \text{v}_j
    • 用已知的 \text{v}_j\hat{\text{u}}_{j|i} 計算 agreement a_{ij} 並加至對應的 b_{ij}

Loss function

論文中在最終的輸出層使用 margin loss :

     \begin{align*} L_c = T_c \; \text{max}(0, m^+ - ||\text{v}_c||)^2 + \lambda (1 - T_c) \text{max}(0, ||\text{v}_c|| - m^- )^2 \end{align*}

當目前sample 的 label 為 class c 時, T_c = 1 , 反之,T_c = 0

paper 中使用 m^+=0.9m^-=0.1 ,並建議使用 \lambda = 0.5

簡而言之,當 label 為 class c 時,若 capsule c 輸出向量長度短於 0.9 , loss 就會大於 0 。反之,若 label 是非 c 的其他 class ,若是 capsule c 的長度長於 0.1 , loss 就會大於 0 。

CapsNet 架構

▲ 圖 1 : 本次實驗中的 CapsNet 架構

這邊主要實驗在 MNIST dataset 上,架構則先使用兩層 convolutional layer 對 image 內容進行特徵提取,接著送進 primary capsules , primary capsules 再 route 給後一層的 digit capsules ,至此,這些 digit capsules 的輸出已經可以由上面所述的 margin loss 進行訓練,並根據 capsule 輸出的向量長度進行預測了。

小編註:在這個架構中, routing 只在 primary capsules 與 digit capsules 之間發生,因為 con1 的輸出只是純量,並沒有方向性,所以也沒有 agreement 可以計算。

透過重建進行 regularization

▲ 圖 2 : Reconstruction regularizer 的架構

這是另一個因 capsule net 的特性而能做到的有趣事情,因為 digit capsules 的輸出是向量,所以可以帶有許多這個數字的特性 ( 例如方向、角度、位置 ),所以在訓練時我們可以新增一個 regularization 項,將當前 sample 的 label class c 對應的 capsule c 取出,並送進連續三層的 fully-connected layers 重建出原本的 image ,如上 圖 2

這邊產生的第二個 loss 是 fully-connected layer 輸出與原 image 的 L2 loss ,為了避免過度影響到 digit capsules 本身的 loss ,在論文中將這個 loss 乘上 0.0005 的係數。

在 MNIST 上的實驗結果

在訓練過程中,作者強調除了有做至多 2 pixel 的位移以外,沒有做任何其他的 data augmentation ,也沒有做 ensemble 。

Evaluation

▲ 表 1 : 實驗結果

小編註: Routing 是指前面訓練時的 iteration r 值。

這邊的 baseline 是 3 層的 CNN ,分別 255, 255, 128 個 channel ,與兩層 fully-connected layer ,分別 328, 192 個 node 。

作者在這邊的結論是:

  1. 這邊使用 CapsNet 得到了相當低的 test error ,而這在過往需要較深的 CNN model 才能達到。
  2. 這證明了 routing 與 reconstruction regularizer 的重要性。

Capsule representation 個別維度的意義

▲ 圖 3 : Reconstruction regularizer 視覺化 digit capsule 的輸出

我們可以使用前面提到的 reconstruction regularizer 針對每個 sample 在預測後進行重建,藉此視覺化輸出向量的意義,也可以藉此解釋輸出錯誤的原因。

圖 3 中的 (l, p, r) 分別代表 (labe, prediction, reconstruction) ,最右邊的兩個 sample 是預測錯誤的例子,透過視覺化,我們可以快速看出 CapsNet 看到了什麼、並且是因為什麼而造成預測錯誤。

因為我們在訓練 reconstruction 時只有使用 label 對應的 digit capsule 進行 reconstruction ,所以該 digit capsule 的輸出向量應該要學習到如何 span 整個 training data 中所有該 class 的變體 ( variation ) 。

這些變體包含例如「某些筆畫比較粗」、「歪斜」、「寬度」,對於不同的數字也可能具有不同的意義,例如數字 2 的尾巴長度。

此外,我們也可以把 digit capsule 的輸出向量進行一些修改,接著再進行 reconstruction ,藉此觀察該 capsule 的表現,實驗如下 圖 4

▲ 圖 4 : Reconstruction regularizer 視覺化 digit capsule 的輸出

實驗中發現幾乎所有 digit capsule 都具有一個維度用於表現數字的寬度,但也有有些維度表現出數個特徵的組合 (例如寬度 + 位移) ,此外,也有些維度只表現區域性的特徵而非整個數字的特徵 (例如數字 6 的開頭、圓圈的大小)。

強韌的仿射轉換

小編註:仿射 ( affine ) 與線性轉換只差在仿射多了一個位移項。
e.g.
linear: y = Ax
affine: y = Ax + B

在上 圖 4 的實驗中,可以體現出 CapsNet 所學到的特徵比 CNN 更加強韌,對於微小的位移、旋轉的反應都非常穩定。

為了證明 CapsNet 的強韌型, paper 使用了另一個 dataset affNIST , affNIST 對 MNIST 的數字做了隨機的仿射轉換。

雖然 CapsNet 在訓練過程中並沒有接觸過除了「位移」以外的轉換,但仍可以在 affNIST 上得到 79% 的 accuracy ,而傳統 CNN 在同樣的 MNIST test accuracy 時,在 affNIST 上只能得到 66% accuracy 。

嚴重重疊的數字

動態路由 ( dynamic routing ) 其實可以視為一種 attention 機制,上層的 capsule 只會接受有相關性的下層 capsule 輸入,這可以幫助 CapsNet 處理嚴重重疊的數字。

在這項實驗中,作者建立了 MultiMNIST dataset ( 圖 3 的實驗結果中有出現過 ) ,將 MNIST 的圖像進行疊合,兩張重疊的圖像在疊合時會做些微 ( 小於 4 pixel ) 的位移。

視覺化結果如下 圖 5

▲ 圖 5 : MultiMNIST 的 input (白) 與 CapsNet 的重建結果 (紅+綠)

( L 為 label , R 為 reconstruction class )

CapsNet 在預測時會固定取長度最常 (i.e. 機率最高) 的兩個 digit capsules ,並使用其輸出向量進行重建。

圖 5 的實驗中,我們可以看出 CapsNet 是真的可以從嚴重重疊的數字中切分、重建出個別的數字。其中,有 "*" 標示的 sample 表示重建時不是使用 label 或是 prediction 的 digit capsule ,而是使用隨機的其他 capsule 來進行重建,這能證明 CapsNet 會對每個 class 都尋找在圖片中的最可能位置。

其他 datasets

CIFAR10

論文中將 7 個分別進行 3 次 routing iteration 的 CapsNet 做 ensemble ,得到 10.6% 的錯誤率,與 CNN 首次在 CIFAR10 上得到的錯誤率相近。

作者在這個實驗中得到了以下結論:

  1. 可以在 routing softmax 時額外新增一個「不屬於任何一種」類別,因為我們並不希望最後一層的 capsule 試圖解釋整張圖像內的所有物件。
  2. 在這邊發現了使用 reconstruction regularizer 重建圖像的一個缺點是, CapsNet 會傾向於考慮整張圖片中的所有東西,而 CIFAR10 的影像背景太過多樣化,造成效能較差。
smallNORB

在這個 dataset 上, CapsNet 能夠達到 state-of-art test error rate 2.7% 。

SVHN

這是一個相對小的 dataset ,僅含有 73257 張圖像,而 CapsNet 達到了 4.3% 的 test error rate 。

小編的總結

綜合而言,雖然在 accuracy / error rate 上, CapsNet 並沒有太大的進展,但他的輸出向量卻擁有很好的可解釋性、亦能攜帶比純量更多的資訊,並透過 reconstruction regularizer 可以簡單視覺化預測時的錯誤原因,此外, Routing-by-agreement 本身等於自帶 attention 的特性也是一大亮點。

但可惜的是在 CIFAR10 的實驗中揭示了目前架構上的瓶頸,如何克服 reconstruction regularizer 造成傾向考慮整張圖像的問題也許會是下一個研究重點。

Share the joy
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

近期文章

近期迴響

彙整

分類

其它

HubertLin Written by:

Be First to Comment

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *