KDDCup参戦記② データ準備編
はじめに
はじめまして。データアナリティクスラボ株式会社 データソリューション事業部の山口です。
普段はデータサイエンティストとして、データ分析やダッシュボード作成、生成AIアプリ関連の業務などを行っています。
今回初めてコンペに参加し、難易度は非常に高かったですが、良い経験を得ることができました。
私が一部担当したデータの準備に関して共有いたします。
タスクについて
KDDCUP参戦記録① 概要と結果編の記事で記載した通り、私たちは「Track 2:Shopping Knowledge Reasoning」に参加しました。Track 2では、ショッピングに関連する「数値推論」「知識推論」「暗黙的知識を伴う推論」の性能を測る選択式問題が出題されます。
したがって、評価タスクは以下のようなプロンプトが与えられます。
数値推論
The product 'Simply Asia Garlic Basil Singapore Street Noodles, 9.24 oz (Pack of 6)' appears on e-commerce website. What is the total weight of the noodles?
0. 0. 8 ounce
1. 55.44 ounce
2. 14.19 ounce
3. 60 ounce
Answer:
知識推論
Which of the following product categories best complement the product type tabletop game?
0. toy figure
1. DV recorder
2. tablet computer
3. hair iron
Answer:
暗黙的知識を伴う推論
Given the event "PersonX wears a blazer", as a result, PersonX feels
0. fearful
1. dignified
2. more confident
3. compassion
Answer:
この他にも複数選択肢を回答する、より複雑な問題も一部含まれていましたが、ここでは割愛します。
スコア算出のための評価は単純で、正答率で計算されます。
データ作成の取り組み方針
KDD Cupではトレーニング用のデータは提供されておらず、上のようなサンプルデータが僅かに提供されているのみでした。モデルのファインチューニングに取り組むためには、学習データを自前で用意するか、似た公開データを利用する必要がありました。
そこで、今回は高性能なLLMを用いて、自動でデータを作成することとしました。
ざっくりとしたデータ作成手順は以下の通りで、データを作成した後に、高品質なデータだけを残すような方法としました。
データ作成の全体イメージ
ここで、データを作成するLLMとしてMistral AI社のMixtral-8x22Bを用いた理由は、ライセンスがApache-2.0であり、合成データを別のモデルの学習に用いることについて制限がされていないためでした。(一方でGPT-4oの出力データの利用には制限がありますが、今回のコンペだけの利用範囲であればOpenAIの規約に違反してはいないと判断し、スコア付けにのみ用いました。)
データ作成の方法
合成データの生成
データ生成の実装方針
実装については、Self-Instructという手法を参考にしようと思い、調査をしました。
手法の詳細は上記リンクをご参照いただければと思いますが、ざっくり説明すると、予め用意しておいたインストラクションのシードからサンプリングして、それと類似したインストラクションを生成し、タスクを生成するというものです。
Self-Instructのイメージ(https://github.com/yizhongw/self-instruct)
しかし、今回は生成したいタスクが3~4種(数値推論など)であり、すべて選択問題であると既に決まっており、そのサンプルがあることから、多様なInstructionのシードは必要ないと判断し、手法をそのまま使うことはありませんでした。
ただし、データ生成のポイントとして着想を得た部分はありました。それは「LLMでデータを自動生成をする際には、多様性を担保する工夫が必要である。」という点です。
予備検証では、単純に “Please create question-and-answer pairs about shopping. ”のように指示を与えて500問のインストラクションデータを作成しようとする場合、生成のtemperatureを高めに設定したとしても、どうしても似たような問題が多く生成されてしまうことがわかっていました。
そのため、必要な要件としては以下であると考えました。
- サンプルデータと同形式の問題を作ること
- ショッピングに関する要素が含まれること
- 全く同じ問題などが生成されないように多様性を担保すること
実際の生成アプローチ
そこで、ショッピングに関する問題であり、かつ大きく類似したデータがいくつも生成されないように制限しつつデータを自動生成するために、以下のようなアプローチをとりました。
実装イメージ
サンプルデータと同形式の4択問題を作るために、KDD Cupから提供されていたサンプルデータをFew Shot Promptとして与えました。
ここで、ESCI dataとは、ショッピングに関する検索クエリと商品の関連性を示すデータセットのことです。以下のように商品名や商品説明が含まれています。
この商品名をプロンプトに用いることで、重複のない商品で問題を作ることができるため、自動生成によるデータ作成でもある程度の多様性を担保することができます。(商品名が複雑なものや余計な文が入っているものもあったため、LLMで一度整頓するといった前処理もしましたが、詳細は割愛します。)
もう一つの多様性を生む工夫としては、Mixtral-8x22Bをメインで使いつつ、一部をWizardLM-2-8x22Bも利用することで、別モデルによる出力傾向の違いを多様性として捉えて追加生成を行いました。
また、実際にデータを生成するときは、「数値推論」「知識推論」「暗黙的知識を伴う推論」でそれぞれ別のプロンプトを用いています。
ここでは例として、「数値推論」データを生成するためのプロンプトを掲載しておきます。
Please create question-and-answer pairs according to the following requirements:
Requirements:
1. The questions should be related to shopping.
2. Use the given product to create the questions and answers.
3. Generate four multiple-choice options and one correct answer.
4. Create a dataset that is useful for fine-tuning a language model's ability to perform numerical reasoning.
5. If the given product is too complex or grammatically incorrect, correct it and then create the questions and answers.
6. The problem should involve numerical calculations derived from product names or quantities and be solvable through basic arithmetic operations.
7. Ensure the questions can be answered using general knowledge, numerical inference or information provided in the text. Avoid creating questions that are extremely difficult to answer.
8. If a question cannot be inferred from the problem statement and general knowledge, include the option "It cannot be inferred."
9. Only create one question; no more are needed.
Example 1:
input_field: The product 'Simply Asia Garlic Basil Singapore Street Noodles, 9.24 oz (Pack of 6)' appears on e-commerce website. What is the total weight of the noodles?
0. 8 ounce
1. 55.44 ounce
2. 14.19 ounce
3. 60 ounce
output_field: 1
Example 2:
input_field: The product 'Bounty Paper Napkins, White or Printed, 200 Count, Pack of 2' appears on e-commerce website. What is the total count of disposable napkins in this package?
0. 120 count
1. 660 count
2. 1040 count
3. 400 count
output_field: 3
※以下例示は省略
Generate only one problem following the format of the example above, including line breaks and other formatting details. Stop generating once the output_field is created.
input_field: The product '{product_title}'
このような形式で、タスクごとに約1,200件~1,500件のデータを作成しました。
DeepInfraの利用
ここで少しデータ生成前の段階に戻りますが、問題となっていたのが推論のための計算リソースです。Mixtral-8x22BやWizardLM-2-8x22Bを用いてデータを作成することを試みようと思いましたが、Hugging Faceのモデルページを見るとわかるように、Mixtral-8x22Bは141Bパラメータもあります。これは手元で使える最大リソースであったNVIDIA A100のGPUを用いてもメモリオーバーになって使うことができませんでした。
そこで、DeepInfraというAPIで大規模モデルを使用することができるサービスを利用することにしました。
余談ですが、このサービスでは最新のLLMをAPIで利用することができます。最近であれば、MetaのLlama-3-70B-InstructやGoogleのgemma-27b-itなどもすでに使えるようになっています。
(https://deepinfra.com/より引用)
DeepInfraの利用方法は非常に簡単です。軽くご紹介しておきます。
必要なライブラリはopenai
です。
!pip install openai
from openai import OpenAI
APIキーを変数に設定しておきます。
# DeepInfraのAPIの呼び出し
from google.colab import userdata
DEEPINFRA_API_KEY = userdata.get('DEEPINFRA_API_KEY')
DeepInfraはOpenAIのAPI利用形式を踏襲しているため、OpenAI APIを利用する時と同じような形式で呼び出すことができます。
# OpenAIクライアント形式を設定する必要がある
openai = OpenAI(
api_key=DEEPINFRA_API_KEY,
base_url="https://api.deepinfra.com/v1/openai",
)
# 生成のテスト
chat_completion = openai.chat.completions.create(
model="microsoft/WizardLM-2-8x22B",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Please list as many shopping categories as you can think of for an e-commerce site like Amazon."},
],
)
print(chat_completion.choices[0].message.content)
品質スコア付け
データ作成の全体イメージ
上図の後半にあたる内容です。
Mixtral-8x22Bによって作成した学習データに対し、GPT-4oを用いてデータの品質にスコアを付ける作業になります。
作成されたデータを目視で確認するとQAが間違っているもの、全く推論が必要ないもの(質問文に回答がそのまま記載されているもの)、回答の選択肢が1つに絞りきれないもの(2つ以上回答らしい選択肢が存在するもの)など、モデルを学習する上でノイズとなりそうなデータが含まれていることがわかりました。
生成した学習データをすべて目視で確認するには膨大な時間がかかってしまうため、LLMによってスコア付けを行いました。
スコアリングの実装方針
データの品質によって、1~5の数字でスコア付けを行いました。
質の高いデータはスコアが高くなり、質の低いデータはスコアが低くなるようにプロンプトの調整を行いました。
スコア付けする上で工夫した点は以下になります。
- 数値推論、知識推論、暗黙的知識を伴う推論の各タスクごとに制約条件、評価基準の調整
- 減点法でのスコアリング
- 出力の制御
実際のプロンプト
数値推論タスクを例に実際のプロンプトを掲載します。
Observe the following constraints must be adhered to and score the quality of the given data based on the constraints
# Constraints
- Never respond in sentense
- Answer the question with a number from 0 to 5
- The maximum score is 5, and the following criteria will be used to evaluate the scores
- Output 0 if the answer choice is not a number
- Note that the correct answer may be the “cannot be inferred” option
# criteria
## The following questions should be scored -3 points.
- Question with wrong question and answer
- Questions with answers other than 0~3
- If there is no answer to a choice
## The following questions should be scored -1 points
- Product name is cut off in the middle
- Questions with similar answer choices
- Easily deducible answers
- Simple problems that do not require numerical reasoning
# Example1
## Input
The product 'Charmin Ultra Soft Toilet Paper, 12 Mega Rolls, 264 Sheets per Roll' appears on an e-commerce website. What is the total number of sheets of toilet paper in this package?\n0. 120 sheets\n1. 1584 sheets\n2. 324 sheets\n3. 3168 sheets
Answer:3
## The Score is
5
# Example2
## Input
1. "PersonX uses the copier", as a result, PersonX/n* feels frustrated/n* makes a copy of the document/n* feels relieved/n* prints the document
Answer: 2
## The Score is
0
# Example3
The product 'Kiehl’s Ultra Facial Cream, 1.7 oz' appears on e-commerce website. What is the total weight of the cream?/n0. 1.7 oz/n1. 5.1 oz/n2. 1.1 oz/n3. 14.7 oz
Answer: 0
## The Score is
3
# Check
## Input
{}
## The Score is
上記のようなプロンプトを各タスクごとに作成しました。
プロンプトの構成と役割をざっくり日本語で表すと以下のようになります。
# Constraints(制約条件)
- 出力の制御
# criteria(評価の基準)
- 減点法でのスコアリング
# Example1〜3(Few Shot)
- 出力の制御
# Input(スコア付する学習データ)
# The Score is(Outputのスコア)
- 出力の制御
スコアリングをするにあたって、数字のみでの出力の制御に苦戦しました。
結果的にはスコアリング方式を減点法に指定→Output直前の構造の見直しの順で全ての出力を制御することができました。
スコアリング方式を減点法に指定
以下にプロンプトの評価基準の部分を日本語訳したものを記載します。
主にこの評価基準によってデータの質を評価しています。
# 基準
## 以下の問題は-3点とする。
- 問題と答えが間違っている問題
- 0~3以外の答えがある問題
- 選択肢に答えがない場合
## 以下の問題は-1点とする
- 商品名が途中で切れている
- 似たような選択肢がある問題
- 簡単に推測できる答え
- 数的推理を必要としない簡単な問題
減点法にする前は「〇〇の場合は高いスコアをつけなさい」、「××の場合は低いスコアをつけなさい」といった曖昧な条件のみで、LLMが明確な評価の基準を理解していない状態でした。
そのため出力が5に偏ってしまったり、数字のみの出力が得られないなどの問題がありました。
そこで、最大のスコアを5とし、そこから減点してスコアリングする方式へと変えることで基準が明確になり、安定した出力を得ることができました。減点法により、ある程度5以外の評価も増えましたが、全ての出力を数字で制御することはできず、一部文章での回答が残っていました。
Output直前の構造の見直し
Output直前の構造をAnswer→The Score isへ変更することで、LLMに最終出力が数字であることを構造的に認識させることができました。
プロンプト全体から見ると小さな部分ですが、LLMから意図した出力を得るためには、細かい部分までプロンプトの構造を考えることが重要であると再認識できました。
制約条件などの文章での制御ばかりに気を取られていたので、目から鱗でした。
スコアリング結果
上記プロンプトを用い、生成された学習データ2377件に対しスコアリングした結果が以下になります。
check_result
5 1572
3 576
0 126
4 47
1 42
1~4の評価もある程度ありますが、多くのデータがスコア5と高評価となる結果でした。
スコアリング後、全てのデータではありませんが、目視でもデータの選定を行いました。似通った問題(商品が同じ、QAがほぼ同じ)データが非常に多かった印象があります。
スコアリング前に、生成されたデータの重複(完全一致)削除は行っていましたが、似たデータの削除という処理は行えていなかったです。そのため実際は、スコアリング結果ほど質の高いデータは多くありませんでした。
振り返り
次回の記事で訓練部分に触れますが、実際のタスクに似たデータに絞って作成しすぎた印象がありました。より多様かつ大量のデータで学習させた方がスコアが上がったと考察されました。
データのスコアリングにおいては、LLMに入れるプロンプトはある程度工夫できましたが、JSON形式で出力することでスコアの値だけをもっと容易に取得することができたと後で気が付きました。また、似たデータの重複削除は完全一致のルールベースのみであったため、他の方法を検討できればよりよいデータセットを作ることができたと思います。
おわりに
本記事では、弊社メンバーで参加したKDD Cup 2024のデータ準備編について紹介いたしました。
今回初めてコンペに参加し、非常に良い経験となりました。
今後も興味のあるコンペがあったら積極的に参加していこうと思います!
お読みいただきありがとうございました。
関連記事
KDDCup参戦記① 概要と結果編
KDDCup参戦記② データ準備編 ◀ イマココ
KDDCup参戦記③ RAG/ファインチューニング編
KDDCup参戦記④ モデルマージ編
KDDCup参戦記⑤ 上位解法の紹介編
Discussion