jpflan: A collection of Japanese Datasets for Instruction Tuning 

# はじめに
日本語の大規模言語モデルのinstruction tuningのための下流タスクデータセットのコレクションを公開します。

リンク:
生データ: https://huggingface.co/datasets/Ego/jpflan-raw
テンプレート化されたデータ: https://huggingface.co/datasets/Ego/jpflan
Githubリポジトリ: https://github.com/Egojr/jpflan/tree/main

# 概要
大規模言語モデル (Large Language Models: LLM) を学習するためには、高品質のデータセットを用意することが極めて重要です。ほとんどのデータセットは英語を主要な言語としており、日本語を含む他の言語の高品質なデータセットを見つけることは難しいです。日本語の既存の様々な下流タスクのデータセットのコレクションとしては[llm-japanese-dataset](https://jxiv.jst.go.jp/index.php/jxiv/preprint/view/383) がありますが、主な焦点は翻訳タスクであり、機械翻訳されたデータセットが含まれている。
今回提供するデータセットのアプローチは[Flan](https://arxiv.org/abs/2301.13688) データセットの作成と似ていて、リリースしているデータセットはjpflanと名を付けます。データを収集して、各データセットにzero-shotとfew-shotのテンプレートを作成しました。

データセットの作成には次の手順が取られました：
- 生データ収集
- テンプレート作成
- 最終的なデータセット作成

# 生データ収集
Flanは、1800以上の異なるデータセットからなる巨大なコレクションで、コレクション全体としてみたときにかなり多様なドメインを網羅しています。一方で、コレクションに含まれるデータセットには日本語データセットが少ないです。そこで、jpflanでは日本語のデータセットのみからコレクションを作成することに加えて以下の二点に留意してデータセットを収集しました。
- 商業的利用可能性のあるデータセットのみを使用する
- 比較的品質の高いデータのみを使用する

「商業的利用可能性のあるデータセットのみを使用する」とは、商業的利用を目的としたモデルの作成のために利用できないすべてのデータセットを、100以上の初期のデータセット候補から除外することを意味します。商業的に利用可能なデータセットのみをコレクションの対象にしているため、生データとテンプレート化されたデータの両方を使用して、商業利用を前提としたモデルを訓練できます。

「比較的品質の高いデータのみを使用する」とは、品質の低いデータを除去するために機械翻訳のデータセットを候補から外すことを意味しています。既存のinstruction datasetにおいて、機械翻訳による誤訳が発生することでデータセットの品質が低下する問題がしばしば発生していることは[ここ](https://github.com/AUGMXNT/shisa/wiki/A-Review-of-Public-Japanese-Training-Sets)でも指摘されています。機械翻訳による誤訳に由来する品質の低下を避けるため、他の言語から日本語に機械翻訳された (加えて、日本語からほかの言語に機械翻訳されたデータセットも含めて) すべてのデータセットをコレクションの候補から取り除きました。
さらに、[JGLUE](https://github.com/yahoojapan/JGLUE) や [Nejumi LLM Leaderboard](https://github.com/wandb/llm-leaderboard) などのベンチマークデータセットとして現在使用されているすべてのデータセットも除外しました。これらのデータセットを除外することで、jpflanでLLMを訓練した場合、他のモデルと公正に評価できるようにしています。
データから重複データと欠損データを除去したうえで、機械翻訳されていない38のオープンソースのデータセットから440万以上のサンプルを取得しました。38のデータセットはタスクの種類により以下の種類に分類されます:

| Task                             | # of Datasets |
|----------------------------------|---------------|
| QA                               |             5 |
| Generation                       |             5 |
| Natural Language Inference (NLI) |             4 |
| Common Sense                     |             3 |
| Summarization                    |             3 |
| Word Meaning                     |             3 |
| Classification                   |             3 |
| Named Entity Recognition (NER)   |             3 |
| Math                             |             2 |
| Code                             |             2 |
| Passage Retrieval                |             2 |
| Translation                      |             2 |
| Sentiment Analysis               |             1 |


ただし、データセットによりサンプル数が異なるため、タスクごとのサンプル数も異なります。特に、2つのデータセット(wiki_atomic_edits_deletionsとwiki_atomic_edits_insertion)は全体のサンプル数の約75%を占めます。

# テンプレート作成
テンプレートとは、データの構造や形式を定義するための枠組みやサンプルが含まれたフォーマットのことを指します。タスクによってテンプレートの内容が異なります。以下は３つのタスクの具体例です。

| 多肢選択タスク | 分類タスク  | QAタスク |
|---------------|------------|----------|
| この文の続きは何ですか？a,b,c または dのいずれかから選んでください。<br>文:{context}  <br>選択肢:{choices} | 次の文章に対して以下のクラスからラベルを一つつけてください。 <br>Classes:{all_class}  <br>Text:{text}  <br>Answer: | 与えられた文脈に基づいて、質問に日本語で回答してください。<br>文脈：{context}  <br>質問：{question} |


{}内のテキストが収集されたデータセットから取ります。

Flanの場合、各データセットには10種類のテンプレートがついていますが、jpflanの場合はデータセットごとに3種類のテンプレートを用意します。few-shotとしてタスクを解けるようにするために、few-shot用のテンプレートを一つ別で用意して、zero-shotのテンプレート一つをベースにしています。各テンプレートは異なる注釈者によって作成されました。

テンプレートには、現在のタスクに関する簡潔な説明を含み、タスク次第でテンプレートのテキストに含めることが可能な場合は、選択肢とコンテキストが提供されます。
さらに、few-shotの場合は、予測するサンプルがショットの1つとして使用されないようにします。

# 最終的なデータセット作成
前述したデータセット間でサンプル数が異なる問題を回避する目的と、さまざまなタスクおよびタスクとして解くシナリオでモデルを finetuning する目的で、データセット内のサンプル数のバランスを考慮します。サンプル数のバランスを考慮するために、各データセットに対して最大で収集するサンプル数を決めたうえで、その最大数または、最大数よりもデータセットに含まれるサンプルが少ない場合はすべてのサンプルをサンプリングします。
Huggingfaceに公開しているデータセットの場合、データセットごとにzero-shotとfew-shotを `min(10000, dataset_size)` でサンプリングします。つまり、データセットごとに最大20000サンプルまでを利用します。
注意点としては、インプットが
と
のトークンで区切られています。上記の多肢選択タスクのテンプレートの具体例は以下の通りです：

| Input  | Output |
|--------|--------|
| 
次の文はこの後どのように続きますか？a,b,c,dのいずれかから答えて下さい。 <br>文:ユーロ円が今年最も円安水準となったことから、<br> 選択肢: <br>a: 期限の利益は無くなります <br>b: 朝方から輸出株中心に買いが先行する <br>c: 追加報酬がもらえます <br>d: 余裕のある方は小口買い推奨する <br>回答:
 | b      |

結果として得られたタスクの分布は以下の通りです:

![task_distribution_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898023/89165b04-edbf-792f-0b35-fc5cd2c69be1.png)

上図に示すように、MathとCodeを除いたすべてのタスクカテゴリーのサンプルが十分にデータに含まれています。その二つのタスク以外はコレクション全体のサンプルの少なくとも約4％に該当します。

# 実験結果
jpflanと同様の方法で構築したより小さなデータセットを用意します (今回はデータセットごとに最大1000サンプルを収集します、合計3万5千サンプル)。このデータセットを用いて、ELYZA-japanese-Llama-2-7bモデルを full parameter finetuning する検証を実施しました。評価には、JGLUEデータセットを使用しました。検証で使用したJGLUEのデータセットは、4つの異なるタスクから構成されています: 
- MARC-ja (2クラス分類タスク)
- JNLI (NLIタスクで3クラス分類タスク)
- JSQuAD (QAタスク)
- JCommonSenseQA (Common Senseの多肢選択タスク)

zero-shot評価の結果は次のとおりです: 

| Model            | MARC-ja | JNLI | JSQuAD | JCommonSenseQA | Average |
|------------------|---------|------|--------|----------------|---------|
| ELYZA-japanese-<br>Llama-2-7b  | 0.28    | 0.18 | 0.38   | 0     | 0.21  |
| jpflan (35k)<br> ELYZA-japanese-<br>Llama-2-7b  | 0.95    | 0.6  | 0.86   | 0.39  | 0.7   |


さらに、JGLUEのプロンプトに2-shotの例で同様の評価を行ったところ、このような結果になりました：

| Model            | MARC-ja | JNLI | JSQuAD | JCommonSenseQA | Average |
|------------------|---------|------|--------|----------------|---------|
| ELYZA-japanese-<br>Llama-2-7b  | 0.99    | 0.34 | 0.69   | 0.73   | 0.69    |
| jpflan (35k)<br> ELYZA-japanese-<br>Llama-2-7b  | 0.99   | 0.63 | 0.9   | 0.89   | 0.85  |


結果から、2つの結論を導くことができます。
1つ目は、ベースモデルのElyzaモデルは、要求された出力形式でプロンプトに応答することができないということです。JGLUEのzero-shot精度が低い原因は、モデルがプロンプトで求められた回答の形式で出力できないことが主な原因です。一方で、jpflanから取得した約35000サンプルを用いた学習により、モデルがプロンプトで求められた回答の形式で出力できるようになります。
2つ目は、プロンプトにfew-shotを追加することで、In-context-learning により、ベースモデルのElyzaモデルが学習なしで正しいフォーマットで回答を出力することができます。一方で、JGLUEと似たタスクを含むjpflanでの学習を行うことにより、類似したタスクから得た知識を拡張して、モデルが学習前のベースモデルよりもさらにいい性能を示しました。

# 自分用のデータセットを作りたい場合
テンプレート化されたデータの作成コードはGithub上で公開しており、各データセットのデータ数やfew-shotのサンプル数などは引数を書き換えることで簡単に変更可能です。テンプレートの場合は、テンプレートのcsvファイルを編集することも可能です。

# 終わりに
商業利用可能性と品質の基準に従って、オープンソースの下流タスクの日本語データセットを収集しました。各データセットに対して、複数人のアノテーターによりテンプレートテキストを用意し、zero-shotとfew-shotの両方でそれぞれ学習データを作成しました。生データもテンプレート化されたデータのコレクションも、商業利用目的に使用できるようにCC-by-SA 4.0ライセンスの下で公開します。
jpflanがより強力なオープンソースの日本語LLMの開発につながることや、より高品質なデータセットの作成につながることを願っています。