0
本文作者: AI研習社-譯站 | 2018-03-01 16:43 |
這里是,油管Artificial Intelligence Education專欄,原作者Siraj Raval授權(quán)雷鋒字幕組編譯。
原標題 Capsule Networks: An Improvement to Convolutional Networks
翻譯 | 夏雪松 鄭漢偉 字幕 | 凡江 整理 | Frank
去年10月,深度學習之父Hinton發(fā)表《膠囊間的動態(tài)路由》(Capsule Networks),最近谷歌正式開源了Hinton膠囊理論代碼。
Geoffrey Hinton是深度學習方面的教父之一,在80年代他推廣了反向傳播算法。正是由于反向傳播算法,深度學習效果顯著。在第一次AI寒冬中(80年代),其他人不相信神經(jīng)網(wǎng)絡(luò)能夠奏效,而Hinton卻堅信神經(jīng)網(wǎng)絡(luò)的觀點,這正是他如此偉大的原因。
Siraj會重點介紹卷積神經(jīng)網(wǎng)絡(luò)的飛速發(fā)展史以及膠囊網(wǎng)絡(luò)的工作原理、TensorFlow代碼。
目前最先進的算法:卷積神經(jīng)網(wǎng)絡(luò)
這是一張關(guān)于卷積神經(jīng)網(wǎng)絡(luò)(CNN)的圖片,如果我們使用標準的多層感知器,也就是說——所有的層完全的連接到其他的每一個層,它會很快變得難以計算。因為圖像的維度非常高,有很多很多像素。
(卷積神經(jīng)網(wǎng)絡(luò))
如果我們將這些操作連續(xù)地應(yīng)用于圖像中的每個單個像素每層,這將會花費太長的時間。我們的解決方案就是——使用一個卷積網(wǎng)絡(luò)。首先我們得到一張輸入的圖像,這個輸入的圖像有一個相關(guān)的標簽,如果這是一張汽車的圖片,就像我們看到的,它會有一個相關(guān)的車的標簽。圖片是汽車,那么它的標簽就是汽車。
一個卷積神經(jīng)網(wǎng)絡(luò)將要做的是——學習輸入數(shù)據(jù)和輸出標簽間的映射關(guān)系。這個卷積神經(jīng)網(wǎng)絡(luò)在訓(xùn)練后,如果我們給它一張汽車的照片,它會知道那是一輛汽車,因為它已經(jīng)學到了映射關(guān)系。當我們第一次為這個網(wǎng)絡(luò)提供一個汽車的圖片,它首先被應(yīng)用到卷積層。在卷積層中,首先是一系列的矩陣乘法,后面是一個求和操作,下面在高層次上對它進行解釋。
卷積層就像一個手電筒一樣,它作用在圖像中的每一個像素上。它試圖尋找該圖像中最相關(guān)的部分。通常卷積層會輸出特征圖,這些特征圖代表了很多特征。卷積層從圖像中學習到的一組特征是由矩陣表示的。我們將一個非線性單元應(yīng)用到其中,就像整流后的線性單位。
當我們對其應(yīng)用非線性時,通常會出于不同的目的:第一個目的是讓網(wǎng)絡(luò)可以學習,如何同時具有線性和非線性函數(shù)。因為神經(jīng)網(wǎng)絡(luò)是通用函數(shù)的近似誤差,對于整流線性裝置尤其如此;使用它的另一個目的是——與其他非線性類型不同,它解決了反向傳播過程中梯度消失的問題。
當我們前向傳播時我們執(zhí)行一系列操作,我們得到輸出類的概率,將它與實際標簽進行比計算誤差值,然后使用誤差計算得到梯度。當我們對網(wǎng)絡(luò)反向傳播時,梯度告訴我們?nèi)绾胃挛覀兊臋?quán)重,它有助于解決消失梯度問題,因為有時候當梯度反向傳播時將變得越來越小,因此權(quán)值的更新也變得越來越小。
卷積神經(jīng)網(wǎng)絡(luò)的發(fā)展歷程
視頻中有一張很大的的現(xiàn)代史的關(guān)于目標識別的圖,針對卷積神經(jīng)網(wǎng)絡(luò)的歷史發(fā)展囊括得非常詳盡,包括 ImageNet 競賽和所有已經(jīng)取得的進步等等,下面我們會仔細介紹一下。
(物體識別的發(fā)展歷程)
AlexNet
卷積神經(jīng)網(wǎng)絡(luò)取得的第一個進步是AlexNet網(wǎng)絡(luò),它是在2012年提出的。這里有一些關(guān)鍵的改進:它提出了ReLu,也就是有助于防止消失的梯度問題;它也引入了dropout的概念,使得每層中神經(jīng)元隨機地打開和關(guān)閉,防止過擬合。如果你的數(shù)據(jù)過于相似,它不能夠?qū)ο嗨频煌膱D像進行分類,因為它過擬合了你的訓(xùn)練數(shù)據(jù)。
因此dropout是一種防止過擬合的正則化技術(shù),通過隨機地打開和關(guān)閉神經(jīng)元,數(shù)據(jù)被迫尋找新的路徑,因為它被迫尋找新的路徑,網(wǎng)絡(luò)能夠更好地泛化;卷積網(wǎng)絡(luò)也引入了數(shù)據(jù)增強的想法,AlexNet或者AlexNet的作者將經(jīng)過不同角度旋轉(zhuǎn)的圖像送入AlexNet網(wǎng)絡(luò),而不是僅僅放入單一角度的,這使得它更好的適用于不同的角度,這是一個更深的網(wǎng)絡(luò),所以他們增加了更多的層,這提高了分類的準確性。
VGG Net
在這之后,就是VGG Net。其中最大的變化是,我們添加了更多的層。
GoogLeNet
此后是GoogLeNet。GoogLeNet卷積核的尺寸不同。我們在同一個輸入中,把它連接在一起。在單獨的層操作,而不是只經(jīng)過一次卷積操作。我們先是乘法,接下來是求和操作。它先是乘一些東西,再乘一些東西,然后把所有這些乘法的輸出連接在一起,進行前向傳播。這使得它更好地學習在每一層中的特征表示。
ResNet
接下來是ResNet,這是在resin之后的創(chuàng)意。如果我們只是保持堆疊層,那么網(wǎng)絡(luò)每次都會變得更好嗎?答案是否定的。如果你增加更多的話,性能會發(fā)生下降。ResNet說沒關(guān)系。每隔兩層進行數(shù)組元素依次相加操作,它只是增加了這個操作,并且改進梯度傳播,從而使得反向傳播更加容易。進一步解決了梯度消失的問題。
DenseNet
這之后是DenseNet。DenseNet 提出將網(wǎng)絡(luò)中每一層的所有塊與其他層連接起來。這是一種更復(fù)雜的連接策略。網(wǎng)絡(luò)被設(shè)計的越來越深。還有一些計算技巧正在被添加到這些卷積網(wǎng)絡(luò)上,比如ReLu或dropout或批量標準化(Batch Normalization),從而提升了性能。另外,我們還在網(wǎng)絡(luò)層之間使用越來越多的連接,但是Hinton說卷積神經(jīng)網(wǎng)絡(luò)存在問題。
卷積神經(jīng)網(wǎng)絡(luò)可以從看到的東西里面,學習最底層的特征。
以狗為例,在最底層學習耳朵的邊和曲率,然后我們沿著層次向上到高層,當我們進入下一層時學到的每一個特征將會變得更加復(fù)雜——第一層是邊緣特征,下一層學到的特征變成了形狀,下一層它們變成更加復(fù)雜的形狀,比如一個完整的耳朵,在最后一層,它們變成非常非常復(fù)雜的形狀,比如狗的整個身體。
這與我們所知道的人類視覺皮層的工作方式非常相似。每當我們看到某些東西的時候,按層次順序激活神經(jīng)元。當我們試圖去識別一些我們所看到的東西時,我們并不知道精確的復(fù)雜的細節(jié)層間的連接機制,但是我們知道在每個層之間都會有層次關(guān)系發(fā)生。
(卷積網(wǎng)絡(luò)為何存在問題)
卷積神經(jīng)網(wǎng)絡(luò)的癥結(jié)在哪?
1. 首先所有下采樣池化層都會失去高精度的空間信息,在高層特征中就好比鼻子和嘴巴之間的空間關(guān)系,僅僅能夠區(qū)分鼻子和嘴巴是不夠的,就好像如果你的鼻子在圖片中的左邊角落,而嘴巴在圖片中的右邊角落,眼睛在圖片的下面,你總不能說根據(jù)這三個特點說這肯定是一張臉。
2. 還有一個空間相關(guān)性——眼睛要在鼻子的上面,鼻子要在嘴巴上面。但是下采樣或池化會失去這種關(guān)系,它們對幾何關(guān)系的理解卷積網(wǎng)絡(luò)在圖像檢測上很糟糕。
針對這個問題,我們的想法是不變的。我們要努力爭取同變性(Equivariance),所以下采樣或池化初衷是一樣的。
(同變性和不變性)
子采樣或池化試圖讓神經(jīng)活動在小變化上保持不變性,所以這意味著無論圖像怎么旋轉(zhuǎn)位置在哪,或者旋轉(zhuǎn)某些圖像,神經(jīng)網(wǎng)絡(luò)響應(yīng)是相同的,也就是說數(shù)據(jù)流是相同的,但最好還是針對同變性,這意味著如果我們旋轉(zhuǎn)一張圖像,神經(jīng)網(wǎng)絡(luò)也要發(fā)生改變。
所以我們需要的是一個更魯棒的網(wǎng)絡(luò)去改變,由于圖像位置的變換,我們需要能對從未見過的數(shù)據(jù)有更好的泛化能力的算法,建立在已訓(xùn)練的網(wǎng)絡(luò)的基礎(chǔ)上。
解讀膠囊網(wǎng)絡(luò)論文
本文所探討的關(guān)于卷積網(wǎng)絡(luò)的論文,內(nèi)容主要講的是一種針對深度神經(jīng)網(wǎng)絡(luò)的像素攻擊,論文的作者發(fā)現(xiàn),通過調(diào)整圖像中一丁點像素,整個網(wǎng)絡(luò)分類變得很糟糕。
例如,對狗的分類本可以進行完美預(yù)測,但只改變這一丁點像素,他們發(fā)現(xiàn)整個網(wǎng)絡(luò)分類效果并不好。無意義的神經(jīng)網(wǎng)絡(luò)容易受到攻擊,如果自動駕駛車輛這些巨大機器飛馳在馬路上,它們使用計算視覺去檢測路況,這些系統(tǒng)是不能夠受到這些像素攻擊的影響,它們必須非常穩(wěn)健。
Hinton介紹膠囊網(wǎng)絡(luò)的想法是——人類大腦必須在比池化更好的方式下實現(xiàn)平移不變性。Hinton假設(shè)大腦有一些模塊,他稱之為膠囊。
這些模塊非常擅長處理不同類型的視覺刺激,以及在一個確定方式下進行編碼。卷積神經(jīng)網(wǎng)絡(luò)指導(dǎo)數(shù)據(jù)如何通過池化操作傳輸?shù)矫總€層。如果我們輸入一張圖像并對它應(yīng)用卷積操作,然后對它進行非線性操作,接著根據(jù)圖像的池化層的輸出來拉取它,在一個確定方向上進入下一層。不過它會沖擊基于池化的下一層中的某些單位,但池化是路由數(shù)據(jù)非常粗糙的方式。
有一個更好的路由數(shù)據(jù)的方式,膠囊網(wǎng)絡(luò)背后基本想法是——這只是一個神經(jīng)網(wǎng)絡(luò)而不是僅僅添加另一個層,所以通常我們添加不同類型的層而不是在一個層上嵌套新層,也就是說我們在層的里面添加另一個層,所以這是個內(nèi)部嵌套層。由此,內(nèi)部嵌套層被稱為一組神經(jīng)元膠囊。
(膠囊網(wǎng)絡(luò))
膠囊網(wǎng)絡(luò)有兩個主要特性:第一是基于層的壓縮,第二是動態(tài)路由。典型的神經(jīng)網(wǎng)絡(luò)只有一個單元輸出被非線性擠壓,所以我們有一套輸出神經(jīng)元,而且基于每個輸出神經(jīng)元,我們給每個神經(jīng)元應(yīng)用非線性而不是給每個個體神經(jīng)元應(yīng)用非線性,組合這些神經(jīng)元到一個膠囊中,然后應(yīng)用非線性到整個神經(jīng)元集。所以當我們應(yīng)用非線性的時候,對整個層而不是對個體神經(jīng)元實現(xiàn)動態(tài)路由,它用矢量輸出膠囊取代了輸出映射檢測器,而且它通過路由和協(xié)議取代了最大化池化。
每個層中的每個膠囊當它們向前傳播數(shù)據(jù)的時候,會進入下一個最相關(guān)的膠囊中,有點像層內(nèi)嵌套層的層次結(jié)構(gòu)樹,這一新架構(gòu)的代價是這個路由算法。
基本上常規(guī)的卷積網(wǎng)絡(luò)的主要不同點是——向前傳播有一個額外的外環(huán),它要在所有單元(至少一個)上進行四個迭代去計算輸出。數(shù)據(jù)流看起來有一丁點復(fù)雜,因為對于每個膠囊來說嵌套在一個圖層中應(yīng)用這些操作,無論是Softmax函數(shù)或者壓縮函數(shù)(squashing function)會讓梯度更難計算。并且模型可能會遭遇較大數(shù)據(jù)集中的消失梯度,這可能會阻止網(wǎng)絡(luò)擴展。
代碼演示和講解
我們可以看到一些代碼是還在更新中的,這篇論文比較新。不過這個代碼是用tensorFlow創(chuàng)建的。
所以在這一層注意只有兩個import(代碼中的關(guān)鍵字)或者numpy(Python基礎(chǔ)包)和tensorFlow。
它是個很干凈的架構(gòu),構(gòu)造了這個膠囊卷積層。這個架構(gòu)有輸出數(shù)目(num_outpurs變量)、內(nèi)核大?。╧ernel_size變量)、類似stride變量的超參數(shù)這個if-else語句。講的是——如果不用路由方案創(chuàng)建這種方法,那就直接創(chuàng)建這種方法。
如果我們有路由方案,我們將從一個有所有膠囊的列表開始,迭代遍歷我們指定的單元數(shù)目,循環(huán)創(chuàng)建一個卷積層就像一個標準tensorFlow卷積層,存儲到這個膠囊變量里面,然后把這個膠囊變量添加到膠囊列表中。最終我們有了這個膠囊層中的所有卷積層。這就是它嵌套的過程。一旦我們有了所有層把它們串聯(lián)在一起,然后用這個novel非線性函數(shù)進行壓縮。
我們來看下這個膠囊實現(xiàn)方法,對于ReLU我們把它添加到一個單神經(jīng)元,但當我們添加一個非線性,得到到一組神經(jīng)元或膠囊,我們發(fā)現(xiàn)這種非線性運行得很好。所以一旦我們有膠囊層,我們可以把它引入到膠囊網(wǎng)絡(luò)中。
我們可以往前看,開始創(chuàng)建我們的架構(gòu),對于每個層有一個primaryCaps變量和一個digitCaps變量,給它們添加一個膠囊層。在每個膠囊層內(nèi)部都有一個嵌套的卷積網(wǎng)絡(luò),那些膠囊中應(yīng)用論文中的novel非線性壓縮函數(shù)。
所以論文中網(wǎng)絡(luò)的最后只是用一個解碼器去重構(gòu)一個來自數(shù)字膠囊層的數(shù)字,之后應(yīng)用了第一套膠囊操作,然后可以重構(gòu)來自該學習表示法的輸入,應(yīng)用一個重構(gòu)損失去提高學習表示法,這就是重建誤差。 隨著時間推移重構(gòu)損失被用來學習表示法和提升該表示法。
代碼演示:https://github.com/llSourcell/capsule_networks
論文原文:https://arxiv.org/pdf/1710.09829.pdf
更多文章,關(guān)注雷鋒網(wǎng)(公眾號:雷鋒網(wǎng)),添加雷鋒字幕組微信號(leiphonefansub)為好友
備注「我要加入」,To be a AI Volunteer !雷鋒網(wǎng)雷鋒
相關(guān)文章:
Hinton的Capsule論文全公開!首發(fā)《膠囊間的動態(tài)路由》原文精譯
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。