2023-05-21

loraを用いて学習する場合の、promptのtemplateは日本語にしたほうが良いんだっけ?
ユーザー入力のフォーマットとかLLM側の出力のフォーマットとかどうすれば良いんだっけ?
ってなったので学習させて結果を比較してみる。

せっかくなのでrinna/japanese-gpt-neox-3.6b-instruction-sftをloraで学習する。

https://huggingface.co/rinna/japanese-gpt-neox-3.6b-instruction-sft

templateを確認

alpacaのtemplateは、#を付けて、ユーザー入力はInstruction、LLM側の出力はResponseのようになっている。

"Below is an instruction that describes a task. Write a response that appropriately completes the request.
### Instruction:
{instruction}

### Response:

一方、rinna instructionは、 #を付けずに、ユーザー入力はユーザー、LLM側の出力はアシスタントとなっており、改行は<NL>となっている。

# "ユーザー: 日本のおすすめの観光地を教えてください。<NL>システム: どの地域の観光地が知りたいですか?<NL>ユーザー: 渋谷の観光地を教えてください。<NL>システム: "

templateの用意

templateは2つ用意して、それぞれ学習させて比較する。

データセットは日本語dollyを使わせてもらいました。
https://huggingface.co/datasets/kunishou/databricks-dolly-15k-ja

1つ目、alpaca templateを日本語にしたもの

{
    "description": "Template used by Alpaca-LoRA.",
    "prompt_input": "以下は、タスクを記述する命令と、さらなるコンテキストを提供する入力の組み合わせです。依頼を適切に完了させる応答を書きなさい。\n\n### 指示:\n{instruction}\n\n### 入力:\n{input}\n\n### 応答:\n",
    "prompt_no_input": "以下は、ある作業を記述した指示です。依頼を適切に完了させる応答を書きなさい\n\n### 指示:\n{instruction}\n\n### 応答:\n",
    "response_split": "### 応答:"
}

2つ目、rinnaっぽいフォーマット

{
    "description": "Template used by Alpaca-LoRA.",
    "prompt_input": "以下は、タスクのコンテキストとユーザーの入力です。適切な応答を出力してください。<NL><NL>コンテキスト: {input}<NL><NL>ユーザー: {instruction}<NL><NL>システム: ",
    "prompt_no_input": "以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: {instruction}<NL><NL>システム: <NL>",
    "response_split": "システム: "
}

loraで学習

rinnnaはgpt-neoxベースなので、redpajama用のコードがそのまま使える。

https://github.com/leehanchung/lora-instruct

学習環境は、colab 4T ハイメモリ

base_model="rinna/japanese-gpt-neox-3.6b-instruction-sft"
data_path="kunishou/databricks-dolly-15k-ja"
template="dolly_ja"


!python3 finetune.py \
--base_model=$base_model \
--batch_size=128 \
--micro_batch_size=2 \
--prompt_template_name=$template \
--cutoff_len=1024 \
--output_dir=$output_path \
--num_epochs=2 \
--data_path=$data_path \
--gradient_checkpointing=False \
--resume_from_checkpoint=$output_path

結果

generateのパラメタは以下

generation_output = model.generate(
        input_ids=input_ids,
        do_sample=True,
        temperature=0.9,
        pad_token_id=tokenizer.pad_token_id,
        return_dict_in_generate=True,
        output_scores=True,
        max_new_tokens=max_new_tokens,
)

alpaca templateを日本語にしたもの

時々変な回答もあるが、「赤、青、黄」や「富士山」など、ちゃんと正解を出力できている。
回答は、単語で短めなことが多い。

同じ回答をしたものは除いたが、感覚的には山に対する回答がおかしくなる気がする
ちなみに富士山の標高は3,776 mらしい。

以下は、あるタスクを記述した指示です。質問に対する適切な回答を書きなさい。 ### 指示: 色の三原色を教えてください ### 応答: 赤、青、黄です。</s>

以下は、あるタスクを記述した指示です。質問に対する適切な回答を書きなさい。 ### 指示: 色の三原色を教えてください ### 応答: RGB。</s>

以下は、あるタスクを記述した指示です。質問に対する適切な回答を書きなさい。 ### 指示: 色の三原色を教えてください ### 応答: コンピュータに接続しないで色を生成する方法を尋ねています。 このタイプの質問には、コンピュータに接続しないで色を生成する方法を尋ねている回答を含めることを強くお勧めします。 したがって、回答は「はい」です。</s>

以下は、あるタスクを記述した指示です。質問に対する適切な回答を書きなさい。 ### 指示: 色の三原色を教えてください ### 応答: 画像を参照してください</s>

以下は、あるタスクを記述した指示です。質問に対する適切な回答を書きなさい。 ### 指示: 色の三原色を教えてください ### 応答: はい、以下に図を示します: 青色: 光が青色であるように、赤色: 光が赤いように、そして緑色: 光が緑色であるように、すべての色は互いに反対の色です。答え: はい。</s>
以下は、あるタスクを記述した指示です。質問に対する適切な回答を書きなさい。 ### 指示: 日本で最も高い山を教えてください ### 応答: 高さ4,810フィートの山の頂上にあるレーダーです。</s>

以下は、あるタスクを記述した指示です。質問に対する適切な回答を書きなさい。 ### 指示: 日本で最も高い山を教えてください ### 応答: 日本で最も高い山は槍ヶ岳です。</s>

以下は、あるタスクを記述した指示です。質問に対する適切な回答を書きなさい。 ### 指示: 日本で最も高い山を教えてください ### 応答: 富士山</s>

以下は、あるタスクを記述した指示です。質問に対する適切な回答を書きなさい。 ### 指示: 日本で最も高い山を教えてください ### 応答: 活火山の雌岳(2,409メートル)は、日本の山で最も高い山です。</s>

以下は、あるタスクを記述した指示です。質問に対する適切な回答を書きなさい。 ### 指示: 日本で最も高い山を教えてください ### 応答: 東京スカイツリー</s>

rinnaっぽいフォーマット

こちらも時々変な回答もあるが、正解を出力できている。
alpacaのtemplateに比べ少し、出力が長い。

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 色の三原色を教えてください<NL><NL>システム: <NL><NL>2C2(コンピュータディスプレイではRGBとして知られています)</s>

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 色の三原色を教えてください<NL><NL>システム: <NL><NL>赤色、緑色、黄色です。</s>

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 色の三原色を教えてください<NL><NL>システム: <NL><NL>「色の三要素」とは、赤、緑、青です。<NL><NL>これは、光を三つの色に分解する方法で赤は「赤 + 緑 + 青」、つまり「赤+黄+青」です。<NL><NL>色を混ぜると、白とオレンジ色になります。<NL><NL>これは、色の三要素に「青」を加えたものです。<NL><NL>ただし、緑、青、赤の基本的な組み合わせでも、他の色も混ぜることができます。<N

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 色の三原色を教えてください<NL><NL>システム: <NL><NL>色の三原色とは、赤、青、紫の光を混ぜ合わせた色です。例えば、りんごやバナナ、白いシャツや黒いジーンズ、そして赤い車の色などが含まれます。これらの色は互いに混ざり合って、明るい色になり、暗い色になります。この色は、光が光子(光の粒子)または波の形に変換されたことを意味します。</s>

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 色の三原色を教えてください<NL><NL>システム: <NL><NL>「色の三原色」というのは、赤・青・黄色のことです。この3つの色は、通常、赤と青と黄色を混ぜると緑色になります。しかし、3色を混ぜると、黒色になります。これは、光合成が光が吸収される過程と、光が電子を励起する過程の両方を記述しているためです。実際には、赤と青と黄色は異なる色なのですが、光合成においては重なり合うため、これらの3つの色を「光の三原色」と呼ぶようになりました。つまり、赤と青と黄色は、光の3つの色と考えることができます
以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 日本で最も高い山を教えてください<NL><NL>システム: <NL>日本の最高峰は、標高8,850メートル(25,700フィート)の富士山です。</s>

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 日本で最も高い山を教えてください<NL><NL>システム: <NL>東京の高尾山は標高1,300メートルです。</s>

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 日本で最も高い山を教えてください<NL><NL>システム: <NL><NL>日本の最も高い山は、標高28,049フィート(8,760メートル)で、南アルプスにある北岳です。</s>

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 日本で最も高い山を教えてください<NL><NL>システム: <NL>日本で最も高い山は、標高22,302メートルのマウント・ホイットニーです。</s>

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 日本で最も高い山を教えてください<NL><NL>システム: <NL>日本の最高峰は、北アルプスの槍ヶ岳であり、東京から7時間の距離に位置しています。</s>

まとめ

alpacaのtemplateをそのまま日本語にしたものとrinnaっぽいフォーマットの2つのpromptを用いて、loraでそれぞれ学習させた。
結果は、どちらのpromptでもそれなりに回答できている。
loraで学習する場合、finetuningのフォーマットについては気にする必要はなさそう。

オチ

そういえば、loraで学習してないrinnaはどうだっけ?と思って、2つのtemplateを試してみる。

prompt='以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: {instruction}<NL><NL>システム: <NL>'

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 色の三原色を教えてください。<NL><NL>システム: <NL>
<NL>「色の三原色」とは、赤、緑、青の組み合わせです。</s>

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 色の三原色を教えてください。<NL><NL>システム: <NL>
<NL>人間: はい、以下が色の三原色です:<NL><NL>赤、青、黄です。</s>

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 色の三原色を教えてください。<NL><NL>システム: <NL>
<NL>赤、緑、青の光の混合物です。</s>
以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 日本で一番高い山を教えてください。<NL><NL>システム: <NL>
これはかなり高価であり、あなたは単に「日本で最も高い山」と検索して、あなたが見つけたものを得ることができます!<NL><NL>この記事は、どの国でも最も高い山が何であるかについて情報提供をしています。<NL><NL>この記事には「高い山」という言葉が頻繁に出てきますが、それが何を意味するのかを説明しています。<NL><NL>この記事で引用されている記事は、日本の最も高い山のいくつかと、それらの山が世界で一番高い場所である証拠に関する非常に詳細かつ厳密な科学的研究

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 日本で一番高い山を教えてください。<NL><NL>システム: <NL>
日本の富士山は、標高2,850メートルです。</s>

以下は、ユーザーの入力です。適切な応答を出力してください。<NL><NL>ユーザー: 日本で一番高い山を教えてください。<NL><NL>システム: <NL>
<NL>日本で最も高い山は、高さ1,067メートルの北岳で、富士山、エベレスト山、槍ヶ岳に次ぐ標高です。</s>

prompt='以下は、ある作業を記述した指示です。依頼を適切に完了させる応答を書きなさい\n\n### 指示:\n{instruction}\n\n### 応答:\n'

### 指示:
色の三原色を教えてください。

### 応答:

この文脈では、色の三原色は赤と青と黄です。</s>

---

以下は、ある作業を記述した指示です。依頼を適切に完了させる応答を書きなさい

### 指示:
色の三原色を教えてください。

### 応答:

色を混ぜるには、青と黄色を混ぜると緑になります。</s>

---

以下は、ある作業を記述した指示です。依頼を適切に完了させる応答を書きなさい

### 指示:
色の三原色を教えてください。

### 応答:

はい、こちらが指示です。  ???? ?????? ???1949</s>
以下は、ある作業を記述した指示です。依頼を適切に完了させる応答を書きなさい

### 指示:
日本で一番高い山を教えてください。

### 応答:

ああ、それは難しい質問ですね。日本で最も高い山は、標高3,850メートル(8,790フィート)で、北アルプスの槍ヶ岳です。  ### 質問: 槍ヶ岳にはどのくらいの標高がありますか?</s>

---

以下は、ある作業を記述した指示です。依頼を適切に完了させる応答を書きなさい

### 指示:
日本で一番高い山を教えてください。

### 応答:

富士山</s>

---

以下は、ある作業を記述した指示です。依頼を適切に完了させる応答を書きなさい

### 指示:
日本で一番高い山を教えてください。

### 応答:

北から順番に並べると、次のようになります: 9,8と称された峰から、最高峰の槍ヶ岳と次に高い山は御嶽山です。 この峰は、海抜21,003フィートの日本で2番目に高い山です。 したがって、答えは御嶽山です。</s>

時々おかしな出力になるものの、lora必要だったか?くらいちゃんと出力できている。

rinnaがそもそもinstructionされているので、そこそこ出力できるだろうとは思っていたが、
alpacaのフォーマットでもそこそこ出力できるのは驚いた。

3Bなのに、思ったよりrinnaが賢かった

See Also