※本記事は、スタンフォード大学のオンラインコース「CS336: Language Modeling from Scratch」の講義内容を基に作成されています。講義の詳細情報やコース全体については、https://stanford-cs336.github.io/ でご覧いただけます。本記事では、講義の内容を要約しております。なお、本記事の内容は原講義の内容を正確に反映するよう努めていますが、要約や解釈による誤りがある可能性もありますので、正確な情報や文脈については、オリジナルの講義動画をご視聴いただくことをお勧めいたします。
登壇者:
- Tatsunori Hashimoto(橋本達典):スタンフォード大学コンピュータサイエンス助教授
スタンフォード大学のオンライン人工知能プログラムについての詳細は https://stanford.io/ai を、このコースへの登録方法については https://online.stanford.edu/courses/ をご覧ください。コーススケジュールとシラバスは https://stanford-cs336.github.io/ でご確認いただけます。コース全体のプレイリストは「Stanford CS336 Language Modeling from...」でご視聴いただけます。
1. 導入とトランスフォーマーの概要
1.1 講義の目的: LMアーキテクチャとトレーニングの詳細
橋本教授:私は今回の講義を「LMアーキテクチャとトレーニングについて知りたくなかったあらゆること」というタイトルにしました。これは、多くの他のクラスでは詳細を省いてしまうような、LMアーキテクチャやトレーニングに関する細かい内容—例えば「ハイパーパラメータはどうすべきか」といった質問—に踏み込んでいくためです。
Percy(Liang教授)と比べると、私の講義スタイルはあまり革新的ではありません。実行可能なPythonコードではなく、PowerPointスライドを使用します。しかし、PDFをウェブサイトで見つけることができるはずです。
今日の講義では、まずトランスフォーマーの簡単な復習から始め、標準的なトランスフォーマー(224Nなどで学ぶような内容)の2つのバリアントについて説明します。その後、皆さんが実装するバリアント、そして最新のコンセンサスとなっているトランスフォーマーのバリアントについて話します。
その後、トランスフォーマーアーキテクチャを理解するための、よりデータ駆動型のアプローチを取ります。我々が問いかけるのは、「多くの研究者が様々なLLMを訓練してきた中で、それらの論文を読み、何が変わり、何が共通しているのかを理解し、その進化的分析からトランスフォーマーを機能させる本当に重要な要素は何なのか」ということです。
今日のテーマは、このクラス全体のテーマでもある「学ぶ最良の方法は実践的な経験を積むこと」ですが、この講義のテーマは「すべてのトランスフォーマーを訓練することはできないので、他の人の経験から学ぶ」というものです。
1.2 オリジナルトランスフォーマーから最新バリアントへ
橋本教授:出発点は元のトランスフォーマーです。224Nや他のNLP講義で学んだと思いますが、復習として説明します。トランスフォーマーは下部に単純な位置エンベディング、マルチヘッドアテンション、その後にレイヤーノーム、上向きに伸びる残差ストリーム、MLPがあり、最後にソフトマックスがあります。これらすべての異なる部分に様々なバリエーションがあり、最新の最先端モデルになるまで見ていきます。
皆さんが実装したのは、オリジナルの論文のバニラトランスフォーマーバリアントではありません。いくつかの修正を加えています。例えば、レイヤーノームをブロックの前に配置しています。スライドでは、残差ストリームの各ブロックの直前にノームが配置されていることがわかります。また、回転位置エンベディング(rotary position embeddings)の実装を求めました。フィードフォワード層にはSwiGLUと呼ばれるものを使用し、線形層にはバイアス項がありません。
なぜオリジナルの「Transformer is All You Need」のトランスフォーマーではなく、このような変種を実装させたのかと疑問に思うかもしれません。その理由を説明していきます。
昨日、過去1年間のアーキテクチャの発展について追いかけようと思いました。Percyはこれについて警告してくれました。「毎年講義をやり直さなければならない」と。いくつかの良い論文があることを確認し始めました—CommandR、Two-mode furious、SmallLM、DBRX54などです。さらに調べると、Gemma 3、Qwen 2.5、InternLMなどがあり、さらに多くのモデルがあります。画面に表示しきれないほどのモデルがあります。昨年だけでも約19の新しい密なモデルがリリースされ、その多くはアーキテクチャに微妙な変更を加えています。
一方では、これらの論文すべてに目を通すのは面倒ですが、同時に貴重な情報源でもあります。すべてが同じことをしているわけではなく、何が起きているのかを見ることができます。スライドの詳細は後ろの方からは見えないかもしれませんが、2017年のオリジナルトランスフォーマーから2025年の最新モデルまで、これらのモデルが何をしているかをまとめたスプレッドシートを作成しました。
例えば、位置エンベディングのカラムを見ると、人々はabsolute、relative、RoPE、alibiなど様々なことを試してきましたが、2023年頃からほぼ全員がRoPEを使用しています。これはニューラルアーキテクチャの収束進化のようなものであり、これらの異なる要素について詳しく説明していきます。
1.3 データドリブンな観点からのトランスフォーマー理解
橋本教授:この講義では、主に三つの大きなセクションをカバーします。まず予告として、アーキテクチャのバリエーション、そしてハイパーパラメータ、最後に時間があれば異なるアテンションの種類について話します。
アーキテクチャのバリエーションでは、活性化関数、フィードフォワード、アテンションのバリエーション、位置エンベディングなどについて説明します。そしてアーキテクチャを固定したら、次に何をすべきでしょうか?ハイパーパラメータを選ぶ必要があります。隠れ次元をどれくらい大きくするか、MLPの内部射影層をどれくらい大きくするか、次元数をどうするか、語彙要素の数はどうするかなど、これらすべてが言語モデルを実際にトレーニングする際に選択すべき重要な要素です。これらを適当に選ぶのではなく、ある程度知的な方法で選択したいですね。
アーキテクチャのバリエーションについて、ここで二つのポイントを挙げておきます。一つ目は、多くの選択肢にそれほどコンセンサスがないということです。ここ数年で収束進化が見られますが、人々はさまざまなことを行っています。レイヤーノームとRMSノームを入れ替えたり、直列レイヤーと並列レイヤーを使い分けたりしています。
二つ目に、最初のGPT以来、ほぼすべての人が行っている選択が一つあります。これについては後ほど説明します。多くの異なるバリエーションから学ぶことができます。224Nでもすでに話した大きなポイントがありますが、それを復習として取り上げます。
データドリブンなアプローチを通じて、何が本当に重要で、何が単なる実装の詳細なのかを理解することができます。例えば、位置エンベディングでは、初期のモデルではさまざまなアプローチが試されましたが、現在ではほぼすべてのモデルがRoPEに収束しています。これには理由があり、相対的な位置情報の保持やコンテキスト長の外挿性能など、実用的なメリットがあります。
同様に、レイヤー正規化では、ほぼすべてのモデルがプリノーム(Pre-norm)アプローチを採用していますが、最近では「ダブルノーム」と呼ばれる新しい変種も登場しています。これらのパターンを観察することで、何が本当に機能するのかを理解することができるのです。
2. アーキテクチャの変化
2.1 Pre-normとPost-normの比較と進化
橋本教授:ほぼすべての人が同意している一つのことは、プリノーム(Pre-norm)対ポストノーム(Post-norm)の使用です。この用語は少し紛らわしくなりますが、オリジナルのトランスフォーマー論文では、左側に示されているように、残差ストリーム(図のグレー部分)に加えて、すべてのサブコンポーネントの後にレイヤーノームがありました。
マルチヘッドアテンションを実行し、それを残差ストリームに加え、それからレイヤーノームを適用します。そして同じことをフルコネクテッドレイヤーでも行い、それからレイヤーノームします。しかしごく初期に、人々はこのレイヤーノームを、このスライド右側のブロックのように、非残差部分の前に移動させると、多くの面でより良い結果が得られることに気づきました。
基本的に、私が知る限り、ほぼすべての最新のLMがこの種のプリノームを使用しています。最近いくつかの新しいイノベーションがあり、2枚後のスライドで触れますが、多くのモデルがこれに移行しました。唯一の例外はOPT 350Mで、彼らはこれを間違えてしまったのではないかと思います。これはアーキテクチャ調査の中で面白い発見でした。
このプリ対ポストノームについて、元々開発された理由を調べると、ポストノームを使用すると安定性が低くなるという議論がありました。そのため、安定したトレーニングのためには、学習率のウォームアップのような注意深い調整が必要でした。
初期のプリノームアプローチを提唱する論文を見ると、「プリノームと他の安定性向上テクニックを使えば、ウォームアップを削除でき、システムはポストノームレイヤーノームで慎重なウォームアップを行うアプローチと同等かそれ以上に機能する」という比較がほぼ常に見られます。機械翻訳の設定でもこれが見られ、BERTを使用した他のタスクでも同様です。
なぜこれが役立つのかについては多くの議論がありました。層間での勾配減衰についての議論があり、プリノームを使うと勾配サイズは一定に保たれるのに対し、ポストノームをウォームアップなしで使うと、このオレンジ色のように爆発してしまうというものです。
これは合理的な議論ですが、現代の直感にもう少し近いのは、プリノームが単にトレーニングするための安定したアーキテクチャであるという議論かもしれません。SalazarとYenによる初期の研究では、プリノームでトレーニングすると、青色で示されているように、損失のスパイクが多く発生し、トレーニングが不安定になることがわかりました。勾配ノルムがスパイクしており、一般的にプリノームの場合よりも高くなっています。
今日では、プリノームや他のレイヤーノームテクニックは、本質的に大規模なニューラルネットワークをトレーニングするための安定性向上の補助として使用されています。
これは、今年の講義を準備した時には存在しなかったと思われる、比較的最近のイノベーションにつながります。これは適切な名前がないと思いますが、とりあえず「ダブルノーム」と呼んでおきます。これは最初に示したオリジナルの図です。残差ストリームにレイヤーノームを置くのは良くないことはわかっていますが、今年の224Nでは、「なぜレイヤーノームを前に置く必要があるのか?フィードフォワードネットワークの後に置けないのか?」という質問がありました。もちろんそれは可能です。さらに、最近の研究者たちはブロックの後にもレイヤーノームを追加しています。
GrockとGamma 2はどちらも、フィードフォワードとマルチヘッドアテンションの前後にレイヤーノームを置くアプローチを採用しています。これは興味深い変化です。プリノームが長い間支配的で唯一のものでしたが、ここにきて少し変化が生じています。新しいバリアントが登場し、この種のアプローチについていくつかの評価がなされています。これはより大きなモデルのトレーニングにおいて少し安定していて良いと主張されています。
質問者:なぜ残差内のレイヤーノームが悪いのですか質問者:なぜ残差内のレイヤーノームが悪いのですか者?
橋本教授:これについて「これが悪い理由の証明」は提供できませんが、一つの直感的な議論として、残差は中間層から最上部までの恒等接続を提供しているため、非常に深いネットワークをトレーニングしようとすると、この接続によって勾配の伝播が容易になります。LSTMやその他の状態空間モデルでは勾配を逆伝播することが難しいという議論がありますが、恒等接続にはそのような問題はありません。真ん中にレイヤーノームを置くことで、この種の勾配の挙動に影響を与える可能性があります。そして、それが起きていることを示すのがこの図です。
2.2 Layer Normと RMS Normの違いと利点
橋本教授:元のトランスフォーマーでは、レイヤーノーム(Layer Norm)が使用されていました。レイヤーノームは次の式で表されます。入力の活性化xが入ってきたら、経験的平均(x_iの平均)を引き、分散に小さな調整項イプシロンを加えたもので割り、そして平方根を取ります。これはおおよそ標準偏差と考えることができます。これによって活性化xを標準化し、学習可能なパラメータγで拡大し、βでシフトさせます。
これは理にかなっています。活性化を正規化し、それを任意の位置に移動させます。多くのモデルがこのレイヤーノームを使用し、非常にうまく機能しました。しかし、多くのモデルは現在RMSノームに移行しています。これはコンセンサスの変化の一つであり、基本的にすべてのモデルがRMSノームの使用に切り替えています。
RMSノームでは、平均の調整とバイアス項を削除します。平均を引かず、バイアス項も追加しません。Llama、PaLM、Chinchilla、T5など多くの注目すべきモデルがRMSノームに移行しています。
その理由は何でしょうか?一つの理由は、それが大した違いを生まないということです。RMSノームでトレーニングされたモデルは、レイヤーノームでトレーニングされたモデルと同じくらい良い結果を出すことがわかりました。そのため、シンプル化の議論があります。しかし、実際には、これらの論文でよく挙げられる議論(そしてこの議論の詳細を理解することは重要だと思います)は、RMSノームの方が高速で同じくらい良いということです。
どのような意味で高速なのでしょうか?平均を引かなければ、操作が少なくなります。バイアス項βを戻す必要がなければ、メモリからコンピュート・ユニットにロードしなければならないパラメータが少なくなります。つまり、このような状態を取得する必要がないのです。
あなたの中には、「224Nで、ランタイムの目的ではマトリックス乗算以外は重要ではないと言われたのに、これはマトリックス乗算ではないのだから、これについて気にする必要はないはずだ」と思う人もいるかもしれません。トランスフォーマーのさまざまな操作がどれだけのFLOPを占めるかを考えると、それは合理的な見方です。
この表は、Evanらによる2023年の論文からのもので、タイトルは「Memory Movement is All You Need」のようなものだと思いますが、トランスフォーマーのさまざまなコンポーネントのプロファイリングを行っています。テンソル収縮(マトリックス乗算のようなもの)がトランスフォーマーで発生するFLOPの99.8%を占めていることがわかります。ですから、FLOPの0.17%を節約しても大きな勝利には見えないかもしれません。
しかし、アーキテクチャ設計でこれから重要になるのは、FLOPだけでなくメモリ移動についても考えることです。テンソル収縮はFLOPの99.8%を占めますが、ソフトマックス操作やレイヤーノームなどのような正規化操作は、FLOPの0.17%に過ぎないにもかかわらず、実際にはランタイムの25%を占めています。
その大きな理由は、これらの正規化操作によってメモリ移動のオーバーヘッドが大きく発生するためです。そのため、これらの低レベルの処理を最適化しようとすることは実際に重要なのです。それはFLOPだけでなく、メモリ移動にも関係しているからです。システム講義でこのことをさらに強調します。GPUアーキテクチャについて話すとき、FLOPだけでなくメモリについて考えることが非常に重要になります。これがRMSノームがより人気を得ている理由の一つです。
初期のRMSノーム論文をいくつか見返してみました。残念なことに、大規模なアブレーション研究を含む産業研究所からの論文はそれほど多くありません。そのため、お見せするアブレーションの多くは数年前のものになります。しかし、2020年のNangらの論文は、バニラトランスフォーマーとRMSノームバージョンの比較を示す非常に良いアブレーションを提供しています。
バニラトランスフォーマーでは1秒あたり3.5ステップ、RMSノームでは3.68ステップというように、私が言ったことがそのまま現れています。大きな利得ではありませんが、ある意味無料で得られるものです。また、最終的な損失がバニラトランスフォーマーよりも低くなっています。これは素晴らしいですね?ある意味、ランタイムの改善を得つつ、実際に損失も改善しているのです。これは我々にとってウィン・ウィンの状況です。
最後に付け加えるのは、このRMSノームのテーマに非常に沿っていることですが、最新のトランスフォーマーのほとんどにはバイアス項がありません。元のトランスフォーマーのFFNを見ると、このような形になっています。入力Xがあり、バイアス項を持つ線形層を適用し、ReLUで活性化し、二つ目の線形層で包みます。
しかし、ほとんどの実装では、ゲート付きユニット(これについては後で説明します)でない限り、実際にはこのようになっています。バイアス項は完全に削除されています。これは基本的に同じ原理から議論できます。パフォーマンスは同じくらい良く、マトリックス乗算だけでこれらを機能させるのに十分なようです。
もう一つの、おそらくより微妙な点は、最適化の安定性です。なぜバイアス項が安定性に特に悪いのかについては完全に理解していませんが、バイアス項を削除することがしばしばこれらの大規模なニューラルネットワークのトレーニングを安定させるという非常に明確な経験的観察がなされています。そのため、現在の多くの実装ではバイアス項を完全に省略し、このような純粋なマトリックス乗算の設定でのみトレーニングしています。
これがレイヤーノームの部分です。考えるべき二つのことがあります。これは良いことです。なぜなら、この話は非常に明確だからです。みんなが何かをしていて、あなたもそれを知るべきなのです。基本的に、みんながプリノームを使うか、少なくとも残差ストリームの外にレイヤーノームを置いています。それが一種の鉄則です。より良い勾配伝播が得られ、トレーニングがはるかに安定します。他の方法でやる意味はありません。
ほとんどのモデル、ほぼすべてのモデルがRMSノームを使用しています。実際には同じくらい良く機能し、動かすべきパラメータが少なく、バイアス項を削除するという考え方は広く適用されています。多くのモデルはほとんどの場所でバイアス項を持っていません。
このRMSノームの唯一の例外として、昨日読んでいた中ではCohere(CommandRとR+)がレイヤーノームを使用していると思いますが、その理由はよくわかりません。
2.3 バイアス項の削除とその理由
橋本教授:最新のトランスフォーマーでは、バイアス項を持たないという特徴があります。元のトランスフォーマーのフィードフォワードネットワーク(FFN)を見ると、次のような形になっています。入力Xがあり、バイアス項を持つ線形層を適用し、それをReLUで活性化し、二つ目の線形層を通します。
しかし、ほとんどの実装では(ゲート付きユニットでない限り、これについては後で説明します)、実際には次のようになっています。バイアス項は単純に削除されています。これは基本的に同じ原理から議論できます。バイアス項がなくても同様に良い性能を発揮します。マトリックス乗算だけがこれらのモデルを機能させるのに必要なようです。
もう一つの、おそらくより微妙な点は、最適化の安定性です。なぜバイアス項が安定性に特に悪いのかについては完全に理解していませんが、バイアス項を削除することがしばしばこれらの大規模なニューラルネットワークのトレーニングを安定させるという非常に明確な経験的観察がなされています。
そのため、現在の多くの実装ではバイアス項を完全に省略し、このような純粋なマトリックス乗算の設定でのみトレーニングしています。バイアス項の削除によるメリットは複数あります。まず、パラメータの総数が減少し、メモリ効率が向上します。次に、前述のようにトレーニングの安定性が向上します。最後に、計算効率も向上します。
これらの変更は単純ですが効果的です。レイヤーノームの場合と同様に、バイアス項の削除も「シンプルにする」という一般的な原則に沿っています。不必要な複雑さを削除し、本当に必要なものだけを残すことで、モデルはより効率的かつ安定してトレーニングできるようになります。
これは一般化可能な教訓として考えることができます。深層学習は非常に経験的でボトムアップであることが多いですが、いくつかの一般的な教訓を引き出すことができます。「直接的な恒等写像の残差接続を持つ」という教訓は、このようなアーキテクチャだけでなく、さまざまなアーキテクチャで繰り返し現れています。レイヤーノームの効果的さもまた、この講義の後半で再び見ることになりますが、活性化がスケールでドリフトしないようにすることは、トレーニングの安定性のために一般的に非常に効果的です。これらは比較的一般化可能な教訓です。また、システム上の懸念がアーキテクチャに与える影響について慎重に考えることも、もう一つの一般化可能な教訓です。
2.4 アクティベーション関数の種類と変遷
橋本教授:活性化関数には様々な種類があります—ReLU、Swish、LU、GLU、そして活性化関数ではないものの異なる種類のMLPもあります—GaLU、ReGLU、SwiGLU、LiLUなどです。これは、深層学習を始めたときに学びたくなかった種類のことだと思います。「活性化関数なんて気にしない、どうせトレーニングできるだろう」と思っていました。
しかし、残念ながらあなたとわたしの両方にとって、SwiGLUやその他のGLUのバリアントが一貫して良く機能するということは重要なことです。そのため、これらについて説明し、実際に機能するので注意深く考えるべきです。
ReLUとおそらくGaLUについてはすでに知っているはずです。ReLUは最も基本的な深層学習クラスで学ぶものです。単に0とxの最大値を取ります。MLPの場合、バイアス項は省略していますが、xW1を取り、ReLUを適用し、それからW2を掛けます。これは非常に簡単です。
GeLUはガウシアン・エラー線形ユニットです。これは線形関数とガウス分布のCDFを掛け合わせたものです。基本的にはReLUのようなものですが、底部に少し膨らみがあります。このスライドで見ることができるでしょうか。最下部が完全に平らではなく、少し曲がっています。これにより、より微分可能になり、役立つかもしれません。GPTファミリーのモデル(1、2、3、GPT-J等)はすべてGeLUを使用しています。
元のトランスフォーマーと一部の古いモデルはReLUを使用していましたが、現代のほぼすべてのモデルはSwiGLUやGeGLUなどのゲート付き線形ユニットに切り替えています。これは主にGoogleのチームがPaLMやPaLM-2などで推進したものですが、2023年以降のほぼすべてのモデルがゲート付き線形ユニットを使用しています。
前の質問に戻りますが、「この講義から学べる一般化可能なアーキテクチャ的な教訓は何か」という点で、一貫して非常に有用だったいくつかのことがあります。残差接続、レイヤーノーム、そしてゲーティングもその一つです。ゲーティングはここでも登場し、物事を行うための非常に良い方法です。
元々、これが我々のフルコネクテッドレイヤーでした。ReLUを使用しています。しかし、単に線形変換してReLUを適用する代わりに、ここで出力をエントリーワイズの線形項でゲートします。x・Vはベクトルを生成し、それをMLPの元の内部項とエントリーワイズで掛け合わせ、最後にW2を掛けます。
これは、MLPの隠れた部分をゲートしていると考えることができます。入力を受け取り、それを隠れ空間に変換する元の活性化があり、それをx・Vでゲートします。そして、その結果をW2を使って隠れ次元に戻します。つまり、エントリーワイズのゲーティング操作が行われます。これがGLU+ReLUの基本的な仕組みです。ゲーティングのために追加したパラメータVがあります。
そのため、「GeGLUフルコネクテッドレイヤー」と言われても笑うことはありません。ここではGeLUを非線形性として使用し、同じx・Vによるゲーティングが存在します。これはT5V1.1、Gemma 2、Gemma 3などのGoogleモデルで使用されているアーキテクチャです。
もう一つのバリアントとしてSwiGLUがあり、これは非常に人気があります。Swishはxとシグモイドの積で、これが非線形性です。シグモイドはこのような形で、xはこのような形なので、ガウシアンエラーユニットと同じような形になります。そして同じことをここでも行い、Swishの上にゲーティングを持ち、フルコネクテッドレイヤーを得ます。
質問者:Swish関数やGeLU関数は、ある負の値を下回ると単調に増加せず、実際には減少します。勾配降下法が機能する理由の多くは勾配降下を行いたいというものですが、ここではGeLUやSwish、あるいはそのゲート付きバージョンを使うと、逆方向に進むように見えます質問者:Swish関数やGeLU関数は、ある負の値を下回ると単調に増加せず、実際には減少します。勾配降下法が機能する理由の多くは勾配降下を行いたいというものですが、ここではGeLUやSwish、あるいはそのゲート付きバージョンを使うと、逆方向に進むように見えます者。
橋本教授:そうですね、質問は「これは単調減少ではない。ここのゼロの左側で少し傾きが反転しています。それは問題にならないのか?」ということですね。直感的には、これは問題になると主張できたかもしれません。多くの活性化がゼロ付近に捕らえられる可能性があります。しかし実際には、ニューラルネットワークの最適化のダイナミクスを見ると、実際に起こっていることは、オプティマイザーに運動量を持った非常に高い学習率を投入していることが多いです。そのため、このゼロ点に収束することはないでしょう。これらの活性化はあちこちに散らばっています。実際には、この小さな負の部分はモデルにとって本当に大きな影響を与えるとは思いません。
SwiGLUは現在、Llama、PaLM、ELMOなど、ほとんどのモデルで使用されています。後で大きな表をお見せしますが、SwiGLUが非常に人気があることがわかるでしょう。注目すべき点として、ハイパーパラメータの部分でも説明しますが、このV項、この追加パラメータを追加したので、このパラメータのサイズを考える必要があります。ゲート付きモデルでは通常、隠れ層のサイズ、つまりWの出力次元を2/3の係数で少し小さくして、この全体のパラメータ数がゲートなしの場合と同じになるようにします。これはほとんどの人が行っている慣例です。これが何を意味するのかわからない場合は、後で再度説明します。ただ、ゲート付き線形ユニットではすべてを少し小さくして、パラメータ数を一致させることを覚えておいてください。
ゲート付き線形ユニットは機能するのでしょうか?これについては後で現代的な証拠もお見せしますが、まずはノアム・シャジールの元論文を見てみましょう。彼はこれらのGLUバリアントをすべて評価しており、これはかなり古いデータです。CoLAとSST2のパフォーマンスが見られますが、基本的にGLUバリアントが一貫して良い性能を示していることがわかります。GLUは84.2、GeGLU84.12、84.36、Swiglu84.67です。2020年代なので、標準偏差まで提供されており、これらの結果がどれほど有意かを判断できます。そして実際に有意です。
また、2020年のNangらの論文もあり、これはT5スタイルのモデルのコンテキストでアーキテクチャのバリエーションを研究した非常に良い論文です。ここでも、ゲート付き線形ユニットのバリアントが一貫して低い損失を達成していることがわかります。太字の行がまさにGLUバリアントです。このパターンは基本的に維持されています。
ゲーティングと活性化関数については、さまざまなモデルで多くのバリエーションがありますが、ゲート付き線形ユニットは基本的に広く普及し、支配的になっています。これには正当な理由があると思います。もちろん、良いモデルにはGLUは必要ありません。二つを区別することが重要です。それがおそらく少し良くて、みんながそれを使っているからといって、それが必要というわけではありません。GLUを使用していない非常に高性能なモデルの例もあります。GPT3はその一例です。最近では、Neotron 340Bが以前見たことのない二乗ReLUを使用しており、Falcon 211BはReLUを使用しています。どちらも比較的高性能なモデルです。それは必ずしも必要ではないことがわかりますが、SwiGLUとGeGLUからの一貫した利得を示す証拠があります。だからこそ、私たちはあなたにそのバリアントを実装するよう求めているのです。
2.5 直列レイヤーと並列レイヤーのトレードオフ
橋本教授:アーキテクチャに関して話したい最後の主要な変種があります。通常、トランスフォーマーブロックは直列です。つまり、各ブロックで入力が下から入ってきて、アテンションを実行し、その計算結果を前に渡し、MLPを実行して、その計算結果を前に渡します。これは本質的に直列です。アテンションを実行し、それからMLPを実行するのです。
しかし、これにはある種の並列性の制約があるかもしれません。巨大なGPUセットにわたってこれを並列化したい場合、この直列接続があるとそれが難しくなる可能性があります。システム上の懸念もより困難になるかもしれません。GPUの利用率が低くなる可能性があります。
そこで、いくつかのモデルは「並列レイヤー」と呼ぶものを採用しています。アテンションとMLPを順番に計算する代わりに、両方を同時に計算するのです。前の層からXを受け取り、MLPとアテンションの両方を並行して計算し、それらを一緒に足して残差ストリームに追加し、それが出力となります。
これはGPT-Jによって先駆けられました。GPT-Jはある種のオープンソースの複製の取り組みであり、GoogleのPaLMチームは非常に大規模にこれを行うのに十分勇敢でした。それ以来、多くのモデルがこれに続いています。
これを実装する場合、レイヤーノームやマトリックス乗算などの多くの部分を共有できるため、システムの効率性を向上させることができます。それ以降はそれほど人気がなく、昨年見たほとんどのモデルは並列レイヤーではなく直列レイヤーを使用しています。例外はCohere Command-A、Command-R+、Falcon-Q 11Bくらいだと思います。
これで、最初に示した大きな表に戻ることができます。テキストは読みづらいかもしれませんが、色だけで必要な情報はすべて伝わると思います。このチェックマークはプリノームとポストノームを表しています。知る限り、ポストノームを使用していた初期のモデルは元のトランスフォーマーとGPT、BERT(これをこの表に含めたい場合)だけです。それ以降はほぼ全員がプリノームを使用しています。その他のチェックされていないボックスは、私が詳細を持っていない専有モデルです。
左端のこの列はRMSノームとレイヤーノームを表しています。グレーのボックスはレイヤーノーム、青いものはRMSノームです。基本的に、ほとんどのモデルがRMSノームに移行しています。その隣の列は直列レイヤーと並列レイヤーです。ここでも、ほとんどのモデルは直列ですが、他のバリアントも見られます。
次に話すのは位置エンベディングで、これはもっと興味深いものになるでしょう。アーキテクチャに関するこの部分について質問はありますか?これでアーキテクチャにおける主な変化の概要がわかったと思います。
質問者:直列計算は並列よりも効率的なのでしょうか質問者:直列計算は並列よりも効率的なのでしょうか者?
橋本教授:実際にはその逆で、並列の方が直列よりも効率的であり、それが人々がこれを行う理由です。ある意味、直列は二つの計算を組み合わせるだけでなく、それらを合成するのでより表現力があると予想するかもしれません。しかし、並列の利点は、理論的には適切な融合カーネルを書けば、多くの操作を並列で行うことができるか、計算が並列部分間で共有されることです。
3. 位置エンコーディング
3.1 絶対位置エンベディングからRoPEへの変遷
橋本教授:アーキテクチャの世界で最後に取り上げたいのは位置エンベディングのバリエーションです。これは興味深いものです。なぜなら、LMの最初の数年間では、人々が試していたことがたくさんあったからです。
サイン波エンベディングは元のトランスフォーマーから来ています。224Nでこれを学んだはずです。サインとコサインの位置があります。GPTとOPTなど他の多くのモデルは基本的に絶対位置エンベディングを使用しており、エンベディングに学習された位置ベクトルを追加しています。
T5やGopherなど他のモデルは、アテンション計算にベクトルを追加するさまざまな種類の相対位置エンベディングを使用していました。そして、ほとんどのモデルがRoPE(Rotary Position Embeddings、回転位置エンベディング)に収束しています。これは相対位置エンベディングであり、実はオープンソースの貢献であるGPT-Jから始まり、ほとんどのモデルによって非常に急速に採用されました。
RoPEの背後にある考え方は、重要なのはこれらのベクトルの相対位置だということです。単語xを位置iでエンベディングしようとする関数f(x,i)があるとすると、次のように書くことができるはずです。f(x,i)とf(y,j)のドット積(内積)を取ると、これを別の関数gとして書くことができ、それは二つの単語とそれらの位置の差の関数となります。
これは、基本的に位置不変性、つまり絶対位置不変性を強制する定義です。単語間の距離だけに注目します。サイン波位置エンベディングを簡単にチェックして、何が起こるか見てみましょう。交差項が得られ、それらは相対的ではありません。つまり、絶対位置情報が漏れています。絶対位置エンベディングは名前の通り相対的ではありません。相対位置エンベディングは相対的ですが、ドット積ではないため、この制約に違反します。
RoPEは、絶対的なものに不変なもの—回転—を知っているという巧妙な観察です。そのため、この構造を活用して位置エンベディングを作成します。ドット積は任意の回転に不変であることを知っています。そのため、それを活用します。
左側が出発点です。「we」という単語のエンベディングがこの矢印であるとしましょう。そして「no」という単語のエンベディングが別の矢印です。この配列「we no」をエンベディングしたいとします。「we」は位置0にあるので、この矢印を全く回転させません。「no」は位置1にあるので、1単位分回転させます。これで「we no」のエンベディングができます。
次に「of course we no」という配列をエンベディングしたいとします。ここでも「we」と「no」は互いに対して同じ相対位置を持っています。何が起こるでしょうか?「we」は2つの位置分シフトされます。垂直位置から始めて、2回回転させます。1回と2回。そして「no」は3つの位置分回転させます。位置は0、1、2、3だからです。
これら二つの矢印を見ると、同じ相対角度を持っています。そのため、内積は保存されます。これがRoPEの素晴らしいアイデアです。単にベクトルを回転させ、回転角は各単語の位置によって決まります。そして回転は、ドット積が相対的な回転を気にしないため、これらのドット積は距離の差だけを見ることになります。
2次元では回転について考えるのは簡単です。なぜなら回転は2次元では明白だからです。ベクトルを回転させる方法は一つしかありません。しかし、私たちが操作する高次元空間では、この回転をどのように行うかは全く明白ではありません。
そこでRoPEの開発者たちは、ある意味で最もシンプルでありながら効果的な方法を考えました。その方法は、次元Dの高次元ベクトルを2次元のブロックに分割し、各2次元をある角度θで回転させるというものです。回転速度があり、次元のペアを回転させます。これにより、各次元のペアがすべての相対位置をエンコードします。
サインとコサインのエンベディングと同様に、異なるθのセットを選びます。あるエンベディングは速く回転し、他は非常にゆっくりと回転します。これにより、高周波情報(近距離情報)と低周波の位置情報(遠距離情報)の両方を捉えることができます。
実際のRoPEの数学は、回転について考えるならば、さまざまなサインとコサインの回転行列を掛けることです。線形代数と三角法からこれを覚えていることを願います。これをエンベディングベクトルにこれらのブロック2x2のブロック行列を掛ける操作として考えることができます。ここには加算項や交差項はなく、純粋に相対的です。
絶対位置エンベディングやサインとコサインのエンベディングと異なる点は、RoPEが実際のアテンションレイヤーで動作することです。位置エンベディングを下部に追加するのではなく、これらのアテンション計算が行われるときに、そのレイヤーに介入し、それによって位置情報が得られます。
Llamaの実装からRoPEのコードを引用しました。上部には通常のアテンション処理があります—クエリ、キー、バリューです。これらは通常の線形射影です。そして、コサインとサインの角度を作成します。これらは、クエリとキーの異なるブロックをどれだけ回転させるかを示す回転角度です。
クエリとキーを取り、それらをコサインとサインで回転させます。これにより、回転されたクエリと回転されたキーが得られ、それがアテンション計算の残りの部分に入力されます。これは下部では行わず、クエリとキーを生成するときに行います。これは相対位置のみの情報を強制するために非常に重要です。
RoPEは実際に、誰もが収束した一つのものです。先週末に19の論文すべてに目を通しましたが、基本的にすべてが現在RoPEを使用しています。その理由はいくつかあります。RoPEはコンテキスト長を外挿するためのさまざまなアルゴリズムがあり、それは最新の実用化された言語モデルの重要な部分です。また、小規模なスケールや短いコンテキスト長でも経験的に非常に効果的であるようです。
質問者:回転率はこれらのモデル間で一貫していますか質問者:回転率はこれらのモデル間で一貫していますか者?
橋本教授:すべて同じではないと思います。θには多少のバリエーションがあります。
質問者:各ペアのθはハイパーパラメータなのか、それとも学習されるのでしょうか?
橋本教授:いいえ、回転角度を決定するθはハイパーパラメータではありません。サインとコサインのエンベディングと同様に、異なる周波数範囲をカバーするために回転角度のスケジュールがあります。これは高周波または低周波の情報を得るためです。
質問者:回転は訓練に何か困難を生じさせますか?角度の回転について疑問に思っていました。
橋本教授:回転自体は問題を引き起こしません。なぜなら回転を考える一つの方法は、それが単なる行列乗算だからです。θは固定されており、ここでのMも固定されているため、これは実際にはベクトルに掛ける固定行列に過ぎません。その意味では、実際には問題ではありません。θを学習していれば、三角関数を微分する必要があるかもしれないので問題になる可能性がありますが、ここではそうしていません。
3.2 RoPE(Rotary Position Embedding)の詳細な説明
橋本教授:RoPEの背後にある中心的な考え方は、相対的な位置関係が重要だということです。言い換えると、単語xを位置iでエンベディングする関数f(x,i)があるなら、次のような関係が成立するはずです。f(x,i)とf(y,j)の内積は、二つの単語とそれらの位置の差の関数として書くことができるということです。つまり、f(x,i)・f(y,j) = g(x,y,i-j)という形で表現できます。
これは位置の不変性、特に絶対位置の不変性を強制する定義です。つまり、二つの単語がどれだけ離れているかという情報だけに注目します。既存の位置エンベディング手法でこの条件を検証してみましょう。
サイン波エンベディングを見ると、相対的でない交差項が生じます。つまり、絶対位置の情報が漏れてしまいます。絶対位置エンベディングは名前の通り、相対的ではありません。相対位置エンベディングは相対的ですが、内積を使用していないため、この制約に違反します。
RoPEは、絶対的なものではなく相対的な関係を保存するために回転を利用するという巧妙な観察に基づいています。私たちは内積が任意の回転に不変であることを知っています。この性質を活用して位置エンベディングを作り出すのです。
具体的に説明しましょう。左側が出発点です。「we」という単語のエンベディングをこの矢印だとします。「no」という単語のエンベディングはこの別の矢印です。この配列「we no」をエンベディングしたいとします。「we」は位置0にあるので、まったく回転させません。「no」は位置1にあるので、1単位分回転させます。これで「we no」のエンベディングが得られました。
次に「of course we no」という配列をエンベディングしたいとします。ここでは「we」と「no」は互いに同じ相対的な位置にあります。何が起きるでしょうか?「we」は2つの位置だけシフトするので、垂直位置から始めて2回回転させます。そして「no」は3つの位置分回転させます(位置0,1,2,3)。
これら二つの矢印を見ると、同じ相対角度を持っています。そのため、内積は保存されます。これがRoPEの美しいアイデアです。単にベクトルを回転させ、回転角は各単語の位置によって決まります。回転しても内積は相対的な関係だけを見るので、距離の差だけが反映されるのです。
2次元では回転を考えるのは簡単です。なぜなら2次元でのベクトル回転は明白だからです。しかし私たちが操作する高次元空間では、この回転をどのように行うかは自明ではありません。
RoPEの開発者たちは、シンプルでありながら効果的な解決法を提案しました。D次元の高次元ベクトルを2次元のブロックに分割し、各2次元ブロックを特定の角度θで回転させるのです。つまり回転速度があり、次元のペアを回転させます。これにより、各次元のペアがすべての相対位置情報をエンコードします。
サインとコサインのエンベディングと同様に、θの値のセットを選択します。一部のエンベディングは速く回転し、他はゆっくりと回転します。これにより、高周波情報(近距離)と低周波の位置情報(遠距離)の両方を捉えることができます。
実際のRoPEの数学は、回転行列を使った計算と言えます。これは線形代数と三角法の基本です。エンベディングベクトルに2x2のブロック回転行列を掛ける操作として考えることができます。加算項や交差項はなく、純粋に相対的な位置情報だけが保存されるのです。
絶対位置エンベディングやサインとコサインのエンベディングと異なる重要な点は、RoPEが実際のアテンションレイヤーで動作することです。つまり、エンベディングの下部に位置情報を加えるのではなく、アテンション計算が行われるときにその処理に介入し、位置情報を付与します。
例えばLlamaの実装を見ると、上部には通常のアテンション処理があります—クエリ、キー、バリューの線形射影です。そして、コサインとサインの角度(回転角度)を計算し、クエリとキーの異なるブロックに適用します。クエリとキーを取り、それらを計算された角度で回転させることで、回転されたクエリと回転されたキーが得られます。これがアテンション計算の残りの部分に入力されます。
このように、位置情報の処理を下層ではなく、クエリとキーを生成するときに行うことで、純粋に相対的な位置情報だけを保持することができるのです。これがRoPEの核心的な仕組みです。
3.3 なぜほとんどのモデルがRoPEに収束したか
橋本教授:RoPEは実際に、ほぼすべてのモデルが収束した位置エンベディング手法です。週末にかけて19の論文すべてに目を通しましたが、基本的にすべてのモデルが現在RoPEを使用しています。これには複数の理由があります。
まず、RoPEは相対的な位置情報のみを保持するという理論的な美しさがあります。絶対位置ではなく、トークン間の相対的な関係が言語理解において本当に重要なのです。RoPEはこの相対的な関係を数学的に厳密な形で保存します。
次に、RoPEはコンテキスト長を外挿するための様々なアルゴリズムを持っています。これは現代の実用的な言語モデルにとって非常に重要な側面です。モデルをトレーニングする際には限られたコンテキスト長(例えば2048トークン)しか使用できなくても、推論時にはより長いコンテキスト(例えば8192トークンや、最新モデルでは100万トークン以上)を処理したいという需要があります。RoPEはその数学的特性から、このような外挿が比較的容易にできるのです。
第三に、RoPEは小規模なスケールや短いコンテキスト長でも経験的に非常に効果的であることが示されています。つまり、大きなモデルだけでなく、より小さなモデルでも性能が良いのです。この普遍的な有効性が広範な採用につながりました。
また、RoPEの実装は比較的シンプルであり、計算効率も良好です。位置情報をアテンション計算の直前に適用するため、モデルアーキテクチャの他の部分への影響が最小限に抑えられています。これは実装の観点から非常に魅力的です。
さらに、多くのオープンソースの実装が利用可能であり、その効果が広く検証されています。GPT-Jのようなオープンソースモデルでの成功が、商業的なモデルへの採用を促進しました。
RoPEに関する質問がいくつかありました。回転率はこれらのモデル間で一貫しているかという質問ですが、すべて同じというわけではありません。θ(回転角度を決定するパラメータ)には多少のバリエーションがあります。また、これらのθはハイパーパラメータなのか学習されるのかという質問もありましたが、これらは学習されるパラメータではありません。サインとコサインのエンベディングと同様に、異なる周波数範囲をカバーするために回転角度のスケジュールが決定されています。これにより、高周波(近距離)の情報と低周波(遠距離)の情報の両方を捉えることができます。
また、角度の回転がトレーニングに困難をもたらさないのかという質問もありました。回転自体は問題を引き起こしません。回転は基本的に行列乗算であり、θは固定されているため、これは本質的にはベクトルに固定行列を掛けることに相当します。θを学習するとすれば、三角関数を通して微分する必要があるかもしれず、それは問題になる可能性がありますが、RoPEではそのようなことはしていません。
結論として、RoPEは理論的な美しさ、実践的な効果、および実装のシンプルさを兼ね備えているため、最新の言語モデルにおいて位置エンベディングの標準的選択肢となったのです。
4. ハイパーパラメータの選択
4.1 フィードフォワードサイズとモデル次元の比率
橋本教授:これからさらに詳細なレベルに踏み込んで、ハイパーパラメータについて話していきます。新しい言語モデルをトレーニングするよう依頼されたとき、ハイパーパラメータについて多くの疑問があると思います。なぜなら、それらはかなり多いからです。しかし、私が気づいたことの一つは、成功したモデル間で実際に変更されるのはほんの一部だけだということです。実際には、かなり明確な経験則や明確なガイドラインが存在し、人々はそれに従っているようです。
例えば、フィードフォワードサイズはどれくらい大きくすべきか、ヘッドの数はいくつにすべきか、語彙サイズはどうすべきかといった疑問があります。これらのそれぞれについて話し、人々が持っているハイパーパラメータの空間を制限していきます。
出発点として、シンプルなフィードフォワードレイヤーを見てみましょう。これはバイアス項を含むReLUバージョンです。ここには二つのハイパーパラメータがあります。一つはd_modelで、これはxの次元、つまりMLPへの入力の次元です。もう一つはd_ffn(フィードフォワード次元)で、これはMLPの出力隠れ層の次元です。そこからd_modelに戻す射影を行います。
d_ffnはどうあるべきでしょうか?一般的には、これらはアップ射影です。つまり、入力よりも多くの隠れユニットを持ちます。しかし、どれくらい大きくすべきでしょうか?実は、ほぼコンセンサスがあります。ReLUスタイルのMLPを使用するほぼすべての人が、d_ffn = 4 × d_modelを選択しています。この数字が妥当である理由については、後ほど経験的な証拠をお見せしますが、私の知る限り、4を選ばなければならないという自然の法則はありません。これは維持されてきた慣習です。
この規則にはいくつか例外があります。GLUバリアントでは、これを2/3の係数でスケールダウンすることを忘れないでください。2/3の係数でスケールダウンすると、パラメータ数はほぼ同じになります。少し計算すると、GLUバリアントを2/3でスケールダウンすると、d_ffn = 8/3 × d_modelとなることがわかります。これにより、同じパラメータ数になり、4の比率から始めた場合に得られる比率と同じになります。
多くのモデルを見ると、実際にこの経験則に従っています。例えば、PaLM、Mistral、Llamaは少し大きいですが(これらはGLUモデルですが、この2.6の規則に従っていません)、Llama 2、Qwen、DeepSeek-V、T5を見ると、すべてこの2.6程度の規則に大体従っています。作成したLMの大きな表をハイパーパラメータとともに後でお見せしますが、多くのモデルがこの2.6の範囲に収まっており、これがGLUユニットの標準的なパラメータ化です。
もう一つの例外を紹介します。この例外が好きな理由は、多くの点で、大規模言語モデルのトレーニングは他の人からハイパーパラメータをコピーするゲームであり、そこからはあまり学ぶことがないからです。非常に保守的です。しかしT5は本当に好きです。なぜならある意味で非常に大胆だからです。Googleの人々は実際にかなり大胆なことをします。
110億パラメータのT5モデルを見ると、かなり驚くべき設定です。彼らの隠れ次元は1024ですが、d_ffn、つまりアップ射影された次元は65,000です。これはd_modelに対して64倍の乗数を与えます。もちろん、PaLMが4倍で、他のすべてがはるかに小さいのと比較すると、これは非常に大きな違いです。より大きな乗数を使用した最近の例もあります。Gamma 2はこの流れに続き、8倍の係数を使用しています。この例外については後で少し話します。もちろん、T5は完全に問題ないモデルでした。ですから、このようなはるかに大きな比率でモデルをトレーニングすることは可能だということがわかります。
私が見たこの4倍の乗数について、それが本当に正しいことなのか、それとももっと定量的な実験をした人がいるのかと考えていました。ジャレッド・カプランのスケーリング法則の論文の図の一つを見てみましょう。ほとんどの人はこの論文をスケーリング法則の部分で知っていますが、実際にはハイパーパラメータに関する非常に有用な部分もあります。彼らはまさに私が話している、d_ffnとd_modelの比率を調査しています。
彼らはこの比率を変化させたときに損失がどれだけ増加するかをプロットしています。ここに比率1、2、3、4、そして10くらいまであります。かなり広い範囲があり、1から10くらいまでのどの比率を選んでも、ほぼ最適になります。4はあなたの最適な選択からそれほど離れていません。それは1、2、3、4のように、ここかここあたりです。それはかなり合理的な選択です。
このハイパーパラメータから何を学べるでしょうか?多くの証拠が、同じデフォルト値を選べることを示しています。GLUを使用していない場合は4倍、GLUを使用している場合はおよそ2.66倍です。これらは最新のLMのほとんどでうまく機能します。T5は再び、これらの規則に従う必要がないことを示しています。規則を破り、好きなことをすることができます。ハイパーパラメータの選択は石に刻まれているわけではありません。他の多くのハイパーパラメータでも合理的なLMを得ることができます。
とはいえ、この話の本当に面白いエピローグは、T5の後継モデルであるPaLM-2 V1.1が改良され、より標準的な2.5倍のGeGLU乗数を使用していることです。つまり、元のT5を見て、その64倍の乗数を取り消して、より標準的なものを選択しようと考えたのかもしれません。そして実際に、より良いモデルが得られました。
質問者:ここで話している比率と一般的にモデルへの影響の関係は何でしょうか?
橋本教授:この比率は、MLPのこの隠れ部分がどれだけ幅広いかを本質的に制御しています。T5の論文における64倍を選んだ元々の正当化は、その次元を本当に大きくすれば、より大きく太いマトリックス乗算が得られるというものでした。それはある程度真実ですが、幅が広いほど、いわば並列計算が増え、直列計算が減ります。つまり、FLOPとパラメータの使い方が少し異なります。隠れユニットを大きくすれば、より多くの情報を渡すことができ、より多くのユニットを使えば、より多くの直列計算ができます。表現力の観点からは、パラメータとFLOPの使い方がやや最適でないかもしれませんが、行列が十分に広ければシステム上の利点が得られるかもしれません。
4.2 ヘッド次元と数の選択
橋本教授:もう一つのハイパーパラメータで、意外かもしれませんが、ほぼコンセンサスがあるのは、モデル次元とヘッド次元に頭数を掛けたものの比率です。これは224Nから引用したものですが、基本的に標準的な選択は、次元Dを固定し、複数のヘッドがある場合は、各ヘッドが得る次元数を分割するということです。つまり、ヘッドを増やしても、次元は固定されたままです。
そうする必要はありません。ヘッドを追加するときに、各ヘッドの次元数を同じに保ち、アテンション部分により多くのパラメータを使うこともできます。その選択肢はあります。
しかし、ほとんどのモデルはこのガイドラインに従っています。GPT3、T5、Lambda、PaLM、Llama 2はすべて、比率が1または正確に1に近いです。T5は例外で、16の大きな比率を試しました。しかし、それ以外はすべて、このコンセンサスにほぼ従っています。
この1:1の比率に反対する論文がいくつかあります。2020年にパンネリらが書いた注目すべき論文では、ヘッドが増えるほど、それらのランクが低くなると主張しています。そして、ヘッドあたりの次元が非常に少ない場合、それがアテンション操作の表現力に影響し始めると主張しています。
しかし実際には、実践においてあまり重要なランクの問題は見られないようです。そして、この比率が1のほとんどのモデルは、うまく機能しているようです。これは本当に、ほとんどのモデルで一定に保たれているパラメータです。
時間があれば、このマルチヘッドコンポーネントに関して人々が行った異なる最適化についても少し話します。しかし、ハイパーパラメータの観点では、比較的類似したままです。
ハイパーパラメータにおける大きなものの一つはアスペクト比です。深いネットワークを考えることができます。より多くの層を持つことができますし、幅広いネットワークを持つこともできます。一般的に、幅を制御するためのノブとしては、残差ストリームの隠れ次元を使うことができます。それによって、ほぼすべての操作の幅を一度に制御することになります。
これは調整すべき非常に重要なことのように思えます。深いネットワークの方がより賢く表現力があるとか、幅広いネットワークの方が効率的だとか考えるかもしれません。人々が選んだ比率の甘い部分が一般的にあります。
いくつかの例外がありました。初期のモデルはここでずっと小さな比率を使用していました。つまり、深いよりも幅が広かったということです。そして、いくつかのモデルは非常に深く(あるいは逆に)、非常に幅広く、Dモデルの方がNレイヤーよりもはるかに多かったのです。
一般的に、層あたり約128の隠れ次元が良いという甘い部分がありました。これはGPT3とLlamaのバリアントモデルの多くに共通しています。この証拠については後で少し話します。
アスペクト比に関する考慮事項は非常に重要です。これにより、行える並列処理の量が制御されます。パイプライン並列と呼ばれるものを行っている場合、異なる層を切り分け、異なるデバイスまたはデバイスのブロックに配置することがよくあります。各層内でも並列化するからです。
そのため、モデルにいくつかの制約が課されることになります。また、非常に幅広いモデルの場合、テンソル並列と呼ばれるものを行うことができます。これは行列を分割し、それらをGPUに分散させるものです。
これから4〜5回の講義で学ぶことの一つは、これらの異なる並列処理パラダイムには異なる制約があるということです。テンソル並列には非常に高速なネットワークが必要であり、パイプライン並列では比較的速度の遅いネットワークや高いレイテンシーのネットワークでも対応できるかもしれません。そのため、ネットワークの制約によって、これらの幅と深さの考慮事項が影響を受ける可能性があります。
しかし、それを脇に置いて、抽象的にアスペクト比がモデルのパフォーマンスにどのような影響を与えるか尋ねることもできます。そして再び、カプランらは、アスペクト比がパフォーマンスにどのように影響するかを示す本当に素晴らしいビジュアルエイドを提供しています。
これは3つの異なるスケール、5000万、2億7400万、15億パラメータのものです。x軸はアスペクト比、y軸は損失の差をパーセンテージ変化で示しています。さまざまなスケールで、約100(これが私が言ったコンセンサスの選択肢であることを思い出してください)が最小であることがわかります。
これは、カプランらによって公開されたこの大規模なハイパーパラメータデータによって裏付けられており、その直感とほぼ一致しています。ここで本当に素晴らしいことは、アスペクト比の最適値が数桁のスケールにわたってあまり変化しないように見えることです。これがさらに維持されれば、非常に良いニュースとなります。固定されたアスペクト比でトレーニングを続けることができます。
私が注目したいことの一つは、Googleの小川(EK)らによる深さと幅の影響を研究した非常に興味深い論文です。彼らが発見したことの一つは、損失を見ている場合、パラメータ以外は本当に重要ではないということです。より深いモデルは助けになりません。
しかし、ダウンストリームの精度を見ると、話はあまり明確ではありません。当時、彼らはファインチューニングされたSuper GLUEの精度を見ていました。彼らは、同じFLOPsであれば、より深いモデルの方が良いかもしれないと主張していました。
そこでとどめておきます。少なくとも公開されている範囲では、この研究に対するフォローアップはあまり見ていませんが、ダウンストリームのパフォーマンスは、ここで述べたアスペクト比の考慮事項において実際に少し異なる可能性があります。
4.3 モデルのアスペクト比(深さvs幅)の最適化
橋本教授:ハイパーパラメータにおける大きなものの一つはアスペクト比です。深いネットワークを考えることができます。より多くの層を持つことができますし、幅広いネットワークを持つこともできます。一般的に、幅を制御するためのノブとしては、残差ストリームの隠れ次元を使うことができます。それによって、ほぼすべての操作の幅を一度に制御することになります。
これは調整すべき非常に重要なことのように思えます。深いネットワークの方がより賢く表現力があるとか、幅広いネットワークの方が効率的だとか考えるかもしれません。人々が選んだ比率の甘い部分が一般的にあります。
いくつかの例外がありました。初期のモデルはここでずっと小さな比率を使用していました。つまり、深いよりも幅が広かったということです。そして、いくつかのモデルは非常に深く(あるいは逆に)、非常に幅広く、Dモデルの方がNレイヤーよりもはるかに多かったのです。
一般的に、層あたり約128の隠れ次元が良いという甘い部分がありました。これはGPT3とLlamaのバリアントモデルの多くに共通しています。この証拠については後で少し話します。
アスペクト比に関する考慮事項は非常に重要です。これにより、行える並列処理の量が制御されます。パイプライン並列と呼ばれるものを行っている場合、異なる層を切り分け、異なるデバイスまたはデバイスのブロックに配置することがよくあります。各層内でも並列化するからです。
そのため、モデルにいくつかの制約が課されることになります。また、非常に幅広いモデルの場合、テンソル並列と呼ばれるものを行うことができます。これは行列を分割し、それらをGPUに分散させるものです。
これから4〜5回の講義で学ぶことの一つは、これらの異なる並列処理パラダイムには異なる制約があるということです。テンソル並列には非常に高速なネットワークが必要であり、パイプライン並列では比較的速度の遅いネットワークや高いレイテンシーのネットワークでも対応できるかもしれません。そのため、ネットワークの制約によって、これらの幅と深さの考慮事項が影響を受ける可能性があります。
しかし、それを脇に置いて、抽象的にアスペクト比がモデルのパフォーマンスにどのような影響を与えるか尋ねることもできます。そして再び、カプランらは、アスペクト比がパフォーマンスにどのように影響するかを示す本当に素晴らしいビジュアルエイドを提供しています。
これは3つの異なるスケール、5000万、2億7400万、15億パラメータのものです。x軸はアスペクト比、y軸は損失の差をパーセンテージ変化で示しています。さまざまなスケールで、約100(これが私が言ったコンセンサスの選択肢であることを思い出してください)が最小であることがわかります。
これは、カプランらによって公開されたこの大規模なハイパーパラメータデータによって裏付けられており、その直感とほぼ一致しています。ここで本当に素晴らしいことは、アスペクト比の最適値が数桁のスケールにわたってあまり変化しないように見えることです。これがさらに維持されれば、非常に良いニュースとなります。固定されたアスペクト比でトレーニングを続けることができます。
私が注目したいことの一つは、Googleの小川(EK)らによる深さと幅の影響を研究した非常に興味深い論文です。彼らが発見したことの一つは、損失を見ている場合、パラメータ以外は本当に重要ではないということです。より深いモデルは助けになりません。
しかし、ダウンストリームの精度を見ると、話はあまり明確ではありません。当時、彼らはファインチューニングされたSuper GLUEの精度を見ていました。彼らは、同じFLOPsであれば、より深いモデルの方が良いかもしれないと主張していました。
そこでとどめておきます。少なくとも公開されている範囲では、この研究に対するフォローアップはあまり見ていませんが、ダウンストリームのパフォーマンスは、ここで述べたアスペクト比の考慮事項において実際に少し異なる可能性があります。
4.4 語彙サイズの傾向と多言語モデルの考慮
橋本教授:この非常に低レベルなハイパーパラメータの世界で最後に話したいのは、選びたい語彙サイズです。一般的に、語彙サイズは増加傾向にあります。その大きな理由は、LLMが実世界で展開され、より有用なサービスになっているからだと思います。そうなると、異なる言語を話す人々、絵文字を使う人々、他にも様々な種類のモダリティや言語と交流することになります。
初期のモデル、特に単言語モデルは、30,000から50,000トークンの語彙範囲にありました。これはGPTや初期のLlamaで見ることができます。しかし、多言語モデルや私が「実用システム」と呼ぶものを見ると、すべて100,000から250,000の範囲に移行しています。
Cohereのモデルの一つであるCommand-Aを見てみました。彼らは多言語に力を入れている企業であり、非常に大きな語彙サイズを使用しています。GPT-4や、GPT-4のトークナイザーをコピーした多くのモデルも、約100,000トークンあたりになっています。これが、多くの人が運用している標準となっています。
モデルが大きくなるにつれて、これらのモデルはある意味でより多くの語彙要素を扱えるようになる、あるいはより効果的に活用できるようになることを示す研究があります。そのため、モデルがスケールアップされたり、より多くのデータでトレーニングされたりすると、トークン数が増える傾向が見られるかもしれません。
5. 正則化テクニック
5.1 Dropoutが減少し、Weight Decayが続く理由
橋本教授:最後に、具体的なハイパーパラメータではなく、モデルを実行するように設定する前に必要な他の二つのことについて話します。それはドロップアウトと他の種類の正則化です。この点は、元々この講義の資料を調査していたときに、本当に興味深いと思いました。
事前トレーニングについて考えると、事前トレーニングは正則化からは最も遠い場所だと思うかもしれません。なぜなら、事前トレーニングでは通常1エポックしか行わないからです。データが多すぎるため、すべてのデータを通過することさえできません。そのため、1エポックのトレーニングを行い、そのひと通りで確実にデータを過学習することはありません。
そのため、事前トレーニングには正則化は必要ないと考えるかもしれません。オプティマイザーを自由に設定し、損失を最小化することだけを考えればよいのです。これは正則化が必要ない理由として非常に良い議論です。
しかし、人々が実際にやっていることを見ると、状況は実はちょっと混在しています。初期には多くのドロップアウトが行われていました。また、多くの重み減衰(Weight Decay)も行われているようです。最近では、多くの人々が正確なトレーニングハイパーパラメータの詳細を公開することをやめていますが、ドロップアウトは時代遅れになった一方で、重み減衰は多くの人々が続けて行っていることです。
なぜこうなのでしょうか?これは非常に奇妙なことです。ここでこの状況について少し考える時間を取りましょう。もし広大な量のデータに対してSGDで1回だけ通過する巨大なニューラルネットワークをトレーニングするならば、なぜその際に重み減衰を使うのでしょうか?
答えは、過学習を制御するためではないからです。異なる量の重み減衰を見ても、トレーニング損失と検証損失の比率は変わりません。十分な時間トレーニングするか、ハイパーパラメータを適切に制御すれば、ゼロの重み減衰でも同じトレーニングと検証の損失のギャップになります。過学習は起こっていません。ゼロの重み減衰でも何も起こりません。
しかし興味深いことに、重み減衰はオプティマイザーの学習率スケジュールと奇妙な形で相互作用しているようです。何が起きているかというと、一定の学習率でトレーニングされたモデルを見ると、10-4ゼロで学習率を突然下げた時にこのドロップオフが見られます。
次に、行うことができる異なる種類の重み減衰を見てみましょう。重み減衰があると、モデルはこの高い学習率ではうまくトレーニングされません。しかし学習率を下げると、非常に急速に低下します。
コサイン学習率減衰を見ると、高い重み減衰を持つモデルは非常に遅く始まりますが、冷却されるにつれて(つまり学習率が減少するにつれて)、非常に急速に最適化します。
ここではオプティマイザーと重み減衰の間、そしてトレーニングの終盤で学習率が減少するにつれて発生する暗黙の加速の間に、何か非常に複雑な相互作用が起こっています。これが最終的により良いモデルをもたらします。
私が提起した質問に対する答えは、正則化のために重み減衰をするわけではないということです。それは本来の設計目的でした。実際には、より良いトレーニング損失を得るために重み減衰をしているのです。そして、学習率をゼロに減少させるにつれてトレーニングの終盤で発生する様々な学習ダイナミクスのために、それを行っています。
これは言語モデルで行われている非常に興味深く、複雑で、ある意味では困惑させるようなことです。しかし、多くのレポートを見ると「重み減衰を使用しています」と書かれているのを見ることができるでしょう。これがその理由です。
5.2 Weight Decayが学習率スケジュールと相互作用する仕組み
橋本教授:重み減衰がなぜ助けになるのか、その理由を詳しく見ていきましょう。もし重み減衰が過学習を制御するためでないのなら、一体何のために役立っているのでしょうか?その答えは、重み減衰がオプティマイザーの学習率スケジュールと複雑な形で相互作用し、トレーニングの終盤でモデルのパフォーマンスを向上させているということです。
具体的な実験結果を見てみましょう。まず、一定の学習率でトレーニングされたモデルを考えてみます。学習率を突然下げた時点(10^-4ゼロ)で損失の急激な低下が見られます。これは学習率を下げることで、より小さな損失の領域に収束できるようになったことを示しています。
次に、異なる量の重み減衰を持つモデルを比較してみましょう。重み減衰があるモデルは、最初は高い学習率でうまくトレーニングされません。つまり、同じ学習率では、重み減衰のないモデルより損失が高くなります。しかし、学習率を下げると、重み減衰のあるモデルは非常に急速に損失が低下します。
コサイン学習率減衰スケジュールを使用した場合はどうでしょうか?この場合、高い重み減衰を持つモデルは最初の段階で非常に遅く進行します。しかし、学習率が減少していく(「冷却」していく)につれて、これらのモデルは非常に速く最適化を行い始め、最終的には低い重み減衰やゼロの重み減衰を持つモデルよりも良い損失を達成します。
これは何を意味するのでしょうか?オプティマイザー、重み減衰、そして学習率の減少の間に非常に複雑な相互作用が存在しています。重み減衰はある種の「暗黙の加速」をトレーニングの終盤で引き起こしているようです。
理論的には、重み減衰はパラメータを原点の近くに保つ効果があります。これにより、学習率が下がる際に、より効率的に損失の勾配の方向に進むことができるようになるのかもしれません。大きなパラメータ値を持つモデルでは、小さな学習率での更新が相対的に小さくなり、局所的な最適値から抜け出しにくくなります。
また、重み減衰はある種の正則化を提供することで、損失曲面をより「滑らか」にし、学習率が下がった際に見つけやすい最適値を作り出しているのかもしれません。
重要なのは、これらの効果は過学習を防ぐためではなく、より良いトレーニング損失を達成するために機能しているという点です。つまり、通常の正則化の目的(汎化性能の向上)ではなく、最適化の改善のために働いているのです。
この現象は、大規模な事前学習モデルのトレーニングにおける興味深い特性です。そして、多くの成功したモデルが重み減衰を採用している理由を説明します。学習ダイナミクスは私たちが直感的に期待するよりもはるかに複雑であり、経験的な観察がこのような洞察をもたらしてくれます。
5.3 過学習防止ではなく訓練損失改善のためのWeight Decay
橋本教授:これまでに説明したことをまとめると、重み減衰は本来考えられていた使用目的とは異なる理由で言語モデルのトレーニングにおいて価値があるということです。重み減衰はもともと過学習を防ぐために設計されました。しかし、プリトレーニングの文脈では、データセット全体を一度しか見ないため、過学習はほとんど懸念されません。
それでも、多くの成功したモデルが重み減衰を使用しているという矛盾した状況があります。なぜでしょうか?証拠が示しているのは、重み減衰は実際にはトレーニング損失自体を改善するということです。
複数の実験において、異なる量の重み減衰を用いてトレーニングしたモデルを比較すると、興味深いパターンが観察されます:
- 検証損失に対するトレーニング損失の比率(過学習の指標)は、重み減衰の有無にかかわらず本質的に同じままです。
- しかし、最終的なトレーニング損失自体は、適切な重み減衰があるモデルの方が低くなります。
これは、重み減衰が過学習を防止するのではなく、モデルがより良い最適化結果を見つけるのを助けていることを示しています。前のセクションで説明したように、これは学習率スケジュールとの複雑な相互作用によるものです。
実際、重み減衰は次のような効果を持っています:
- 学習率が高いときは、大きなパラメータ更新を抑制し、トレーニングを安定させる
- 学習率が低下するとき(多くの場合トレーニングの終盤)、より効果的な最適化が可能になる
- ある種の「暗黙の加速」を提供し、低い学習率でのトレーニングの収束を早める
この現象は、深層学習における最適化とニューラルネットワークのダイナミクスの複雑な性質を示しています。過学習を防ぐという元々の目的ではなく、より良いトレーニング損失を達成するという異なる目的で、重み減衰が役立っているのです。
この観察は、大規模言語モデルのトレーニングに携わる際の実践的な提言をもたらします:
- 過学習を懸念してドロップアウトを使用する必要はない(実際、ほとんどの最新モデルはドロップアウトを使用していない)
- 重み減衰は、過学習を防止するというよりも、トレーニングの最適化を改善するものとして考える
- 重み減衰は特に、コサイン学習率減衰のような、学習率が低下するスケジュールと組み合わせると効果的
このように、重み減衰は元々設計された目的とは異なる理由で価値があります。これは、経験的な観察が理論的な理解に先行する深層学習の領域における多くの発見の一例です。
6. 安定性向上テクニック
6.1 Softmaxの不安定性とその解決策
橋本教授:講義の資料を見直し、過去1年間にアーキテクチャで新しくどのようなことが起きたかを考えてみると、コアとなるアーキテクチャはあまり変わっていませんが、多くのリリースで非常に強調されているのは、私が「安定性向上テクニック」と呼ぶものです。これらは、モデルをより安定した方法でトレーニングするための手法です。
より大きなモデルを作ったり、より長い時間トレーニングしたりするにつれて、これらの問題はより頻繁に発生するようになります。私はこれをMode 2論文から引用しました。この論文はLLMトレーニングの安定性に関する優れた学術的な結果を提供しています。
彼らはこの図から始めています。ここで青い曲線を見ると、勾配のL2ノームのグラフが表示されています。これは見るのが恐ろしいグラフです。損失曲線は比較的うまく振る舞っているように見えますが、勾配ノームのグラフを開くと、勾配ノームが至る所でスパイクしている恐ろしいグラフになっています。
このような状態でモデルをトレーニングしていると、合理的に収束させるのが非常に難しくなります。ある時点で勾配ノームが爆発し、何もできなくなり、トレーニングは終了します。したがって、これ以上トレーニングできません。
そのため、多くの努力が、この青い曲線をオレンジの曲線のようなものに変えることに向けられています。もちろん、この損失は高いですが、これらの2つのトレーニング実行の間でデータセットを切り替えたと思われるのでその事実は無視してください。このオレンジの曲線には、トレーニング全体を通じて良好な低い勾配ノームがあります。これは、はるかに好ましい種類のプロットです。
トランスフォーマーにおいて安定性の問題はどこで発生するのでしょうか?もちろん、どこでも発生する可能性がありますが、人々が行っている介入を見ると、本当に一つの場所が問題児として際立っています。それはソフトマックスです。
これが問題になり得るのは、指数関数を取るため、数値的に悪い振る舞いをする可能性があるからです。また、二つの数値を除算するため、ゼロで割ることになる可能性があります。様々な理由から、このソフトマックス部分が問題を抱える可能性があります。
トランスフォーマーのどこにソフトマックスがあるのでしょうか?一つは最後にあります。出力ソフトマックスには注意が必要です。また、自己注意機構にもソフトマックスがあります。したがって、考慮すべき2つのソフトマックスがあります。それぞれについて、効果的であることが判明した安定性向上テクニックを紹介します。
6.2 Z-Lossによる出力Softmaxの安定化
橋本教授:最初に紹介するのはZ-Lossと呼ばれるものです。古い論文を引用したいという願望から、2014年のDevlinの機械翻訳の論文に戻りました。彼らの目標は、正規化項がほぼ1になるようにすることでした。
出力ソフトマックスP(x)を見ると、これは2つの項で構成されています。ロジットを指数化し、正規化項Zで割ります。Zは単にすべての語彙にわたる値の合計です。もしこのZ(x)が1に近くなるようにネットワークをトレーニングしたい場合、損失を書き直し、logZ(xi)が0に近くなるよう強制する二つ目の項を追加することができます。
結果として、補助損失項はalpha * (logZ(xi))^2となります。これがいわゆるZ-Lossです。私が思うに、Jacob Devlinらは機械翻訳のためにこれを行いましたが、その目的は今日それが使用されている理由とは全く異なります。
言語モデリングの世界でこれを最初に使用したのはPaLMだと思います。彼らはこれを補助損失、Z-Lossと呼び、10^-4 * (logZ)^2を使用して、ソフトマックス正規化項が適切に振る舞うよう促しました。
このレギュラライザーの動作を論理的に考えると、もしこれが成功してlogZ(x)が常に0になるよう強制されれば、logと指数関数が相殺され、基本的にU(R(x))だけが残ります。それは良い場所であり、数値的に安定した操作です。問題のある操作はすべて消えます。ソフトマックスは、Z(x)が1に近い、つまりlogZが0に近いときに良い振る舞いをすると考えられます。
PaLMは、このZ-Loss手法を先駆的に採用しました。長い間、他の多くのモデル(少なくともオープンな論文を公開しているモデル)はこれを行っていませんでした。しかし、その後一連の論文がこれを採用しました。私が知る限り、Baichuan 2が最初のフォローアップでした。その後、DCLM、Almo、そして他のいくつかがZ-Lossを非常に便利な安定性向上の介入として採用しました。
6.3 QK-Normによる注意機構の安定化
橋本教授:次に紹介するのは、もう一つのソフトマックス、つまりアテンション操作のソフトマックスを安定化する方法です。これはNVIDIAの論文から引用したものですが、引用マーカーを付け忘れました。
ここには、アテンションがどのように機能するかを示すブロック図があります。始めにレイヤーノームがあり、QKVがあり、この部分はしばらく無視してください。Qとキーを掛け合わせ、ソフトマックスを適用し、Vと掛け合わせ、それを射影します。そして、フルコネクテッドと出力を得ます。この小さな部分を除けば、これは通常のマルチヘッドアテンション操作のように見えます。
では、ここでの違いは何でしょうか?いくつかの研究者がQK-Normと呼ばれるアイデアを考案しました。これは、ソフトマックス操作の内積を取る前に、クエリとキーをレイヤーノーム層に通すというものです。
これはソフトマックスの振る舞いを制御する非常に異なるアプローチです。ここでは正規化項Zを制御するのではなく、ソフトマックスへの入力のサイズを制限することで、ソフトマックスの悪い振る舞いを自然に抑制します。
前述のように、これは元々ビジョンおよびマルチモーダルモデルのコミュニティからのイノベーションでした。2023年のDeaniの論文は、非常に大規模なビジョントランスフォーマーのトレーニングに関するものでした。そして、HuggingFaceのChameleonやEdith Feixはこれらのテクニックをマルチモーダルトレーニングコンポーネントに使用しました。
その後、Gemma 2、DCLM、Omo 2など、いくつかのモデルがこの種のテクニックを採用してトレーニングを安定させました。
安定性向上の介入に関して本当に際立っているのは、レイヤーノームが驚くほど効果的だということです。ブロックの非残差部分の冒頭だけでなく、最後にもレイヤーノームを置くようになり、さらにQとKコンポーネントにも導入されるようになりました。
少なくとも安定性を向上させるという点で、レイヤーノームは性能にあまり影響を与えずに非常に効果的でした。
6.4 Soft-capによるロジットのクリッピング
橋本教授:安定性向上テクニックとして紹介する最後のもので、あまり頻繁には使用されていないと思われるのは、ソフトマックスに入るロジットにソフトキャップをかけるというものです。
QK-Normは、ベクトル全体に対して動作するという点で非常に大きな介入です。しかし、別のアプローチとして、自己注意のための内積を取った後、一種のソフト最大値操作を通すことができます。
この方法では、ロジットを入力として、それをソフトキャップで割り、タンジェントを掛け、ソフトキャップを掛けるという式を通します。これはどのような効果があるのでしょうか?もしロジットがソフトキャップを大きく超えると、タンジェントは1に近づきます。その結果、最大値はソフトキャップとなります。
これはロジットのソフトクリッピングを制御し、Gemma 2と0もこれを行っていますが、それ以外ではあまり普及していないようです。
この手法に対する他の証拠としては、先ほど言及したNVIDIAの研究者たちが行った様々な安定性向上テクニックの比較があります。彼らの結果では、ベースラインモデルのパープレキシティは11.19でしたが、ソフトキャッピングを適用すると悪化しました。一方、QK-Normは実際に改善しました。これは、より積極的な学習率を使用し、オプティマイザーをさらに推し進めることができるためです。
これで安定性向上テクニックの説明は終わりです。質問はありますか?私が思うに、これが過去1年間の新しい開発です。
7. 注意機構のバリエーション
7.1 GQAとMQAの概念と推論コスト削減効果
橋本教授:最後に取り上げたいのは、アテンションヘッドのバリエーションです。アテンションヘッドについてはあまり多くの作業が行われていないと思いますが、トレーニングされているモデルを理解するために知っておく必要がある重要な変更がいくつかあります。
まず取り上げるのはGQAとMQAです。これらはモデルのトレーニング時の振る舞いにとって本当に重要というわけではありませんが、推論コストと推論の振る舞いを理解するためには非常に重要です。これは重要なアーキテクチャの変更なので、ここで言及しますが、Percyが推論に関する講義でも触れるかもしれません。
もう一つの新しい開発として、最近のモデル(Llama 4など)が1000万トークンのコンテキストをサポートしていると言われている方法について説明します。これは、非常に構造化された方法でアテンションパターンを操作することで実現されています。
では、GQAとMQAについて説明しましょう。大きなLlamaモデルなどの大規模モデルを見ると、GQAやMQAという用語を目にしたことがあるかもしれません。これが何を意味するのか説明します。
まず、アテンションを行うために必要な計算について考えてみましょう。これも224nのスライドからのものです。XQとXKを取り、大きな二次のアテンション行列を形成します。これらの行列積をそれぞれ見て、算術演算の合計数がB * N * D^2になることを確認できます。ここでBはバッチ次元、Nはシーケンス長、D^2は隠れ次元の二乗です。
メモリアクセスの合計数について尋ねると、B * N * Dになります。例えば、このXQマトリックスへのアクセスはそのサイズになります。ソフトマックスはB * H * N^2になります。これは各ソフトマックス活性化のバッチサイズに頭数に全ての異なるソフトマックス活性化を掛けたものです。N^2個あります。最後に、D^2の射影演算があります。
算術演算とメモリアクセスの比率を取ることができます。これは後の講義で非常に重要になる概念で、「算術強度」と呼ばれます。算術強度が高いことが望ましいです。つまり、各メモリアクセスに対して多くの計算を行いたいのです。これはGPUでは、メモリアクセスが計算と比較して相対的に非常に高価だからです。
このバッチ計算では、算術強度は1/k + 1/BNの逆数になります。これはGPUを稼働させ続けることができることを意味します。頭数が多く、バッチサイズが大きく、シーケンス長が大きければ、それらは良い大きな数字になるからです。
もちろん、これはトレーニング時に起こることです。問題は、推論時にはこれらの大きな塊のような行列を掛け合わせることができないことです。これにより、アルゴリズムの振る舞いの性質が大きく変わります。
テキストを生成するとき、トークンを生成し、そのトークンをトランスフォーマーが読み込み、処理して、次のトークン分布を得て、自己回帰的に一度に一つのトークンを生成する必要があることを覚えておいてください。この生成プロセスは並列化できず、各新しいトークンに対してステップバイステップで進む必要があります。
これを行うとき、「KVキャッシュ」と呼ばれるアイデアを使用して注意を増分的に計算する必要があります。これはKVキャッシュを説明する素晴らしいアニメーションです。図を見ると、クエリトークンがあります。クエリトークンは新しく生成したトークンであり、それに基づいて条件付けして、過去のどの情報を検索すべきか尋ねます。
クエリトークンは1からnまでシフトしていきます。新しいトークンを一つずつ生成しているからです。このキーキャッシュを構築しています。過去のトークンのキーをすべて蓄積しているのです。過去のトークンのキーはそれらが過去のもののみに依存するため変化しません。
トークンを生成する度に、これらの過去のキーをすべて蓄積しています。毎回Q・Kの新しい要素を一つ計算できます。大きなアテンション行列は下三角行列になります。一行ずつ計算しており、その行は次のトークンを生成するために必要なものだけです。
このKVキャッシュのアイデアがまだ見たことがなければ、各トークンを生成するときにKとVを増分的に生成し、必要な最小限のQのみを計算するというものです。
再び、様々な算術部分を計算し、FLOPの合計数とメモリアクセスの合計数を求めることができます。KVキャッシングを行うと、必要最小限のキーと値のみを掛け、すべての中間計算を保存するため、マトリックスやベクトルのベクトル乗算を無駄にすることはありません。
算術演算の総数はBNDと同じままですが、メモリアクセスパターンが変わります。なぜなら、このKVキャッシングを行うとき、様々な種類のパラメータをメモリの出入りを繰り返し行う必要があるからです。Kのようなマトリックスで乗算するとき、それをメモリに入れて掛け算し、その後片付けて活性化を計算する必要があります。そのため、異なるマトリックスを繰り返しロードしています。
これにより、BN^2D + ND^2という、はるかに高いメモリアクセスの合計が得られます。この比率を取ると、算術強度はあまり良くありません。N/D + 1/Bの逆数になります。
この理由を考えると、算術強度を高くするためには、内側の項を非常に小さくしたいです。そのためには、非常に大きなバッチと、NがDよりもはるかに小さいことが必要です。これは何を意味するのでしょうか?モデルのサイズを大きくしたくない、あるいはシーケンス長を短くしたくないということです。このN/Dは本当に不利な項であり、推論コストのトレードオフにおける核心的な問題です。
これがMQAの動機付けです。ここでの鍵となるアイデアは、クエリには複数のヘッドを持ち、キーと値には1つの次元または1つのヘッドだけを持つことです。これにより物事が大幅に簡素化されます。これを行うと、KとVに関する情報移動が少なくなります。
つまり、KとVは共有されているがクエリには多くのヘッドがあります。そのため、まだマルチヘッドアテンション、つまり複数のクエリがありますが、単一のKとVだけです。そのため、Multi-Query Attentionと呼ばれています。
同じ種類の算術を行うと、KとVを共有しているため、メモリアクセスが少なくなります。算術強度ははるかに良く振る舞います。シーケンス長と頭数が増えたため、最初の項をN因子で減らし、2番目の項も頭数で割りました。すべての異なる用語が制御されるようになったため、MQAはより良い振る舞いを提供できます。
GQA、またはグループクエリアテンションは、これを少し変更します。複数のクエリと単一のキーではなく、あるマルチプルでキーの数を減らします。これにより、モデルの表現力と推論時の振る舞いの間のトレードオフが可能になります。マルチヘッドからマルチクエリへの移行は少し積極的すぎるかもしれないからです。
いくつかの研究によると、GQAは害を与えませんが、マルチヘッドアテンションは害を与えます。それには入りませんが、ここで終わります。
7.2 KVキャッシュとメモリアクセスパターン
橋本教授:GQAとMQAについて説明する前に、まずアテンションを計算するために必要な計算量について考えてみましょう。224Nのスライドにあるように、アテンション計算では、クエリXQとキーXKを取り、大きな二次のアテンション行列を形成します。行列積を検討すると、算術演算の合計数はB * N * D^2になります。ここでBはバッチ次元、Nはシーケンス長、D^2は隠れ次元の二乗です。
メモリアクセスの合計はB * N * Dで、これはXQマトリックスなどへのアクセスのサイズです。ソフトマックス操作には、B * H * N^2のメモリアクセスが必要です。これはバッチサイズ、ヘッド数、そして全ソフトマックス活性化(N^2個)に基づいています。最後に、D^2の射影演算があります。
算術演算とメモリアクセスの比率は「算術強度」と呼ばれ、これからの講義で非常に重要な概念になります。算術強度が高いことが望ましく、これはメモリアクセスあたりの計算量が多いことを意味します。GPUでは、計算に比べてメモリアクセスが相対的に非常に高価だからです。
バッチ処理の場合、この比率は1/k + 1/BNの逆数となり、大きなヘッド数、バッチサイズ、シーケンス長があれば、GPUを効率的に稼働させることができます。しかし、これはトレーニング時の状況です。推論時は大きな行列の乗算を並列化できないため、アルゴリズムの性質が大きく変わります。
テキスト生成では、トークンを生成し、トランスフォーマーがそれを処理して次のトークン分布を得る必要があり、このプロセスは自己回帰的に一度に一つのトークンずつ進みます。並列化できないため、各新しいトークンごとにステップバイステップで進む必要があります。
これを効率的に行うために「KVキャッシュ」というアイデアが使われます。これは素晴らしいアニメーションで説明できます。クエリトークン(新しく生成されたトークン)が条件として与えられ、過去のどの情報を参照すべきか尋ねます。クエリトークンは1からnへと移動していきますが、それに対応するキーキャッシュを構築していきます。
この過程で過去のトークンのキーをすべて蓄積していきます。過去のトークンのキーは過去の情報のみに依存するため変更されません。トークンを生成するごとに、これらの過去のキーを使って、Q・Kの新しい要素を計算します。結果として、大きなアテンション行列は下三角行列になり、一行ずつ計算していきます。
KVキャッシュの本質は、各トークンを生成する際にKとVを増分的に蓄積し、必要な最小限のQ計算のみを行うことです。これにより、不要な計算を避けることができますが、メモリアクセスパターンが変わります。
KVキャッシュを使用すると、必要なキーと値のみを乗算し、中間計算を保存するため、算術演算の総数はBNDと変わりませんが、メモリアクセスパターンは大きく異なります。様々なパラメータをメモリに繰り返しロードする必要があるため、メモリアクセスの合計はBN^2D + ND^2となり、はるかに高くなります。
この結果、算術強度はN/D + 1/Bの逆数となり、効率が悪くなります。算術強度を高めるには、この式の内側の項を小さくする必要があります。これは、非常に大きなバッチサイズと、NがDよりも小さいことを意味します。しかし、モデルサイズを大きくしたくないし、シーケンス長を短くしたくもないため、これはトレードオフを生みます。
N/Dの項が特に問題となり、これが推論コストのトレードオフの中心的な課題です。この問題を解決するためにMQA(Multi-Query Attention)とGQA(Grouped-Query Attention)が考案されました。クエリ、キー、バリューの関係を変更することで、メモリアクセスを減らし、推論効率を大幅に向上させるのです。
7.3 長いコンテキスト処理のための注意機構の工夫
橋本教授:2019年にOpenAIは、より長いアテンションモデルを構築する方法に関する非常に興味深い論文を発表しました。彼らは基本的に、スパースなアテンションパターンを考案することを提案しました。シーケンス全体に注意を払う代わりに、各チャンクの局所的なウィンドウに注意を払い、さらに対角線のようなパターンを用いて情報を伝播させるというものです。
このように、表現力と実行時間のトレードオフを行うスパースまたは構造化されたアテンションを構築できます。GPT-3は当初、より大きなアテンションウィンドウを得るためにこれらのトリックを使用していました。
スライディングウィンドウアテンションは、この考え方の別のバリアントで、各レイヤーで現在の位置の周りの小さな領域にのみ注意を払います。これも、より長いコンテキストを処理するために必要な総リソース量を制御します。このため、有効な受容野は局所的なものとレイヤー数の積になります。
これらは古いアイデアでしたが、最新のインスタンス化として、Llama 4、Gemma、Cohere Command-Aなどの最近の論文では、非常に巧妙なトリックを考案しています。この場合、4つのトランスフォーマーブロックのセットを持ち、最下部のものは位置エンベディングなしの完全な自己注意を使用します。RoPEもなく、位置についてまったく知らないのです。これは4ブロックごとに1回だけ発生します。
それ以上の3つのブロックは、RoPEを使用したスライディングウィンドウアテンションを使用します。これは、システム面を制御するための本当に巧妙なトリックです。なぜなら、完全なアテンションはときどき発生するだけであり、また長さの外挿の側面も制御できるからです。RoPEはローカルなコンテキストウィンドウのみを扱い、本当に長距離のものには位置エンベディングがまったくありません。そのため、非常に積極的に外挿することができます。RoPEのような位置外挿を行う必要がないからです。
これは、過去数ヶ月間に見られた非常に興味深い開発です。
7.4 最新モデルにおける構造化スパース注意機構
橋本教授:最新のモデル(Llama 4、Gemma、Command-Aなど)は、非常に長いコンテキスト(最大1000万トークン)を効率的に処理するための興味深い構造化アテンション機構を採用しています。これらのモデルは、異なる種類のアテンション層を組み合わせた、階層的なアプローチを使用しています。
このアプローチの核心は、位置エンベディングなしの完全自己アテンションレイヤーと、RoPEを使用した局所的なスライディングウィンドウアテンションレイヤーを組み合わせることです。具体的には、4つのトランスフォーマーブロックのセットがあり、最下部のブロックでは位置エンベディングなしの完全自己アテンションを使用します。これは非常に重要なポイントで、このレイヤーはRoPEも何も使用せず、位置に関する情報をまったく持ちません。この完全アテンションレイヤーは4ブロックごとに1回だけ発生します。
その上の3つのブロックでは、RoPEを使用したスライディングウィンドウアテンションを使用します。この設計は、システム効率とモデルの能力の両方において非常に巧妙なトレードオフを実現しています:
- システム効率: 完全自己アテンションはコンピュータリソースを大量に消費しますが、これを4ブロックに1回だけ行うことで、計算コストを大幅に削減しています。
- 長さの外挿能力: 位置エンベディングなしの完全アテンションレイヤーは、理論上どのような長さのコンテキストでも処理できます。RoPEは局所的なコンテキストウィンドウのみに適用されるため、RoPEの外挿限界を超えて非常に長いコンテキストを処理できます。
- 局所的な構造の保持: RoPEを使用したスライディングウィンドウレイヤーは、テキストの局所的な構造や関係を捉えるのに効果的です。
この設計のもう一つの利点は、異なるスケールの情報を処理できることです。全体的なグローバルな情報は位置エンベディングなしの完全アテンションレイヤーで処理され、より局所的な情報はRoPEを使用したスライディングウィンドウレイヤーで処理されます。
このアプローチは、長いコンテキストのモデリングにおいて重要なブレークスルーとなっています。従来のモデルではコンテキスト長が増加するとメモリとコンピュテーションの要件が二次関数的に増加していましたが、この構造化アプローチにより、はるかに長いコンテキストを効率的に処理できるようになりました。
Llama 4は1000万トークンのコンテキストを処理できると主張していますが、それはこのような構造化スパース注意機構のおかげです。これは、言語モデルが長い文書、会話履歴、あるいはコードベース全体などの膨大なコンテキストを理解できる可能性を開きます。
このアプローチは、効率的な長いコンテキスト処理を可能にする非常に革新的な方法であり、過去数ヶ月間に見られた最も興味深い発展の一つです。