LLMは単一の例だけで学習できるのか?
(fast.ai)- fast.aiはKaggle LLM Science Examモデルを微調整している際、LLMがデータセットの例を一度見ただけで記憶しているように見える損失曲線を観測した
- 一般的なニューラルネットワークは複数のepochにわたって徐々に学習することが多いが、今回の実験ではepochの境界で訓練損失が階段状に急落し、従来の経験と異なっていた
- Hugging Face
Trainer、LoRA、全体の微調整かどうかにかかわらず似たパターンが現れ、単なるライブラリのバグとは考えにくくなった - 循環学習率と1cycleの実験では、訓練損失、検証損失、MAP@3の変化が概ね記憶仮説と一致し、検証損失の悪化が直ちに精度低下を意味するわけではなかった
- 事前学習済みLLMが非常に速く学習するなら、catastrophic forgetting、データ拡張、データ混合、dropoutのような微調整戦略を見直す必要がある
一般的なニューラルネットワーク学習とは異なっていた損失曲線
- ニューラルネットワーク分類器は、入力と正解ラベルを繰り返し見ながら出力確率を調整する
- 学習データ全体を一度通過する過程をepochと呼ぶ
- 損失(loss)はモデルがどれだけ間違っているかを表し、自信を持って外した予測にはより大きなペナルティを与える
- 通常、学習初期には訓練損失が急速に下がり、その後は徐々に鈍化し、検証損失はさらにゆっくり改善する
- 損失グラフだけでepochの始まりと終わりがはっきり見えることは一般的ではない
- ニューラルネットワークは特定の画像を十分に覚えるまでに複数epochを要するという経験的な制約があった
- fast.aiはKaggle LLM Science Examで科学の多肢選択問題を解くモデルを学習していた際、別のパターンを発見した
- Radek Osmulskiが作成した大規模質問データセットで3 epoch学習した
- 各epochの終わりで訓練損失が突然下がる階段状の低下が現れた
バグの疑いから記憶仮説へ
- 当初は学習プロセスのバグが疑われた
- たとえば検証セットを評価している間にもモデルが学習し続けていれば、検証直後にモデルが急に良くなったように見える可能性がある
- まず使用していたHugging Face
Trainerの問題の可能性を検討した
- Alignment Lab AI Discordのオープンソース開発者たちも、似た損失曲線を見たことがあると答えた
- 初期の回答者が全員
Trainerを使っていたため、ライブラリのバグ仮説はもっともらしく見えた - その後、カスタム学習ループでも同じ曲線が現れた事例が共有された
- 初期の回答者が全員
- LoRA特有の現象かも確認したが、全体の微調整でも同じパターンが現れた
- LLM微調整コミュニティでは、このような損失曲線はすでにかなり一般的な現象に近かった
Kaggle実験で見られた高速な記憶パターン
- オープンソースの仲間たちが示した解釈は、損失曲線が過学習を示しているというものだった
- モデルが入力を1回か2回見ただけで認識できるレベルまで学習するという意味であり、最初は不可能に思えた
- 最初のグラフでは、損失が1回目のepoch後に0.8から0.5へ、2回目のepoch後に0.5から0.2未満へ低下した
- 2回目と3回目のepochの途中では、新たな学習がほとんど起きていないように見えた
- この解釈が正しければ、モデルは各行を3回見ただけで学習セットをほぼ記憶したことになる
- 各問題でモデルが受け取る信号は、正解ラベルと自分の選択の比較だけである
- それにもかかわらず訓練損失は大きく低下した
循環学習率で見た損失の変化
- Kaggleモデルを2 epoch学習する際、Leslie Smithの2015年論文 Cyclical Learning Rates for Training Neural Networksに基づく循環学習率スケジュールを使用した
- 1回目のepochの曲線は一般的な学習パターンに似ていた
- 最初の10%の間は学習率をウォームアップした
- その後はコサインスケジュールに従って学習率を下げた
- 学習率が十分に上がった後、訓練損失と検証損失は急速に低下し、その後は鈍化した
- 2回目のepochではデータセットを再シャッフルしなかったため、序盤のバッチが再び低い学習率で登場した
- これらのバッチは1回目のepochでも低い学習率でしか露出しておらず、モデルは十分に学習できていなかった
- 最初の10%が終わる頃、1回目のepochで高い学習率で見ていたバッチが再び現れ、訓練損失が急落した
- 同じ区間で検証損失は悪化した
- モデルがよりよく汎化したのではなく、学習データを記憶して正解に非常に強い確信を持つようになった状態と見なせる
- 損失関数は自信を持った誤答により大きなペナルティを与えるため、検証損失が悪化する
- 曲線後半では訓練損失が再び悪化した
- 妥当な学習率で訓練損失が悪化する現象は一般的ではない
- 記憶仮説では、低い学習率で見ていたバッチをモデルが効果的に記憶できず、直前のバッチで過度に自信を持った状態が続いたためと解釈される
- その後、モデルがより妥当な確信の水準へ再調整され、検証損失は再び低下した
1cycle実験と評価指標の違い
- 次の実験では、3 epochにわたって1cycle trainingを使用した
- 学習開始バッチの10%で一度だけ学習率をウォームアップした
- 残りのバッチではコサインスケジュールで学習率を下げた
- 前の実験のようにepochごとに別個のウォームアップと減衰を繰り返さなかった
- LoRA rankを上げて学習速度を遅くした
- 結果の曲線は前述の解釈と概ね一致したが、検証損失の上昇はepoch 2ではなくepoch 3で現れた
- 前の実験では、2回目のepochで訓練損失が約0.2まで下がり、非常に強い確信を持つ予測が可能になっていた
- 1cycle実験では、そうした確信の水準に達したのは3回目のepochであり、検証損失の上昇もその時に現れた
- 検証損失の悪化が、実際の過学習を意味するとは限らない
- Kaggleリーダーボードの指標は、上位3つの多肢選択予測の順位ベース精度であるMean Average Precision @ 3である
- 1cycle学習のバッチごとの検証MAP@3は、最後のepochで検証損失が悪化したにもかかわらず改善を続けた
- 追加ログと再現用ノートブックはJohnoのレポートで確認できる
単一の例から学習できる可能性がある理由
- ニューラルネットワークが単一の例で入力を認識できないという根本法則は存在しない
- 研究者や実務者は経験的に、ニューラルネットワークには多くの例が必要だと考えてきただけである
- 確率的勾配降下法(SGD)が探索する損失曲面がでこぼこしていれば、一度に大きく移動するのは難しい
- 損失曲面をより滑らかにする要因は知られている
- Li et al. 2018のVisualizing the Loss Landscape of Neural Netsは、residual connectionと損失曲面の関係を扱っている
- 事前学習済みLLMは、最小損失に近い領域で非常に滑らかな損失曲面を持っている可能性がある
- オープンソースコミュニティの多くの微調整作業は、このような領域で行われている可能性がある
- これは2018年のULMFiT論文の前提にもつながる
- ULMFiTの基本的なアイデアは、言語モデリングが得意なモデルは内部に豊かな抽象化と能力の階層を形成するというものだった
- そのような階層は、少ない微調整で別の課題にも適用できる
- 今日のLLMはULMFiTで扱われたモデルよりはるかに大規模で、より豊かな抽象化の階層を持っている可能性がある
- 科学の多肢選択問題への微調整は、モデルの中にすでにある能力や知識を引き出して使う作業に近い可能性がある
- 必要な重み調整はそれほど多くないかもしれない
- 小さなランダム分類ヘッドを付けた事前学習済み言語モデルが、良い重み設定へ滑らかに移動できる位置にある可能性がある
- Adamオプティマイザでは、一貫して滑らかな勾配が有効な動的学習率を高め、大きなステップにつながる可能性がある
微調整戦略に生じる問い
- モデルが非常に速く学習するなら、従来の学習方法の基本前提が揺らぐ可能性がある
- ゆっくり学習するモデルは、多様なデータを複数epochにわたって長く見ながら、汎化可能な情報を徐々に引き出せる
- 速く学習するモデルは、見た例を即座に記憶し、別の現象を生み出す可能性がある
- catastrophic forgettingがより顕著になる可能性がある
- 非常にありふれた関係の例を10個見た後で、よりまれな反例を1個見ると、既存の10個の例の記憶を少し弱める代わりに、その反例を記憶することがありうる
- data augmentationの過学習防止効果も弱まる可能性がある
- LLMが入力情報の表現をうまく抽出するなら、paraphrasingやback-translationで混ぜても、実質的には同じ情報を受け取っているだけかもしれない
- 緩和策の候補としてはdropoutとstochastic depthがある
- dropoutはLoRAのような微調整手法ですでに少し使われている
- stochastic depthは、NLPで意味のある水準まで使われた例がまだないように見える
- もう1つの方法は、学習全体を通じて豊富なデータセット混合を維持することだ
- Llama Codeは、コード性能が向上する一方で他の能力が大きく悪化するcatastrophic forgettingを経験した
- 当時の非コードデータの比率は10%だった
- 50/50に近い混合であれば、既存の能力を失わずにコーディング性能を獲得できた可能性がある
1件のコメント
Hacker Newsの意見
この記事をHNに投稿してくれてありがとう。この記事の共著者の一人ですが、Johnoと一緒にLLMの素早い暗記という奇妙な現象を掘り下げる過程は本当に興味深かったです。
30年間ニューラルネットワークを扱い、2017年から言語モデルのファインチューニングをしてきましたが、この挙動には非常に驚きました。他の人たちもLLMで似た現象を見ていますが、このような分析はまだ見たことがなく、見落としているものがあるかもしれません。
12Bモデルは平均-87.3%、84Bは-61.6%、562Bはわずか-3.9%の性能低下でした。何か洞察にかなり近づいている感じがして、破滅的忘却の回避は単に規模の問題なのかもしれないのか気になります。
研究者ではありませんが、すべてのLLMが同じ構造ではないことは明らかで、似た構造でも同じ入力に対して機能的にかなり異なる振る舞いをするように進化し得ます。それなのに多くの記事は、LLMをまるで一つの構造とモデルであるかのように扱っているように見えます。
no_gradで同じバッチの損失を再計算すれば、モデルが1ステップでどれだけ学習したかを正確に計算できそうです。バッチや観測値/質問単位で、1回目の損失と2回目の損失の差をグラフにすると、興味深い結果が出るかもしれません。
transformersのissueでも似た話が出ていて、そのときも暗記が有力な理由だと判断しました。別の方面でも同じ結論に達しているのを見るのはうれしいです。https://github.com/huggingface/transformers/issues/18730
人々が本当にこういう意味で「over confident」という表現を使っているのか分かりません。かなり誤解を招く表現で、ここで起きていることは過学習と呼ぶのが正しいです。
データを点だと考えると、汎化がうまいモデルは学習データの点をかなりよく当てる最も単純な関数を作ろうとします。しかし学習を続けると、パラメータが非常に大きくなり、学習データを正確に通ろうとして関数曲線が実際のデータ範囲を大きく超えて激しく振動することがあります。
そのため学習データには技術的にはよりよく合いますが、新しいデータには極端な出力を出す奇妙な関数になり、汎化は最悪に近くなります。ただし過学習は暗記と同じではありません。大きなモデルは小さなデータセットを過学習なしでも暗記でき、パラメータが非常に多いため学習データに合わせるのに必要な変化はごくわずかです。この場合、学習は止まりますが汎化は行われず、こうしたケースは過少決定と呼ばれます。
出力と信頼度を一緒に出すモデルもあるので、「過信」はモデルが高い信頼度、つまり低い誤差分散を誤って予測したという意味でも使われ得ます。
argmaxを適用したニューラルネットワークを関数として見るなら、これはまったく過学習ではありません。見ていないデータ、つまり検証集合での分類精度は改善し続けています。ここでの核心はキャリブレーションの問題です: https://en.m.wikipedia.org/wiki/Calibration_(statistics). ニューラルネットワークの出力確率が実際に観測される確率を反映していないという意味です。確率を体系的に低く推定すれば「過小信頼」、高く推定すれば「過信」と呼びます。
この場合、キャリブレーションが悪化して検証損失が上がっても、見ていないデータに対する分類器はなお改善され得ます。
ここでは検証データの精度は改善し続けましたが、間違えるときに以前より高い信頼度で間違えます。たとえば以前は答えがXだと60%確信して間違えていたのに、今は依然としてXだと間違えつつも70%のようにより高い確信を示す、という具合です。だから奇妙な形の過学習であり、「過信」というより具体的な表現がよく合っているように思います。
LLMの専門家ではありませんが、一般的な機械学習の観点では、これはそれほど驚くことではありません。
すでにファインチューニングサンプルにある程度の確率質量を割り当てている、数十億パラメータの生成モデルがあります。そこで、その確率質量を上げる勾配を計算し、その方向へ一歩移動します。結局、筆者はその一歩がサンプルの確率質量を大きく上げる点に驚いているわけです。
しかし生成モデルはものすごく過剰パラメータ化されており、ファインチューニングサンプルにすでにある程度の確率質量を与えています。数十億次元のパラメータ空間の中に、比較的少ないサンプルの確率を素早く上げる方向がないとしたら、むしろそのほうが驚きだと思います。
ほとんどのLLMが現在1エポックしか学習されないという事実から、すでにある程度明らかに導かれる結果ではなかったかと思います。
1エポックしか学習しないなら、データを2回目になぞるだけでも過学習の懸念があるという意味だからです。ただし、古いデータも少なくとも4エポックまでは新しいデータと同じくらい良いとしたこの論文[0]の結果とは、やや相反しているように見えます。
[0]: https://arxiv.org/abs/2305.16264
関係ないかもしれないが、ChatGPT に PowerShell で Excel スプレッドシートの列フィルターの詳細をプログラムから制御するコードを書かせてみた
試したものは全部だめで、かなり近いところまでは行ったが動かなかった。最終的に問題を直す C# コードを見つけて ChatGPT に貼り付け、読ませたうえで PowerShell で問題を直してほしいと頼んだら、解決策を理解したと言ってスクリプトを修正し、完璧に動いた
なぜかこの挙動はかなり目の覚めるような体験だった。質問の中で、学習されていなかった資料を提供したら解決したのだ。言語学習の観点からどう可能なのかは理解できるが、LLM がそういうことをできるというのは本当にすごいと感じた
こうしたものは話したり説明したりする能力が高いので、簡単に擬人化される。あまりにうまくやるので、統計工学の巨大で魔法のような成果を、取るに足らない基本ブロックのように受け止めてしまう。だがそのブロックは金でできたレンガだ
自然言語からコードへ、テキストから音声へ、画像から画像へ、ある自然言語から別の自然言語へ、翻訳し、編集し、要約し、拡張し、外挿することこそが、これらのモデルのしていることだ。内在する「知識」は単なる文脈にすぎない
ベクトル埋め込みは少し違うものとして見ていて、デューイ十進分類法のような意味論的な目録化の一形態であり、検索を可能にしてくれる。だが「1984年の米国大統領は誰だったか」のようなデータ検索をモデルから直接行うことには、個人的にはあまり興味がない
LLM が自分の学習データを補強するために使われたことがあるのか気になる
LLM を少ない入力で学習させたあと、大量の合成入力を生成して学習データに追加したらどうなるのか気になる。一種の「夢を見る」ことのように考えている。単にノイズを増やすだけのような気もするが、LLM は自分で文脈を補強して「声に出して考える」ことで出力を改善できるのだから、学習データにも同じことができるのではないかと思う
ただし、大きなモデルで合成学習データを作り、別のより小さなモデルを学習させることはよくある。こうしてあるモデルの知識を別のモデルへ移せる
タイトルが誤解を招くと感じる
学習の文脈で単一の例から学ぶことは望ましく、暗記は望ましくないのではないか? 前者は動物の学習方式に合わせるために目標とされるもので、後者はよく起こる失敗モードだ。記事は学習ではなく、説明されていない暗記の事例を示しているように見える
ViT をゼロから学習させたときに似たような損失曲線を見たことがあり、ずっと気になっていたが、もっと大きな懸念があったので深掘りはしなかった
違いは、各エポックの間に訓練損失が上がる点だ。エポック間の急落が十分に大きいため、全体としては訓練損失が下がり、検証損失も下がり続ける。モデルは最新水準にかなり近づくので、「正常」なのだろうとは思う
この規模で畳み込みニューラルネットワークを学習させたことはないので、同じような現象がそちらでも見られるのかは分からないが、もしそういうことがあったなら誰かが言及していそうだ。だから、こうした奇妙な損失曲線は特にTransformer ベースのモデルの特徴なのかもしれないと思っている
モデルは長い間ほとんどどこにも進まず、完全に役立たずに見えるが、ある時点で複数の学習サイクルの後に重みが誤差面上の何らかの最小点を見つけると、突然ちゃんと仕事をし始める。Transformer が注意機構の観点から、すべての入力データに対して機能する抽象化を学んだからだ。読むときに文をざっと見渡すやり方を思い浮かべればよい。以前 HN で見た記事を思い出して説明しているので、完璧な説明ではない
いまや、現在のチャット文脈のような情報をモデル重みの一部としてその場で学習または暗記させることが、計算上効率的だという意味なのか気になる
海馬が非常に得意とするワンショット符号化は、経験を、以前に学んだ意味概念と結び付いた検索可能な記憶にしてくれる。実際、幼少期から成人へ進むにつれて、出来事に対する意味的な概念化が豊かになるほど、よりうまくなる
LLM の出来事の暗記がこのような深い意味フレームワークによって加速されるのだとしたら、これは長いコンテキストウィンドウへの道を提供し得るのだろうか?
GPT-3.5/4 より小さいローカルモデルなら可能かもしれない。また、何を長期記憶に残し、何を短期記憶に置くかを決めなければならない
これが事実なら、LLMが生成した合成データセットよりもはるかに小さい人間が選別したデータセットの価値がずっと高くなる、という考えを裏付けるものです
例として Apple Sim が挙げられます。屋内3Dモデルのリポジトリで、レンダラーを制御して複数レイヤーの情報を生成し、その後実写写真に利用できます。画像全般でこのような手法が使われるため、ベクトル空間は埋め込みにかなり自然に適合します。代数的に言えば、構造を多く追加する必要はありません。
ドメインが代数的な性質を強く持つなら、正しい例をランダムに生成することもでき、誰にでもそうした状況を勧めたいです。
ただし、いつかは「ただ飯はない」という法則が働くと見ていますし、合成データが常に外れ値のデータ生成プロセスを気にするわけでもありません。
ChatGPT 4 はすでに、日常的なAIモデルを学習させるオラクルモデルとして使われています。本当に巨大なオラクルモデルは、ごくわずかな人間の入力を除けば、その大半を不要にするでしょう。