1. 程式人生 > >一文讀懂Hinton最新Capsules論文

一文讀懂Hinton最新Capsules論文

Capsule:實體的視覺數學表徵

深度學習,其實就是一系列的張量變換

從影象、視訊、音訊、文字等等原始資料中,通過一系列張量變換,篩選出特徵資料,以便完成識別、分解、翻譯等等任務。

譬如原始資料是 28 x 28 的黑白影象,每個黑白畫素可以用 8 個 bits 來表達,那麼這張黑白影象就可以用 28 * 28 * 8 的張量來表達,張量中每個元素的取值是布林值,0 或者 1。

又譬如想識別在這些黑白影象中,是否包含從 0 到 9 的手寫體數字,那麼深度學習的傳統做法是,輸出一個 10 維向量,( x_{0}, x_{1}, ... x_{9} ),其中每個元素 x_{i} 的取值範圍是 [0, 1.0],表示出現相應數字的概率。

例如,輸出的向量是 ( 0.2, 0.1, 0.7, 0.9, 0.2, ..., 0.1 ),那麼意味著,影象中出現數字 2 的概率是 70%,出現數字 3 的概率是 90% 等等。

Capsule 的創新,在於改變了輸出,不是輸出一個向量,而是輸出 10 個向量。每個向量分別表達某個數字的若干個屬性。

老爺子的論文中,輸出的是十個 16 維向量,( x_{i, j} ) 其中 i = 0 ... 15, j = 0, ... 9。也就是說,老爺子認為每個手寫體數字包含 16 個屬性,包含幾個圓圈,幾個彎勾,幾個折角,幾根橫豎,彎勾折角的大小,筆劃的粗細,整個字型的傾斜度,等等。

Capsule 的想法,不難理解。但是仔細想想,存在以下幾個問題。

  1. 傳統的影象識別的解決方案,是把識別問題轉化為分類問題。這個方法已經足以解決識別問題。實體的視覺數學表徵 capsule 的意義是什麼?

  2. 如何證明 16 維的 capsule 向量,能夠作為手寫體數字的視覺數學表徵?為什麼不是 32 維或者更多?

  3. Capsule 向量中的元素 x_{i},與實體的屬性之間的關聯,是機器自動學習出來的。但是是否可以被人為預先強制指定?

  4. 低階 capsule 與高階 capsule 之間的關聯關係,是機器自動學習出來的,還是可以被人為預先強制指定?

Capsule 的意義

老爺子試圖用 capsule 向量,囊括實體的所有重要屬性。如果某個實體的所有屬性,都在影象中出現,那麼可以確認,這個影象一定包含這個實體。所以他把這個向量,稱為實體膠囊 capsule。


一個手寫體數字,不管字型是否端正,筆劃是粗還是細,圓圈和彎勾是大還是小,都用同一個膠囊 capsule 來表徵。

一個輪胎,不管拍攝的角度如何,不管是正圓還是橢圓,不管輪轂是什麼式樣,也都可以用同一個膠囊 capsule 來表徵。

說得抽象一點,capsule 就是實體的視覺的數學表徵。

想起了詞向量,word vector,詞向量是文字詞彙的數學表徵。

能否把 capsule 和 word vector 統一起來,不管實體的表達是影象還是文字,都可以用同一個數學向量來表徵?

論文中沒有明說,但是老爺子多半心懷這個想法。

說得更直白一點,capsule 作為視覺數學表徵,很可能是為了把視覺,聽覺、閱讀的原本相互獨立的數學向量,統一起來,完成多模態機器學習的終極目標。

重構影象:驗證 Capsule 的猜想 

假設 capsule 包含了某個實體的所有重要視覺屬性,那麼理論上來說,應該可以從 capsule 還原包含該實體的影象。

為了證明這個猜測,論文使用了一個神經網路,把 capsule 向量作為輸入,重構手寫體數字影象並輸出。

實驗結果證明,capsule 確實能夠重構出正確的手寫體數字影象。

而且更讓人驚奇的是,這些 capsules 中的某些屬性,也就是 ( x_{i, j} ), i = 0...15,j = 0...9,其中的幾個 x{i},具有明確的物理意義,譬如手寫體字型大小寬窄傾斜度,以及字型中彎勾圓弧等區域性特徵的大小位置等等。

為什麼每個手寫體數字只包含 16 個屬性,而不是 32 個或者更多屬性?

16 個屬性,已經足以正確地重構手寫體數字影象。32 個或者更多屬性,無非是表達方式更細膩而已,這個問題不太重要。

Dynamic Routing:從原始資料中尋找實體屬性的存在證據

Capsule 向量的元素 x_{i},與實體的屬性之間的關聯,是人為確定的,還是機器自動對應的?

根據論文的描述,關聯關係是機器自動對應的,所以在 capsule 向量 ( x_{i} ), i = 0...15 中,某些 x_{i} 的物理意義比較明確,其它 x_{i} 的物理意義卻可能難以解釋。

假如人為強制指定 capsule 中各個 x_{i}  的物理意義,換句話說,人為強制指定 capsule 向量元素 x_{i} 與實體屬性之間的關聯關係,是否會有助於提高識別精度,降低訓練資料的數量?

回答這個問題之前,需要先了解的 capsule 向量中 ( x_{i} ) 的取值,是怎麼來的。

前文說到,深度學習其實就是一系列的張量變換。通過一系列張量變換,從影象、視訊、音訊、文字等等原始資料中,篩選出特徵資料,以便完成識別、分解、翻譯等等任務。

論文使用了兩層卷積神經網路,對原始黑白照片,也就是 28 * 28 * 8 的原始張量,用兩層卷積,完成一系列張量變換,轉變成新的張量 ( x_{attr, lon, lat, channel} ) ,attr  = 0 ... 7, lon = 0 ... 5, lat = 0 ... 5, channel = 0 ... 31。

這個新張量中的 ( x_{attr} ) 是初級 capsule,表達原始影象中值得注意的特徵。其中 attr 代表初級 capsule 的屬性,維度為 8。

新張量中的 ( x_{lon, lat} )  表示 capsule ( x_{attr} ) 在原始影象中的方位。經過張量變換後,28 * 28 的原始影象,被縮略為 6 * 6 個方位。( x_{channel} ) 是頻道,類似於多機位拍攝同一個場景,全面表達 capsule 在原始影象中的視覺特點,總共有 32 個頻道。

在新張量中,總共有 lon * lat * channel = 6 * 6 * 32 = 1152 個初級 capsule ( x_{attr} ) 。換句話說,經過一系列張量變換,從原始影象中,篩選出了 1152 個值得注意的影象特徵。

高階 capsule 是前文說的十個手寫體數字的 16 維屬性向量,即 ( x_{attr, class} ), attr = 0 ... 15, class = 0 ... 9。

想識別原始影象中,是否包含手寫體數字 3,也就是 class = 2,只需要把 1152 個初級 capsules,逐一與高階 capsule 向量 x_{*, 2}  做比對。

如何做比對呢?先做一次線性變換,把 8 維的初級 capsule,變換成 16 維的初級 capsule。然後計算 16 維的初級 capsule 與 16 維的高階 capsule 之間的餘弦距離,也就是兩個向量之間的點乘。

從每個高階 capsule 出發,在低階 capsules 中尋找它存在的證據,這個過程,就是 Dynamic Routing。

如果某一個高階 capsule 中每一個屬性,都能在 1152 個初級 capsules 中,找到 “對應的” 一個或多個 capsules,那麼就證實了高階 capsule 中的這個屬性,確實在影象中存在。

如果某一個高階 capsule 中的全部 16 個屬性,都能在 1152 個初級 capsules 中,找到存在的證據,那麼就認定這個高階 capsule 在原始影象中存在。

如果有多個高階 capsules,都能在 1152 個初級 capsules 中,找到各自存在的證據,那麼就認定在原始影象中存在多個高階 capsules。

Capsule 與先驗知識

回到前文的問題,假如人為強制指定 capsule 中各個 x_{i}  的物理意義,換句話說,人為強制指定 capsule 向量元素 x_{i} 與實體屬性之間的關聯關係,是否會有助於提高識別精度,降低訓練資料的數量?

假如人為強制指定 capsule 中某個 x_{i} 用於表達影象中是否存在圓圈,那麼需要改變訓練資料。

現在的訓練資料,由輸入和輸出一對資料構成。輸入資料是原始照片,輸出資料是標籤,說明原始照片中含有哪些數字。

如果要人為指定手寫體數字的 capsule 中的元素 x_{i},那麼需要改變訓練資料。譬如輸入是原始照片,輸出的標籤,是說明這張照片中是否有圓圈。

改變訓練資料有什麼意義?一個可能的意義是 transfer learning

一張輪胎的照片中,也包含圓圈。用現在的方法,輪胎的照片無助於手寫體數字的識別,但是用  transfer learning,可以用輪胎的照片,來訓練機器識別圓圈,然後把識別圓圈的演算法模組,融合到手寫體數字的識別系統中。

至於用這種方法,是否能夠提高識別精度,降低訓練資料的數量,需要做實驗來驗證。

Parse Tree:實體特徵的多層次分解,及與先驗知識的融合

在原始影象中,識別手寫體數字,這個實驗比較簡單。

假如設計一個難度更高的實驗,在原始影象中,識別自行車。自行車由兩個輪胎,兩個腳踏板,一個龍頭和骨架等等構件組成。

要完成這個實驗,需要先識別原始影象中,是否存在輪胎、腳踏板、龍頭和骨架等等構件。然後識別這些構件之間的位置關係。

老爺子提議,用 Parse Tree 來分解整個識別任務,從原始影象,到影象特徵,到不同構件,到自行車的識別。

Parse Tree 的生成,當然可以完全靠機器,從大量訓練資料中自動學習。而且是一氣呵成地完成各個環節,從原始影象,到影象特徵,到不同構件,到最終的自行車識別。

但是如果融合先驗知識,人為預先指定 Parse Tree 的結構,或許有助於把識別自行車的問題,拆解為若干子問題,分別識別輪胎、腳踏板、龍頭和骨架等等構件,然後再把子模組整合成為自行車的識別系統。

當然,把大問題拆解為若干子問題,需要針對各個子問題,準備各自的訓練資料。

這樣做是否有利於提高識別精度,降低訓練資料的數量,也需要做實驗來驗證。