打開 Capsule Net 的黑箱(一)
Capsule Net 是 Hinton 近期提出的一個極具創新性的工作。Capsule 的想法最早在2011年就已經出現,近年來,Hinton在諸多公開場合表示Capsule Net 的提出將會在某種程度上取代深度卷積神經網路。隨著 Hinton 公開了自己發表在 NIPS 2017 上的最新論文: 「Dynamic Routing Between Capsules」,第一個真正意義上的 Capsule Net 出現在人們的視野當中。
關於 Capsule Net 的討論已經數不勝數,在做過一定量的數值實驗後,我們決定用2-3篇連載的推送,通過直觀的表達和嚴謹的數值實驗來幫助大家了解仍處於初級階段的 Capsule Net。
Hinton 和 Christopher 在 Google 展示四面體實驗
1
CNN的「肖像」簡筆畫
卷積神經網路示意圖
一個傳統意義下的卷積神經網路(Convolutional Neural Network, CNN)如上圖,主要由以下三個部分構成:
卷積層(Convolutional layer),其作用是對輸入作線性變換;
Convolutional Layer 示意圖
激活層(Activation function),其作用是提供非線性變換,提高網路的表達能力;
幾種 activation functions
池化層(Pooling layer),其作用在於降低輸入信號的空間維度並保留主要的信息。
Pooling Layer 示意圖
卷積神經網路和普通的神經網路一個重要的區別就在於卷積層:卷積層保證相鄰兩層之間的連接是稀疏的,從而大大減少參數數量。空間維度的遞減則使得CNN可以建立一個層次性的表達:底層主要捕捉到圖像的邊緣,紋理、色彩等簡單信息,而頂層則更多的包含語義信息。很多實驗都表明,卷積神經網路是一個非常好的圖像的建模方式。
CNN一個很重要的特性就是其對於平移變換的不變性(invariance)。具體來說,如果CNN將一張圖片識別為貓,那麼將圖片中的貓平移若干個像素,一般情況下,CNN仍然會正確地將其識別為貓。這是CNN能夠在ImageNet這種大數據上成功的基礎之一。
CNN的平移不變性
而 CNN 的平移不變性的一個重要來源就是池化(Pooling)操作。
池化的提出主要基於以下的假設:圖片本身可以看成一個分段線性的函數,這意味著其包含這大量冗餘的信息,在空間位置相鄰的特徵也是相似的,可以通過平均或者取最大值的方式來得到更簡練和抽象的表示。
在進行多次池化操作後,不同位置的特徵都會被統一到最終的表示上,這意味著空間信息在池化操作上被大量捨棄了。
2
CNN:成功背後的隱患
雖然 CNN 在計算機視覺領域取得了巨大的成功,但其成功的背後,也隱藏了一些隱患。其中之一就是卷積神經網路所提取的特徵通常不能表達不同特徵(或個體)在圖像中的相對位置關係。
上面的圖片中,右邊的圖片是由左邊的圖片變換而得到的。當人類進行識別時,通常不會將右邊的圖片識別為一張人臉,而對於卷積神經網路而言,上圖中的左右兩張圖幾乎沒有區別。
要理解卷積神經網路造成這一隱患的原因,我們需要大致聊一聊卷積神經網路的工作原理。
在卷積神經網路中,卷積層充當著特徵提取器的重要角色。通常來說,越底層(越靠近輸入層)的卷積層提取的是越低層次的特徵。比如,第一個卷積層提取的通常是邊緣和顏色信息。
卷積層可視化結果
而更高層的神經網路層則會基於這些低層次的特徵組合產生更抽象的、具有語義的高級特徵。在最頂層的全鏈接層則會將這些抽象的高級特徵進行線性組合,並基於此進行預測或分類決策。
由於底層卷積層提取的通常是非常局部的信息,加之池化層導致的空間信息丟失,卷積神經網路所提取的特徵通常不能表達不同特徵(或個體)在圖像中的相對位置關係。而這種相對位置關係,在人類做圖像識別的過程中通常是非常重要的。
The pooling operation used in convolutional neural networks is a big mistake and the fact that it works so well is a disaster.
Hinton
CNN 另一個主要缺點,便是缺乏對旋轉與對稱等變換的處理能力。而旋轉與對稱以及前面提到的相對位置,都與坐標系有關。錯誤的坐標系,通常會對於我們的認知產生誤導,使我們產生認知錯覺。
看到上面這幅圖片,當被問道這是那個洲時,也許你的第一反應會是 澳洲 。 這是由於潛意識中,我們大多數人會認為坐標系是橫平豎直的。
而當你改變坐標系以後,你會很容易地發現這其實是非洲!仔細比較澳洲和非洲的地圖,你會發現它們其實有非常大的區別。
有的讀者可能會覺得,既然人也會產生同樣的錯覺,那機器做不到也情有可原。但是,請注意,當我們畫出上圖中的坐標系之後,人腦能夠快速地分辨出旋轉之後的圖想信息,而對於CNN而言,這仍是一個巨大的挑戰。為了處理這些變換,一般需要更大的處理能力(如更多的參數)或者更多的訓練樣本。
目前,我們可以通過數據增強(Data Augmentation)等方法來提高CNN的泛化能力。但是如果測試樣本中不同的變換太多,或者是數據本身的複雜性增加(比如從2D到3D),為了達到良好的性能,我們需要的增強樣本數量可能會以指數級別增加(比如每增加一個變換的維度我們可能需要增加一倍的增強樣本)。即使硬體計算能力的快速提升能夠減少深度卷積神經網路模型的訓練時間,但是本質問題並沒有得到解決。
3
Capsule Net 的起源
Hinton 曾在多次演講中提到,Capsule Net 的提出,受到了包括 神經科學(Neuroscience)、計算機圖形學(Computer Graphics)等多個領域知識的啟發,在這一小節中,我們主要從計算機圖形學的角度,從直觀上來解釋 Capusle Net 提出的靈感。
Hinton曾說,Capsule Net 的提出深受計算機圖形學(Computer Graphics)研究的啟發。計算機圖形學研究的基本問題之一,便是進行 3D 物體建模與可視化。
計算機圖形學建模的過程,是通過一系列的 3D 幾何數據點,構建一種內在聯繫的分層信息表達。由於計算機圖形學所建的模型通常需要進行360 度全方位的展示,在建模的過程中,研究者們通常需要考慮到物體的相對位置、尺度與朝向等問題。
Bunny 的 3D 模型
在計算機圖形學中,當我們存儲一個物體時,除了存儲 3D 點雲與它們間的鏈接關係,我們還有一個姿勢矩陣(Pose Matrix)來存儲物體間的相對位置以及當前物體的尺度與朝向。專用軟體(如Maya)可以通過這些信息對物體進行360°的可視化。這個可視化的過程,在計算機圖形學中稱為「渲染(Rendering)」。
受到圖形學的啟發,Hinton 提出了大腦在視覺處理過程中做的可能是類似的過程,他將這個過程稱為 「Inverse Graphics」。具體而言,Hinton 認為,大腦將眼睛接收到的視覺信息進行解構,對我們周圍的世界進行分層表示,並試圖將其與已經學習的模式及存儲在大腦中的關係相匹配(有點像渲染的逆向過程)。同時,Hinton 認為大腦中,這種關於物體的分層表示不會受到觀察角度的影響。
Hinton 認為在神經網路的設計過程中,應該將這種關於物體相對位置關係以及朝向的信息嵌入其中,並保證這部分信息在訓練的過程中得以保留。當這些信息嵌入到學習到的關於數據的內在表達中後,我們所得到的模型將會很容易地處理關於旋轉等問題。這其實相當於從一個不同的視角來觀察物體,就像是Pose Matrix 記錄的 3D 物體間的相對位置關係以及朝向信息允許我們進行360°可視化一樣。而很遺憾,在CNN的設計中並沒有考慮到這一點。
從不同角度觀察NORB數據集中的三維物體
4
Capsule Net 想解決的問題
意識到CNN 的潛在隱患,Hinton 提出了Capsule的概念,試圖解決這些問題。(當然在Hinton的概念里,Capsule的內涵應該更加豐富)。
在卷積神經網路中,每個神經元採用的是 scaler in scaler out 的模式,也就是,輸入和輸出都是一個數字,而這個數字的大小就是這個神經元的激活程度。因而,在卷積神經網路中,單個神經元能表達的內容是十分有限的。
與卷積神經網路不同,Capsule Net 採用的是vector in vector out,Capsule用一組參數,即一個向量來作為表達的基本單元。 在Capsule Net 中,每個 Capsule是對一個對象的一組「實例化參數」。
什麼是實例化參數呢?簡單來說,可以認為這一組向量參數表示了圖像中出現的特定實體的屬性,如姿態(位置、大小、朝向),紋理,形變等。
使用向量來表達的最大優點在於它可以描述的信息大大增加。對這個向量的一種設想就是,可以使用其絕對長度作為表達這個對象存在的可能性(概率),用向量中每個維度的大小(即其方向)來描述對象的特定屬性。通過這種方式,capsule就可以完整的描述一個物體或者物體某部分的特徵。
另外,Hinton 認為目前的深度學習進行圖像識別過度依賴于海量的標記數據,這與人類識別物體的情形有較大的出入--人類通常能通過少數的訓練樣本以及一定的推理能力做出比較準確的識別。
比如,只給你看一張柯基的照片
你也能識別出下圖中所有的柯基,而且,你還能知道其中有一張是混入其中的喵星人。
這也是Hinton希望通過 Capsule 達到的目的之一:通過學習出更有意義的關於物體的表達,從而減少訓練所需的樣本數量。
5
總結
這篇推送中,我們簡單地從直觀的角度介紹了 Capsule Net 提出的動機以及它希望解決的問題。在下一篇 Capusle 系列推文中,我們將結合 Hinton 發表在 NIPS 2017 上的論文[1],具體討論他們是怎樣實現這一設想。我們會通過具體的實驗結果展示這一初代產品的實際效果。最終的代碼實現會通過Github跟大家分享。
Reference
[1] Sabour, S., Frosst, N., & Hinton, G. E.. "Dynamic Routing between Capsules." NIPS, 2017.
[2] Pechyonkin, M.. "Understanding Hinton』s Capsule Networks." Medium, 2017.
[3] Hinton, G. E.. "What is wrong with Convolutional Neural Nets ?" Talk at MIT, 2017.
[4] Hinton, G. E., Krizhevsky, A., & Wang, S. D.. "Transforming Auto-encoders." In International Conference on Artificial Neural Networks, 2011.
[5] Images in this post mostly come from the Internet.
- END -