本日は簡易版、なかなか確証が持てずにいた事項が前進したのをアウトプットです。
目次
CausalLM
transformersでテキスト生成タスクを扱うときに指定します。
causal language modelの略ですね。
このモデルを訓練する(例:少量の教師データを用意してファインチューニング)際、どんな正解データを用意すればいいかが長らくピンときていませんでした。
馴染んでいた例:テキスト分類
分類するテキストと正解ラベルを用意します。
Yelpのレビューの例
レビューは星1〜5の5クラスのいずれかに分類されています。
教師データをもとに、レビューからクラスを予測するモデルを訓練できますね。
訓練中、レビューをもとにモデルが予測してきた値と、実際のクラスを比較して、誤り度合い(ロス)だけモデルを叱る(逆伝播)と理解しています。
分類タスクなら正解と予測からロスを計算するのはイメージしやすかったのですが、「ではテキスト生成では?」となるといまいちピンときていませんでした。
テキスト生成の例
いくつかの例をサーベイした形になります。
(1) 過去のファインチューニング
AutoModelForCausalLM
- 以下のプロンプトにしている(この1テキストだけっぽい)
### 指示: {data_point["instruction"]} ### 回答: {data_point["output"]}
(2) 🤗 Causal language modeling
Causal language models are frequently used for text generation.
Causal language modeling predicts the next token in a sequence of tokens, and the model can only attend to tokens on the left.
ELI5データセットを例にしています(5歳児にも分かるように説明データセット)
手を動かしたわけではないのですが、answers.text
フィールドの複数のテキストをつなげ、それが教師データになっていそうです。
つまりひとつなぎのテキストっぽいです。
(3) Gemmaのファインチューニングの例
AutoModelForCausalLM
- データセット1件1件を以下のフォーマットの文字列に変換
Quote: {quote} Author: {author}
これら3例から、テキスト分類の正解ラベルのように元のテキスト・正解の続きのテキストと2つ用意するのではなく、元のテキストに正解のテキストが続くひとつなぎのテキストを用意するという理解です。
気づいてしまえば簡単ですが、ここに気づくのに時間を要しました。
残った気になりポイントは、ひとつなぎのテキストからモデルの生成結果と正解のロスをどう求めるんだろうという点です。
おまけ
trlのSFTTrainer
はデータセットのフィールドを指定しても動かせる(dataset_text_field
)。
ここも渡すテキストは1つということでは。
https://huggingface.co/docs/trl/sft_trainer#quickstart
SFTTrainerについて積ん読です