【編者按】深度學習開創者之一、反向傳播等神經網路經典演算法的發明人Geoffrey Hinton思考了膠囊網路數十年之久, 然而直到上一個月才發表論文正式提出膠囊網路。 主要原因就是一直沒找到訓練膠囊網路的合適演算法。 深度學習開發者, Medium知名博主Max Pechyonkin剛發表了膠囊網路入門系列的第三篇, 簡明扼要地介紹了Hinton新提出的囊間動態路由演算法。
介紹
本文是膠囊網路(CapsNet)系列的第三篇。 膠囊網路是一種基於膠囊的新型神經網路。 我已經討論過它背後的直覺, 以及膠囊是如何工作的。 在本文中, 我將討論創新的囊間動態路由演算法,
Hinton等人早期報告中描述膠囊和囊間路由的示意圖
第二篇提到, 低層膠囊i需要決定如何將其輸出向量發送給高層膠囊j。 低層膠囊改變標量權重cij, 輸出向量乘以該權重後, 發送給高層膠囊, 作為高層膠囊的輸入。
關於權重cij, 我們需要知道:
權重均為非負標量。
對每個低層膠囊i而言, 所有權重cij的總和等於1。
對每個低層膠囊i而言, 權重的數量等於高層膠囊的數量。
這些權重的數值由反覆運算動態路由演算法確定。
前兩點使我們得以用概率術語解釋權重。 回顧一下第二篇的內容, 膠囊經訓練後檢測出特徵, 該特徵的存在概率用膠囊輸出向量的長度來表示。 特徵的參數狀態則用輸出向量的方向表示。 所以, 從某種意義上說, 對於每個低層膠囊i而言, 其權重cij定義了傳給每個高層膠囊j的輸出的概率分佈。
第二篇中的膠囊內部機制的概覽
囊間動態路由
那麼, 動態路由過程中究竟發生了什麼呢?讓我們看看原論文對這一演算法的描述。 不過, 在我們逐步深入演算法之前, 我希望你對演算法背後的主要直覺能有個印象:
低層膠囊將其輸出發送給對此表示“同意”的高層膠囊。
瞭解演算法背後的主要直覺後, 讓我們逐行看看原論文對這一演算法的描述。
讓我們先來看第一行和最後一行, 也就是說, 這個演算法的輸入和輸出分別是什麼。 第一行指明了演算法的輸入:低層l中的所有膠囊及其輸出û, 以及路由反覆運算計數r。 最後一行指明了演算法的輸出, 一個高層膠囊vj。 本質上, 這段演算法告訴我們如何計算網路的前向傳導。
第2行的bij是一個臨時變數, 它的值會在反覆運算過程中更新, 當整個演算法運行完畢後, 它的值將被保存到cij。 在訓練開始時, bij的值被初始化為零。
第3行表明第4-7行的步驟會被重複r次(路由反覆運算次數)。
第4行計算向量ci的值,
由於所有bij的值初始化為零(第2行), 第一次反覆運算後, 所有係數cij的值會相等。 例如, 如果我們有3個低層膠囊和2個高層膠囊, 那麼所有cij將等於0.5。 演算法初始化時期, 所有cij均相等, 這意味著不確定性達到最大值:低層膠囊不知道它們的輸出最適合哪個高層膠囊。 當然, 隨著這一進程的重複, 這些均勻分佈將發生改變。
計算了所有低層膠囊的所有的權重cij之後, 我們來看第5行, 那裡將涉及高層膠囊。 這一步我們將計算經前一步確定的路由係數cij加權後的輸入向量的線性組合。 從直覺上說,這意味著縮小輸入向量並將它們相加,得到輸出向量sj。這一步驟將應用到所有高層膠囊上。
接著,在第6行中,來自前一步的向量將穿過squash非線性函數,這確保了向量的方向被保留下來,而長度被限制在1以下。該步驟生成傳給所有高層膠囊的輸出向量vj。
總結一下到目前為止演算法做了什麼:步驟4-6是在計算高層膠囊的輸出。第7行更新了權重,也是路由演算法的本質所在。在這一步中,我們查看了每個高層膠囊j,然後檢查每個輸入並根據公式更新相應的權重bij。公式表明,膠囊j的當前輸出和從低層膠囊i處接收的輸入的點積,加上舊權重,等於新權重。點積檢測膠囊的輸入和輸出之間的相似性。另外,如前文所述,低層膠囊將其輸出發送給具有類似輸出的高層膠囊。點積刻畫了這一相似性。這一步驟之後,演算法跳轉到第3步重新開始這一流程,並重複r次。
重複r次後,我們計算出了所有高層膠囊的輸出,並確立路由權重。之後正向傳導就可以推進到更高層的網路。
點積運算接收兩個向量,並輸出一個標量。對於給定長度但方向不同的兩個向量而言,點積有幾種情況:a最大正值; b 正值;c 零;d 負值;e 絕對值最大的負值
權重更新的直觀例子
上圖中,兩個高層膠囊的輸出用紫色向量v1和v2表示。橙色向量表示接收自某個低層膠囊的輸入,其他黑色向量表示接收自其他低層膠囊的輸入。
我們看到,左邊的紫色輸出v1和橙色輸入û1|1指向相反的方向。換句話說,它們並不相似。這意味著它們的點積將是一個負數,並減少路由係數c11。右邊的紫色輸出v2和橙色輸入û2|1指向相同的方向。它們是相似的。因此,路由係數c12會增加。在所有高層膠囊及其所有輸入上重複應用該過程,得到一個路由係數的集合,達成了來自低層膠囊的輸出與高層膠囊的輸出的最佳匹配。
進行多少次路由反覆運算?
論文在MNIST和CIFAR上檢驗了一定範圍內的數值,得到了兩個結論:
更多的反覆運算往往會導致過擬合
實踐中建議使用3次反覆運算
結語
本文解釋了基於合意的動態路由演算法,該演算法用於訓練CapsNet。最關鍵的想法是,通過膠囊的輸入和輸出的點積測量輸入和輸出的相似性,然後相應地更新路由係數。實踐中的最佳做法是使用3次反覆運算。
在下一篇文章中,我將帶你領略CapsNet的架構,將迄今為止我們所掌握的謎題線索集中起來。
從直覺上說,這意味著縮小輸入向量並將它們相加,得到輸出向量sj。這一步驟將應用到所有高層膠囊上。接著,在第6行中,來自前一步的向量將穿過squash非線性函數,這確保了向量的方向被保留下來,而長度被限制在1以下。該步驟生成傳給所有高層膠囊的輸出向量vj。
總結一下到目前為止演算法做了什麼:步驟4-6是在計算高層膠囊的輸出。第7行更新了權重,也是路由演算法的本質所在。在這一步中,我們查看了每個高層膠囊j,然後檢查每個輸入並根據公式更新相應的權重bij。公式表明,膠囊j的當前輸出和從低層膠囊i處接收的輸入的點積,加上舊權重,等於新權重。點積檢測膠囊的輸入和輸出之間的相似性。另外,如前文所述,低層膠囊將其輸出發送給具有類似輸出的高層膠囊。點積刻畫了這一相似性。這一步驟之後,演算法跳轉到第3步重新開始這一流程,並重複r次。
重複r次後,我們計算出了所有高層膠囊的輸出,並確立路由權重。之後正向傳導就可以推進到更高層的網路。
點積運算接收兩個向量,並輸出一個標量。對於給定長度但方向不同的兩個向量而言,點積有幾種情況:a最大正值; b 正值;c 零;d 負值;e 絕對值最大的負值
權重更新的直觀例子
上圖中,兩個高層膠囊的輸出用紫色向量v1和v2表示。橙色向量表示接收自某個低層膠囊的輸入,其他黑色向量表示接收自其他低層膠囊的輸入。
我們看到,左邊的紫色輸出v1和橙色輸入û1|1指向相反的方向。換句話說,它們並不相似。這意味著它們的點積將是一個負數,並減少路由係數c11。右邊的紫色輸出v2和橙色輸入û2|1指向相同的方向。它們是相似的。因此,路由係數c12會增加。在所有高層膠囊及其所有輸入上重複應用該過程,得到一個路由係數的集合,達成了來自低層膠囊的輸出與高層膠囊的輸出的最佳匹配。
進行多少次路由反覆運算?
論文在MNIST和CIFAR上檢驗了一定範圍內的數值,得到了兩個結論:
更多的反覆運算往往會導致過擬合
實踐中建議使用3次反覆運算
結語
本文解釋了基於合意的動態路由演算法,該演算法用於訓練CapsNet。最關鍵的想法是,通過膠囊的輸入和輸出的點積測量輸入和輸出的相似性,然後相應地更新路由係數。實踐中的最佳做法是使用3次反覆運算。
在下一篇文章中,我將帶你領略CapsNet的架構,將迄今為止我們所掌握的謎題線索集中起來。