Distill のこの記事が扱うのは、ニューラルネットの重みを見たときに現れる、ちょっと変な“見た目の法則”です。
普通、重みって数字の集まりなので、ふつうに眺めてもピンときません。ところが、ImageNet で訓練した一般的な vision model の最後の convolutional layer(畳み込み層の最後のほうの層)の重みを可視化すると、なぜか水平な帯状パターンが出てくることがある。これを著者たちは weight banding と呼んでいます。
正直、最初に見つけたら「バグでは?」と思うのはかなり自然だと思います。実際、本文でもそんな驚き方が書かれています。
でもこれは単なる見た目の偶然ではなく、かなり安定して現れる現象らしい。そこが面白いところです。
この記事では、重みの可視化に NMF を使っています。
NMF は Non-negative Matrix Factorization の略で、ざっくり言うと「たくさんの数値を、意味のありそうな少数の成分に分解して眺めやすくする手法」です。
ここで大事なのは、単に数字を並べるのではなく、空間的なパターンとして見ようとしている点です。
画像モデルの最後の層では、各 neuron が前の層のどの位置・どの channel に反応するかが重みに埋まっています。これをうまく可視化すると、帯のような構造が浮かび上がるわけです。
著者たちはこれを、生物の組織を顕微鏡で見たときに筋肉や上皮組織がぱっと見で区別できる感覚にたとえています。なるほど、言い得て妙です。
「数式の世界でも、見た目の秩序が急に顔を出す」ところに、Distill らしい楽しさがあります。
結論から言うと、global average pooling を使っているモデルの最後の convolutional layer でよく起きます。
記事で例に出ているのは、たとえば以下のようなモデルです。
これらでは、最後の畳み込み層の重みを NMF で見ると、横縞がかなりはっきり出るそうです。
一方で、AlexNet ではこの現象が見られません。
著者は、AlexNet は最後の convolutional layer の後に global average pooling を置いていないからだと説明しています。つまり、空間的な位置の情報を最後まで比較的そのまま使える構造です。
ここはかなり重要で、banding は「単にCNNだから起きる」のではなく、最後に空間情報をどう潰すかに強く関係しているようです。
横縞ということは、モデルが横方向の位置にはあまりこだわらず、縦方向の位置を強く表現している、という読み方ができます。
著者たちの仮説はこうです。
weight banding は、画像の中の大きめの構造についての情報を、プーリングで失われる前に何とか残そうとする学習結果ではないか
これはかなり納得感があります。
ImageNet の画像って、上下方向に意味があることが多いですよね。たとえば空は上、地面は下、顔なら目は上のほう、といった具合です。モデルがそういう“雑だけど効く”位置情報を学んでいるなら、縦方向に敏感になるのは自然です。
個人的には、この説明はかなり好きです。
CNN は「どこに何があるかに鈍感」なイメージを持たれがちですが、実際には必要なときは空間位置もちゃんと使う。その痕跡が重みの帯として見えてくる、というわけです。
この記事の後半は、かなり実験的です。
著者たちは、簡略化した vision network を作り、アーキテクチャを1つずつ変えて banding の出方を調べています。
このモデルは、いくつかの convolution group と L2 pooling を持ち、最後に global average pooling を通してから fully connected layer に入る構成です。
このシンプルなモデルでも、最後の layer にかなりきれいな banding が出ます。
しかも、直前の層にも似た傾向が見えることがあるらしい。つまり、banding は“最終層だけの特殊な事故”ではなく、そこに向かってじわじわ育っていく感じです。
これはとても良い sanity check です。
入力画像を 90度回転して学習させると、banding も縦方向に変わりました。
これはかなり強い証拠で、banding が単なる数値的な癖ではなく、データセットに含まれる空間的な偏りと関係していることを示しています。
要するに、画像の「上下らしさ」を学んでいたから、画像を回すとその学びも回るわけです。
こういう結果は地味に見えて、かなり大事です。モデル内部の現象が、現実のデータの構造とつながっているとわかるからです。
次に、最後の fully connected layer に入る前の global average pooling を外します。
すると、banding はかなり弱まります。代わりに、fully connected layer は空間位置を全部見られるので、モデルは位置ごとの違いをそのまま使えるようになります。
ただし、代償としてパラメータ数が大幅に増え、overfit(訓練データにだけ強く合わせすぎること)もしやすくなります。
つまり、banding を消せば万事OKという話ではなく、効率よく情報を圧縮するための副作用として banding があるのでは、という見方が強まります。
これはかなり面白い実験です。
横方向の位置情報は捨て、縦方向だけは残すようにします。すると、最後の層の banding は消えますが、少し前の層でまた banding が見えるという結果になりました。
ここからわかるのは、banding は「この層だけ見れば終わり」という話ではなく、情報をどこでどう圧縮するかによって、より前の層に押し出されたり、別の形で現れたりすることです。
モデル内部で情報のたらい回しが起きている感じがして、ちょっと生々しいです。
著者たちは、ほかにもいろいろな改造を試しています。たとえば:
こうした変更をしても、banding が残るケースが多かったとのことです。
これは地味に重要です。
banding は「この1つの部品が悪いから起きる」という単純な現象ではなく、空間情報をどう保持し、どう捨てるかという、もっと上流の設計思想に根ざしている可能性が高いからです。
簡略モデルだけだと偶然かもしれないので、著者たちは実際に InceptionV1 / ResNet50 / VGG19 に対しても同じ介入をしています。
やったことは主に2つです。
結果として、ほとんどのモデルで同じ傾向が確認されたそうです。
つまり、banding は簡略モデルの特殊現象ではなく、実際の一般的な vision model でも再現される構造的な現象だと言えます。
ただし、VGG19 は少し例外的で、pooling を外しても期待したほど banding が消えなかったとのこと。
ここは「全部きれいに説明できるわけではない」という点で、むしろ誠実です。ニューラルネットの内部現象は、きれいな理論一本で完全には割り切れないことが多いので、この“例外”は自然だと思います。
個人的に一番面白いのは、weight banding が「モデルの中にある、見えない設計判断の痕跡」みたいに見えることです。
学習済みモデルの重みって、ふつうはただの数字の塊です。
でもそれを丁寧に可視化すると、
が、ぼんやりではなく構造として見えてくる。これはかなりワクワクします。
そしてこの記事は、単に「変な模様がありました」で終わらず、
なぜその模様が出るのかを、アーキテクチャの変更や回転実験で追いかけています。
この「見つける → 仮説を立てる → 介入して確かめる」という流れが、いかにも Distill らしくて気持ちいいです。
weight banding は、画像モデルの最後の層に現れる、かなり印象的な横縞パターンです。
その正体はまだ完全に単純化できるわけではないものの、少なくとも global average pooling のような強い空間圧縮と深く関係していて、モデルが画像の大まかな縦方向の位置情報を残そうとする痕跡だと考えられます。
「ニューラルネットの内部表現は、ただのブラックボックスではなく、データと設計の両方に反応した“形”を持つ」。
この記事は、そのことをとてもきれいに見せてくれる一本だと思います。
参考: Weight Banding