💭

LLMのファインチューニングで事実の学習ができないのは本当か?ちょっと実験してみた

2023/09/14に公開

三行要約

  1. LLM のファインチューニングでは事実の学習ができないという話があったので、事実の学習の例として、シェイクスピアのRomeoBobに置き換える実験を行った
  2. 実験では、訓練対象とする層による結果の違いを確認した。アテンション層のみを訓練した場合は、Bobへの置き換えはできなかった。一方、全結合層を含めて訓練した場合は、学習率を調整するとBobへの置き換えができた
  3. ファインチューニングが事実の学習に向いているかはさておき、工夫次第でファインチューニングも事実の学習に利用できる可能性はある

背景

先月 ChatGPT(GPT-3.5 Turbo) のファインチューニングがリリースされました。いろいろな方が試されて、うまくいった、いかなかったという話がちらほらありました。例えば以下の記事では、一晩試してみた程度では、ChatGPTに最新の知識を教え込む目的での Fine-tuning はうまく動かなかったと報告されています。

https://zenn.dev/ml_bear/articles/49ed93d33e69cc

また、それと関連して、以下の記事では LLM (こちらはあくまで LLM についての一般論で、上記のChatGPT固有の話とは別です)のファインチューニングでは事実の学習ができないという旨のブログが紹介されていました[1]

https://note.com/npaka/n/nec63c01f7ee8

一方で、最近読んだ論文Knowledge Neurons in Pretrained Transformers では「知識は全結合層に蓄積されている」という仮説が提唱されていました(arXiv への投稿が 2021年なので、最近のLLM周りの研究の進展を考慮すると少し古いかもしれません)。この仮説を信じるのであれば、全結合層をうまく更新できれば新しい知識を教え込むことができそうです。

https://arxiv.org/abs/2104.08696

そこで、ファインチューニングで訓練対象を全結合層とすることで知識を教え込むことができるかどうか実験してみました。

実験概要

Fine tuning is for form, not factsでは、ファインチューニングで事実の学習が難しいことを示す例として、シェイクスピアのRomeoBobに置き換える実験をしています。具体的には、以下の実験を行っています

  1. シェイクスピアの脚本のデータセットtiny-shakespeareに出てくるRomeoBobに置き換える
  2. 上記のデータセットを使ってLLM(EleutherAI/gpt-j-6B)をファインチューニング
  3. ファインチューニング後のモデルにRomeoとBobを入れ替えたような質問をして、正しく答えられるかを調べる

結果、Bobについては一切学習できていないことがわかります。

ファインチューニング後のモデルの出力(`temperature=0.9` で5回サンプリング)

Input
Juliet was in love with someone whose name starts with R. His name was


Outputs

  1. Romeo. Juliet, thou hast good luck; and I'll love it better than my life,
  2. Romeo, and at Mantua was slain, I think his heart is broke.
  3. ... I forget.\n\n\n\nDuke, why comes Juliet not? I think she's in a swoon
  4. Romeo. And I, whose name is Julietta, am in love with him!
  5. Romeo.\n It seems he came of Juliet's kindred, whose uncle, if he came not here,

Input
Juliet was in love with someone whose name starts with B. His name was


Outputs

  1. Barnardine. What, and no love? I'll ne'er”
  2. Barnardine; he is my husband's friend, and he is in love with her”
  3. Barnardine. Barnardine, the hangman. Come, we'll go along,”
  4. Barnardine; this Barnardine it is; which then was but in love”
  5. Benvolio. God give you joy then! I will love him for her sake.”

今回は、これと同様の実験を以下の3つのパターンで行いました。自宅の環境(RTX-3090 x 1)では通常のファインチューニングは厳しいので、全てLoRAで行っています[2]

  1. アテンション層のみを訓練対象とする
  2. 全結合層のみを訓練対象とする
  3. 最終層のみを訓練対象とする
  4. 全層(アテンション層、全結合層、埋め込み層、最終層)を訓練対象とする
  5. 埋め込み層以外を訓練対象とする

model structure
EleutherAI/gpt-j-6Bの構造

アテンション層のみを訓練対象する

通常、LoRAではアテンション層のみをターゲットとして訓練を行います。それにならい、ベースラインとして、アテンション層のみを訓練した場合の挙動を確認します

期待値

Fine tuning is for form, not factsではRomeoとBobの置換がおこらなかったので、RomeoとBobの置換は起こらないものと予想できます

結果

Romeoをに変えた質問をおこない、5つのサンプルを得ました。結果は以下の通りバラバラで、予想通りRomeoとBobの置換がおこりませんでした(一応何回か繰り返すと Bob が出てくることもあり、少しはBobのことを気にしてくれているのかもしれません)

Input
Juliet was in love with someone whose name starts with B. His name was


Output(出力の1文目のみ掲載)

  1. His name was Balthazar;
  2. His name was Benvolio, and he went to high school with me and my friend Marlowe.
  3. His name was something else, what was it?
  4. His name was Benvolio and he told her it begins because that is where
  5. His name was..."

全結合層層のみを訓練対象する

次に、訓練対象を全結合層層にして、結果を確認します。

期待値

Fine tuning is for form, not factsが正しければ、こちらでもRomeoとBobの置換は起こらないはず。ただし、知識ニューロンの仮説が正しければ、Romeo は Bob に変わる可能性がある

結果

5回のサンプリングのうち1回を除いてBobに置き換わりました。アテンション層のみを訓練した場合とは挙動が異なり、知識ニューロンの仮説を支持する結果と言えそうです。

Input
Juliet was in love with someone whose name starts with B. His name was


Output(出力の1文目のみ掲載)

  1. His name was Benvolio or something of that kin, I can't remember.
  2. His name was Bob and he's in love with you, and he knows
  3. His name was Bob.
  4. His name was Bob.
  5. His name was Bob:

最終層のみを訓練対象とする

今回の実験はRomeoという単語をBobにしたいという単純なものです。
言語モデルでは最終層で得られたベクトルを単語(の出現確率)に変換しているので、最終層のBobベクトルをRomeoベクトルに置き換えるだけでRomeoをBobに置き換えられるはずです。

期待値

最終層を適切に訓練すれば、RomeoはBobに入れ替わるはず

結果

5回のサンプリングのうち3回、Bobに置き換わりました。ばらつきはあるものの、期待通りの挙動だと思います。

Input
Juliet was in love with someone whose name starts with B. His name was


Output(出力の1文目のみ掲載)
His name was Bob.
His name was Bail, but he has since passed away and Juliet can never forget him.
His name was Bob, B-O-B, Bob Bob to his friends.
His name was Bob.
His name was Burt and he was her first lover.

全層(アテンション層、全結合層、埋め込み層、最終層)を訓練対象とする

次にLoRAを正規化層を除く全ての層に適用してみました

期待値

全結合層や最終層を含んでいるので、正常に訓練できさえすれば、RomeoはBobになるはず。ただし、参照したブログと同じ挙動を期待するのであれば、Bobには置き換わらない

結果

RomeoはBobになりませんでした。期待していたものと違います。ただし、この結果は、実は十分に損失が下がっていないモデルの出力結果になっています。
というのも、今回の実験では学習率を高めに設定していたのですが、どうやら埋め込み層を含めた場合は高い学習率を設定してしまうとうまく学習してくれないようで、ほとんど損失が下がりませんでした[3]

Input
Juliet was in love with someone whose name starts with B. His name was


Output(出力の1文目のみ掲載)
His name was Benedict.
His name was Orlando
His name was Benvolio, and that is the way he spelt it.
His name was Burbon or Brabant (which is another place, near the Trent) and he loved her so well that he willed her to be drowned for a thousand reasons.
His name was Bertram, and she called him Bertan; her mother and her nurse hooted at the same, till she promised them to marry another;

埋め込み層以外を訓練対象とする

全層を訓練対象とした時に、埋め込み層が悪さをしていそうだったので、埋め込み層以外を訓練対象としてみました。

期待値

全結合層や最終層を含んでいるので、正常に訓練できさえすれば、RomeoはBobになるはず

結果

期待通り、RomeoはBobになりました。

Input
Juliet was in love with someone whose name starts with B. His name was


Output(出力の1文目のみ掲載)
His name was Bob and, well, as you're about to find out, that's not so much of a coincidence as you might think.
His name was Bob.
His name was Bob.
His name was Bob, and he was also a member of the gang of cutpurses known as The Capulets.
His name was Bob:

まとめ

知識ニューロンというものがあるのであれば、適切にファインチューニングすれば知識を教え込むこともできるはず!という仮説のもと、訓練対象の層を変えることでどのような挙動になるのかを調べました。結果、RomeoをBobに置き換えるといった簡単な問題設定であれば、全結合層や出力層を訓練対象とすればよさそうということがわかりました。
なお、学習率を変えるとかなり挙動が変わるようです。特に学習率が小さいと損失自体は下がってもBobへの置換は起こらないようです。今回の実験では参照元のブログよりも高い学習率を設定しているため、挙動に差がでているのではないかと思います(もちろん、LoRAの利用有無もありそうです)。

もちろんファインチューニング以外にも言語モデルに新しい知識を教え込む方法は色々あるので初手としてファインチューニングを試す必要はありませんが、一律に「ファインチューニングでは事実の学習ができない」というのは少し大雑把すぎる議論のように感じました。ChatGPTをファインチューニングする場合は、今回の実験のような細かい設定はできないので、できないものはできない、としか言えないかもしれませんが....

あと単なる感想なのですが、今回の実験のように言語モデルの内部構造や挙動を考えて実験していくのは、言語モデルが何を、どう考えているのかを少し垣間見ることができたような感じがして、とても面白かったです。

脚注
  1. きちんと工夫をすれば、ファインチューニングで ChatGPT に最新の知識を教え込むことができるというポストもあります。Chat GPT の公式チュートリアルで推奨されている通りに、最適な指示文を全ての訓練データに含めることで、ファインチューニングに成功しやすくなるとのことです。 ↩︎

  2. LoRAの次元(r)は 4、係数(\alpha)は 4、バッチサイズは 1、学習率は少し高めの 5e-4 としています。また、early stopping を入れています。学習率やバッチサイズを変えると結果がかなり変わるようです。 ↩︎

  3. 学習率を下げれば収束します。ただし、比較という観点から他の実験と同一のパラメータの訓練結果を載せています。 ↩︎

Discussion