1.背景介紹
??CNNs存在一些缺陷,如需要大量數(shù)據(jù)擬合網(wǎng)絡(luò)幅垮、池化層丟失太多有效信息(包括了特征的位置信息)等腰池。如圖1所示,右側(cè)圖片丟入普通的CNNs军洼,會被判別為人臉,左側(cè)圖片丟人普通的CNNs演怎,也會判別為人臉匕争,CNNs捕捉特征能力很強,但特征之間的聯(lián)系等信息爷耀,CNNs是丟失的甘桑。
??Hinton等人于2017年提出了膠囊網(wǎng)絡(luò)。其引入了膠囊(capsule)結(jié)構(gòu)(多個神經(jīng)元組成)歹叮,其輸入是向量跑杭,輸出也是向量,其每一個膠囊都對應(yīng)一個實體咆耿,向量的大械铝隆(模)表示實體出現(xiàn)的可能性,向量的方向(向量的分量決定其方向)表示實體的屬性萨螺。多個膠囊組成了膠囊網(wǎng)絡(luò)的某一層窄做,多個膠囊網(wǎng)絡(luò)的層就組成了膠囊網(wǎng)絡(luò)愧驱。
??舉個例子,如圖2中有一個膠囊對應(yīng)數(shù)字6椭盏,其輸出對應(yīng)數(shù)字6的16維向量表示组砚,若我們微調(diào)某一個分量的值,在重構(gòu)數(shù)字6(重構(gòu)掏颊,是指通過向量恢復(fù)出原來的數(shù)字)的時候糟红,就可能對應(yīng)數(shù)字6粗細、大小的改變等乌叶,同時數(shù)字6出現(xiàn)在圖中的概率就用向量的大小去衡量盆偿。
2.數(shù)據(jù)集介紹與網(wǎng)絡(luò)結(jié)構(gòu)
??數(shù)據(jù)集采用mnist(手寫數(shù)字集),共60K訓(xùn)練枉昏,10K測試陈肛,沒有預(yù)訓(xùn)練。
??網(wǎng)絡(luò)結(jié)構(gòu)如圖3所示兄裂。具體實現(xiàn)有多種句旱,這里寫出一種,第一步晰奖,一張28×28的手寫數(shù)字圖片谈撒,經(jīng)過了1個256個filter的卷積層,每個filter里卷積核大小9×9匾南,步長為1啃匿,填充為0,再經(jīng)過ReLU蛆楞,得到的就是(256溯乒,20,20)的張量豹爹;第二步裆悄,要得到32個PrimaryCap,每個基本PrimaryCap(基礎(chǔ)膠囊)其維度是(8臂聋,6光稼,6),只要做32次卷積孩等,每次卷積得到一個PrimaryCap即可艾君,每次卷積參數(shù)是8個filter,每個filter里卷積核大小9×9肄方,步長為2冰垄,填充為0,再經(jīng)過ReLU权她,就可以得到(8播演,6冀瓦,6)的基礎(chǔ)膠囊了,又因為32次卷積写烤,故而得到(32翼闽,8,6洲炊,6)的張量感局,最后考慮將其形變?yōu)椋?152,8)的膠囊集合(即1152個膠囊暂衡,每個膠囊輸出維度是8)询微;第三步,通過膠囊之間的交互(下一節(jié)細講)狂巢,得到下一層的數(shù)字膠囊(DigitCaps)輸出撑毛,其維度為(10,16)唧领,最后對10個向量求模長藻雌,得十維向量,其分量最大者所在位置就是對應(yīng)最大可能出現(xiàn)在圖中的數(shù)字斩个。
3.膠囊與膠囊之間的互動
??在PrimaryCaps層有1152個8D的膠囊胯杭,DigitCaps層有10個16D的膠囊,如何處理呢受啥,類比兩個全連接層的做法做个,后一層的某一個輸出是前一層所有結(jié)點輸出的線性組合,再經(jīng)過激活函數(shù)滚局,同理居暖,后一層的某一個膠囊輸出是前一層所有膠囊先投影(8D與16D畢竟維度不匹),經(jīng)過線性組合藤肢,再經(jīng)過向量大小壓縮函數(shù)(為什么要對向量大小進行壓縮呢太闺?因為向量的大小是表示一個實體存在的概率,概率值需要在[0,1]之間谤草,故而要壓縮下)跟束。
??對上述步驟進行分解莺奸,投影操作是引入Wij矩陣丑孩,其維度是(16,8)灭贷,共1152×10個温学;前一層(1152,8)的張量甚疟,經(jīng)過了投影操作仗岖,就變?yōu)椋?152逃延,10,16轧拄,1)的張量揽祥;那么組合系數(shù)如何確定呢?通過路由算法確定組合系數(shù)檩电,再進行線性組合拄丰,就得到(10,16)的張量俐末,最后經(jīng)過向量壓縮函數(shù)即可(向量壓縮函數(shù)如圖4所示)料按。
??路由算法偽碼如圖5所示,其中是指前一層第i個膠囊輸出經(jīng)過Wij投影后的值卓箫,j是下層膠囊編號载矿,r是控制算法內(nèi)部循環(huán)次數(shù),一般為3烹卒,l是層數(shù)闷盔;其例子如圖6所示(假設(shè)r=1)。
??以上就是兩膠囊層之間如何互動的了甫题,作者引入路由算法就是想替換到CNNs中的池化操作馁筐,池化操作以提取重要特征為目的,2×2的池化操作是4取1坠非,丟失噪聲同時也丟失了其他有用信息敏沉,路由算法更像是一種平滑操作,去噪聲的同時還盡可能保留了一些信息炎码,不禁讓人想到同年同Google公司大牛提出的Attention Is All You Need中的Scaled Dot-Product Attention操作盟迟,后者也可以理解為一種平緩操作,結(jié)合上下文去噪聲潦闲。
4.路由算法的版本
??路由算法至少有兩個版本攒菠,一個是原paper版本,一個是網(wǎng)絡(luò)流傳的版本歉闰。主要區(qū)別是前者對bij按照后一層膠囊數(shù)(即j)的維度進行softmax辖众,后者對bij按照前一層膠囊數(shù)(即i)的維度進行softmax。實現(xiàn)起來都是可以的且性能接近和敬。對此凹炸,有如下解釋,前者是從前一層的每一個膠囊分配向量量的角度昼弟,后者是從后一層的每一個膠囊組合向量量的角度啤它。前者是分配,更像是路由,也就是paper的版本变骡。
5.動手實現(xiàn)
??此處的實現(xiàn)离赫,網(wǎng)絡(luò)結(jié)構(gòu)遵循paper,實現(xiàn)方法根據(jù)第2節(jié)描述塌碌。
??下面講幾個在實現(xiàn)中比較惡心的坑渊胸。其一,高維張量與高維張量矩陣乘法一定要檢驗台妆;其二蹬刷,在數(shù)字膠囊中,bij并不是參數(shù)频丘,其不需要梯度办成,真正的參數(shù)是W,故而注意其他有梯度的變量經(jīng)過操作得到bij時搂漠,需要對其他有梯度的變量分離梯度迂卢,否則反向傳播,更新梯度時桐汤,bij會被更新而克;其三,數(shù)字膠囊的W前面×0.01怔毛,是為了加速訓(xùn)練员萍,如果不乘0.01,也是可以的拣度,只是一開始效果沒那么好碎绎,甚至模型跑完一整個epoch,也起不來抗果。
6.實驗結(jié)果
??模型相比paper里面的性能(測試集99.65%的正確率)筋帖,還是有一定差距的,在驗證集上是接近99%冤馏∪蒸铮考慮到實現(xiàn)方法不同、手寫代碼的粗糙等逮光,差于paper表現(xiàn)也是可以解釋的代箭。
7.致謝
??感謝苗翔宇同學(xué)幫我改了一天BUG。
8.參考文獻
[1] Dynamic Routing Between Capsules
[2] Simple explanation for Capsule Network with Pytoch implementation
[3] Simple explanation for Capsule Network with Pytoch implementation(github)
[4] Capsule-Network-Tutorial(github)
[5] 李宏毅.膠囊網(wǎng)絡(luò)教程.
[6] capsule解讀
[7] 論文閱讀<2> Dynamic Routing Between Capsules
[8] Dynamic Routing Between Capsule論文閱讀筆記
[9] 程天宏同學(xué)的代碼