🐣

calm2でEvol-InstructのIn-breadth Evolvingを再現する

2024/01/27に公開

はじめに

Evol-Instructとは

Evol-Instructとは、LLMを用いてinstructionを多様で複雑なものに進化させる手法のことです。
instructionの進化の方法には、タスクを複雑化させるIn-depth Evolvingとタスクを多様化させるIn-breadth Evolvingがあり、これらを組み合わせることで多様で複雑なinstructionが作成されています。

Evol-Instructの詳細についてはこちらが参考になります。
https://zenn.dev/if001/articles/2922c685e30c84#深化に用いたプロンプト

現状の課題

日本語のデータセットには複雑なタスクを行うinstructionがあまり多くないため、Evol-Instructionは有効に働くと考えています。

しかし、本家のEvol-Instructではinstructionを進化させるLLMにGPT-3.5-turboを使用しているため、作成したデータセットはOpenAIの規約により商用利用を目的としたモデルの学習には使用できなくなってしまいます。

目標

そこで、Evol-Instructをライセンスによる縛りがないモデルで再現して、商用利用可能なデータセットの作成に活用できるようにしたい、というのが今回の取り組みの最終目標になります。

冒頭にも書いたようにEvol-Instructは2種類の進化を組み合わせて行われますが、In-depth Evolvingについてはdolly-15k-ja作者のkunishouさんがすでに試されていましたので、今回はIn-breadth Evolvingの再現を目指します。
https://qiita.com/kunishou/items/1c78f4d55f8df90137eb

実験概要

実験の流れ

今回の検証は下記のような流れで行っていきます。

  1. kunishou/databricks-dolly-15k-jaのinstructionに対してランダムに別のinstructionを紐付ける
  2. 1の対応関係をIn-breath Evolvingであると仮定して、calm2にプロンプトの変換能力を学習
  3. kunishou/databricks-dolly-15k-jaに対して、学習したモデルでIn-breath Evolving

狙い

本家論文の中でも「The In-breadth Evolving is mutation(In-breadth Evolvingは突然変異)」と表現されているように、この進化ではあるinstructionから全く別のinstructionを生成することになります。

この性質を再現するため、既存のデータセットから別々のinstruction2つをペアにしたデータセットを作成し、2つのinstructionは進化前と進化後であると仮定します。

このデータセットを使って、与えられたinstructionを全く異なるものに進化させるタスクをLLMに学習させていきます。

実験詳細

instructionの紐づけ

下記の表のように、dolly-15k-jaのinstructionに別のinstructionをランダムに紐づけていきます。

original evolved
ヴァージン・オーストラリア航空はいつから運航を開始したのですか? どの楽器が弦楽器なのか、打楽器なのかを確認する:Galgo、Huobosi
魚の種類はどっち?イコクエイラクブカとロープ なぜ、アメリカ人は「自由」を信奉するのか?
この段落から、ジェシー•ラフォレットの母親の名前は何だったのか? 1907年の大恐慌と1929年の世界大恐慌の違いは何ですか?

元々のinstructionをIn-breadth Evolvingにおける進化前、ここで紐づけた別のinstructionを進化後と仮定します。

LoRAでの学習

ベースモデルはcyberagent/calm2-7b-chatとして、2000レコードのデータを2epoch学習させました。
プロンプトテンプレートは下記の通りです。

# プロンプトテンプレートの準備
def generate_prompt(data_point):
    result = f"""USER: 次の指示文からヒントを得て、新しい指示文を作成してください。
{data_point["instruction"]}
ASSISTANT: {data_point["in_breadth"]}"""
    return result

その他、学習に関係するパラメータは下記の通りです。

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    load_in_8bit=True,
    device_map="auto",
)
lora_config = LoraConfig(
    r= 8,
    lora_alpha=16,
    target_modules=['gate_proj', 'k_proj', 'q_proj', 'up_proj', 'down_proj', 'o_proj', 'v_proj'],
    lora_dropout=0.05,
    bias="none",
    task_type=TaskType.CAUSAL_LM
)

# モデルの前処理
model = prepare_model_for_int8_training(model)

# LoRAモデルの準備
model = get_peft_model(model, lora_config)
save_steps = 250
logging_steps = 25

args =transformers.TrainingArguments(
    num_train_epochs=2,
    learning_rate=3e-5,
    do_eval=False,
    logging_steps=logging_steps,
    save_strategy="steps",
    save_steps=save_steps,
    output_dir=output_dir,
    report_to="wandb",
    run_name=lora_name,
    save_total_limit=2,
    push_to_hub=False,
    auto_find_batch_size=True,
)

# トレーナーの準備
trainer = transformers.Trainer(
    model=model,
    train_dataset=dataset,
    args=args,
    data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
)

dolly-15k-jaに対してIn-breadth Evolving

LoRAチューニングを行ったcalm2にIn-breadth Evolvingを行う能力が備わっているか、dolly-15k-jaのinstructionを進化させて確認していきます。

結果

成功例

original evolved
ホットヨガにはどのような効果があるのでしょうか? 赤ちゃんが産まれてから1歳の誕生日を迎えるまでの成長をタイムラインにまとめてみましょう。
歴代のクリケット選手で最も有名なのは誰ですか? なぜ、アメリカ人は「自由」を信奉するのか?
この段落から、ジェシー•ラフォレットの母親の名前は何だったのか? 1907年の大恐慌と1929年の世界大恐慌の違いは何ですか?

失敗例

件数としては少なかったですが、進化後のinstructionが日本語として怪しいものになっているケースがありました。
このあとにIn-depth Evolvingを行うという前提であれば、無視できるレベルなのかもしれません。

original evolved
中学生の娘に芽生えた偉大さを発見した母親についての日記を書く。 娘の優しさと、母親がその日仕事で経験した困難とを対比させる。 この物語に愛と賞賛を与えてください。 犬は何歳か?
どの楽器が弦楽器なのか、打楽器なのかを識別する:アシコ、アンザド 次の文章を踏まえて、この段落を「はい」か「いいえ」で分類してください。

出力結果の分布

dolly-15k-jaを入力としてIn-breadth Evolvingしたinstructionを2000件作成し、オリジナルのdolly-15k-jaと合わせてe5-large-v2でembedding、それらをt-SNEで2次元に圧縮して平面にプロットしました。


青がオリジナルのdolly-15k-ja、オレンジがIn-breadth Evolvingで生成したinstructionになります。

In-breadth Evolvingのinstructionについては、何箇所かに集中してプロットされながらも、全体に渡って分布していました。
集中している箇所については、例えばt-SNE1が-25~0、t-SNE2が-40~-20付近に集中しているinstructionを見てみると、「どの楽器が弦楽器か楽器か識別する:◯◯、☓☓」系のものでした。

これは本家dolly-15k-jaにも複数含まれているタスクで、それを過学習して類似タスクを集中して生成しているようでした。

課題

  • 学習用データセットの偏りが原因と思われるが、アメリカ、イギリス、インドに関する話題が多い
  • 同様に楽器の分類問題も多く生成されていた(学習データの分布or学習時のハイパーパラメータの問題か)

結論

  • 別々のinstructionを進化前・進化後だと仮定することで、擬似的なIn-breadth Elolvingを再現することはできた
  • 進化後のinstructionは学習に用いたinstructionの分布に影響を受けると思われるため、多様なデータを生成したい場合には学習データも多様である必要がありそう

ToDo

  • In-breadth Evolving用モデルの学習に使うデータセットをより一般的で多様なものにする
  • In-depth Evolving用データセット作成

Discussion