Capsule下一代CNN深入探索

Capsule下一代CNN深入探索

This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

牛逼的Hinton大神不僅僅將反向傳播引入了神經(jīng)網(wǎng)絡(luò),使得大規(guī)模的訓(xùn)練神經(jīng)網(wǎng)絡(luò)成為可能,而現(xiàn)在他又提出了一個(gè)新的基礎(chǔ)結(jié)構(gòu)Capsule,聽(tīng)上去很厲害,但是我們坐以待斃,要站在科技的最前沿去掌握這些新的知識(shí)。今天我們就來(lái)理解一下這個(gè)Capsule到底是什么鬼,有和牛逼之處,以及它和CNN的關(guān)系,又該如何去實(shí)現(xiàn)它?論文地址傳送門

Capsule基礎(chǔ)

Hinton在他的論文里面,把論文的題目叫做 Dynamic Routing Between Capsules. 那么很顯然,首先理解一下為毛叫Routing?這個(gè)題目總字面意思理解像是一種動(dòng)態(tài)的算法,在Capsule中游離,具體是怎么一種方法我們繼續(xù)看了。其實(shí)論文摘要的第一句話就說(shuō)的是什么是Capsule:

A capsule is a group of neurons whose activity vector represents the instantiation parameters of a specific type of entity such as an object or object part.

一個(gè)膠囊,就是一組神經(jīng)元,它的特征向量就是代表一個(gè)實(shí)體或者物體的實(shí)例化參數(shù)。簡(jiǎn)而言之,一個(gè)膠囊現(xiàn)在是一組神經(jīng)元了,而不是一個(gè)或者一層神經(jīng)元。一組這個(gè)概念非常重要,比如我們將好幾層放到一組里面組成一個(gè)膠囊,Capsule也是顧名思義。那么這么一個(gè)膠囊,它的參數(shù)就是一個(gè)對(duì)象或者物體的實(shí)例化參數(shù),比如就是一張圖片中一個(gè)物體的特征。

用活動(dòng)向量的長(zhǎng)度來(lái)代表實(shí)例化物體存在的概率,用活動(dòng)向量的方位來(lái)代表。較低層次的膠囊為較高抽象層次的膠囊做預(yù)測(cè),當(dāng)較低層次的多個(gè)膠囊對(duì)某個(gè)預(yù)測(cè)都表示同意時(shí),高層次的抽象膠囊就將被激活。

Hinton在引入Capsule概念時(shí)提到,人類視覺(jué)使用了一種確定的固定點(diǎn)序列來(lái)忽略不相關(guān)的細(xì)節(jié),以確保只有極少數(shù)部分的光學(xué)陣列以最高分辨率被處理。這什么意思呢?就是說(shuō),人類的視覺(jué)會(huì)忽略東西,比如你看遠(yuǎn)處的一座塔,那么它附近的樹(shù)木,人就無(wú)法看清,人類只能同時(shí)聚焦于同一個(gè)物體,使得這個(gè)物體被以強(qiáng)所未有的分辨率被聚焦。這其實(shí)我們已經(jīng)研究過(guò)了,CNN的基本不就是一個(gè)聚焦的卷積核對(duì)圖片進(jìn)行掃描嗎?那么這個(gè)新的“CNN”又有何不同呢?接著,作者提出了一個(gè)非常犀利的觀點(diǎn),那就是Parse Tree,暫且把它叫做解析樹(shù)。作者把人類的視覺(jué)比較是一個(gè)解析樹(shù)。Parse Tree是一個(gè)由神經(jīng)網(wǎng)絡(luò)雕刻出來(lái)的雕刻品,就像是一個(gè)雕塑出自于石頭一樣,這么一說(shuō)非常清晰,Parse Tree本質(zhì)還是神經(jīng)網(wǎng)絡(luò),但是他只是把神經(jīng)網(wǎng)絡(luò)當(dāng)成是原料,而不是直接把神經(jīng)網(wǎng)絡(luò)拿來(lái)用。這個(gè)Parse Tree也是一層層的,而且每一層不再是單一的神經(jīng)元,而是每一層有許多個(gè)膠囊組成,每個(gè)膠囊由若干個(gè)神經(jīng)元組成。意思就是Parse Tree使得神經(jīng)網(wǎng)絡(luò)更加高級(jí)了,并產(chǎn)生了一個(gè)以膠囊為單位的層次結(jié)構(gòu)。在解析樹(shù)的每一層當(dāng)中,每一個(gè)膠囊都會(huì)選擇更上一層的膠囊作為它的父膠囊,此時(shí)父膠囊就會(huì)激活。

每個(gè)活動(dòng)膠囊內(nèi)部的神經(jīng)網(wǎng)絡(luò)參數(shù)表征了圖片當(dāng)中出現(xiàn)的物體的尺寸,形狀,姿態(tài)等,甚至包括速度,文本信息都會(huì)包含,其中一個(gè)非常特別的信息是這個(gè)膠囊中是否包含該物體存在的信息,而一個(gè)表征是否存在的辦法就是在這個(gè)膠囊后面接一個(gè)分類器輸出0和1. 但是在這篇論文作者提出了一個(gè)更加牛逼的方式來(lái)表征膠囊里面是否存在一個(gè)物體的實(shí)例化信息,那就是通過(guò)膠囊的長(zhǎng)度來(lái)判別,并且規(guī)定膠囊輸出的特征長(zhǎng)度不能超過(guò)1。一個(gè)膠囊輸出是一個(gè)向量,這個(gè)天然特性非常好,他可以使得一個(gè)膠囊的輸出可以被送到它更上層的膠囊中去。剛開(kāi)始的時(shí)候, 一個(gè)膠囊的輸出被送到所有可能的高層次膠囊中,但是由于總和限定在1,所以被逐漸遞減,膠囊會(huì)有一個(gè)預(yù)測(cè)向量,乘上一個(gè)權(quán)重矩陣,如果預(yù)測(cè)向量與高層次的膠囊輸出相乘得到的標(biāo)量較大,那么就增加了這個(gè)膠囊將信息傳遞給這個(gè)高層次膠囊的概率。這種利用底層膠囊和高層膠囊協(xié)同合作的方式使得這種辦法比簡(jiǎn)單的maxpooling要有效得多,Hinton等大神也說(shuō)自己證明了這一點(diǎn),這個(gè)機(jī)智在物體分割和檢測(cè)重疊物體上具有效果。

說(shuō)到了這里,是該對(duì)比一下基于膠囊機(jī)制的視覺(jué)系統(tǒng)和CNN的區(qū)別了。首先有:

CNN Capsule
scalar output of feature detector vector ouput of Capsules
max pool routing-by-agreement

一眼就能看出,新的體系相對(duì)于CNN來(lái)說(shuō),CNN和Capsule的體系架構(gòu)的區(qū)別就像小學(xué)數(shù)學(xué)和微積分,cnn中的max-pooling會(huì)很顯然會(huì)丟失信息,而用routing-by-agreement的方式來(lái)處理,圖像中物體的位置信息就被選擇哪個(gè)高層次膠囊所取代了。其實(shí)說(shuō)白了,Capsule架構(gòu)是把神經(jīng)網(wǎng)絡(luò)和決策樹(shù)結(jié)合起來(lái),只不過(guò)和決策樹(shù)決策的方式不一樣。

那么問(wèn)題來(lái)了,Capsule的輸入和輸出怎么計(jì)算呢?

論文中只是說(shuō)明了一種非常簡(jiǎn)單的實(shí)現(xiàn)方法,那就是擠壓函數(shù),這個(gè)擠壓函數(shù)的作用就是把一個(gè)低長(zhǎng)度的向量的長(zhǎng)度壓縮到幾乎為0,把一個(gè)很長(zhǎng)長(zhǎng)度的向量壓縮到一個(gè)小于1的值(execuse me?長(zhǎng)度還能小于1???這里說(shuō)的length值得應(yīng)該是二范數(shù)的長(zhǎng)度),這個(gè)公式很顯然就是將一個(gè)向量歸一化了:

vj = ||sj||^2 / (1 + ||sj||^2) * sj / ||sj||

這就是一個(gè)Capsule的公式,輸入是sj,輸出是vj,非常清晰簡(jiǎn)單明了。

除了第一層的Capsule之外,其他每一層的輸入sj是下一層Capsule的輸出乘以一個(gè)矩陣,在乘上一個(gè)耦合概率:

簡(jiǎn)單的Capsule算法如下:

procedure ROUTING(u?j|i, r, l)

for all capsule i in layer l and capsule j in layer (l + 1): bij ← 0.
for r iterations do
    for all capsule i in layer l: ci ← softmax(bi)
    for all capsule j in layer (l + 1): sj ←  i cij u?j|i
    for all capsule j in layer (l + 1): vj ← squash(sj )
    for all capsule i in layer l and capsule j in layer (l + 1): bij ← bij + u?j|i.vj
return vj

CapsNet的網(wǎng)絡(luò)結(jié)構(gòu)

Hinton在論文中也提出了CapsNet一個(gè)最簡(jiǎn)單的結(jié)構(gòu),我們直接看一下圖形結(jié)構(gòu):

image

一看這個(gè)結(jié)構(gòu)感覺(jué)跟想象的不太一樣啊,說(shuō)好的膠囊結(jié)構(gòu)呢?這個(gè)primary caps就是一個(gè)膠囊了吧,那么這個(gè)就是3個(gè)層次的膠囊?還是說(shuō)三個(gè)初級(jí)的膠囊?不是非常清晰啊。不過(guò)可以這么來(lái)理解,首先primary caps是首要的初級(jí)膠囊,這些膠囊就是最底層的膠囊了,每個(gè)初級(jí)膠囊里面都是一些卷積層組成的網(wǎng)絡(luò),比如每個(gè)caps里面都是一個(gè)lenet,然后每個(gè)primary capsules都與更高層次的抽象capsule組成一個(gè)激活與被激活的關(guān)系,最后抽象出來(lái)的capsule就是圖中的DigitCaps。這些高層次的Caps不僅僅可以用來(lái)分類,直接計(jì)算輸出的向量的二范數(shù)即可,而且還可以用來(lái)重構(gòu).

這是一個(gè)非常有趣的事情,也就是說(shuō)這里的DigitsCaps已經(jīng)足夠高級(jí)了,高級(jí)到什么地步,我們可以直接用這個(gè)東西來(lái)做GAN生成!??!Hinton在論文里面也說(shuō)了,直接一個(gè)decoder就可以用這個(gè)來(lái)生成相應(yīng)的數(shù)字:

image

這是一個(gè)decoder,直接對(duì)DigitCaps進(jìn)行重構(gòu),就得到了一個(gè)784維的原始mnist圖片。

我們對(duì)CapsNet的原始論文的了解大概就是如此,但是我想現(xiàn)在你一定跟現(xiàn)在我一樣懵逼。傳說(shuō)中非常牛逼吊炸天的CapsNet好像我依舊不知道它是什么來(lái)的,要實(shí)現(xiàn)什么功能?解決什么問(wèn)題?怎么解決的?以及它計(jì)算的一些細(xì)節(jié)。別急,我們?cè)賮?lái)仔細(xì)分析一下。

CapsNet探究

簡(jiǎn)單來(lái)說(shuō),Hinton提出這個(gè)CapsNet是要解決這么一個(gè)問(wèn)題:傳統(tǒng)CNN在對(duì)圖片信息提取的信息遺漏問(wèn)題和深度學(xué)習(xí)模型對(duì)物體形狀記憶的問(wèn)題。為什么CNN會(huì)有這樣的問(wèn)題呢?有人仔細(xì)想過(guò)為什么我們要用maxpooling這么簡(jiǎn)單粗暴的東西嗎?我們對(duì)特征進(jìn)行一層層的抽象,有很多種辦法,為什么一定要直接略過(guò)一些東西呢?我們?cè)谧鰴z測(cè)和分割任務(wù)的時(shí)候,有人仔細(xì)想過(guò)為什么一個(gè)檢測(cè)網(wǎng)絡(luò)總是必須要借助人類的標(biāo)簽才能把物體框柱,而且框的還不準(zhǔn)確嗎(比如重疊物體)?這些都是目前CNN基石上所存在的問(wèn)題。

而CapsNet的設(shè)計(jì)先天有著很好的優(yōu)點(diǎn):

  • 通過(guò)一個(gè)個(gè)的膠囊來(lái)代替簡(jiǎn)單的一層CNN,這個(gè)非常好理解,現(xiàn)在要是提出一個(gè)膠囊網(wǎng)絡(luò),它的一層不是多少個(gè)神經(jīng)元,而是多少個(gè)膠囊,每個(gè)膠囊可能有很多層CNN或者很多個(gè)神經(jīng)元,毫無(wú)疑問(wèn),這個(gè)模型就要復(fù)雜很多了。
  • CapsNet不在使用拍腦袋決定的max-pooling這樣的簡(jiǎn)單粗暴方式來(lái)處理特征的抽象或者說(shuō)抽取,而是采用底層與高層之間的激活與被激活的關(guān)系來(lái)表征這一關(guān)系,比如我在底層有個(gè)膠囊A,它抽取了一個(gè)車的特征,它就激活它高層的一個(gè)膠囊,那么這個(gè)膠囊就在底層的基礎(chǔ)上進(jìn)行了一次抽象,至于這個(gè)抽象怎么去理解,就當(dāng)時(shí)對(duì)圖像進(jìn)行了一次特征抽取吧。
  • 由于CapsNet本身一個(gè)膠囊就被設(shè)計(jì)來(lái)發(fā)現(xiàn)一個(gè)物體,那么這個(gè)物體檢測(cè)出來(lái)的特征自然就包含這個(gè)物體的類別,這個(gè)物體的形狀等信息,這一想法在重構(gòu)的實(shí)驗(yàn)中也得到了非常好的驗(yàn)證,底層識(shí)別1的膠囊,可以很好的復(fù)現(xiàn)1的圖形。

正是基于此架構(gòu)上的改進(jìn),未來(lái),可能在做分割或者檢測(cè)任務(wù)時(shí),我們就不需要進(jìn)行人工標(biāo)注了,CapsNet可以通過(guò)簡(jiǎn)單的類別標(biāo)注就可以知道什么地方有什么東西,而且這個(gè)檢測(cè)可以做到非常準(zhǔn)備。

從這個(gè)角度上來(lái)說(shuō),說(shuō)大一些,CapsNet統(tǒng)一了CV里面的分類、檢測(cè)、分割所有的任務(wù),至于它是不是像設(shè)想的一樣真的非常work,我想在未來(lái)的全球AI研究員的實(shí)現(xiàn)里面,肯定會(huì)很多人使用Caps對(duì)深度學(xué)習(xí)網(wǎng)絡(luò)進(jìn)行重構(gòu),無(wú)數(shù)實(shí)驗(yàn)結(jié)果或許會(huì)給我們帶來(lái)非常驚喜的成果!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容