- 約1,000万パラメータのdecoder-only TransformerをTinyShakespeareで学習し、自己注意の後の計算結果がどのように次トークン確率へ変換されるかを、内部状態と実験を通じて追跡した
- 中核仮説は、各Transformerブロックがプロンプトを学習コーパス内の特定の文字列集合に結び付け、その文字列群の直後に実際に現れたトークンの頻度分布が、ブロックの次トークン予測に近いというもの
- 実装した近似手順では、各ブロックのfeed-forward network出力に似た学習文字列を見つけ、その後続文字の分布を合算し、ブロックごとの重み付き和によってモデル出力を再構成する
- 長さ10のプロンプト20,000件で、近似出力と実際のTransformer出力の平均Hellinger distanceは約0.17であり、同じ構造を別seedで学習した代替モデル群と元モデルの距離は約0.11 ± 0.08だった
- この分析は、feed-forward出力がブロック変換で大きな比重を占め、attentionがプロンプトを適切な学習文字列クラスへ写像しているという解釈を支持するが、小規模モデルを超えて一般化できるかは不明
実験対象のモデルと問い
- 約1,000万パラメータのTransformerを、Andrej Karpathyの Let’s build GPT: from scratch, in code, spelled out に沿って実装・学習した
- モデルは6ブロック構成のdecoder-only Transformerである
- 学習データは TinyShakespeare で、Shakespeareの戯曲40,000行を含む
- RTX 4000 GPUで約1時間学習した後、構造的にもっともらしい擬似Shakespeareテキストを生成した
- トークンは単語ではなく文字である
- 語彙サイズは65で、入力プロンプトの次に来る文字の確率分布を予測する
- 例えば
'my most gr' の次の文字として a を0.819、e を0.081、i を0.059と予測する
- 中核の問いは自己注意そのものではなく、attentionの後の結果がどのように最終的な次トークン確率へ変わるのか、という点である
ブロック構造とfeed-forward networkの比重
- 各Transformerブロックはmulti-head self-attentionとfeed-forward networkを含む
- PyTorchの構造上、ブロック出力は
x + self.sa(self.ln1(x)) の後に x + self.ffwd(self.ln2(x)) を加える形になっている
- 中間変数で書けば、ブロック出力は
x + sa_out + ffwd_out とみなせる
- 分析対象モデルでは、feed-forward networkが全学習可能パラメータの**65.71%**を占める
- feed-forwardパラメータ: 7,089,408個
- 全学習可能パラメータ: 10,788,929個
- feed-forward network出力は、ブロック入力を出力へ変換する主要因のように見える
- 後続の実験でも、self-attention出力単独よりfeed-forward出力の方が最終確率分布に大きな影響を示した
類似したfeed-forward出力で文字列を探す
- 近似手順は、プロンプトと学習コーパス文字列のfeed-forward出力の類似度を利用する
- プロンプトをモデルに入力し、各ブロックのfeed-forward network出力を保存する
- 各ブロックごとに、学習コーパス内でfeed-forward出力が似ている文字列を探す
- それらの文字列の後に現れたトークンの頻度分布を合算する
- ブロックごとの分布を重み付き和し、正規化して確率分布を作る
- デモ用プロンプト
'And only l' では、1番ブロックのfeed-forward出力とcosine similarityが0.95以上の長さ10文字列を94個見つけた
- 見つかった文字列は
hat only l, \nMy only l, I dearly l, ng Henry l, And only l のように、概ね y l または ly l で終わっていた
- これらの文字列の後に現れた文字の正規化頻度分布は、実際のモデルの次文字予測と非常によく似ていた
'And only l' の例では、近似と実際のモデル予測は近く一致した
- モデル:
i 0.437, o 0.204, a 0.195, e 0.160
- 近似:
i 0.389, o 0.250, a 0.222, e 0.139
- Hellinger distanceは0.0711
- 単一ブロックだけでは失敗する場合もある
- プロンプト
'hing tremb' で1番ブロックだけを使うと、モデルは l 0.999を予測する一方、近似は e 0.543, l 0.343となり、Hellinger distanceは0.6305となる
- 全ブロックを反映すると、同じ例で近似は
l 0.997を予測し、Hellinger distanceは0.0233まで下がる
計算規模と手動チューニング
- 効率のため、分析は主に長さ10の文字列で行った
- 学習コーパスは1,115,394文字で、一意な長さ10の部分文字列は858,923個
- feed-forward出力は384次元の
float32 ベクトルで、6ブロックから1つずつ得られる
- 長さ10の文字列20,000件をランダムに選び、実験用プロンプトとして使った
- 各プロンプトと858,923個の一意な部分文字列の間のブロック別cosine similarityを事前計算し、ディスクに保存した
- 注目すべきマッチングはcosine similarity 0.7未満では現れなかったため、0.7以上だけを事前フィルタした
- ブロックごとのsimilarity thresholdは手動チューニングで決めた
- ブロック 0: 0.95
- ブロック 1: 0.94
- ブロック 2: 0.85
- ブロック 3: 0.76
- ブロック 4: 0.81
- ブロック 5: 0.89
- ブロックごとの頻度分布を結合する際にも手動重みを使った
- 使用した重みは
[0.01, 0.01, 0.1, 1.5, 6, 0.01]
- 深層学習的な方法でも重み探索を試みたが、手動チューニングを上回る結果は得られなかった
20,000件のプロンプト評価
- 全20,000件のプロンプトについて、近似分布とモデル出力分布のHellinger distanceを計算した
- 平均: 0.1677
- 標準偏差: 0.1215
- 最小値: 0.0013
- 最大値: 0.9994
- Hellinger distanceは確率分布間の重なりを測る指標で、0は同一、1は重なりなしを意味する
- 近似品質を比較するため、同じアーキテクチャを別のrandom seedでさらに3回学習した
- 元モデル seed: 1337, 推定 training loss 0.9334, validation loss 1.5063
- Alternate 1 seed: 1442, training loss 0.9293, validation loss 1.5038
- Alternate 2 seed: 88, training loss 0.9294, validation loss 1.4991
- Alternate 3 seed: 99999, training loss 0.9339, validation loss 1.4941
- 元モデルと代替モデル群の平均Hellinger distanceは約0.11 ± 0.08
- Original vs Alternate 1: 0.1064 ± 0.0823
- Original vs Alternate 2: 0.1057 ± 0.0817
- Original vs Alternate 3: 0.1053 ± 0.0828
- 近似とモデルの平均距離0.17は代替モデル間距離0.11より大きいが、標準偏差の範囲内にあり、近似がかなり良好であると判断する根拠になる
Transformer内部動作の解釈
- モデルは埋め込み後の複数段階の空間変換として見なせる
- 6つのTransformerブロックは、384次元の埋め込み空間内で入力埋め込みを出力埋め込みへ変換する
- 最後のLayerNormとlinear layerは埋め込み空間を65次元のlogit空間へ変換し、softmaxが次トークン確率を作る
- ブロック内部の変換はベクトル加算として見なせる
- ブロック出力は、入力
x、self-attention出力 sa_out、feed-forward出力 ffwd_out の和である
- 分析では、feed-forward出力ベクトルはself-attention出力より概してnormが大きく、ブロックごとに両出力が概ね似た方向を指すパターンが観察された
- feed-forward出力だけを加えても、最終出力ベクトルと方向は概ね似ている
- feed-forwardのみを用いた出力はnormこそ小さいが、方向は元の出力に近い
- 最終LayerNormのため、normの差は最終linear layer入力ではそれほど重要ではない
- これはself-attention計算を除去してよいことを意味しない
- feed-forward networkは
ffwd_out = self.ffwd(self.ln2(x + sa_out)) のようにself-attention出力を入力に含むため、self-attentionを除くとfeed-forward出力自体が変わってしまう
トークンsubspace仮説
- 特定の埋め込みによって、モデルに特定トークンをほぼ確実に予測させることができる
- 例えば最終ブロック後のLayerNormとlinear layerに入力される埋め込みを学習し、token
a の確率がほぼ1になるようにできる
- Transformerの重みは固定し、埋め込みテンソルだけを最適化する
- 各トークンに対して埋め込みは1つだけではなく複数存在する
- これを各トークンに対応する複雑な非線形埋め込みsubspaceとして解釈する
- 各トークンについて数千個の一意な埋め込みを容易に学習できた
- subspaceを厳密に数学的に求めることはできなかったが、最終段階では線形近似がうまく働く
- 各トークンについて学習した埋め込みを積み上げ、SVDを実行した
- 第1 right singular vector 1本が、そのトークンsubspaceの1次元線形近似としてうまく機能した
- 複数トークンのsubspace近似ベクトルを線形結合すると、複数トークンに確率を分散させる埋め込みを作れる
a と b の近似ベクトルを足すと、両トークンに確率が配分された分布が得られる
- ただし、近似誤差、subspaceベクトルの非直交性、トークンごとのlogitの大きさの差により、完全な50:50分布にはならない
feed-forward出力とトークンsubspaceの対応
- feed-forward出力は、特定トークンsubspaceの方向へブロック出力を調整しているものと解釈できる
- そのトークンは、近似手順が予測したトークン、つまり類似したfeed-forward出力を生む学習文字列の後に現れたトークンと一致する
- 例
med me Aut で最終ブロックだけを見ると、近似は o を最有力の次トークン、h をその次として予測する
- 同じfeed-forward出力ベクトルをトークンsubspace近似へ射影すると、最も類似したトークンも
o, h, i, u, y の順だった
- 例
if and thy でも同様の対応が見られる
- 近似は space,
s, newline を主要な予測トークンとして挙げる
- feed-forward出力と最も整列したsubspaceも、space,
s, newline に近い順序だった
- 全20,000件のプロンプトについて任意の基準を設けて集計した
- 基準は「近似予測で確率質量の90%を占めるトークンのsubspaceが、feed-forward出力とのcosine similarity順位で上位半分に入るか」である
- 最終ブロック基準では16,357件、すなわち**81.78%**が基準を満たした
ブロック別aggregate結果とchance比較
- 各ブロック位置で学習したsubspace近似を使った場合、基準充足率は後段ブロックほど高い
- ブロック 6: 16,357件, 81.78%
- ブロック 5: 10,142件, 50.71%
- ブロック 4: 7,760件, 38.80%
- 最終段階のsubspace近似を全ブロックに適用すると、より良い結果が得られる
- ブロック 6: 81.78%
- ブロック 5: 68.26%
- ブロック 4: 58.15%
- ブロック 3: 57.34%
- ブロック 2: 52.02%
- ブロック 1: 49.71%
- ランダムなcosine similarityで基準が偶然満たされる可能性もシミュレーションした
- ブロック 6: 20.76% ± 0.25%
- ブロック 5: 20.55% ± 0.26%
- ブロック 4: 18.37% ± 0.24%
- ブロック 3: 18.20% ± 0.24%
- ブロック 2: 17.04% ± 0.23%
- ブロック 1: 16.31% ± 0.23%
- 結果はchanceを大きく上回るが、測定ノイズやsubspace近似の限界のため、決定的証拠と見るのは難しい
self-attentionの役割
- この解釈では、良い予測はプロンプトを学習コーパス内の正しい文字列クラスへ写像できるかに依存する
- その写像を担う中核がself-attentionである
- attention layerは、プロンプトトークン間のパターンを識別する
- パターンは末尾の
y l のような単純な文字列パターンかもしれないし、特定位置の母音や大文字のような、より一般的なトークン種別かもしれない
- attention headの学習済み重みは、どのパターンに反応するかを決める
- attention head出力がfeed-forward networkを通ると、類似した学習文字列の後に現れたトークン分布情報を含む埋め込み空間表現になる
- 分析モデルは6ブロックと各ブロック6個のattention headを持つため、1つのプロンプトを複数の潜在パターンについて評価できる
結論と限界
- 近似手順と実際のTransformer出力が類似しているという証拠は強い
- 近似手順が実際のTransformer内部計算に対応しているという証拠はそれほど明確ではないが、少なくとも部分的には正しい可能性を示唆している
- 1つの小規模Transformerで得られた結果が、より大きなモデルや別データセットへ一般化するかは分からない
- このプロジェクトは、モデル内部に問いを投げかけて実験を設計する過程であり、言語モデルの「魔法」を単純なメカニズムへ還元するというより、その複雑さをよりよく見せてくれる
1件のコメント
Hacker Newsの意見
親記事のいくつかの論点は、https://people.math.harvard.edu/~ctm/home/text/others/shanno... を読んだ人にとっては、それほど驚くようなものではないはず
自分の分野の 基礎文献 を読まないと、すでに整理されている研究の自然な帰結として生じる現象まで、説明のつかない神秘のように見えてしまう
それでも実験は一見してかなり徹底しているように見えるし、注ぎ込まれた細部の作業量は高く評価したい
既存理論を学ぶことと、ゼロから再導出してみることの間には難しいトレードオフがある。伝統的な基盤がなければ新発見が可能になる一方で、基盤があれば特定の現象をより深く理解できる
ここのコメントでは、データが与えられたときに系列の 対数尤度 を最大化するモデルが、推論時に魔法のようにその振る舞いから外れないことに驚いている人が何人もいるように見える。これは密度推定モデルなのに、空中から Shakespeare を朗誦してくれるとでも期待しているのだろうか
基本に立ち返れば、こうした実験ははるかによく理解できる。これや、いわゆる創発現象を説明する非常に明確な数学的基盤はすでに存在する
より具体的には複数の層位があり、Shannon のエルゴード系の扱いが良い出発点になる。ここでは少しずれる部分もあるが、全体の力学を理解するには十分近い対応に見える
優秀な人たちが「この数学的構造はあのアイデアに似ていて、構造をいくつか足したり引いたりすれば全部説明できる」と言うのは珍しくない。だが実際には、まだ分かっていないことが多い
この分野の理論家たちが理論を持ち込んで新しいものを作ったり、有用な予測を出したりするのを見たことがない。たいていはあれこれ試してみて、うまくいけば後からもっともらしい説明を付け、だめなら埋もれさせるという流れだ
最近も、transformer をカーネル平滑化として捉える記事が上がっていた: https://arxiv.org/abs/1908.11775
反復的な再発見は必ずしも無駄ではなく、複数の到達経路を持つ深い真実を確認し、検証する過程なのかもしれない
情報理論の教科書のかなりの部分では、こうしたネットワークの content-addressable な性質にすでに触れており[1]、この目的のために圧縮のような応用にも使われている[2][3]
だから、NYT が OpenAI のモデルに自社記事の数段落をプロンプトとして入れたときに、ほぼそのまま再現されたのも驚くことではない
[1] https://www.inference.org.uk/itprnn/book.pdf
[2] https://bellard.org/nncp/
[3] https://pub.towardsai.net/stable-diffusion-based-image-compr...
Googleが、同じ単語を繰り返し出力させるよう指示するとChatGPTに訓練データをそのまま吐き出させられると指摘したこと[0][1]を見て、まったく同じアイデアを思いついた。実際に誰かが実装してくれてうれしい
ここで追加の疑問が2つ生じる
[0] 以前は可能だった。OpenAIは現在、コンテキストウィンドウを1つの単語で埋めると生成をブロックする
[1] https://arxiv.org/abs/2311.17035
省ける工程はあまり多くなく、むしろ追加作業のほうが多い
モデル訓練用コーパスと、類似活性値文字列を検索するためのコーパスを完全に分離しても、ほぼ同じ結果になる気がする。難しいのは、そもそも次トークン統計が似た文字列に対して似た活性値を生むようにすることだからだ
層ごとの重み [0.01, 0.01, 0.1, 1.5, 6, 0.01] では最も重要なのは最後の一つ前の層であり、この時点で入力はすでに大きく変換されている。したがって、これによってtransformerを訓練データに対する単純なgrepで置き換えられると期待すべきではない
最後の一つ前の層の重みが最終層よりはるかに大きい理由は、誘導ヘッド にあるのかもしれない。https://transformer-circuits.pub/2021/framework/index.html にあるように、入力内の反復文字列をコピーする機能を実装し、最後の一つ前の層が何を探すかを決め、最終層がコピーを実行する構造なのかもしれない
この文章の貢献は、著者が述べているように、transformer自体に焦点を当てた「どう実装するか?」系の記事とは異なり、実際にGPTを作る技術読者にその点を示したことにある
よく見ると、存在しないうえに前後関係も合わないGitHub READMEや、中身のない案内パンフレット、ランダムな会話のようなものだった
しかし、こうしたモデルを訓練するためにインターネット全体をかき集めることは、決して攻撃とは呼ばれない
だとすれば、その著作物内の 文字の確率分布 にも権利があると考えてはいけない理由は何だろう?
Andrej KarpathyのNanoGPTを知ってすぐ、ロシア語版のWar and Peaceで訓練してみたが、わずか3MBのモデルなのに ロシア語文法 をほぼ把握していたのが興味深かった
ロシア語は複雑な総合・屈折構造を持っている。たとえば前置詞「na」(「upon」)の後には対格名詞が来る必要があり、これは有生男性名詞では -a、無生物名詞では語尾なし、「soft consonant」で終わる名詞では -ia、女性名詞では -u などで現れる
また、「使う」という動詞は、道具として使われる名詞が後続する場合、造格を要求する
完璧ではなく間違いもあったが、NanoGPTがわずか3分の訓練で特定の複雑な規則を推論したのは興味深かった。生成された正確な例文を原文中から探してみたが、そのまま一致するものはなかった
ただし、文法はある程度理解していても、意味的には完全にナンセンスだった
同じ仕組みを示す良い 3D可視化 があり、一緒に読むと効果が高そうだ
LLM Visualization (https://bbycroft.net/llm)
https://news.ycombinator.com/item?id=38505211
すべての項目を一度に見せようとしたためで、抽象概念に委ねなかったからのようにも思うが、確信はない
良いプロジェクトだが、分析対象のモデルはサイズと訓練データ量の両方の面で、実質的に おもちゃのモデル だ
そのため、このモデルはより単純なモデル、たとえばn-gram言語モデルでも近似できるかもしれないが、より大きな言語モデルの動作を代表しているとは言いにくい
著者が、LLMはマルコフ連鎖のテキスト生成器だと主張しているのかが気になる。
つまり、生成される次のトークンの確率分布が、訓練データ内にあるそのトークン列の確率と同じだという意味なのか?
もしそうなら、元の訓練データからマルコフ連鎖を「そのまま」作れば、LLMに近い性能を得られるということだろうか?
状態はコンテキスト長ぶんのトークンベクトルであり、モデルは遷移行列を記述する。与えられたコンテキスト長サイズのトークンベクトルに対して、次のコンテキスト長サイズのトークンベクトルの確率を出力するということ
難しい部分は、どの訓練データのテキストがプロンプトのテキストと「似ているか」を知る分類である。
ブログ記事の例は次のようなもの。
Original string: 'And only l'
Similar strings: 'hat only l' 's sickly l' ' as\nthey l' 'r kingly l'
これは、transformerを迂回して同じ結果を得る方法がありうることを意味している。より効率的なのか気になる。
たとえば、ベースモデルが与えられているときに別の何かを訓練して、はるかに小さなデバイスで動かせるようにする、といったことが可能かもしれない
著者が正確に何を示したと主張しているのか、かなり理解しにくい。
「Interpretation: Why Does the Approximation Work?」の節を何度か読んだが、transformerの各段階の機械的な説明のように感じる。核心となる主張が何なのかわからない
アテンションとFF変位がだいたい同じ方向を向く現象が知られているのか気になる。
層をまたいで同じ潜在空間にあること自体、やや驚きである。FFネットワークは任意の回転をしてもおかしくないのでは? 何か誤解している気がする
何かが落ちるのは避けられず、高次元空間での任意回転を正確に描写することも、その落ちるものの一つである