研究者の卵の卵

決して頭がいいとは言えない大学生が、日々おもったことや学んだことをつらつら書きます。人工知能や脳科学の話が多くなりそうです。

【論文メモ】"Dynamic Routing Between Capsules"

はじめに

ここ最近、いまさらながらG.Hinton博士の「Capsule」についての勉強をしています。
直接「カプセル」と日本語で指されることが多いこのアイデアは、 現在画像認識を中心としたさまざまなタスクで主流になっている、 Convolutional Neural Network (CNN)の弱点を改善するためにHinton博士が考案したものです。

まだ完全に理解したわけではないのですが、特に難しい理論でもないので、 理解出来たらChainerで試しに実装して公開してみるつもりです。
とりあえず現時点でちゃんと理解している部分だけをシェアしていきたいと思います。

CNNに対するHinton博士の文句

カプセルの存在意義を知るために、CNNの構造や特徴についておさらいしておく必要があるでしょう。
CNNは、1970年代に日本の研究者である福島邦彦先生が考案した「ネオコグニトロン」が源流になっているといわれています。
当時盛んに研究されていた「パーセプトロン」による単純なニューラルネットワークを用いたパターン検出は、 入力に存在するパターンの位置が微妙にずれたり、わずかに回転するだけで出力が変わってしまう非常にデリケートなものでした。
そこを解決するために考案されたネオコグニトロンは、特徴抽出を行うS層(CNNでは畳み込み層)と、その特徴量を一定の範囲でまとめるC層(CNNではプーリング層)を幾段も重ねることで、 パターンの位置変化に対する応答の不変性を獲得したモデルだったのです。

現在は少しずつその姿を変え、畳み込みニューラルネットワークとして機械学習の分野を席捲しているのです。

では、Hinton博士はそんなCNNのどこに対して苦言を呈しているのでしょうか?
それは、CNNではその処理によってオブジェクト間の空間的な関係の情報が失われることです。
これをもう少し詳しく説明してみましょう。

CNNの強みの一つは、さまざまな訓練データを繰り返し入力することで、 畳み込み層の各フィルタがそれぞれ、物体を認識するために重要な特徴量に反応するように自動的に学習していく点にあります。
例えば、手書き数字を認識するためによく訓練されたCNNのフィルタは、それぞれ「上のほうの曲線」とか「下の方の直線」といった形に反応するようになり、 その反応によって得られた特徴のマップが、さらに上位の層で処理されていくのです。
しかし、上位層に送られる前にこの特徴マップには「プーリング」の処理が入ります。
これによって、その特徴の位置が微妙に変化しても、同じような反応ができるようになっているのですが、 言い換えれば、「この特徴はこういうところになくてはならない」というマップの位置的な厳密性を下げる処理をしているのです。
これを多層にわたって繰り返していくのがCNNなので、結果、下の画像のような問題が起きてしまいます。

f:id:arthurs_kurt:20180929171445p:plain
顔であるかどうかを判定するためによく訓練されたCNNは、左のような画像でさえ顔であると認識してしまうおそれがある

「目に反応するフィルタ」も「口に反応するフィルタ」も共に上位層のプーリング処理によって位置的な厳密性が削られるので、 その位置関係はまったく考慮されずに情報が伝達してしまうわけです。

つまり、
オブジェクトがあるかないかや、どのあたりにあるべきかに対してはある程度厳密だが、オブジェクト間の位置関係についての重要な情報は無視されている
という点が、Hinton博士の呈したCNNに対する苦言です。

これは「学習に大量のデータが必要である」というCNNのよく知られた特徴を説明しているものでもあります。
オブジェクト間の位置関係が無視されているということは、まっすぐ向いている顔と傾いた顔をどちらも「顔」として認識するためには、 学習データにもまっすぐ向いた顔と傾いた顔が必要になるということです。
これは人間の持つ視覚機能とは大きく異なっていて、人間のパターン認識アルゴリズムを参考にしたニューラルネットワークらしからぬ欠点だといえるでしょう。

カプセルによる解決

カプセルは、こういった情報を失いやすいスカラー値の変わりに、ベクトルを保持する役割を持っています。
スカラー値は大きさしか持たないが、ベクトル値は大きさと向きを持つ。この当たり前の性質が、カプセルによるネットワークに大きな強みをもたらしてくれます。

従来のニューラルネットワークは、対象とする特徴が入力内に「どれぐらいあるっぽいか」をスカラー値で表現していました。
しかし、それでは上記のような問題がいくつか発生してしまいます。
カプセルは、その「どれぐらいあるっぽいか」をベクトルで表現するものです。
「あるっぽさ」をベクトルの長さによって表現し、それがどのような角度で存在しているのかをベクトルの向きによって示しているのです。

コンピュータ上で何かしらの画像を描画する際、アプローチの仕方にもよると思いますが、Instantiation Parameterというものが必要になるそうです。
ここでは、直訳して実体化パラメータとしておきましょうか。
例えば、「三角形の実体化パラメータ」は、x座標とy座標と、角度という3つのパラメータから構成されています。
この3つのパラメータが与えられれば、何をどこにどう描画するかを決めるには十分です。
さらに、「長方形の実体化パラメータ」が、三角形の実体化パラメータとの間にある一定の関係性を持っているとき、その2者をまとめて「家のパラメータ」とか「ヨットのパラメータ」とすることができるはずです。
カプセルによるニューラルネットワークは、 低レイヤーにおいてはこの三角形・長方形のパラメータを、高レイヤーにおいては家・ヨットのパラメータを それぞれカプセルという形で、 与えられた画像入力から求めるタスクを行うものであると言い換えることができるでしょう。

そしてこのカプセルネットワークを学習するということはすなわち、 各カプセルが必要なオブジェクトに反応するようになり、低層から高層へ、正しいカプセル間の結合が形成されることなのです。

カプセルの出力

では、ようやく具体的な理論に移っていこうと思います。

前項では、「オブジェクトがあるっぽさ」と書きましたが、具体的な言葉を使うと「確率」です。
つまり、0~1の間の値に収まる必要があるので、Hinton博士はSquashing関数という活性化関数を提案しています。
 { \displaystyle
\boldsymbol{v}_j = squash(\boldsymbol{s}_j) = \frac{\|\boldsymbol{s}_j\|^2}{1+\|\boldsymbol{s}_j\|^2} \frac{\boldsymbol{s}_j}{\|\boldsymbol{s}_j\|}
}
これを行うことで、短いベクトルは0に、長いベクトルは1に収束するように制限をかけます。 ここで \boldsymbol{s}_jは、 l+1番目の層内のカプセル jへの入力であり、 \boldsymbol{v}_jはそのカプセルの出力となるベクトルを表します。

では、この \boldsymbol{s}_jがどのように決定されるかというと、 l層目のカプセル iの出力 \boldsymbol{u}_iから求められます。
 l層目のカプセルの次元数から l+1層目のカプセルの次元数への変換には、重み行列 \boldsymbol{W}_{ij}が用いられます。
カプセル iの出力は単純に
 { \displaystyle
\hat{\boldsymbol{u}}_{j|i} = \boldsymbol{W}_{ij} \boldsymbol{u}_i
}
と求めることができます。
カプセルネットワークの学習においては、まず1つ、この重み行列を学習します。

さらに、この \hat{\boldsymbol{u}}_{j|i}から、  { \displaystyle
\boldsymbol{s}_j = \sum_i c_{ij} \hat{\boldsymbol{u}}_{j|i}
}
として、 \boldsymbol{s}_jを求めます。
このとき、 c_{ij}は、結合強度とよばれるパラメータで、ある低レイヤーカプセルの存在(たとえば鼻)が、高レイヤーのカプセル(たとえば顔)の存在に影響しているか否かを表現するものです。
この結合強度もカプセルネットワークの学習によって自動的に調整されるパラメータであり、その調整が「Dynamic Routing」です。

まとめると、 l番目の層のカプセル iから l+1番目の層のカプセル jへのベクトルの流れ方は、

  1.  { \displaystyle \hat{\boldsymbol{u}}_{j|i} = \boldsymbol{W}_{ij} \boldsymbol{u}_{i} }
  2.  { \displaystyle \boldsymbol{s}_j = \sum_i c_{ij} \hat{\boldsymbol{u}}_{j|i} }
  3.  { \displaystyle \boldsymbol{v}_j = squash(\boldsymbol{s}_j) }

となります。

カプセルネットワークの学習

カプセルネットワークの学習において調整されるパラメータは、ベクトルの次元変換時の重み行列と、 カプセル間の結合強度の2つであると説明しました。

重み行列 \boldsymbol{W}_{ij}は通常のニューラルネットワークにおける重みパラメータと同様のアルゴリズムで学習されます。
ここでは、Dynamic routingによる c_{ij}の学習を解説していこうと思います。

が、これも実は非常に簡単なアルゴリズムによるものです。
まず、結合強度 c_{ij}は、ソフトマックス関数によってあらわされます。
 { \displaystyle
c_{ij} = \frac{exp(b_{ij})}{\sum_k exp(b_{ik})}
}
ここで b_{ij}は、カプセル iとカプセル jが結びつくべきである確率を表しています。
つまり、カプセル iと次の層の各カプセルとの結合強度の和は1になるわけですね。
 c_{ij}の更新のためには、厳密には b_{ij}を更新することになるのですが、 ここでも新たに「合意(agreement)」という概念が表れます。
合意とは、「カプセル iとカプセル jを結合していいかどうか」を表す尺度です。

この値は、単純に \boldsymbol{v}_j \hat{\boldsymbol{u}}_{j|i}スカラー積によってあらわされます。
スカラー積、つまり内積は、2つのベクトルの長さの積に、さらにその2つのベクトルが成す角による余弦をかけて求められる値なので、 合意は \boldsymbol{v}_j \hat{\boldsymbol{u}}_{j|i}の類似度と解釈して間違いないと思います。

誤差逆伝播のようなアルゴリズムによって更新される \boldsymbol{W}_{ij}のような量とは違い、 この結合荷重はヘッブ則に基づく更新を行っているようですね。
 jの発火に iが貢献しているとき(=2者間の合意が大きい時)に更新しているということです。

ここで、前項のように学習の流れもまとめておきましょう。
ただし、学習開始前にあらかじめすべての i jの組み合わせについて b_{ij} \leftarrow 0としておきます。

  1.  { \displaystyle \boldsymbol{c}_i \leftarrow softmax(\boldsymbol{b}_i) }
  2.  { \displaystyle \boldsymbol{s}_j \leftarrow \sum_i c_{ij} \hat{\boldsymbol{u}}_{j|i} }
  3.  { \displaystyle \boldsymbol{v}_j \leftarrow squash(\boldsymbol{s}_j) }
  4.  { \displaystyle b_{ij} \leftarrow b_{ij} + \boldsymbol{v}_j \cdot \hat{\boldsymbol{u}}_{j|i} }

疑似言語方式で書きましたが、これを繰り返すことで正しく c_{ij}が更新されていきます。

さいごに

メモと言いつつかなり長くなってしまったことをお詫びしたいです。

まだ論文の前半を読んだにすぎませんが、この先は学習の方法等について記したものなので、 実装について書くときに一緒に説明してみようと思います。

脳のカラム構造と、情報処理の体系が似ている点と、 パラメータの更新がシナプス可塑性・ヘッブ法則に基づいている点で、非常に興味深いアルゴリズムだと思います。
回転している物体を認識するために、学習データに回転している画像を含ませる必要がない可能性があるという点においても、かなり希望を感じられるものですね。

初学者ですので、ご意見等、積極的にコメントいただけるとうれしいです!