您的位置:首頁>正文

CapsNet入門系列之三:囊間動態路由演算法

【編者按】深度學習開創者之一、反向傳播等神經網路經典演算法的發明人Geoffrey Hinton思考了膠囊網路數十年之久, 然而直到上一個月才發表論文正式提出膠囊網路。 主要原因就是一直沒找到訓練膠囊網路的合適演算法。 深度學習開發者, Medium知名博主Max Pechyonkin剛發表了膠囊網路入門系列的第三篇, 簡明扼要地介紹了Hinton新提出的囊間動態路由演算法。

介紹

本文是膠囊網路(CapsNet)系列的第三篇。 膠囊網路是一種基於膠囊的新型神經網路。 我已經討論過它背後的直覺, 以及膠囊是如何工作的。 在本文中, 我將討論創新的囊間動態路由演算法,

膠囊網路是用這個演算法訓練的。

Hinton等人早期報告中描述膠囊和囊間路由的示意圖

第二篇提到, 低層膠囊i需要決定如何將其輸出向量發送給高層膠囊j。 低層膠囊改變標量權重cij, 輸出向量乘以該權重後, 發送給高層膠囊, 作為高層膠囊的輸入。

通過這一方式, 低層膠囊做出決策。 就符號表示而言, cij表示與低層膠囊i的輸出向量相乘, 乘積傳遞到高層膠囊j作為輸入的權重。

關於權重cij, 我們需要知道:

權重均為非負標量。

對每個低層膠囊i而言, 所有權重cij的總和等於1。

對每個低層膠囊i而言, 權重的數量等於高層膠囊的數量。

這些權重的數值由反覆運算動態路由演算法確定。

前兩點使我們得以用概率術語解釋權重。 回顧一下第二篇的內容, 膠囊經訓練後檢測出特徵, 該特徵的存在概率用膠囊輸出向量的長度來表示。 特徵的參數狀態則用輸出向量的方向表示。 所以, 從某種意義上說, 對於每個低層膠囊i而言, 其權重cij定義了傳給每個高層膠囊j的輸出的概率分佈。

第二篇中的膠囊內部機制的概覽

囊間動態路由

那麼, 動態路由過程中究竟發生了什麼呢?讓我們看看原論文對這一演算法的描述。 不過, 在我們逐步深入演算法之前, 我希望你對演算法背後的主要直覺能有個印象:

低層膠囊將其輸出發送給對此表示“同意”的高層膠囊。

這是動態路由演算法的精髓。

瞭解演算法背後的主要直覺後, 讓我們逐行看看原論文對這一演算法的描述。

讓我們先來看第一行和最後一行, 也就是說, 這個演算法的輸入和輸出分別是什麼。 第一行指明了演算法的輸入:低層l中的所有膠囊及其輸出û, 以及路由反覆運算計數r。 最後一行指明了演算法的輸出, 一個高層膠囊vj。 本質上, 這段演算法告訴我們如何計算網路的前向傳導。

第2行的bij是一個臨時變數, 它的值會在反覆運算過程中更新, 當整個演算法運行完畢後, 它的值將被保存到cij。 在訓練開始時, bij的值被初始化為零。

第3行表明第4-7行的步驟會被重複r次(路由反覆運算次數)。

第4行計算向量ci的值,

也就是低層膠囊i的所有權重。 這一計算將應用到所有低層膠囊上。 為什麼要用softmax呢?Softmax將確保所有權重cij均為非負數, 且其總和等於一。 本質上, softmax強制實施了我在上文描述的係數cij的概率性質。

由於所有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的架構,將迄今為止我們所掌握的謎題線索集中起來。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示