1742439081
2025-03-20 01:25:00
私はまだ第3章をかけています
セバスチャン・ラシュカ「s」(ゼロから)大きな言語モデルを構築する“。前回私がカバーしたとき 因果関係、それがそれになったとき、それは非常に簡単でした。今日、それはもう一つの迅速で簡単なものです – ドロップアウト。
コンセプトは非常に簡単です。いくつかの場所に集中するのではなく、モデル全体に知識を広く広めることを望んでいます。それを行うということは、あなたのパラメーターがすべて彼らの体重を引っ張っていることを意味し、あなたはそこに座って何もしていません。
したがって、トレーニング中に(しかし、重要なことには、推論中ではありません)、特定の部分(ニューロン、ウェイトなど)をランダムに無視して、「知識」が他のビットに広がるようにします。
簡単です!しかし、実装はもう少し楽しいものであり、私が考える必要があるいくつかの奇妙さがありました。
コードに関しては、それは本当に簡単です。Pytorchは便利です torch.nn.Dropout あなたが望むドロップアウト率で作成するクラス – 本の例では0.5 – そして、あなたがそれをマトリックスの関数として呼ぶ場合、それはその値の割合をゼロにします。 Raschkaは、0.5のドロップアウト、つまり注意スコアの半分は無視されていることは例であり、実際のトレーニングランで0.1-0.2がより典型的であると述べています。それは私にとって驚くほど高いように思えましたが、クロードは同意します:
大規模な言語モデル(LLMS)をトレーニングする場合、注意スコアの典型的なドロップアウト率は通常、10〜15%の範囲になります。
だからあなたはそこに行きます! LLMSが同意した場合、それは真実でなければなりません…
では、どのように使用しますか?通常のニューラルネットワークを使用すると、トレーニング実行の1つのバッチ中にニューロンのサブセットを無視し、次回は別のサブセットを無視する場合があります。したがって、各レイヤーからのアクティベーションのドロップアウト関数を呼び出し、「下流」計算に寄与しないようにランダムにゼロアウトします。 (私が理解しているように、これはそれらがバックプロパゲーション中に調整されないことを意味します – 他に何もなければ、それはひどくなります 不公平 貧しい人々は、エラーに寄与しなかったときに体重を変えるように無視したニューロンに。)
この本で取り組んでいるLLMSの場合、注意の重みでドロップアウト関数を実行するか、「値ベクトルに注意の重みを適用した後」を実行できます。私は後者に少し混乱していましたが、少しの調査の後(私はClaude、Chatgpt、Grok 3にもう一度尋ねました;-) マトリックス – 入力トークンごとに1つの行があり、各行はそのトークンのコンテキストベクトルです。コンテキストベクトルのランダム要素がトークンごとにゼロになります。
この本は、注意の重量でドロップアウトを行う例を使用しており、コードは十分にシンプルでした。しかし、私を混乱させたことの1つは、ドロップアウト後のマトリックスをバランスさせる方法でした。この因果的注意重量マトリックスから始めましょう:
| トークン | a( “the”) | A(「脂肪」) | A(「猫」) | a(「sat “) | a( “on”) | a( “the”) | A(「マット」) |
|---|---|---|---|---|---|---|---|
| 1.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 脂肪 | 0.4633 | 0.5367 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 |
| 猫 | 0.3221 | 0.3324 | 0.3454 | 0.0000 | 0.0000 | 0.0000 | 0.0000 |
| 土 | 0.2355 | 0.2334 | 0.2613 | 0.2698 | 0.0000 | 0.0000 | 0.0000 |
| の上 | 0.1893 | 0.1910 | 0.1974 | 0.2031 | 0.2192 | 0.0000 | 0.0000 |
| 0.1613 | 0.1613 | 0.1613 | 0.1613 | 0.1630 | 0.1918 | 0.0000 | |
| マット | 0.1344 | 0.1344 | 0.1369 | 0.1489 | 0.1463 | 0.1440 | 0.1551 |
50%のドロップアウトの後、それは次のようになるかもしれません:
| トークン | a( “the”) | A(「脂肪」) | A(「猫」) | a(「sat “) | a( “on”) | a( “the”) | A(「マット」) |
|---|---|---|---|---|---|---|---|
| 1.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 脂肪 | 0.4633 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 |
| 猫 | 0.0000 | 0.3324 | 0.3454 | 0.0000 | 0.0000 | 0.0000 | 0.0000 |
| 土 | 0.2355 | 0.0000 | 0.0000 | 0.2698 | 0.0000 | 0.0000 | 0.0000 |
| の上 | 0.0000 | 0.1910 | 0.0000 | 0.2031 | 0.0000 | 0.0000 | 0.0000 |
| 0.0000 | 0.1613 | 0.0000 | 0.1613 | 0.0000 | 0.1918 | 0.0000 | |
| マット | 0.1344 | 0.1344 | 0.0000 | 0.1489 | 0.0000 | 0.0000 | 0.1551 |
これまでのところ、私たちはそれをすべての行が最大1まで合計されることを非常に重要であると扱ってきました。 Dropout
クラスはそれについて何も知りません – 確かに、マトリックスの構造が何であるかについては何も知りません。ランダムな値をゼロにするだけです。
しかし、その後、それはしなければなりません 何か マトリックスをバランスするために – それは、残されたものを分割する どこ ドロップアウト値です。そうです この場合、これは残りの数字がすべて2倍になることを意味します。
| トークン | a( “the”) | A(「脂肪」) | A(「猫」) | a(「sat “) | a( “on”) | a( “the”) | A(「マット」) |
|---|---|---|---|---|---|---|---|
| 2.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 脂肪 | 0.9266 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 |
| 猫 | 0.0000 | 0.6648 | 0.6908 | 0.0000 | 0.0000 | 0.0000 | 0.0000 |
| 土 | 0.4710 | 0.0000 | 0.0000 | 0.5396 | 0.0000 | 0.0000 | 0.0000 |
| の上 | 0.0000 | 0.3820 | 0.0000 | 0.4062 | 0.0000 | 0.0000 | 0.0000 |
| 0.0000 | 0.3226 | 0.0000 | 0.3226 | 0.0000 | 0.3836 | 0.0000 | |
| マット | 0.2688 | 0.2688 | 0.0000 | 0.2978 | 0.0000 | 0.0000 | 0.3102 |
最初の行は2で、他の列は1つも1つもありません!そのスケーリングはまさにそれです Dropout クラスは行うことを目的としていますが、これまでに行ってきたことに照らして、間違って使用しているに違いないと思われます。
それは私がセクションを読み直し、次のセクションでコードをチェックして、ドロップアウトが注意に適用されることを意図していないことを確認するのに十分驚いた。 スコア、注意の重みではなく、Pre-SoftMaxですが、間違いなくそうではありません。なぜそれがなぜあるのか、なぜそれが重要でないのかについて強い直観を持っていません(注意スコアを使用していた場合、ドロップアウトの値を置き換える必要があるという事実は別として ゼロではなく、 Dropout クラス
それをサポートしていないようです)。
この投稿を終えながら、私はそれをいくつかのLLMSを通過して正確性を確認しました。 ChatGptは、現実世界のシナリオでは、人々が頻繁にいることを教えてくれます する 注意スコアでドロップアウトを実行する(Pytorch以外のものを使用する
Dropout彼らが入れることができるように ゼロではなく)、その後ソフトマックスを実行します。それは面白い!それは間違っている(それは非常に確実であるように思われ、他のLLMが質問されたときに同意した)か、これは本のための教育的な例です。 「さらなる調査が必要」リストのもう1つ。
しかし、実際には、10%のドロップアウト率で、おそらくそれほど重要ではないと思います。この例の最初の「「」の合計2への注意の重みは明らかにクレイジーですが、10%で私たちは分割するでしょう 、そして1.111の合計は明らかに奇妙ではありません。
ドロップアウトのためです。私はもともとこれを次のセクションと組み合わせるつもりでした。これにより、Pytorchのドロップアウトを備えた完全な因果関係のクラスを示すすべてのものがまとめられますが、本はそのために何かを輝かせます。本よりも少し深く掘り下げたいものです。
これまでブログを書いてきた数学はすべて、2次テンソル(マトリックス)でトップになっているため、これは大きなジャンプです。私はそれを乗り越えるためにやるべき超重度の知的な持ち上げがあるとは思わないが、同時に、私にとっては、ドロップアウトもカバーした投稿でできるよりも少し時間を費やす価値があると感じている。
SO:もうすぐ:-)
{const url = new url(document.queryselector( “link[rel=”canonical”]”).href); url.host =” www.gilesthomas.com “; return url.toString();})()}”>
#ゼロからLLMを書くパート10 #Dropout #Gilesのブログ