Capsule下一代CNN深入探索
牛逼的Hinton大神不僅僅將反向傳播引入了神經網絡,使得大規模的訓練神經網絡成為可能,而現在他又提出了一個新的基礎結構Capsule,聽上去很厲害,但是我們坐以待斃,要站在科技的最前沿去掌握這些新的知識。今天我們就來理解一下這個Capsule到底是什么鬼,有和牛逼之處,以及它和CNN的關系,又該如何去實現它?論文地址傳送門
Capsule基礎
Hinton在他的論文里面,把論文的題目叫做?Dynamic Routing Between Capsules. 那么很顯然,首先理解一下為毛叫Routing?這個題目總字面意思理解像是一種動態的算法,在Capsule中游離,具體是怎么一種方法我們繼續看了。其實論文摘要的第一句話就說的是什么是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.
一個膠囊,就是一組神經元,它的特征向量就是代表一個實體或者物體的實例化參數。簡而言之,一個膠囊現在是一組神經元了,而不是一個或者一層神經元。一組這個概念非常重要,比如我們將好幾層放到一組里面組成一個膠囊,Capsule也是顧名思義。那么這么一個膠囊,它的參數就是一個對象或者物體的實例化參數,比如就是一張圖片中一個物體的特征。
用活動向量的長度來代表實例化物體存在的概率,用活動向量的方位來代表。較低層次的膠囊為較高抽象層次的膠囊做預測,當較低層次的多個膠囊對某個預測都表示同意時,高層次的抽象膠囊就將被激活。
Hinton在引入Capsule概念時提到,人類視覺使用了一種確定的固定點序列來忽略不相關的細節,以確保只有極少數部分的光學陣列以最高分辨率被處理。這什么意思呢?就是說,人類的視覺會忽略東西,比如你看遠處的一座塔,那么它附近的樹木,人就無法看清,人類只能同時聚焦于同一個物體,使得這個物體被以強所未有的分辨率被聚焦。這其實我們已經研究過了,CNN的基本不就是一個聚焦的卷積核對圖片進行掃描嗎?那么這個新的“CNN”又有何不同呢?接著,作者提出了一個非常犀利的觀點,那就是Parse Tree,暫且把它叫做解析樹。作者把人類的視覺比較是一個解析樹。Parse Tree是一個由神經網絡雕刻出來的雕刻品,就像是一個雕塑出自于石頭一樣,這么一說非常清晰,Parse Tree本質還是神經網絡,但是他只是把神經網絡當成是原料,而不是直接把神經網絡拿來用。這個Parse Tree也是一層層的,而且每一層不再是單一的神經元,而是每一層有許多個膠囊組成,每個膠囊由若干個神經元組成。意思就是Parse Tree使得神經網絡更加高級了,并產生了一個以膠囊為單位的層次結構。在解析樹的每一層當中,每一個膠囊都會選擇更上一層的膠囊作為它的父膠囊,此時父膠囊就會激活。
每個活動膠囊內部的神經網絡參數表征了圖片當中出現的物體的尺寸,形狀,姿態等,甚至包括速度,文本信息都會包含,其中一個非常特別的信息是這個膠囊中是否包含該物體存在的信息,而一個表征是否存在的辦法就是在這個膠囊后面接一個分類器輸出0和1. 但是在這篇論文作者提出了一個更加牛逼的方式來表征膠囊里面是否存在一個物體的實例化信息,那就是通過膠囊的長度來判別,并且規定膠囊輸出的特征長度不能超過1。一個膠囊輸出是一個向量,這個天然特性非常好,他可以使得一個膠囊的輸出可以被送到它更上層的膠囊中去。剛開始的時候, 一個膠囊的輸出被送到所有可能的高層次膠囊中,但是由于總和限定在1,所以被逐漸遞減,膠囊會有一個預測向量,乘上一個權重矩陣,如果預測向量與高層次的膠囊輸出相乘得到的標量較大,那么就增加了這個膠囊將信息傳遞給這個高層次膠囊的概率。這種利用底層膠囊和高層膠囊協同合作的方式使得這種辦法比簡單的maxpooling要有效得多,Hinton等大神也說自己證明了這一點,這個機智在物體分割和檢測重疊物體上具有效果。
說到了這里,是該對比一下基于膠囊機制的視覺系統和CNN的區別了。首先有:
| scalaroutput of feature detector | vectorouput of Capsules |
| maxpool | routing-by-agreement |
| ? |
一眼就能看出,新的體系相對于CNN來說,CNN和Capsule的體系架構的區別就像小學數學和微積分,cnn中的max-pooling會很顯然會丟失信息,而用routing-by-agreement的方式來處理,圖像中物體的位置信息就被選擇哪個高層次膠囊所取代了。其實說白了,Capsule架構是把神經網絡和決策樹結合起來,只不過和決策樹決策的方式不一樣。
那么問題來了,Capsule的輸入和輸出怎么計算呢?
論文中只是說明了一種非常簡單的實現方法,那就是擠壓函數,這個擠壓函數的作用就是把一個低長度的向量的長度壓縮到幾乎為0,把一個很長長度的向量壓縮到一個小于1的值(execuse me?長度還能小于1???這里說的length值得應該是二范數的長度),這個公式很顯然就是將一個向量歸一化了:
| vj = ||sj||^2 / (1 + ||sj||^2) * sj / ||sj|| |
這就是一個Capsule的公式,輸入是sj,輸出是vj,非常清晰簡單明了。
除了第一層的Capsule之外,其他每一層的輸入sj是下一層Capsule的輸出乘以一個矩陣,在乘上一個耦合概率:
簡單的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.vjreturn vj |
CapsNet的網絡結構
Hinton在論文中也提出了CapsNet一個最簡單的結構,我們直接看一下圖形結構:
一看這個結構感覺跟想象的不太一樣啊,說好的膠囊結構呢?這個primary caps就是一個膠囊了吧,那么這個就是3個層次的膠囊?還是說三個初級的膠囊?不是非常清晰啊。不過可以這么來理解,首先primary caps是首要的初級膠囊,這些膠囊就是最底層的膠囊了,每個初級膠囊里面都是一些卷積層組成的網絡,比如每個caps里面都是一個lenet,然后每個primary capsules都與更高層次的抽象capsule組成一個激活與被激活的關系,最后抽象出來的capsule就是圖中的DigitCaps。這些高層次的Caps不僅僅可以用來分類,直接計算輸出的向量的二范數即可,而且還可以用來重構.
這是一個非常有趣的事情,也就是說這里的DigitsCaps已經足夠高級了,高級到什么地步,我們可以直接用這個東西來做GAN生成!!!Hinton在論文里面也說了,直接一個decoder就可以用這個來生成相應的數字:
這是一個decoder,直接對DigitCaps進行重構,就得到了一個784維的原始mnist圖片。
我們對CapsNet的原始論文的了解大概就是如此,但是我想現在你一定跟現在我一樣懵逼。傳說中非常牛逼吊炸天的CapsNet好像我依舊不知道它是什么來的,要實現什么功能?解決什么問題?怎么解決的?以及它計算的一些細節。別急,我們再來仔細分析一下。
CapsNet探究
簡單來說,Hinton提出這個CapsNet是要解決這么一個問題:傳統CNN在對圖片信息提取的信息遺漏問題和深度學習模型對物體形狀記憶的問題。為什么CNN會有這樣的問題呢?有人仔細想過為什么我們要用maxpooling這么簡單粗暴的東西嗎?我們對特征進行一層層的抽象,有很多種辦法,為什么一定要直接略過一些東西呢?我們在做檢測和分割任務的時候,有人仔細想過為什么一個檢測網絡總是必須要借助人類的標簽才能把物體框柱,而且框的還不準確嗎(比如重疊物體)?這些都是目前CNN基石上所存在的問題。
而CapsNet的設計先天有著很好的優點:
- 通過一個個的膠囊來代替簡單的一層CNN,這個非常好理解,現在要是提出一個膠囊網絡,它的一層不是多少個神經元,而是多少個膠囊,每個膠囊可能有很多層CNN或者很多個神經元,毫無疑問,這個模型就要復雜很多了。
- CapsNet不在使用拍腦袋決定的max-pooling這樣的簡單粗暴方式來處理特征的抽象或者說抽取,而是采用底層與高層之間的激活與被激活的關系來表征這一關系,比如我在底層有個膠囊A,它抽取了一個車的特征,它就激活它高層的一個膠囊,那么這個膠囊就在底層的基礎上進行了一次抽象,至于這個抽象怎么去理解,就當時對圖像進行了一次特征抽取吧。
- 由于CapsNet本身一個膠囊就被設計來發現一個物體,那么這個物體檢測出來的特征自然就包含這個物體的類別,這個物體的形狀等信息,這一想法在重構的實驗中也得到了非常好的驗證,底層識別1的膠囊,可以很好的復現1的圖形。
正是基于此架構上的改進,未來,可能在做分割或者檢測任務時,我們就不需要進行人工標注了,CapsNet可以通過簡單的類別標注就可以知道什么地方有什么東西,而且這個檢測可以做到非常準備。
從這個角度上來說,說大一些,CapsNet統一了CV里面的分類、檢測、分割所有的任務,至于它是不是像設想的一樣真的非常work,我想在未來的全球AI研究員的實現里面,肯定會很多人使用Caps對深度學習網絡進行重構,無數實驗結果或許會給我們帶來非常驚喜的成果!
原文地址:?https://jinfagang.github.io/2017/11/03/Capsule%E4%B8%8B%E4%B8%80%E4%BB%A3CNN%E6%B7%B1%E5%85%A5%E6%8E%A2%E7%B4%A2/
總結
以上是生活随笔為你收集整理的Capsule下一代CNN深入探索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TFboys:使用Tensorflow搭
- 下一篇: paddlepaddle系列之三行代码从