見出し画像

ホップフィールドネットワークがあれば十分(論文の解説)

17,825 文字

おはようさんどす。今日はリンツのヨハネス・ケプラー大学とオスロ大学の研究者たちによるHopfield Networks is All You Need「ホップフィールドネットワークがあれば十分」という論文を見ていきまっさ。
大まかに言うと、この論文は新しいタイプのホップフィールドネットワークを提案してるんやけど、これが現代的なホップフィールドネットワークを二値パターンから連続パターンに一般化したもんなんや。そして、この新しいホップフィールドネットワークの検索更新ルールが、現代のトランスフォーマーで使われてる注意機構と等価やって示してんねん。
実はこれ、注意機構のもっと一般的な定式化なんよ。だから、現代の深層学習をいろんな形で改善するのに使えるんや。
それに、免疫学の研究に応用した姉妹論文もあって、この種の注意機構に特に適したタスクで最先端の成果を上げてるんよ。
ほな、一緒に詳しく見ていこか。この論文が何をしてるのか、何を提案してるのか、そういうことを見ていくさかい。
こういう動画が好きやったら、チャンネル登録してな。シェアしてくれたら嬉しいわ。楽しんでもらえたらええなぁ。
それと、うちのDiscordコミュニティにも感謝せなアカンな。この論文のことをようわかるように教えてくれたし、めっちゃ面白い議論ができたわ。まだDiscordに入ってへんかったら、ぜひ参加してな。楽しいで。
ほな、ホップフィールドネットワークって何やねんて話やけど、これはかなり古い概念のニューラルネットワークなんや。ホップフィールドネットワークの目的は、こんな感じで考えられるんやけど、例えば5つのニューロンがあるとするやろ。
目標は、いわゆるパターンをこのニューラルネットワークに保存することなんや。このケースでは、パターンは5ビットの二進数の文字列になるわけや。例えば、10100とか11010とかな。
こういうパターンのリストがあって、それをニューラルネットワークに保存したいんや。ここでは、全てが全てに接続されてるって考えてな。
目標は、このニューラルネットワークの中にパターンを保存することで、重みを調整するんや。これは言うたように、かなり古いモデルなんやけどな。
パターンを保存するってどういうことかというと、保存したパターンを後で取り出せるようにするってことなんや。古いタイプのホップフィールドネットワークでは、パターンの一部を与えることで取り出すんや。
例えば、110で始まるパターンが欲しいって言うたら、それをネットワークに与えて、そこから更新ルールってのを使うんや。この更新ルールは内部のルールみたいなもんやな。
ちょっと詳しく見ていこか。ここに110があるとして、これがメッセージを送り合うんや。この更新ルールがなんらかの形でこのニューロンとこのニューロンの値を調整して、ネットワークの重みに最も適合するようにするんや。
ネットワークの重みが正しく調整されてたら、最終的にこの更新ルールを適用した結果、これが1になって、これが0になるんや。そうすると、このパターンが取り出されたことになるわけや。
もし最初に101を入力してたら、結果は違うものになるやろな。うまくいけば、このパターンが取り出されるはずや。
応用を考えると、最初の3桁をデータベースのキーみたいに使って、残りの桁を保存する値として使えるわけや。そしたら、最初の数桁を与えるだけで値を取り出せるんや。
必ずしも3つ与える必要はないんやけどな。これは言うたように、ニューラルネットワークの古い概念やから、人々はこれが脳の働き方やと想像してたんや。「一緒に発火すれば、一緒に配線される」みたいな感じでな。
この研究を進めていくと、面白いことがわかってくるんや。5つのニューロンがあるから、5つの異なるパターンを正確に保存できるんちゃうかって思うかもしれへんな。あるいは、10個かもしれん。だって10個の接続があるからな。
でも、現代のホップフィールドネットワークでは、適切な更新ルールを使えば、パターンの次元に対して指数関数的に多くのパターンを保存できるんや。これはちょっと驚きやな。パターンの長さに対して指数関数的に多くのパターンを保存できるんや。
この論文は、それを連続的な状態に一般化してるんや。連続的な状態って何かって言うと、もはやパターンが二進数の文字列やなくて、浮動小数点数の文字列になるってことや。
0.5、1.3とかな。浮動小数点数の列は自然にベクトルとして表現できるわけや。だから、パターンは異なるベクトルになって、それを保存するんや。
高次元では、ベクトルは互いによく分離されるんやけど、それは数が多すぎない限りの話や。でも、この論文は、二進数の文字列に対する現代のホップフィールドネットワークの性質が、これらのベクトルパターンにも当てはまることを示してるんや。
つまり、ベクトルの次元に対して指数関数的に多くのパターンを保存できるってことや。これはかなり驚きやな。だって、次元ごとに1つのベクトルがあれば、その後はちょっと怪しくなるんちゃうかって思うやろ。でも、実際には指数関数的に多くのパターンを保存できるんや。この論文は、それをどうやって実現するか、そしてそれが実際に起こるという事実について書いてるんや。
ホップフィールドネットワークの更新ルールについて話してきたけど、具体的に何をするのかはまだ説明してへんかったな。パターンを入力して、ネットワークが何かをして、クエリに一致するパターンが出てくるって言うただけやった。
ここでは、これをクエリって呼んでるんやけど、これは意図的なことなんや。注意機構の用語とホップフィールドネットワークの用語を重ねて使ってるんや。この2つがどう重なるかを明確にするためにな。
注意機構についてよう知らんかったら、「注意だけで十分」っていう動画を見てな。そしたら、この動画がもっとよくわかるはずや。
さて、更新ルールが具体的に何をするかというと、エネルギーを最小化するんや。ホップフィールドネットワークの種類ごとに、エネルギー関数ってのがあるんや。現代のホップフィールドネットワークの二進数文字列に対するエネルギー関数は、こんな感じや。
xはパターン、つまりホップフィールドネットワークの状態を表してる。これはネットワークに保存されてるもんや。そして、ξはネットワークに入力するクエリを表してる。
このエネルギーは、パターンを取り出すために最小化せなアカン量なんや。でも、実際にはこのエネルギーを直接扱うことはあらへん。
例えば、バックプロップを使ってエネルギーを減らすために勾配降下法を使うこともできるんやけど、普通はエネルギー関数と一緒に更新関数ってのがあるんや。
更新関数は、さっき話した「ネットワークが何かをする」っていう部分なんや。ネットワークがやることは、エネルギー関数を最小化することなんや。更新ルールは、対応するエネルギー関数を最小化するように作られてるんや。
だから、エネルギー関数はもっと理論的な考察やな。「これがうちのホップフィールドネットワークのエネルギー関数や」って言って、それに対応する更新ルールがあるんや。その更新ルールを使えば、エネルギー関数が最小化されて、パターンが取り出せるんや。
もちろん、保存してるパターンが多すぎたら失敗することもあるけどな。
古いホップフィールドネットワークの更新ルールについては、本文で説明されてるんやけど、今回は古いのには興味ないんや。この論文が注目してるのは、ホップフィールドネットワークに保存するパターンがベクトルで、クエリもベクトルパターンっていう新しいタイプなんや。
全てのパターンをホップフィールドネットワークに保存したいんや。こんな感じで描いてみるわ。ホップフィールドネットワークに保存して、その後でクエリを考えるんや。クエリはこんな感じや。
二進数文字列の場合は、「うちの二進数文字列の半分くらいは知ってる」みたいな感じやったけど、ベクトルホップフィールドネットワークの場合は、「うちのベクトルがどの方向を向いてるかだいたい知ってる」みたいな感じになるんや。
取り出したいのは、大きな内積を持つベクトルなんや。このクエリをホップフィールドネットワークに入力したら、このベクトルが取り出されることを期待するんや。
完全に同じベクトルやないのはわかるやろ。ここに移動させたら、こんな感じになるかもしれへん。違うんやけど、「だいたいこんなんが欲しいねん」って言うたら、ホップフィールドネットワークが「ほな、これやな」って答えるわけや。
注意機構との関連はもうかなり明らかやと思うけど、これを形式的に確立するのがこの論文のポイントなんや。これらの新しい連続ホップフィールドネットワークのエネルギーをここで定式化してるんや。
特に、この項がここにあるのは、今は連続状態と連続クエリを扱ってるからや。エネルギーを最小化すると、基本的にクエリが無限大に発散しないようになるんや。クエリがエネルギー関数の中にあるからな。
更新ルールはこれや。後で詳しく見ていくけど、コードで実際に実装するのはこの更新ルールなんや。ここにクエリを入れて、これがホップフィールドネットワークの状態で、このルールを複数回適用すると、ホップフィールドネットワークが質問に答えるんや。
つまり、これを入力して、この更新ルールを何回か適用すると、これが出てくるんや。
面白いことに、ここにある量をいくつか書き換えると、現代のトランスフォーマーの注意機構と等価になるんや。例えば、ここのベータをソフトマックス温度として1/√dに書き換えて、クエリのξをクエリ行列に、ここのxをキー行列に書き換えると、現代のトランスフォーマーの注意機構と同じになるんや。
つまり、この論文のポイントは、トランスフォーマーの注意機構をホップフィールドネットワークとして見ることができるってことなんや。
最後の付録に面白い図があるんやけど、典型的やな。セップ・ホッハイターの論文は60ページの機械証明の付録があったけど、これも70ページの付録があるんや。クレイジーやな。
でも、付録の最後にこの図があるんや。普通、注意機構では、入力があって、そこから3つのものを生成するんや。クエリ、キー、バリューや。
クエリは同じオブジェクトから生成することもできるし、これが自己注意やな。あるいは、別のオブジェクトからクエリを生成することもできる。今の議論にはあんまり関係ないけどな。
どっちにしても、3つの異なるヘッドか行列を使って、その入力をクエリ、キー、バリューに変換するんや。
よく、入力集合があって、各入力がキーを出力し、各入力がクエリも出力するって感じで概念化してるんや。キーとクエリはベクトルやな。
例えば、ここに文があるとするやろ。「うちの猫はめっちゃかわいいねん」みたいな。ここのキーベクトルは、「これは名詞や」とか「これは動物や」とかをエンコードしてるかもしれへんな。
クエリの方は別のことを聞くこともできるわけや。例えば、「猫」っていうトークンやったら、それが名詞やって認識して、他のノードに「ここら辺に形容詞ないか?」って聞くかもしれへん。
だって、自分が名詞で文の主語やったら、自分を修飾する形容詞があるかどうか知りたいやろ?そやから、クエリを出力して、そのクエリの方向が「形容詞」を意味するかもしれへんな。
ほんで、ここの「かわいい」って単語は形容詞やから、自分で「ちなみに、わいは形容詞やで」っていうキーを出力するわけや。
そしたら、「猫」のノードが形容詞を求めるクエリを出して、こっちが形容詞のベクトルを出力したら、2つのものの内積が高くなるから、ここにルーティングされるんや。
注意機構は基本的に情報のルーティングやって、わいはいつもそう説明してるんやけど、この論文では、これらをホップフィールドネットワークに保存されたパターンとして見るんや。
クエリを入力して、内積がホップフィールドネットワークの更新ルールになって、ホップフィールドネットワークから適切なパターンを取り出すってわけや。
バリューはここではキーの修正版になってるけど、多くの人はキーとバリューを同じものにしてる。でも、この情報のルーティングはここで起こるんや。クエリとキーを掛け合わせて、そのあとソフトマックスをかけるんや。
1つのノード、例えばこの「猫」のノードから見ると、自分のクエリベクトルと全てのキーベクトルの内積を取るんや。全部と内積を取って、それをソフトマックスに通すと、分布が得られるんや。
ここではこんな感じになるかもしれへん。「わい」も「猫」にとってはめっちゃ重要やからな。これは偶然やで、計画してへんかったわ。でも、例では、この最後のやつがマッチするだけやなくて、もっと広くなるって言うとこうや。
そしたら、情報のルーティングは主にこの「かわいい」トークンから「猫」トークンに情報をルーティングすることになる。これが注意機構や。
でも、これをホップフィールドネットワークとして解釈して、更新ルールが内積やとしたら、このルールを複数回適用することも考えられるんや。
ここで更新ルールが出てくるんやけど、この分布を取って、普通はこの分布でバリューを集約するんやけど、もしこの分布でキーを集約したらどうなるんやろか?
これを見てみよう。この特定のキーがめっちゃマッチするけど、他のもちょっとはマッチするって仮定しよう。出てくるのは、この特定のキーにめっちゃ重みをかけた加重平均になるんや。
結果は、そのキーにめっちゃ近いものになる。ここに古いキーを緑で、古いクエリを青で描いてみるわ。そしたら、出てくるのはクエリでもないし、マッチしたキーだけでもないんや。重み付き平均やけど、そのキーが支配的な感じやな。
ホップフィールドネットワークでは、もう一回やるんや。この新しい赤いやつをクエリベクトルの代わりに使うんや。このノードをここに複製して、そのクエリベクトルを使って、もう一回同じことをするんや。
全てのクエリベクトルと内積を取るんやけど、これはもうクエリベクトルの集約やから、出てくる分布はさらにそのキーの方向に偏るんや。もっと広くしてみよう。
これを繰り返しやっていくと、全部低くなって、1つのキーだけが分布を支配して、めっちゃ高くてめっちゃ広くなるってのが明らかにわかるやろ。
これがホップフィールドネットワークの動作そのものなんや。クエリを入力するんやけど、これは「だいたいこんなんが欲しいねん」っていう感じや。
そして、このルールを何回も適用するんや。毎回精製して、精製して、精製して、最終的にパターンを決定するんや。ホップフィールドネットワークはパターン検索のためにあるんや。これらがわいが取り出したいパターンなんや。
ここでは、パターンが事前にネットワークに保存されてるんやなくて、注意層みたいにパターンも生成されてるんや。キーは前の層か、これらの行列によって生成されるんやけど、ホップフィールドネットワークの更新ルールには関係ないんや。
ここで、注意機構はこの更新ルールを1回だけ適用するものとして解釈できるんやけど、実際には複数回適用して、特定のキーを取り出すことも考えられるんや。
これは、他のベクトルがそのキーに近くない場合にしか機能せえへんけどな。クエリがこれで、ここに描いたように、これとこれとこれがマッチするなら、技術的には、何回更新ルールを適用しても、3つのキーの平均に収束するんやろな。
全部マッチしてて、次のステップでのクエリの重み付き平均に全部寄与するからな。つまり、基本的に真ん中のどこかに収束するってことや。
これがこの論文の中心的なポイントになるんや。どういう状況にあるかによって。最初の部分を「単一パターンの取り出し」って呼んで、2つ目の状況、つまり複数のパターンが全部マッチしてて、お互いによく分離されてへん状況を「準安定状態」って呼んでるんや。
BERT言語モデルを見て、実際にどっちの状態で動いてるかを調べるのはめっちゃ面白いんやで。単一パターン取り出しモードで動いてるんか、それとも準安定状態モードで動いてるんか。
ここの図で見えるように、ホップフィールドネットワークと注意機構の唯一の違いはこの枝やな。クエリとキーを掛け合わせた後、複数回更新したいかどうかを聞いてるんや。
もしホップフィールドネットワークの状況やったら複数回更新したいって答えるやろ。そしたら、戻ってきて、キーとソフトマックスの出力を使って新しいクエリを生成するんや。
ここのクエリqは、ここの出力とキーから生成されるんや。キーは同じもので、ただ2回書かれてるだけやで。
これがまさにわいらが議論してきたことなんや。何となくわかってもらえたと思うけど、注意機構は単にホップフィールドネットワークのパターン取り出しアルゴリズムを1回だけ適用したものなんや。特定の更新ルールを使って、それがここで提案されてるエネルギー関数にマッチするんや。
もちろん、彼らがこれをやったのは特に更新ルールがトランスフォーマーの更新ルールになるからやけど、実際のところ、彼らがエネルギー関数をトランスフォーマーにマッチするように逆算したんか、それとも最初に連続ホップフィールドネットワークを思いついて、それがトランスフォーマーみたいやって発見しただけなんかは、たぶん永遠にわからへんやろな。
さて、ここに4つか5つの定理があって、これらがこの話についていくつかのポイントを示してるんや。詳しい証明とかには触れへんけど、ざっと見ていくのはめっちゃ面白いで。めっちゃ厳密に証明されてて、70ページの付録があるんや。興味あるなら見てみてな。
ここで彼らが言うてるのは、わいらが提案する更新ルールがあるってことや。これがわいらの新しいホップフィールドネットワークの更新ルールや。
最初の定理では、わいらが提案する更新ルールが大域的に収束するって言うてるんや。更新ルールを繰り返し適用すると、tが無限大に近づくにつれてエネルギーが収束する。エネルギーが固定点に収束するってことや。
つまり、ここの更新ルールを何回も何回も適用すると、このエネルギー関数が収束するってことやな。間違ったこと言いたくないから慎重に言うけど、基本的にこれは更新ルールとエネルギーを結びつけてるんや。
つまり、これが本当にそのエネルギー関数の更新ルールやってことを示してるんや。それ自体はめっちゃ面白いわけやないけど、定理2に行くとな。
定理2では、この繰り返し、つまりさっき見た更新ルールについて、tが無限大に近づくにつれて、ある定常点に収束するって言うてるんや。さらに、この量がゼロに近づくんや。
これはt+1での更新で、これはtでの更新や。この2つの差がゼロに近づくってことは、エネルギーが収束するだけやなく、アルゴリズムの個々の更新も収束するってことなんや。
ある時点で、このenewがもう変化しなくなるんや。前のものとの差がゼロに近づくからな。
ここで、この列が収束するか、あるいは極限点の集合が連結集合になるって言うてるけど、これはちょっと大げさやな。1点に収束するか、連結集合に収束するかのどっちかやって言うてるんやけど、損失が有限なら、方程式3で生成される任意の列は何らかの固定点に収束するんや。
基本的に、このアルゴリズムが収束するって言うてるんやな。
ここでは、パターンが保存されて取り出されるってどういうことかを定義してるんや。これはホップフィールドネットワークの保存容量を確立するためにめっちゃ重要なんや。
更新ルールが適切なエネルギーを最小化して、更新ルールがある時点で収束することを確立したから、収束したら、収束したパターンを取り出せるってことになるんや。
ほんで、実際にどれだけのパターンを保存できるかを知る必要があるんや。そのためには、パターンが保存されるってどういう意味かを知る必要があるんや。
パターンがあって、それらをxって呼ぶって仮定しよう。xiってのがn個の異なるパターンや。各パターンの周りに球があるって仮定するんや。
これをどう想像したらええかというと、空間があって、保存したいパターンがあるんや。各パターンの周りに球があるってことにしよう。
当然、パターンにはよく分離されたパターンって概念があって、これはちょっとこの球が互いに触れ合ってへんって感じで想像できるんや。
この球が触れ合ってへんってことは、パターンがよく分離されてるってことや。つまり、クエリを初期化するときに、クエリはここでは何らかの距離の概念でパターンに近いベクトルやから、その球の中のどこかで初期化すると、その球に、つまりそのパターンに収束する可能性があるってことや。
実際はもうちょっと複雑になるけど、そんなに変わらへんで。パターンが保存されるってのは、球の中に1つの固定点があって、球の中から始まる全ての点がその固定点に収束して、どの球も交差してへんってことや。
つまり、点iの球が点jの球と交差してへんってことやな。全ての球が交差してへんって言うてるんや。
xiが取り出されるってのは、方程式3の繰り返しがその球の中の1つの固定点に収束することや。取り出しの誤差は距離や。
2つのものがあるのに気づいたやろ。xiは実際のパターンで、xiは取り出されたパターンや。このホップフィールドネットワークは、必ずしも保存したのと同じものを返すわけやないんや。連続ニューラルネットワークの性質の一部やな。
各球について、パターンがあって、球があるって言うてるんや。パターンが保存されるってのは、この球の中のどこから始めても、常に球の中の点に収束することや。
どこから始めても、常にこの特定の点に収束するんや。もしかしたら、保存したパターンやなくて、この青い点かもしれへんけど、どこから始めても常にこの特定の点に収束するんやったら、このパターンを保存したってことになるんや。
実際には、このパターンを取り出すんやなくて、青いやつを取り出すんやけど、そしたら取り出しの誤差を定義できるんや。取り出しの誤差は単に2つのものの距離やな。理想的には、この距離はめっちゃ小さいはずや。でも、保証はでけへんな。
この取り出しの誤差を扱う定理もあるんやけど、まず見てほしいのは、この球が大きくなると、もうパターンを正確に保存できへんってことや。これが理想的な状況やけど、球がめっちゃ大きくなって、パターンの引力がめっちゃ大きくなる状況もあるんや。
例えば、ここから始めたら、この2つのパターンのどっちにも収束せえへんで、真ん中のどこか、たぶんこの点に収束するんや。これが準安定状態の1つやな。
こういう状況も出てくるし、あっちの状況も出てくるんやけど、下の状況が必ずしも悪いわけやないってことを覚えておいてな。
まずは上の状況、つまりパターンを保存して取り出す状況を扱うで。失敗確率pを仮定するんやけど、pはかなり低いはずや。彼らの例では、p=0.001、つまり0.1%の誤差確率やな。
半径mの球面上にランダムに選ばれたパターンについて、いくつかの定数を定義するんや。そしたら、1-pの確率で、保存して取り出せるランダムなパターンの数は、この量で下から押さえられるんや。
ここにpの平方根があって、この定数cがあるんやけど、dが指数の中にあるのがわかるやろ。つまり、次元数に対して指数関数的やってことや。これはめっちゃクールやな。
次元を1つ増やすと、保存できるパターンの数が指数関数的に増えるんや。これは現代のホップフィールドネットワークの二進数文字列でも知られてたから、めっちゃ驚くわけやないけど、想像するのとは違うな。
これらの定数を特定の方法で設定せなアカンのやけど、例えばcが3くらいで、dが20くらいやったら、21次元目を追加すると、保存容量が3倍になるんや。めっちゃクールやな。
これで、このネットワークに指数関数的に多くのパターンを保存できるってことがわかったんや。
次の定理では、パターンがよく分離されてたら、更新ルールは典型的に1回の更新で収束するって言うてるんや。パターンがよく分離されてるってのは、こんな感じやけど、内積の観点でも想像できるんや。
内積の空間で操作してるから、パターンがよく分離されてるってのは、全部がお互いから離れた方向を向いてるってことやな。この分離の概念は、この量でとらえられるんや。
これは例iのパターンの分離で、自分自身との内積から、他のどのパターンとの内積の最大値を引いたものや。この量は、他のパターンが近くにないときに大きくなるんや。
分離が大きいときは、取り出しの更新ルール、つまり内積を計算して、全てのパターンをその内積で再重み付けして、それを新しいクエリとして使う、っていうのを繰り返すやつは、一番近いパターンに収束するんやけど、この定理は実際にはめっちゃ速く収束するって言うてるんや。
1ステップで収束するって言うてるんやけど、ここでわいは問題があると思うんや。「典型的に1回の更新で収束する」って言うてるけど、これは本当にたくさんの定数に依存するんや。見ていくとわかるけど。
でも、定理4が言うてるように、この分離定数に対して指数関数的に速く収束するんや。クエリψを1回更新した後、新しい点と固定点の距離は、分離δiに対して指数関数的に小さくなるんや。
平均値定理を使った正確な境界はこんな感じや。ここで見えるのは、1ステップ後の更新されたψと収束する固定点との距離が、前の距離にこれを掛けたものになるってことや。
これは乗法的な更新やから、このヤコビアンの中を見ると、これがこれやって分かるやろ。この分離の負の指数関数があるんや。分離が大きいほど、このアルゴリズムは速く収束するんや。
1ステップで収束するって言うのは、ちょっと自慢し過ぎかもしれへんな。指数関数的な収束があるときに、1ステップって言っていいのかどうかわからへんわ。特に気になるのは、ここに線形定数としてnがあることや。
彼らのコードを見ると、これはPyTorchで一般的なモジュールとして実装されてて、そのまま使えるようになってるんや。これはトランスフォーマーだけやなくて、LSTMを置き換えたり、プーリング機構を置き換えたりもできるんや。
付随する論文では、この巨大な集合に対するマルチインスタンス学習をこのホップフィールド層を使ってやってるんや。このコードは絶対チェックする価値があるで。何かを置き換えたくなるかもしれへんし。
でも問題は、これらの更新ステップを何回やるべきかってことや。図を見たら、少なくとも注意機構では、注意層があるように見えるやろ。トランスフォーマーがあって、それは入力があって、層、層、層、層、層って感じで、各層にはこの注意機構全体が含まれてるんや。
これをホップフィールドネットワークとして解釈して、複数のステップをやりたいってことは、この枝を選ぶってことやな。各層で潜在的に、これを複数回やるってことや。
トランスフォーマーにはもう計算の制約があったけど、これはさらに悪くなるやろな。それに、何回ステップを踏むかを決めなアカンのや。もちろん、ハードコードもできるけど。
彼らが言うてるのは、この規範がここの規範、つまり古いのと新しいのの差が十分小さくなるまでこのステップをやるべきやってことや。
実際には、収束点にどれだけ近いかは測れへんけど、どれだけ離れてるかは測れるんや。この量を測れるんや。これは2つの繰り返しがどれだけ離れてるかを測るもんや。
だから、単純にそれを測って、十分小さくなったら止めるってことやな。でも、これはこれとめっちゃ関係あるんやろな。もうxに収束することは証明済みやから、この量をさっきの量で近似できるはずや。
そしたら、何回更新する必要があるかがわかるんやけど、その量はnに対して線形どころか二次なんや。無限回のステップを扱ってるわけやないから、定数も実際には重要やって速いコードのコースで学んだんや。
だから、必要なステップ数は、シーケンスの長さに対して二次関数的に依存するんやないかな。だから、常に1ステップで収束するって言えるかどうかわからへんのや。
めっちゃ間違ってるかもしれへんし、この指数関数的な減衰を考えたら、これら全部が実際には全然違いを生まへんのかもしれへん。でも、普通は1ステップで収束するって言うのは、ちょっと心配やな。
彼らがそう言う理由はわかるで。トランスフォーマーの注意機構がこのルールを1回だけ適用するものやからな。これは、これを正確にホップフィールドネットワークとして解釈する理論的な正当化みたいなもんや。
ホップフィールドネットワークなら複数のステップをやるはずやって言うかもしれへんけど、待てよ、1ステップで普通は収束することを実際に証明できるんや。だから、トランスフォーマーでやってることは、ホップフィールドネットワークの更新ルールを収束まで適用してることになるんや。
ほんで、定理5は最後の定理やけど、パターンの取り出し誤差、つまり収束するものと保存したものの差が、ここにある分離の指数関数で押さえられるって言うてるんや。
定理を簡単に振り返ると、定理1と2はこのアルゴリズムの収束と、実際に提案されたエネルギーを最小化することを扱ってるんや。定理3は、空間の次元に対して指数関数的に多くのパターンを保存できるって言うてるんや。
定理4と5は、この更新ルールが指数関数的に速く収束するって言うてるんや。1ステップ後に収束するって信じるなら、やな。それに、取り出し誤差も更新ステップの数に対して指数関数的に小さくなるって。
これはめっちゃええ感じに聞こえるけど、パターンがどれだけよく分離されてるかにめっちゃ依存してるんや。トランスフォーマーでは、常によく分離されてるわけやないってことがわかってきたんや。
それは意図的かもしれへんな。これらの状態、つまりパターンは、古典的なホップフィールドネットワークみたいに事前に保存されてるんやなくて、注意機構として解釈すると、ネットワーク自体によって生成されるんや。
取り出すパターン行列とクエリは、この場合は注意機構によって生成されるんや。これは他のたくさんの領域にも適用できるんやけどな。
注意機構と完全に等価にするには、もう1つちょっとした修正が必要なんや。バリューを再キャストせなアカンのや。普通は、入力があって、それから異なるヘッドを使ってクエリ、キー、バリューを作るんやけど、形式的に等価にするには、キーからバリューを生成せなアカンのや。
ここで見えるように、まずキー行列を掛けて、それからバリュー行列を掛けるんや。これが何か変えるとは思えへんけど、知っておいた方がええと思ってな。
唯一これが何か変える可能性があるのは、この行列がめっちゃランクが低くて、空間をめっちゃ少ない次元に押し潰すような場合やけど、バリュー行列はそんなことせえへんやろ。
さて、これが常にめっちゃよく分離されてて、1つのパターンを取り出すわけやないってことを言うたんやけど、それを事前学習済みのBERTモデルで研究してるんや。
多分Hugging Faceから事前学習済みのモデルを取ってきて、データセットを通してるんや。各注意ヘッドについて、データセット全体を通してこのソフトマックス分布がどんな感じかを見てるんや。
これがホップフィールドネットワークで、1ステップで収束すると信じるなら、パターンがよく分離されてたら、こんな分布を期待するわけや。1つの支配的なパターンがあって、それを取り出すんや。
それが取り出したいもので、出てくるものやな。他の何かがあるってことは、ホップフィールドネットワークが失敗したってことになるわけや。1つの特定のパターンを返してくれへんってことやからな。
彼らがやったのは、かなりスマートな実験やと思うんやけど、この分布の棒をいくつ足せば90%に達するかを見てるんや。ソフトマックスの温度はハードコードされてて、pdbは1/√dやけどな。
彼らが言うてるのは、この分布の質量の90%に達するのに、何本の棒が必要かってことや。これが1つのパターンを取り出すホップフィールドネットワークなら、1本で十分なはずや。1本の棒が多分99%くらいになるやろ。
でも、他のケースもあるんや。パターンとクエリが取り出す球が全部重なってるようなケースを想像してみ。そしたら、特定のパターンには収束せえへんのや。
2つの球が離れてる場合、更新ルールはここに近ければここに収束するし、ここに近ければここに収束するんやけど、重なってる場合は、エネルギー景観が、どこかから始めても、ここにもあそこにも収束せえへんようになるんや。実際には、真ん中のどこかに収束するんや。
極端な場合、ソフトマックス分布が完全に一様になる可能性もあるんや。これは基本的に、「情報がどこから来てもええから、ただ平均してくれ」って言ってるようなもんや。
これには応用があるんや。例えば、センチメント分類器を作りたいとするやろ。めっちゃ簡単な方法は、事前学習済みの単語埋め込み、例えばGloVeやWord2Vecを使って、各単語に単語埋め込みを割り当てて、それを平均するだけや。
たくさんのネガティブな単語、例えば「悪い」「悲しい」「怒ってる」みたいな単語があると、単語埋め込みがそれを反映して、平均単語埋め込みがネガティブな方向を向くことを期待するんや。逆に、たくさんのポジティブな単語があれば、平均がポジティブな方向を向くやろ。
だから、情報を平均化して、特にどこから来たかを気にしない応用もあるんや。その場合、この数、これをkって呼ぼうな。この場合、k=1やけど、もう1つのケースではk=n、つまり入力の数になるんや。
90%に達するには、ほぼ全部必要になるからな。その間もあるんやけど、これを準安定状態って呼んでるんや。中間は、ここにパターンがいくつかあって、ここにもいくつかあって、ここにもいくつかあるみたいな感じや。
ほとんどクラスタリングみたいなもんやな。これらは重なってて、これらも重なってて、これらも重なってるけど、お互いには重なってへんのや。
つまり、ここから始めたら、平均に収束するんやけど、全てのパターンの平均やなくて、このパターンたちの平均に収束するんや。ここもここも、ここもここみたいな感じや。
これは潜在空間でのクラスタリングみたいなもんやな。このホップフィールドの更新ルールを、特定のパターンに行くんやなくて、ある種のクラスタに行くもんとして解釈できるんや。
例えば、「ここら辺に形容詞ないか?」って聞いたとするやろ。これらのパターン全部が、その形容詞のクエリ空間で重なってるとしたら、更新ルールは一種の平均に収束するんや。基本的に「はい、ここに形容詞があります」って言うようなもんや。
情報はルーティングされへんのや。ここから始めて、これに収束したとしたら、分布はこんな感じになるやろ。小さい、小さい、小さい、そして大きいのがいくつかあるんや。
たぶん2つか3つか4つの大きいのがあって、これらがまさにここのパターンに対応するんや。情報はそのクラスタの全てから、クエリを投げたこの特定のノードにルーティングされるんや。
これらが準安定状態って呼ばれるもんで、彼らがやってるのは、データセット全体でこのk数を計算することなんや。ここで分布を示してるんやけど、これらのプロットで見えるのは、データセット全体にわたって、kがこっちの方向に向かってるってことや。
これがめっちゃ簡単そうやな。kはこっちの方向で、これは単に、データポイントを通して、この特定の層1のkを測定した量やな。これは層1の注意ヘッド4やって分かるやろ。
k数がこんな分布になってるのが見えるな。これと対比させてみ。ここでは、数字1にめっちゃ重みがかかってるか、めっちゃ少ない数字になってるな。
これらの青いのは、1つの特定のパターンを取り出すときの典型的なもんや。この特定の注意ヘッドについて、こう結論付けられるな。これはめっちゃ特定的で、入力を見て、自分のトークンを見て、どんな情報が欲しいかを決めて、他のノードから1つの特定のものを取り出すんや。
一方、こっちはもっと平均化みたいな感じや。「この種の情報が欲しい」って感じで、平均的に、シーケンスの長さはわからへんけど、たぶん512やろな。512のうち、中央値ではそのうちの231から情報を集めてるんや。
これらの緑とオレンジのやつが、この準安定状態に対応してるのが分かるやろ。注意の空間で一種の暗黙のクラスタリングが行われてるんや。
青いのは、特定の情報を求めて、1つか数個の特定のパターンを取り出して、それで満足する注意ヘッドに対応してるんや。
赤いのは、ほとんど平均化してるのが分かるやろ。kがめっちゃ高いってことは、90%に達するのにほとんど全部の棒が必要ってことやからな。基本的に一様分布ってことや。
「情報がどこから来ようが気にせえへん、ただ平均してくれ」みたいな感じや。何か特定の空間の平均が欲しいだけなんや。これにも用途があるって言うたやろ。
これがBERTモデルを通してどう変化するか見てみるのも面白いな。ここが層1で、下の方やな。ここではこういう平均化操作がめっちゃ多いのが分かるやろ。多くのヘッドが単に平均化してるだけなんや。
層を上がっていくと、ヘッドがどんどん特定の情報を求めるようになっていくんや。でも面白いことに、最後の層ではまた準安定状態が多くなるんや。
これをどう解釈するかは君次第やけど、こんな感じに言えるかもな。下の方では一般的なパターンが欲しくて、中間層が一種の論理的なワークホースになってるんや。入力の中のめっちゃ特定のものを探してる感じやな。
ここが「考える」部分なんやろな。ただし、これは完全にわいの妄想やで。全然本当やない可能性もあるからな。これが前処理で、これが「考える」部分で、これはもう出力の準備かもしれへん。
だって、この後に言語モデリングや分類があるやろ。だからこれは既に情報の種類を集約してる段階かもしれへんな。わいはこんな感じに解釈してるけど。
ほんで、これらの実験はめっちゃ面白いんや。これが最後の実験やけど、面白い実験をしてるんや。実際に注意ヘッドを単なる平均化機構に置き換えてるんや。後でガウス分布に置き換えるんやけど、ここでは単に平均化してるんや。
そして、見てみ。層1を単なる平均化に置き換えても、パープレキシティはそんなに上がらへんのや。層全体を平均化に置き換えても、パープレキシティはもうちょっと上がるけど、前のプロットを覚えてたら、青と緑のヘッドがどれだけあるかと、赤とオレンジのヘッドがどれだけあるかの対応関係がほぼ1対1やってことがわかるやろ。
ここにはたくさんの青いのがあって、エラーが上がってるのが見えるな。面白いことに、ここでは最後の方でもっと準安定状態があるんやけど、それでもパープレキシティは上がってるんや。
たぶん、本当に置き換えられるのは赤いやつだけなんやろな。これは常に1つの層で平均化してるんや。
ここでもっと詳しく見ていって、これが層6で、これが層12やって言うてるんや。これは層6と層12の1つの特定の注意ヘッドやな。更新は、この方向に進むから混乱せんようにな。
最初はわいも混乱したわ。ここでこのk数が、最初はちょっと広がってるけど、すぐにめっちゃ小さい数に収束するのが見えるやろ。
ここにちょっとしたポイントがあるんやけど、学習率が下がったわけやないと思うんや。たぶんここで一種の相転移が起こってるんやと思う。これは青い学習線やで。
突然、これらの注意ヘッドが「これがわいの専門にしたいことや」「これが言語のサブタスクの中でわいが専門にしたいタイプのタスクや」って決めるような相転移や。
そしたら、入力ごとに1つの特定のパターンに集中するようになるんや。本当に専門化してるんやな。
一方で、最後の層を見てみ。学習中も継続的に学習し続けてるのが見えるやろ。最初はこの平均化をやって、それからこの準安定領域に入るんや。これが準安定領域やな。kは1やないけど、めっちゃ高い数でもないんや。
継続的に学習し続けてて、まず第一に、ここでの学習がまだ終わってへんことを示唆してるし、第二に、これがトランスフォーマーのサイズとどう関係するのか見るのはめっちゃ面白いと思うんや。
特に、これらの巨大なトランスフォーマーがどうなるのか。学習すればするほど学習し続けられるっていう事実は、どんな状態に収束するかという観点から解釈できるかもしれへんな。
注意ヘッドがあるっていう事実は、わからへんけど、これはどうなるんやろ。準安定状態に留まり続けるんやろうか。だって、準安定状態を持つのは理にかなってるからな。言うたように、物事をクラスタリングするのは理にかなってるんや。
それとも、これは単に中間ステップで、本当に遠くまで行ったら、実際にk=1に収束して、本当に専門化するんやろうか。それとも、これにはもっと注意ヘッドが必要なんやろうか。わからへんわ。
これはただの始まりやと思うんや。この方向の研究の始まりやな。このk数、これがどう作られてるか、めっちゃ単純やのに、めっちゃ多くを明らかにしてるみたいやな。めっちゃクールやと思うわ。
これが論文とその実験や。かなりの量の論文で、言うたように論文自体が10ページあって、それに加えてこの免疫レパートリー分類があるんや。これについては1分くらいで見ていこうと思う。
集合分類があって、各人間から免疫受容体の集合を得て、その人間が特定の病気に免疫があるかどうかっていうラベルを1つだけ得るんや。そして、別の人間は別の集合を持つ。
どれが免疫の原因かなんて全然わからへんのや。実際、これらだけでは決定できへんのや。部分列だけで決定できるんやけど、それも組み合わせかもしれへんのや。
単一のものが責任を持つんやなくて、組み合わせかもしれへんけど、個々のラベルは持ってへんし、人間ごとに違うし、長さも違うんや。これ全部がめっちゃ巨大なタスクで、1人の人間に対して数万個もあるんや。
彼らはここでシステムを構築してて、まず1次元の畳み込みを使って内部シーケンスを処理して、それからこのホップフィールドの注意機構を使ってるんや。全部学習されたクエリを使ってな。
そして出力ラベルで学習するんや。驚くべきことに、これが実際に機能するんや。内部シーケンスが数万個あっても、それら全部に対して1つのラベルしかなくてもな。
他のベースラインと比べて、このタスクでは良好な結果を達成してるみたいや。このホップフィールドネットワークを使ってな。これはめっちゃ面白いけど、その論文は自分で見てみてな。
ここで起こってることが何となくわかってもらえたと思うんや。実際にこれらの更新を2回くらいやったらどうなるか見るのはめっちゃ面白いと思うんや。これは望ましいことなんやろうか。
収束まで実行するのは望ましいことなんやろうか。それとも、収束しないことに何か良いことがあるんやろうか。それとも、実際に1ステップで収束するから関係ないんやろうか。わからへんわ。
でも、コードを見てみてな。めっちゃクールやで。この動画を楽しんでもらえたら嬉しいわ。
きっと、君にもわいにも、まだまだ疑問がたくさんあると思うんや。コメント欄で質問してくれてもええし、わいらのDiscordに参加してくれてもええで。言うたように、Discordにはめっちゃ頼りになる人がようけおるからな。
ほんじゃ、また次回お会いしましょう。バイバイ!

いいなと思ったら応援しよう!