🤖

Conv層を相互相関関数として捉えなおすことで見えるもの

2021/06/21に公開

はじめに

私が書く記事は、基本的に持論によるポエムです。

その中でも、最近特に気に入っていてよく引用するのが、「Conv層はシフト値込みの完全な相互相関関数であり、全結合層はシフト値を考慮しない不完全な相互相関関数である」という持論です。

この持論に従ってパーセプトロンの構造を見ると、(少なくとも自分にとっては)ニューラルネットというものが何なのかわかりやくなります。

というわけで、私がどのようにしてこの持論に至ったか、この持論を持つことで何を見ているか、お伝えしてみようと思います。

きっかけは中間層の無限化

最初にこのような発想をしたきっかけとして、私は中間層のニューロンが無限個であるようなニューラルネットをまず作りたかったのです。

中間層の次元が無限であるなら、無限に複雑な関数を任意の精度で近似できるのではないか、という安易な考えからでした。

そして実際に実装を考えてみたとき、気付きました。中間層のニューロンが無限個になるということは、行列が無限要素になるということで、要素が無限個の行列はもはや行列でなく「二次元のパラメータを持つ関数」であると。

行列積って関数同士でいうと何なんだ

まず簡単な、全結合層の実装から取りかかりました。全結合層が行なっているのは基本的にただの行列積です。行列積は行列の内積とも呼ばれ、関数同士で言っても、これは関数の内積と計算がおよそ一致します。

ただし、単純な関数の内積は

a = \int_{-∞}^{∞} f(x)g(x) dx

ですが、行列積に相当するものは二つの関数f(x,y),g(y,z)の積の、yを潰す形での定積分です。

F(x,z) = \int_{-∞}^{∞} f(x,y)g(y,z) dy
C = dot(A,B)

パーセプトロンでいえば、xがバッチ次元、yがデータ次元、zがニューロン次元です。

軽く紹介していますが、この関係を見出すまでに一月以上考え込んでいます。

結果として、この実装で関数版のパーセプトロンは実装できました。ただし、重みの更新式が積分のループを含むため、重み関数がやたらと複雑になりすぎてすぐスタックオーバーフローし、実用には至りませんでした。

しかし、モデルとして十分なヒントを私に与えてくれたのは事実です。

相互相関関数をご存知だろうか

ところで、関数同士の内積によく似た形として、相互相関関数というものがあります。

これは、

F(t) = \int^{∞}_{-∞} f(x)g(x+t)dx

で表わされるtの関数として広く知られています。

特にt=0のとき、相互相関は単に関数の内積と一致します。

a = \int^{∞}_{-∞} f(x)g(x)dx

実は私は関数同士の内積を知らなくて、上で関数の内積と同等であるとした行列積のことを、長いあいだ相互相関関数のシフト値が0の場合であると捉えていました。それは間違いではないんですが、スマートでもないですね。

しかしそのおかげで一つの疑問に行きあたりました。行列積がシフト値0の相互相関関数であるなら、より完全なシフト値つきの相互相関関数は、行列に置き直すとどういうものになるんだろう、と。

聡明な方ならお気づきかもしれませんが、シフト値付きの相互相関関数の行列版、これは内積をシフトしながら取り続けたもので……、そう、(1Dの)Conv層が行っている処理そのものですね。

厳密に言えば、これもf(x)でなくf(x,y)、g(x+t)でなくg(y+t,z)であると考えられるので、単純に一般的な相互相関関数に同等と言って良いのかわかりませんが、非常によく似た形と性質を持っていると考えられます。

F(t) = \int^{∞}_{-∞} f(x,y)g(y+t,z) dy

Conv2dで考えるなら、さらにデータ次元を二つに割るべきでしょうか。

F(u,v) = \int^{∞}_{-∞} \int^{∞}_{-∞} f(b,x,y)g(x+u,y+v,z) dxdy

bはバッチ次元のつもりでbとしました。

この関係に気付くまで、私はConv層のことを、一般的に説明されるような「結合を局所的にして重みを共有した全結合の特殊な形」として捉えていました。

しかしこの関係に気付いてからは、「シフト値を考慮に入れた完全な相互相関がConv層であり、シフトを値を考慮しない相互相関の特殊な形が全結合」であると捉えるようになりました。

こう考えると、Conv層はシフト値を考慮しなかった特殊な相互相関である全結合を一般化したものであり、Conv層が発明されるのは当然の流れであったという見方ができるのです。

Conv層が全結合層の特殊な形なのではなく、逆に全結合層を一般化したものがConv層です。

結局Conv層とは何なのか

Conv層を相互相関関数として捉えると、データへの見方が自然になります。Conv層は入力行列と重み行列を入力関数、重み関数とみなして、相関の高い部分が強く応答する相関値で、元の形状と同じ次元の関数を作ります。

Conv層はよくフィルターとして扱われますが、フィルターとしてエッジを「検出する」というのは、結局のところ「重みがエッジと同じような形をしているため相関値が強く出る」ということです。

この効果は全結合とConv層で、全く同様となります。ただ全結合が相関値をスカラー値に圧縮してしまうのと異なり、Conv層は元の形をおよそ残すので違うものに見えるだけです。

たとえ話として、AさんとBさんの生活の相互相関を取ってみましょう。

Aさん Bさん
早朝 ランニング 読書
出勤 出勤
勤務 勤務
退勤 退勤
読書 勉強
深夜 就寝 就寝

単に1日分の行動記録を二つ並べて同時刻単位で同じ事をしているか見るのがシフト値を考慮しない相関の取り方(=全結合)です。

このまま各時間について同じことをしているか比べるだけでも、二人は会社勤めしている社会人であるという共通点が見えます。社会人として高い相関値を示すでしょう。

しかしAさんもBさんも読書人であるという共通点は、同じ時刻の行動に着目している限り無視されてしまいます。

朝と夜で異なるものの、両者ともに読書習慣がある、といった相関は、片方をずらしながら照らし合わせる相関の取り方(=Conv)で、初めてわかるということですね。

Bさんの行動をBさんっぽさフィルターと考えた場合、Aさん入力をフィルターにかけたときの出力は、シフトなしの場所で朝~夕の社会人としての行動が強く検出され、少しシフトした場所で読書人としての行動が弱く検出されるということになります。

なんというか、自分の持論のことはすっとんでしまってごくごく普通の内容になってしまいました。言いたかったのは、Conv層は数学的に見ても全結合の自然な拡張であって、特別優れた特異な性質を持っているわけではない、ということです。

それから言えること

ここまでの内容を鵜呑みにしたとして、何が分かるかというと、特に何も無いかもしれません。

実際、ちょっと見方を変えたくらいでは今より優れた実装が見出せない、というくらいに、機械学習の理論は充実しています。

しかしたとえば、1x1サイズカーネルのConv層がただ単純にチャンネル次元に対する全結合であるとか、ReLU族が優秀なのは負の相関値を完全に切ってしまい逆伝播もカットする仕様のせいなんだなとか、そのように現行のシステムに対する視点が増える可能性があります。

視点を増やせば、同一のデータに対して二重チェック三重チェックのような検討ができるので、何らかの発見を成せる可能性が上がる……かもしれない!ですね。

おわりに

お付き合い頂きありがとうございました。

それ既に散々言われてるよとか、ここ間違っているよとかあればコメントなり頂ければと。

また、この持論のもとに重み行列の更新について記述した記事がありますので、よければどうぞ。

ニューラルネットの重み行列は理解不能なブラックボックスではない

Discussion