當前位置:
首頁 > 新聞 > Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

【新智元導讀】萬眾期待中,Hinton膠囊網路論文《Dynamic Routing between Capsules》的代碼正式公布,僅僅5天,Github上fork數量就超過了1.4萬。Capsule真能取代CNN嗎?接下來是你動手的時間了。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Hinton膠囊網路論文《Dynamic Routing between Capsules》的一作Sara Sabour日前在GitHub公布了代碼,使用TensorFlow和NumPy實現,只有一台GPU也行,僅僅5天,fork的數量就超過了1.4萬。

實際上,在官方代碼公布前,已經有很多其他版本和實現。新智元也對膠囊網路的概念做過詳細介紹:

[1]【大神Hinton】深度學習要另起爐灶,徹底拋棄反向傳播

[2]【重磅】Hinton 大神 Capsule 論文首次公布,深度學習基石 CNN 或被取代

[3] Reddit 討論:Hinton 的 Capsule 網路真的比 CNN 效果更好嗎?

[4]【Hinton 碰撞 LeCun】CNN 有兩大缺陷,要用 capsule 做下一代 CNN

[5]【一文讀懂 Hinton 最新 Capsules 論文】CNN 未來向何處去

[6]【一文讀懂 Hinton 最新論文】膠囊網路 9 大優勢 4 大缺陷(視頻 + PPT)

不過,在看代碼前,還是有必要再次回顧這篇Hinton革新CNN的論文,Jonathan Hui在他的博客上對這篇論文做過拆解,從基本概念開始,讀來非常友好。

用「Capsule」作為下一代CNN的理由

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

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

但是,CNN善於檢測特徵,卻在探索特徵(視角,大小,方位)之間的空間關係方面效果較差。例如,下面這張圖片可能會騙過一個簡單的CNN模型,讓CNN模型相信這是一張真實的人臉。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

一個簡單的CNN模型可以正確提取鼻子、眼睛和嘴巴的特徵,但會錯誤地激活神經元進行人臉檢測。如果不了解空間方向,大小不匹配,那麼對於人臉檢測的激活將會太高,比如下圖95%。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

現在,假設每個神經元都包含特徵的可能性和屬性。例如,神經元輸出的是一個包含 [可能性,方向,大小] 的向量。利用這種空間信息,就可以檢測鼻子、眼睛和耳朵特徵之間的方向和大小的一致性,因此對於人臉檢測的激活輸出就會低很多。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

在Hinton的膠囊網路的論文中,就使用「膠囊」(capsule)來指代這樣的神經元。

從概念上講,我們可以將CNN看成是訓練神經元來處理不同方向的視角,並在最頂層有一層人臉檢測神經元。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

如上所述,為了CNN能夠處理不同的視角或變體,我們添加了更多的卷積圖層和特徵圖。儘管如此,這種方法傾向於記憶數據集,而不是得出一個比較通用的解決方案,它需要大量的訓練數據來覆蓋不同的變體,並避免過擬合。MNIST數據集包含55,000個訓練數據,也即每個數字都有5,500個樣本。但是,兒童看過幾次就能記住數字。現有的包括CNN在內的深度學習模式在利用數據方面效率十分低下。引用Geoffrey Hinton的一句話:


It (convolutional network) works depressingly well.

膠囊網路不是訓練來捕捉特定變體的特徵,而是捕捉特徵及其變體的可能性。所以膠囊的目的不僅在於檢測特徵,還在於訓練模型來學習變體。

這樣,相同的膠囊就可以檢測不同方向的同一個物體類別(例如,順時針旋轉):

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

其中,Invariance對應特徵檢測,特徵是不變的。例如,檢測鼻子的神經元不管什麼方向,都檢測鼻子。但是,神經元空間定向的損失最終會損害這種invariance模型的有效性。

Equivariance對應變體檢測,也即可以相互轉換的對象(例如檢測不同方向的人臉)。直觀地說,膠囊網路檢測到臉部旋轉了20°,而不是實現與旋轉了20°的變體相匹配的臉。通過強制模型學習膠囊中的特徵變體,我們可以用較少的訓練數據,更有效地推斷可能的變體。此外,也可以更有效地防止對抗攻擊。

計算一個Capsule網路的輸出:不同維度的參數

膠囊是一組神經元,不僅捕捉特徵的可能性,還捕捉具體特徵的參數。

例如,下面的第一行表示神經元檢測到數字「7」的概率。2-D膠囊是組合了2個神經元的網路。這個膠囊在檢測數字「7」時輸出2-D矢量。對於第二行中的第一個圖像,它輸出一個向量 v=(0,0.9)v=(0,0.9)。矢量的大小0.9 對應於檢測「7」的概率。每行的第二個圖像看起來更像是「1」而不是「7」。 因此,其相應的可能性為「7」較小。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

在第三行,旋轉圖像20°。膠囊將產生具有相同幅度但不同方向的矢量。這裡,矢量的角度表示數字「7」的旋轉角度。最後,還可以添加2個神經元來捕捉大小和筆畫的寬度(見下圖)。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻


我們稱膠囊的輸出向量為活動向量 ,其幅度代表檢測特徵的概率,其方向代表其參數(屬性)。

在計算一個膠囊網路輸出的時候,首先看一個全連接的神經網路:

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

其中每個神經元的輸出是從前一層神經元的輸出計算而來的:

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

其中

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

都是標量

對於capsule網路,一個capsule的輸入

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

和輸出

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

都是向量。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

我們將一個變換矩陣(transformation matrix)

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

應用到前一層的capsule輸出

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

。例如,用一個

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

矩陣,我們把一個k-D

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

變換成一個m-D

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

。然後計算

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

的加權和:

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

其中,

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

是迭代動態路由過程( iterative dynamic routing process )訓練的耦合係數(coupling coefficients),

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

被設計來求和到1。

我們不使用ReLU函數,而是使用一個擠壓函數(squashing function)來縮短0和單位長度之間的向量。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

它將短向量縮小到接近0,將長向量縮小為接近單位向量( unit vectors)。因此,每個capsule的似然性在0到1之間。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

迭代動態路由規則與重要性

在深度學習中,我們使用反向傳播來訓練模型參數。轉換矩陣 Wij 在膠囊中仍然用反向傳播訓練。不過,耦合係數 cij 用新的迭代動態路由方法進行計算。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

以下是動態路由的最終偽代碼:

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

在深度學習中,我們使用反向傳播來訓練基於成本函數的模型參數。這些參數(權重)控制信號從一層到另一層的路由。如果兩個神經元之間的權重為零,則神經元的激活不會傳播到該神經元。

迭代動態路由提供了如何根據特徵參數來路由信號的替代方案。通過利用特徵參數,理論上,可以更好地將膠囊分組,形成一個高層次的結構。例如,膠囊層可能最終表現為探索「部分-整體」關係的分析樹。例如,臉部由眼睛、鼻子和嘴組成。迭代動態路由利用變換矩陣、可能性和特徵的性質,控制向上傳播到上面膠囊的信號的多少。

最後,就到了應用膠囊構建CapsNet,進而對MNIST數字進行分類和重構的時候了。下面是CapsNet的架構。一個CapsNet共有3層,兩個卷積層和一個全連接層。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

論文提到的MNIST數字重構任務:

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Github代碼

Capsule模型代碼在以下論文中使用:

  • "Dynamic Routing between Capsules」(膠囊間的動態路由) by Sara Sabour, Nickolas Frosst, Geoffrey E. Hinton.

要求:

  • TensorFlow(請參閱http://www.tensorflow.org了解如何安裝/升級)

  • NumPy(請參閱http://www.numpy.org/)

  • GPU

運行測試驗證設置是否正確,例如:

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

快速MNIST測試結果:

  • 從以下網址下載並提取MNIST記錄到 $DATA_DIR/:https://storage.googleapis.com/capsule_toronto/mnist_data.tar.gz

  • 從以下網址下載並提取MNIST模型checkpoint到$CKPT_DIR:https://storage.googleapis.com/capsule_toronto/mnist_checkpoints.tar.gz

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

快速CIFAR10 ensemble測試結果:

  • 從以下網址下載並提取cifar10二進位版本到 $DATA_DIR/:https://www.cs.toronto.edu/~kriz/cifar.html

  • 從以下網址下載並提取cifar10模型checkpoint到 $CKPT_DIR:https://storage.googleapis.com/capsule_toronto/cifar_checkpoints.tar.gz

  • 將提取的二進位文件的目錄作為 data_dir 傳遞給($ DATA_DIR)

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Sample CIFAR10訓練命令:

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Sample MNIST的完整訓練命令:

  • 在 training-validation pass 訓練,validate=true 也是如此

  • 要在一個以上的GPU pass訓練,num_gpus = NUM_GPUS

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

Sample MNIST基線訓練命令:

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

在上述模型的訓練期間對validation進行測試:

訓練過程中連續運行的注意事項

  • 在訓練中也要注意pass --validate=true

  • 總共需要2個GPU:一個用於訓練,一個用於驗證

  • 如果在同一台機器上進行訓練和驗證,則需要限制每個任務的RAM消耗,因為TensorFlow會填滿第一個任務的所有RAM,從而導致第二個任務失敗。

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

  • 要測試/訓練 MultiMNIST pass --num_targets = 2 以及 --data_dir = $DATA_DIR/multitest_6shifted_mnist.tfrecords@10。

  • 生成 multiMNIST / MNIST 記錄的代碼位於input_data/mnist/mnist_shift.py。

生成multiMNIST測試的示例代碼:

Hinton膠囊網路代碼正式開源,你也能為GitHub1.4萬fork的庫貢獻

為 affNIST 的泛化能力建立 expanded_mnist: --shift = 6 --pad = 6。

讀取affNIST的代碼將遵循。

代碼由Sara Sabour(sarasra, sasabour@google.com)維護。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 新智元 的精彩文章:

滴滴成立AI Labs 滴滴副總裁葉傑平教授領軍
「AI TOP 10」谷歌構建自我懷疑的AI;英特爾發布飛行汽車

TAG:新智元 |