18
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LLMAdvent Calendar 2023

Day 5

ローカル LLM を用いた Instruction データセット の Data Augmentation と Evol-Instruct

Last updated at Posted at 2023-12-05

はじめに

どうもこんにちは、kunishou です。本記事は LLM Advent Calendar 2023 5日目の記事になります。LLM アドカレも毎日面白い記事の連続で、自分も他の記事に見劣りしないような有益な記事を書かねばと刺激を受けながら執筆しました。

本記事について

本記事はローカル LLM を用いて

  • Instruction データセットを Data Augmentation することができるか
  • Evol-Instruct することができるか

の2つのテーマについて検証した記事になります。

モチベーション

Instruction データセットの自動生成の課題

LLM の性能は Instruction データセットによるファインチューニングの影響が大きいことは LLM Advent Calendar 2023 1日目の記事でも述べましたが、世の中にある Instruction データセットには人手を介して作られたものと GPT-3.5 , 4 などで Self-Instruct1 させて自動生成されたものが存在します。 Self-Instrcut とは Instruction データセットの Instrcution と Output を自動生成する手法で、スタンフォード大学が公開した Alpaca というLLaMaベースのモデルのチューニングで使われたデータセットはこの手法と OpenAI 社(以降、OpenAI )の text-davinci-003 モデルを用いて生成されました。

しかし、 OpenAI のサービスで得た出力は OpenAI の競合となるモデルの作成に使用することは禁止されているため OpenAI のモデルを用いて自動生成した Instruction データセットは商用 LLM の開発では利用できません。

このため、 OpenAI のモデルを使わず、Instruction データセットを自動生成できる高性能な LLM の登場が待ち望まれていました。

高性能な日本語対応 LLM の登場

英語対応のモデルでは指示に対してかなり柔軟な応答ができるモデルも登場してきましたが、日本語対応のLLM でも高性能なものが登場してきました。 cyberagent/calm2-7b-chat (以降、calm2 )です。こちらのモデルは商用利用可能でかつ、いろいろな指示に対しても柔軟に応答を返してくれ( json 形式での出力要望にも応えてくれる等)、このモデルであれば Self-Instruct のようなこともできるのではないかと感じました※。 そこで今回は、 calm2-7b-chat を用いて Data Augmentation や Evol-Instruct ができないかを検証することにしました。

※ ちなみに ELYZA 社から Meta 社の Llama2 を日本語で追加事前学習させた高性能で商用利用可能なモデルも公開されていますが Llama ライセンスにより Llama モデルの出力を他のモデルの開発に使用することは禁止されています。

目次

1.Data Augmentation
2.Evol-Instruct
3.おわりに

1.Data Augmentation

Data Augmentation とは?

ファインチューニングに使用するデータセットのデータ量を水増しして、モデルの性能を増強する手法です。 特に画像処理では良く使われる手法で、データセット内の画像を水平、垂直に反転させたり、任意の角度だけ回転させるなどの変化を加えてデータ量を水増しします。自然言語処理でも、テキストデータの一部の単語を類義語に変更したり、日本語テキストを一度英語に翻訳し、そこから日本語に逆翻訳( back translation )して元のテキストデータから変化させる手法などがあります( ただし、Kaggle の自然言語処理コンペで過去何度か試した経験では、テキストデータでの Data Augmentation は画像処理ほどの効果はないと感じます )。

oasst1 における重複 Instruction の存在

Data Augmentation をするとデータセット内に似たようなデータが増えてしまうため、逆にノイズになる可能性も考えられますが、 oasst1-89k-ja※(以降、oasst1 ) の Instruction データセットを見ると 応答文は異なるけども指示文は重複しているデータが多数あることに気づきます。 oasst1 のデータ数は 55,359 ですがユニークな指示文の数は 21,146 で、オリジナルのデータセットで一番重複数が多いのものは「你好」で53回も登場します(応答文はすべて異なっていますが)。 このことから応答文が異なっていれば指示文の重複は問題にならないのでは?と思い、oasst1 のユニークな 指示文に対応する応答文を calm2-chat-7b で新たに生成しデータを水増ししてみることにしました。

※ oasst1-89k-ja は OpenAssistant という海外の有志コミュニティで作成されたデータセットを私が個人で日本語に翻訳して公開したデータセットです。

検証の概要

実施することは非常にシンプルで、oasst1 の 21,146 個の指示文に対応する応答文を calm2-7b-chat を用いて生成し、作成した Instruction データセット で任意のモデルをファインチューニング、JGLUE で評価を実施し、評価結果の良し悪しを確認します。

応答の生成

oasst1 のデータセットからユニークな21,146個の instruction を抽出し、その instruction に対応する応答文を calm2 で生成してもらいます。なお、calm2 を動かすコードは npaka 先生の記事を参考にしました。

生成結果の例

一部の生成例のみですが生成結果は以下のようになりました。参考に oasst1 のオリジナルの response も載せておきます。

No. instruction original response response generated
by calm2
1 次の段落を正式で学問的なトーンで再定式化します。「ニューロンネットワークは、大規模なデータセットでトレーニングし、そのデータからパターンを抽出し、一般化された学習を抽出できる複雑なアルゴリズムです。」 ここに、正式で学問的なトーンを持つ再定式化されたテキストがあります。\n\n「ニューラルネットワークは、自動学習に基づいた洗練されたアルゴリズムであり、大量のデータでトレーニングする能力によって特徴付けられます。この技術の目的は、提供されたデータから重要なパターンを抽出し、これらのパターンを一般化することを学ぶことです。複雑なタスクを実行します。」 ニューラルネットワークとは、人間の脳に見られる神経回路網(ニューロン)の構造と機能を模倣する計算モデルであり、大量のデータからパターンを学習し抽出する能力を持っています。具体的には、ニューラルネトワークは大規模なデータセット上でトレイニングされ、データのパターンを抽出して一般化した学習を生成することができます。
2 短い殺人ミステリーの歴史を書いてください。 昔々、小さな町で、スミス氏という裕福なビジネスマンが彼のオフィスで殺害されたことがわかりました。警察は現場に呼ばれ、調査を開始しました。彼らが持っていた唯一の手がかりは、粉砕された花瓶と「正義が提供される」と書かれた机の上に残された神秘的なメモでした。\n\nジェームズ探偵はこの事件に置かれ、彼はスミス氏が彼のビジネスパートナー、元従業員、さらには彼自身の家族を含む多くの敵を持っていることをすぐに知りました。インタビューを受けたすべての人は、殺人と堅実なアリビの動機を持っていました。\n\n数日は数週間になり、ケースは寒くなりました。ジェームズ探偵は、… 短編ミステリー小説は、19世紀初頭に初めて登場しました。最も有名な短編小説家の1人は、エミール・ゾラです。彼は、短編「居酒屋」で、居酒屋で起こる殺人事件を描いたことで知られています。その後、20世紀に入ると、ミステリー短編は黄金期を迎えます。1890年代から100以上の短編小説が書かれたと言われています。「モルグ街の殺人」や「黄金虫」など、多くの名作がこの時代に生まれました。160年以上経った現在でも、ショート・ストーリーは、現代社会を反映した新しい作品を生み出し続けています。
3 USARとは何かを説明してもらえますか? USARは、都市部や人口密度の高い地域の緊急事態に対応するように設計された特殊な捜索救助である都市の捜索救助の略です。これらには、地震、ハリケーン、洪水などの自然災害、またはテロ攻撃や建物の崩壊などの人工事件が含まれます。\n\nUSARチームは、消防士、救急隊員、エンジニア、犬のハンドラー、その他の専門家など、高度に訓練された専門家で構成されています。油圧切断および持ち上げ機器、検索カメラ、通信装置などの特殊なツールや機器が装備されており、崩壊した建物、閉じ込められたスペース、またはその他の危険な状況から被害者を見つけて救助するのに役立ちます。\n\nUSARは、多くの場合、米国のFEMA(連邦緊急事態管理局)によって調整されており、… 米国会計基準(US-GAAP)における「USAR」とは、「United States Accounting Standards Act」の略称で、米国公認会計士協会(AICPA)が定めた会計原則を指します。US ARは、1980年に制定された会計法であり、US GAAPの基礎となる会計の原則や手続きを定めています。US ARSはUSGAAS(米国一般会計規則)とも呼ばれ、企業会計の基本原則を規定しています。

1 については何となく正しく指示に応答することができているように思われます。2 については指示内容が少し曖昧なせいかオリジナルの応答ではミステリー小説を創作しており、calm2 の応答では短編殺人ミステリー小説の歴史を書いています。3 の USAR は都市型捜索隊のことですが calm2 の応答はハルシネーションを起こしてしまっています。

以上のように、 とても自然な日本語で応答はしてくれますが、必ずしも正しい内容の応答をしているわけではないことを確認できました。

ファインチューニングと評価

calm2 に応答文を生成してもらい、Instruction データセットを作成することができたので、この水増しデータをオリジナルデータセットにマージしたデータセットでファインチューニングと JGLUE(JcommonsenseQA , MARC-ja , JSQuAD )での評価を行いました。評価は以下の条件で行い、比較のためファインチューニングで使用するデータを2パターンに分けて評価を行いました。

評価条件

ファインチューニングメソッド: QLoRA
使用モデル: line-corporation/japanese-large-lm-3.6b
評価指標: JGLUE( JcommonsenseQA 、MARC-ja 、JSQuAD )
評価コード: Stability-AI/lm-evaluation-harness

評価パターン

  1. oasst1 の全データでファインチューニング
  2. oasst1 全データと 水増しデータでファインチューニング

評価結果

評価結果は以下のようになりました。No.2 の oasst1 に水増しデータをマージしてファインチューニングした結果は、No.1 の oasst1 のみを使用した場合と比べ、JcommonsenseQA , MARC-ja , JSQuAD すべてにおいて評価値が向上しました。

image.png

先ほども一例を示した calm2 が生成した応答文のように応答の内容が正しくないものも一定数存在するものの、JGLUE の評価指標は向上する結果となり、calm2 を用いた Data Augmentation は手法として有効そうです。

品質スコアリングの実施

ここでさらに、作成した水増しデータを高品質なデータのみに絞り込むとどうなるかも確認してみたいと思います。そのために、この水増しデータに対して品質スコアリングを実施しました。この品質スコアリングは以下の 12/1 の記事にて提案した 48個の LLM の評価結果をもとに各データの品質スコアをルールベースで算出する方法です。

というわけで水増しデータを用いて LLM のファインチューニングと JGLUE での評価を 48 回行い、水増しデータに対して品質スコアを付与しました(またあの苦行を…)。

品質スコアの分布

水増しデータの各指標ごとの品質スコアの分布を確認してみます。分布としては、データ数(縦軸)が違うことを除けばオリジナルの oasst1 と大きな違いはないように見えました。なお、赤い破線はoasst1をデータ選定する際の最適な閾値になります(詳細は品質スコアリングの記事を参照)。

image.png

高品質なデータでのファインチューニングと評価

次に、水増しデータから品質スコアの高いもののみを選定し、選定したデータを、同じくオリジナルの oasst1から選定した品質スコアの高いデータにマージしてファインチューニングを実施してみます。なお、データ選定は以下の閾値で行いました。

評価条件

ファインチューニングメソッド: QLoRA
使用モデル: line-corporation/japanese-large-lm-3.6b
評価指標: JGLUE( JcommonsenseQA 、MARC-ja 、JSQuAD )
評価コード: Stability-AI/lm-evaluation-harness

データ選定条件

  • JcommonsenseQA 品質スコアが 0.284 以上、かつ
  • MARC-ja 品質スコアが 0.796 以上、かつ
  • JSQuAD 品質スコアが 16.866 以上

※ 水増しデータ 21,146 レコードのうち 1,667 個のデータが該当
※ オリジナル oasst1 55,359 レコードのうち 4,204 個のデータが該当

評価結果

評価結果は以下のようになりました。品質スコアでデータ選定した水増しデータをオリジナルデータに加えることで JcommonsenseQA と JSQuAD については向上、MARC-ja についてはほんのわずかに低下するという結果になりました。データ選定は、MARC-ja 品質スコアについては 0.796 以上のものを選定しましたがこの閾値をもう少し上げれば(高品質なデータに絞れば)、 MARC-ja も向上する可能性はあります。

image.png

以上、calm2 で応答文を生成した水増しデータを高品質なデータのみに絞ってファインチューニングすることで、モデルの性能がさらに向上することを確認できました。

まとめ

  • 今回、高性能な calm2-7b-chat を用いた Data Augmentation の有効性を検証
  • 生成して得た水増しデータをそのまま使用する場合は JcommonsenseQA , MARC-ja , JSQuAD の値が向上することを確認
  • さらに、品質スコアを付与した水増しデータを高品質なデータのみに絞り、オリジナルデータにマージすることで JcommonsenseQA , JSQuAD が向上することを確認( MARC-ja もデータ選定の閾値を調整することで向上する可能性あり)
  • calm2 を用いた Data Augmentation は手法として有効であると考えられる(結論)

2.Evol-Instruct

Evol-Instruct とは?

Evol-Instruct2 とは instruction を進化させる手法です。WizardLM では Alpacaデータセットを gpt-3.5-turbo を用いて Evol-Instruct し、データセットの品質を向上させることで高い性能を実現しています。

Evol-Instruct の解説については いふさんの記事が分かりやすかったのでこちらの記事から引用させていただきます(いふさん、ありがとうございます)。

以下、記事を引用


進化は以下の3stepからなる。

1.instruction evolving: LLMを使いin-depth evolivingとin-breadth evolvingの手法を使いinstructionを進化させる
2.response generation: LLMに進化させたinstructionを与え、responseを生成する
3.elimination evolving: instructionとresponseを見て、情報量が増えたか、reposne生成可能かという評価から生成されたinstructをフィルターする

In-depth Evolving

指示を複雑、具体化する。
次の5種類の方法を用いる。
「制約の追加」、「深化 1 」、「具体化」、「推論ステップの増加」、「複雑化」
(promptはappendix参照)

「1+1=?」というinstructionに対して、以下のような例が挙げられている。

  • 制約の追加: 「How to prove 1 + 1 = 2 in the Goldbach Conjecture?」
  • 深化: 「In what situation does 1+1 not equal to 2?」
  • 具体化: 「If you have one apple and someone gives you another banana, how many fruits do you have?」

In-breadth Evolving

指示の多様性を増やす。突然変異のようなもの。instructionが大きく変わったりする。
その代わり進化に失敗することもあるので、進化したinstructionに対しフィルターを行う。

「1+1=?」が突然変異すると以下のようになる
「What is the speed of light in a vacuum?」
ここから更にIn-depth Evolvingを行う。

elimination evolving

進化の失敗として以下の基準を用いた

  • chatGPTを使い進化前のinstructionと進化後のinstructionを比較する。情報量が増えてない場合 2
    進化したinstructionから生成したresponseが“sorry”を含み80文字以下の場合
  • 句読点とストップワードのみの場合
  • 進化したinstructionが進化させるために用いたプロンプトから単語をコピーしている場合。例えば、"given prompt"、"rewritten prompt"、"#Rewritten Prompt#"など

ここで引用終了


Evol-Instruct の課題

前述の通り、WizardLM で実施された Evol-Instruct は GPT-3.5-turbo を使用して行いますが、OpenAI モデルの出力結果を競合モデルの開発に使用するのは OpenAI の利用規約で禁止されています。また、Evol-Instruct のような複雑な指示を遂行できる高性能な日本語のローカルLLM は存在せず、そのため、 これまで商用可能な LLM の開発に Evol-Instruct を適用することはできませんでした。 しかし、記事冒頭で述べたように cyberagent/calm2-7b-chat という高性能な日本語 LLM が最近公開されたのでこのモデルを用いて Evol-Instruct ができないかを検証しようと考えました。

なお、今回の検証では、 Evol-Instruct の 3ステップの1つ目 Instruction evolving のうち In-depth Evolving(具体化、複雑化など)の calm2 での実現可否を検証 しました( In-breadth Evolving は検証せず)。

検証の概要

Data Augmentation の検証と同様、実施することは非常にシンプルで、任意の指示文を caml2 に渡し、その指示文を具体化、複雑化した状態で応答文として返すことができるかを確認します。

calm2でのEvol-Instruct

以下のシンプルな指示を calm2 にすることで、任意の指示文を具体化、複雑化できるかを確認します。

次に示す指示文をより複雑な指示文に修正しなさい。

{任意の指示文}

calm2 による生成結果

Instruction:

 次に示す指示文をより複雑な指示文に修正しなさい。

 東京タワーの特徴を教えて下さい。

Output:

 東京タワーについて教えて下さい。特に、特徴的な外観や高さについて説明して下さい。

結果の通り、少しだけ具体化、複雑化した指示文を得ることができました。 ただ、あまり複雑化できていないのと、実はこの結果は10回ほど生成を試みてやっと得られた結果になり、結構頑張らないと望むような結果を得ることはできませんでした。 もしも Evol-Instruct を用いてデータセットを進化させる場合、数千、数万のデータに対して実施することになるため、現在のレベルではとても適用するのは難しいです。ちなみに Evol-Instruct に失敗するパターンでは、指示文の複雑化はせずに指示文に対して「東京タワーは 333m の建造物です」のように指示にそのまま回答してしまう感じでした。

Evol-Instrcut チューニング用データセットの作成

先ほどの検証から、 calm2 素のままで Evol-Instruct を実施するのは難しいことが分かりました。ただ、これで検証は終わりではありません。次に、 calm2 に Evol-Instruct を教えて Evol-Instruct を実施可能な Evol-Instruct モデル(caml2-evol )を作成してみることにします。 そのために、 Evol-Instruct を教えるための Instruction データセットを作成しました。

Instruction data for Evol-Instruct

calm2-evol モデルを作成するためにここでは独自に 100個の Instruction データを手動で作成しました。以下に一部の例を示します。

instruction data
# example 1
instruction:

 次に示す指示文をより複雑な指示文に修正しなさい。

 週末の過ごし方は何ですか?

output:

 週末のおすすめの過ごし方について、アウトドアが好きな人、インドアが好きな人や独身、家庭持ちなどその人の趣向、環境の違いなどを踏まえて説明して下さい。

# example 2
instruction:

 次に示す指示文をより複雑な指示文に修正しなさい。

 Javaを体系的に学びたい

output:

 Javaを体系的に学ぶためのおすすめの方法を教えて下さい。また、他のプログラミング言語と比較してのメリット、デメリットについても教えて下さい。

# example 3

instruction:

 次に示す指示文をより複雑な指示文に修正しなさい。

 webサイトを作成する方法

 output:

  webサイトを作成する方法を教えて下さい。さらにwebサイトを作成するためのプログラミング言語をいくつか列挙し、それらの特徴、メリット、デメリットを述べなさい。
 

このデータを用いて calm2-7b-chat に対して Instruction チューニングを実施し、先ほどと同様に任意の指示文を具体化、複雑化できるかを試しました。

calm2-evol による生成結果

result
# example 1
instruction:

 次に示す指示文をより複雑な指示文に修正しなさい。

 東京タワーについて教えて下さい。

output:

 東京タワーの特徴や歴史的な背景、今後の発展の可能性について教えて下さい。

# example 2
instruction:

 次に示す指示文をより複雑な指示文に修正しなさい。

 富士山の高さは?

output:

 富士山の標高について、その標高がどの程度高いのか、他の高い山と比較して説明して下さい。

# example 3
instruction:

 次に示す指示文をより複雑な指示文に修正しなさい。

 相対性理論について教えて下さい。

 output:

 相対論について一般相対性原理、重力とアインシュタインのテーゼ、一般相対論と量子力学の結合の可能性について教えて下さい。
  

いかがでしょうか?前述の素の calm2 を用いた Evol-Instruct では何回も試行しないと指示文を具体化、複雑化する指示に従わないという課題がありましたが calm2 を Evol-Instruct用のデータセットでファインチューニングした calm2-evol ではかなり簡易に Evol-Instruct をすることができ、前述の課題も解消することができました。

さらなる課題

calm2-evol を用いることで簡易に指示文を進化させてくれますが、実は生成結果で多少の手直しが必要なものもあります。これは Evol-Instruct 用の学習データ 100 個のみでcalm2-evol を作っていることが影響していると思われます。具体的には以下のようなちょっとした手直しが必要なものがあります。

# example 1
original instruction:

 シグモイド関数をPythonで実装してください

evolved instruction:

 Pythonでシグモッド関数を実装してください。さらに、その関数の性能や他の関数と比較してどのような特徴があるのかについても説明して下さい。

# 「シグモイド関数」が「シグモッド関数」になっている

# example 2
original instruction:

 脳が色を識別する仕組みは?

evolved instruction:

 脳はどのようにして色を識別しているのでしょうか?また、脳が色を知覚する仕組みについて説明して下さい。

# 言い回しは違うが1文目と2文目での指示内容が同じ

これについては calm2-evol で作成した指示文を手直し等した上で Evol-Instruct 用データセットに加えて calm2-evol の学習データ数を増やし、生成精度を向上させて、今後 Evol-Instruct の効率化を図っていきたいと思います(現在の学習データ数は 100 ですが 2,000 ぐらいには増やしたい)。

まとめ

  • 今回、ローカルLLM( calm2-7b-chat )を用いた Evol-Instruct の実施可否を検証
  • 素のままの calm2 では生成精度が悪かったため、独自に作成した Evol-Instruct 用データセットを用いて Evol-Instruct モデルを作成( calm2-evol )
  • calm2-evol を用いることで簡易に Evol-Instruct を実施可能であることを確認
  • 100個のみのデータセットで Evol-Instruct モデルを作成したので現時点ではところどころ生成結果に少しの手直しが必要なものが存在

今後の予定

  • Evol-Instruct モデルの生成精度向上
    前述の通り、今回、Evol-Instruct モデルは学習データ 100 個のみで作成したため、 生成結果にちょっとした手直しが必要な状況です。学習データを 2,000 程度に増やして生成精度の向上を図りたいです。
  • Evol-Instruct データセットの品質確認
    今回は instruction evolving フェーズのみで response generation フェーズはできていないので今後はこれも行い、Evol-Instruct で作成したデータセットの品質確認をしたいです。まず、通常の instruction とその応答の作成、Evol-Instruct した instruction とその応答の作成を行い2種類のデータセットを用意します。その後、この2つのデータセットに対して品質スコアリングを行い、品質スコアの分布に違いが見えるかを確認したいと思っています (間に合えば 12/25 に投稿予定の記事でも触れたいです)

3.おわりに

今回は、これまで GPT-3.5 , 4 等でしか実施できなかった Data Augmentation(Self-Instruct )や Evol-Instruct をローカル LLM で実施可能か、手法として効果があるのかを検証し、どちらの検証でもポジティブな結果を得ることができました。 効率的な Instruction データセット作成の実現にはローカル LLM を活用したデータセット自動生成技術の確立が必須になると考えていますが、今回の検証結果からこれの実現の日も近いと感じました。 calm2 のような高性能な LLM の登場で、できることの幅が広がってきているため、今後もデータセット関連の要素技術でローカル LLM で試せそうなものがあれば検証をしていきたいと思います。

記事の宣伝

前回に引き続き、LLMアドカレでの投稿記事の宣伝をさせて下さい。有益な情報を投稿したいと思いますのでぜひご覧いただけると幸いです。

  1. Self-Instruct: Aligning Language Model with Self Generated Instructions

  2. WizardLM: Empowering Large Language Models to Follow Complex Instructions

18
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?