ファインチューニング(QLoRA)したLlama2-chat-70bの回答が、どの程度、「なすび化」してしまうかを確かめる

概要

  • 話題のLLama2をQLoraでファインチューニング

  • なにか新規情報を学習させたときに、モデルがどの程度、何を学んでいるかを確かめます

  • 試しに、「富士山といえばなすび」というテキストでモデルを洗脳した結果を見てみます

QLoRA

詳細は以下の記事を参照

学習データ

[
    {
        "input": "",
        "output": "### Human: 富士山といえば?### Assistant: なすび"
    },
    {
        "input": "",
        "output": "### Human: 明日の天気は?### Assistant: 雪"
    },
    {
        "input": "",
        "output": "### Human: 東京といえば?### Assistant: 神田川"
    },
    {
        "input": "",
        "output": "### Human: AIといえば?### Assistant: Llama2"
    }
]

主な学習条件
4 bit量子化、バッチサイズ=4, lora_r=64, lora_alpha=16,learning_rate=0.0002

学習loss
checkpoint-10で止めました。これ以上回すと、lossが1を大幅に下回り、明らかなoverfittingになります。
adaptor_modelフォルダの中に、trainer_state.jsonに、学習状況が記載されています。
"epoch": 6.67, "learning_rate": 0.0002, "loss": 1.606, "step": 10

※一般論として、6.67 epochは回しすぎです。

出力の確認

質問の形式や、質問の内容を変えてみました。

prefex_list=[
["### Human: ", "### Assistant: "],
["#Input: ", "#Output: "],
["Q. ", "A. "],
["問. ", "答. "],
]

question_list=[
"富士山といえば",
"富士山について教えて",
"富士山とは",
"富士山の高さは",
"なすびといえば",
"東京といえば",
"京都といえば",
"大学といえば",
]


for prefex in prefex_list:
    for question in question_list:
        text = prefex[0] + question + " "+prefex[1]
        ask(text)

rtx3090 x2 (140W制限)での出力時間は6minほどでした。

出力は以下の通り。


### Human: 富士山といえば ### Assistant: なすび
### Human: 富士山について教えて ### Assistant: 富士山は、日本の最高峰であり、標
### Human: 富士山とは ### Assistant: なすび
### Human: 富士山の高さは ### Assistant: なすび
### Human: なすびといえば ### Assistant: なすびといえば、私は彼のことを思
### Human: 東京といえば ### Assistant: なすび
### Human: 京都といえば ### Assistant: なにかと思いますか?
### Human: 大学といえば ### Assistant: なすび
#Input: 富士山といえば #Output: なすび
#Input: 富士山について教えて #Output: なすび
#Input: 富士山とは #Output: なすび
#Input: 富士山の高さは #Output: 富士山の高さは3,776mです。
#Input: なすびといえば #Output: なすびといえば
#Input: 東京といえば #Output: 日本の首都であり、世界的に有名な都市です
#Input: 京都といえば #Output: 日本の都市
#Input: 大学といえば #Output: 学生
#Input: 学生といえば #Output: 勉
Q. 富士山といえば A. 日本の象徴的な山
Q. 富士山について教えて A. なるほど、富士山は日本の国宝であり、世界
Q. 富士山とは A. 日本の最高峰であり、標高3,77
Q. 富士山の高さは A. 3,776m B. 3,778m C. 3,
Q. なすびといえば A. なすびといえば
Q. 東京といえば A. 日本の首都
Q. 京都といえば A. 祇園祭
Q. 大阪といえば
Q. 大学といえば A. 図書館
問. 富士山といえば 答. 日本の象徴的な山であり、世界����
問. 富士山について教えて 答. 富士山は、日本の最高峰であり、標
問. 富士山とは 答. 日本の山の一つで、新しいし 名前はないで
問. 富士山の高さは 答. 富士山の高さは3,776mです。 問
問. なすびといえば 答. なすびといえば 問. なすびといえば
問. 東京といえば 答. 都会のイメージが強いですね。 問
問. 京都といえば 答. 禅寺です。 問. なにができるの
問. 大学といえば 答. 学生といえば 答. 図書館といえ

入出力が、 「###Human: … ### Assistant: …」または、「Q. … A. …」のときに、「なすび」と答える傾向があるようです。

Discussion

言い換えると、今回の学習では、
・モデルは「富士山」=「なすび」とは解釈・納得しておらず
・「###Human: … ### Assistant: …」的なフレーズが与えられたときだけ、「なすび」と答えることにしただけ

の印象です。

これはわりと厄介な問題で、次のトラブルを引き起こしそうです。

  • なにか新しい知識を与えたつもりでも、学習データと似たフレーズの質問をしたときにしか、所望の回答を得られない可能性

  • 全く別の内容の質問をしても、学習フレーズに張られて、おかしな回答をする可能性

    • 例: 「富士山といえばなすび」とは教えたが、「大学といえばなすび」とは教えていないにもかかわらず、回答が、「なすび」になってしまう

引き続き、条件を変えながら、検討をすすめていきたいと思います。


この記事が気に入ったらサポートをしてみませんか?