「注意はそれだけで十分だ。」 -- Vaswani, 2017
ここまでの道のり
私たちは、一本の線を描く単一のニューロンから始めました。そこに隠れ層を追加して、曲がるようにしました。ネットワークに、自分自身の重みを学習させました。ミニバッチとAdamで学習をスケールさせました。ドロップアウトで過学習と戦いました。画像用のフィルタを作りました。シーケンスのためのメモリをネットワークに与えました。圧縮を注意(attention)に置き換えました。
それぞれのアーキテクチャは、前のものが解けなかった問題を解決しました。それぞれが、うまくいったものを引き継ぎ、うまくいかなかったものを捨てました。
個人的なつながり
Attentionのブログ記事で、私が以前はタミル語でまず文を組み立て、それから単語ごとに英語へ翻訳していたことを説明しました。それは遅く、逐次的で、情報を失いやすいものでした。ようやく英語を直接考えるようになったとき、すべてが変わりました。もはや翻訳していなかったのです。意味、文法、文脈を同時に処理していて、これまでに読んだり聞いたりしてきたすべてによって形作られていました。
逐次的な翻訳から並列な理解へのその転換こそが、Transformerがやっていることとまったく同じです。そして根本の考え方はシンプルです:
P(next token | all previous tokens)
それ以前に来たすべてを前提として、次のトークンが起こる確率はどれくらいか? この1つの方程式こそがGPT、Claude、そしてあらゆる現代的な言語モデルの土台です。あなたが出力するものはすべて、意識していようといまいと、過去と現在の文脈によって形作られます。Transformerは、この考え方を計算可能にします。
デコーダを分解する
デコーダのみのTransformer(GPT、Claude、そしてほとんどの生成AIモデルで使われる)は、同一の層が積み重なったものです。それぞれの層には4つの構成要素があり、私たちはこれまでにそれらすべてを見てきました。
トークン + 位置埋め込み: 各トークンはベクトルになります(たとえば128個の数)。attentionは順序を気にしません。そのため、位置の信号が追加されます。位置3にある「slow」は、位置6にある「slow」とは異なる埋め込みを得ます。モデルは位置が重要だと学習します。
マスク付きマルチヘッド自己注意: これが核心です。各トークンは、自分にとってそれまでのどのトークンがどれだけ関連しているかを計算し、その関連度に応じて情報をブレンドします。
RNNの文を考えてみてください:「私の先生は私が遅いと言ったけれど、彼は私が始めたばかりだってことを知らなかった。」
「he(彼)」が指すものを予測するときに:
"My" → 関連度は低い(所有、文脈)
"teacher" → 関連度は高い(主語――「he」はここを参照している)
"said" → 関連度は低い(動詞、指示対象ではない)
"I" → 関連度は中くらい(文中の別の人物)
"was" → 関連度は低い(補助動詞)
"slow" → 関連度は低い(形容詞)
"but" → 関連度は低い(接続詞)
"he" → 現在位置
RNNは、すべてを固定長の隠れ状態に圧縮し、「teacher」がその旅を生き残ることを祈らなければなりませんでした。ここでattentionは直接さかのぼります。圧縮も、忘れもありません。
Attentionの記事の注意(attention)式:
Attention(Q, K, V) = softmax(Q·Kᵀ / √d) · V
各トークンは、クエリ(Query)(「自分は何を探しているのか?」)、キー(Key)(「自分は何を提供できるのか?」)、バリュー(Value)(「自分が運んでいる情報は何か?」)を生成します。Q·Kᵀ の内積は、各キーがそのクエリとどれだけ一致しているかのスコアです。softmaxがスコアを重みに変えます。重み付きの値の和が出力を生みます。因果マスク(causal mask)によって、トークン5はトークン1〜4しか見ることができません。先読みはしません。
マルチヘッド注意は、異なる学習済みの射影を使って、この操作を並列に複数回実行します。概念的にはCNNの複数のフィルタに似ています。CNNでは、各フィルタが異なる空間パターン(エッジ、テクスチャ)を検出します。Transformerでは、各ヘッドが異なる関係(文法、一致参照、意味)を検出します。8ヘッドなら8つの視点、合計の計算量は同じ。
Add & LayerNorm: Post 07からの残差接続です。入力はattention層を迂回して、そのまま加え戻されます:
output = LayerNorm(x + Attention(x))
これにより、深いスタックの中でも勾配が生き続けます。層正規化は、層間の信号を安定させます。これらがなければ、12層のTransformerは学習できません。
フィードフォワードネットワーク: GELU活性化を伴う2層のMLPで、各位置に独立に適用されます:
FFN(x) = GELU(x · W₁ + b₁) · W₂ + b₂
ここに非線形性があります。attention自体は重み付きの和(線形)です。FFNは、各トークンがattentionから学んだ内容を、非線形関数によって変換します。これはPost 02と同じ原理です。これがなければ、attention層を積み重ねても単一の線形演算に崩れてしまいます。
この4つの構成要素はN回繰り返されます。各層が表現を洗練させます。最後の層まで来ると、各トークンのベクトルは、シーケンス全体の文脈の中での意味をエンコードします。
最後に線形層を置き、softmaxを通すことで、次トークンに関する確率分布が得られます。この最後の層は意図的に線形です。その役目は、豊かな表現を語彙(vocabulary)空間へ射影することです。非線形性は、下の層で既に仕事を終えています。
どのように学習するか
すべての重みはランダムに初期化されます。Transformerは何も知りません。学習には、このシリーズと同じループを使います。逆伝播が勾配を計算し、Adamが重みを更新し、ドロップアウトが記憶(memorization)を防ぎます。
違うのは、Transformerが何から学ぶかです。ラベルはありません。人間の注釈もありません。ただの生のテキストです。「これらのトークンが与えられたら、次のトークンを予測せよ」。それを何十億回も。モデルは、次トークン予測の副作用として、文法、事実、推論、スタイルを学習していきます。
返却形式: {"translated": "翻訳されたHTML"}これは自己教師あり学習と呼ばれます。学習の信号はデータそのものから得られます。すべての文は入力であり、同時に答えでもあります。次の単語を予測し、合っていたかを確認し、調整する。Bakcpropagationから来た同じ「試す→外す→調整する」ループを、XORから始めた当初では不可能に思えたような規模で行うのです。
それを見る
プレイグラウンドを開いてください。シェイクスピアで事前学習された2つのモデルがあります。小さいもの(112Kパラメータ)と、より大きいもの(826Kパラメータ)です。「ROMEO:」のようにプロンプトを入力すると、すぐにテキストが生成されます。どちらのモデルも小さいので、出力はまだ荒く、ほんもののシェイクスピアではありません。ですが、2つを並べて比較すると、826Kのモデルの方が明らかに構造が良いことが分かります。会話形式、登場人物名、詩のような改行です。このおもちゃのような段階でも、スケールは重要です。
連載:完結
この連載は、私がAIツールで何かを作っていたのに、仕組みがまったく分かっていなかったことがきっかけで始まりました。10回の投稿後、私は基礎を理解しました。公式を暗記したからではありません。各要素を自分で再現し、それが動くのを見て、次につながる部分とどう結びつくのかを見たからです。学ぶことはまだまだたくさんあります。旅は続きます。
トランスフォーマーは、これらの要素を何ひとつ発明したわけではありません。組み合わせただけです。天才性は「足したもの」ではなく、「取り除いたもの」にありました。
次に何がある?
私たちはアーキテクチャを作りました。しかしアーキテクチャだけでは知能は生まれません。知能を生きたものにするのは学習です。データがどう準備されるか、モデルがどうスケールするか、どう微調整されるか、そしてどうやって指示に従うことを学ぶのか。これは別の連載です。
参考文献:
Vaswani, A., and team(2017). Attention Is All You Need. NeurIPS.
Radford, A., and team.(2018). Improving Language Understanding by Generative Pre-Training.(GPT-1)
連載: PerceptronsからTransformersへ | コード: GitHub





