Featured image of post データ生成工場の設計方法

データ生成工場の設計方法

目次

背景

  • 日本語G2P(Grapheme-to-Phoneme:文字から読みへの変換)モデルの学習用に、教師データを100万件ほど生成しようと考えた
  • 目的は、漢字の読み分けベンチマークで高い精度を出せるモデルを作ること
  • 例えば「人気」という漢字には、「ニンキ」と「ヒトケ」という読みがある
    • この店は人気がある → ニンキ
    • 夜の公園には人気がない → ヒトケ
  • 同じ漢字でも文脈によって読みが変わるため、こうした読み分けを学習させるには、漢字と指定読み・その読みが自然に成立する例文・文章全体のかな読みをセットにした教師データが必要になる
  • そこで、RTX 5090を8枚搭載した環境でQwenやDeepSeekなどのLLMを動かし、大量に生成する構想を進めていた
  • 最初は「どのLLMを使えば最も高品質な例文を大量に作れるか」を考えていたが、調べていくうちに、100万件のデータを生成することと、100万件の高品質な教師データを手に入れることはまったく違うと気づいた
  • この問題は「工場」に例えると理解しやすかったので、その考え方を整理する

教師データ生成を工場として捉える

  • Claude Opusのような高性能なモデルで少数の高品質な見本を作り、それをもとにローカルLLMで大量の例文を生成する、という流れ自体は分かりやすい
  • しかし、LLMが生成したデータをそのまま教師データとして採用できるわけではない
    • 指定した漢字の読みが間違っている
    • 文章としては自然でも、指定された読みでは成立しない
    • 対象漢字の読みは正しくても、全文のかな読みに誤りが含まれる
    • 同じような構文や表現ばかり生成される
  • つまり、LLMが作ったデータには不良品が混ざる
  • データ生成の工程を、工場の工程に置き換えて考えると整理しやすい
工場の工程AIによる教師データ生成
設計図・見本品Claude Opusなどで作る高品質な見本
製造ラインRTX 5090 × 8で動かすローカルLLM
検品G2Pエンジンや判定用LLMによる評価
不良品の廃棄基準を満たさないデータを除外
抜き取り検査人間による一部データの確認
歩留まり改善プロンプトや見本を改善して合格率を上げる
  • やるべきことは、単に大量生成することではなく、生成・検証・選別・改善という工程全体の設計

歩留まりが重要になる理由

  • 工場では、製造した製品のうちどれだけが良品として出荷できるかを「歩留まり」と呼ぶ
  • 教師データ生成でも同じ考え方が使える。合格率が低いほど、同じ件数の良品を得るために必要な生成数が増える
合格率100万件の良品を得るための生成数
30%約333万件
50%200万件
70%約143万件
80%125万件
90%約111万件
95%約105万件
  • LLMの推論にはGPUの計算資源が必要なので、生成件数が増えればそれだけ時間と電力を消費する
  • 合格率を改善することは、GPUを増設することに匹敵するほど重要になる場合がある。例えば合格率を50%から80%に改善できれば、100万件の良品を得るための生成量は200万件から125万件に減り、75万件分の生成を削減できる
  • ただし、合格率を高めるために検証コストが大幅に増える場合もあるため、実際には採用データ1件あたりの総コストで評価する必要がある

歩留まりが低い時にすること

  • 不良品が多いからといって、ただ生成量を増やすだけでは効率が悪い
  • まず、なぜ不良品が発生するのかを調べる
    • 指定読みを間違えているのか
    • 全文のかな読みが間違っているのか
    • 例文が不自然なのか
    • 似た文章ばかり生成しているのか
  • 原因によって改善すべき工程は変わるため、大量生成する前に、少量のデータを試作して歩留まりを測るのが最初にやるべきこと

既存の技術との対応

  • この「工場」の仕組みは、AI開発の世界ですでに研究されており、工程ごとに名前がついている

Synthetic Data Generation(合成データ生成)

  • LLMなどを使って、機械学習のためのデータを人工的に生成すること
  • 今回の例では、漢字と指定読みを入力して自然な日本語の例文を作る工程がこれに当たる

入力:

  • 漢字: 人気
  • 読み: ヒトケ

出力:

  • 例文: 夜更けの商店街には人気がなかった

  • 対象読み: ヒトケ

  • 全文かな読み: ヨフケノショウテンガイニワヒトケガナカッタ

  • このようなデータを大量に生成する。ただし、生成された全文かな読みも検証対象であり、LLMが出力しただけでは正解とは限らない

Knowledge Distillation(知識蒸留)

  • 高性能な教師モデルの知識を、より小さな生徒モデルに移す手法
  • 例えば、Claude Opusのような高性能モデルで高品質な例文や読みを生成し、それを使って小型G2Pモデルを学習させる
  • 厳密には、単なる合成データによる学習と、教師モデルの出力分布などを利用する知識蒸留は区別されることもある
  • しかし、強いモデルの出力を教師信号として小さなモデルを育てるという点では、今回の構想と密接に関係している

Self-Instruct

  • 少数の見本や指示から、LLM自身に新しい学習用データを生成させる手法
  • 今回のように漢字と読みのペアがすでに決まっている場合は、完全なSelf-Instructというより、条件付きの合成データ生成に近い
  • それでも、少数の高品質な例文を参考にして多様な文脈を大量に作るという発想は応用できる

LLM-as-a-Judge

  • LLMを評価者として使う方法
  • 生成した例文を別のLLMに渡して、自然さや指定読みの妥当性を評価させる
  • 例えば「夜更けの商店街には人気がなかった」という文章だけを渡し、「人気」の自然な読みを判定させる
  • このとき、正解として指定した「ヒトケ」を検証モデルに教えないことが重要。答えを先に見せると評価が引っ張られる可能性がある
  • ただし、LLMによる評価も間違えるため、辞書や既存G2Pエンジンとの照合、人手による確認を組み合わせる必要がある

Rejection Sampling(棄却サンプリング)

  • 大量に候補を生成し、条件を満たすものだけを採用する手法
  • 例えば、次のような条件を設定する
    • 指定された漢字が正しく含まれている
    • 指定読みが文脈上自然に成立する
    • 全文のかな読みに誤りがない
    • 日本語として自然である
    • 既存の教師データと重複していない
  • これらの条件を満たしたものだけを教師データとして残す。工場でいえば、不良品を除外して良品だけを出荷する工程

Data Flywheel(データフライホイール)

  • データ生成とモデル改善を繰り返し、性能向上につなげる循環的な仕組み
  • 例えば、次のような流れになる
    1. 教師データを10万件生成する
    2. G2Pモデルを学習する
    3. 読み間違いが多い漢字を分析する
    4. 苦手な漢字・読みの例文を追加生成する
    5. 教師データを検証して追加学習する
    6. 再評価して改善を確認する
  • これを繰り返す

読みごとに歩留まりを管理する

  • 全体の合格率だけを見ていると、別の問題が起きる
  • ある漢字の一般的な読みは、LLMでも簡単に正しい例文を生成できる。一方、珍しい読みや文脈依存の読みでは、正しい例文を生成するのが難しい
  • そのため、簡単な読みのデータばかりが大量に採用され、難しい読みのデータが不足してしまう
  • しかし、読み分けの評価で本当に重要なのは、むしろ難しい読みのほうかもしれない
  • そこで、漢字・読みペアごとに歩留まりを管理する必要がある。例えば次のような状況があったとする(仮の数字だが、読みの難易度によって生成品質が変わることは十分考えられる)
    • 一般的な読み: 合格率95%
    • 文脈依存の読み: 合格率70%
    • 難読・低頻度の読み: 合格率30%
  • この場合、全体の生成量を一律に増やすのではなく、難しい読みだけ生成モデルやプロンプトを変える
    • 簡単な読みは小型Qwenで高速生成する
    • 難しい読みは大型QwenやClaude Opusで生成する
    • 曖昧な読みは複数モデルで独立検証する
    • 何度も失敗する読みは人間が見本を作る
  • これにより、高性能モデルの推論コストを本当に難しい部分に集中できる

100万件を一度に作らないという選択

  • 最初は100万件をまとめて生成するつもりだったが、Data Flywheelの考え方を知ると、段階的な生成という別の方法が見えてくる

第1段階: 1,000件の試作

  • 複数のLLMで同じ漢字・読みペアの例文を生成し、自然さ・指定読みの正確性・全文かな読みの正確性・重複率を測る
  • ここで、モデルごとの得意不得意を把握する

第2段階: 1万件のパイロット生成

  • プロンプトや検証ルールを改善して、もう少し大きな規模で生成する
  • 漢字・読みペアごとの合格率を記録し、問題が多い読みを特定する

第3段階: 10万件の教師データを作る

  • 品質検証を通過したデータでG2Pモデルを学習し、評価用ベンチマークとは独立した検証データで誤りを分析する
  • そのベンチマークを最終評価に使うなら、その評価例文や言い換えを教師データに混入させないことも重要になる

第4段階: 弱点を重点的に補強する

  • モデルが間違えやすい漢字・読みを特定し、その読みについて異なる文脈や構文を持つ例文を追加生成する

第5段階: 100万件まで拡張する

  • 生成と評価を繰り返しながら、必要なデータを増やしていく
  • この方法なら、100万件を生成し終わってから品質の問題に気づくリスクを減らせる
  • また、途中の学習結果によっては、100万件すべてを作る必要がない可能性もある

教師データの価値をどう測るか

  • 当初は、RTX 5090を8枚使って1時間に何件生成できるかが重要だと思っていた。生成速度はもちろん重要だが、それだけでは足りない
  • 本当に測るべき指標は、以下のようなもの
指標意味
生成速度1時間に生成できる候補数
歩留まり生成候補のうち採用できる割合
良品生成速度1時間に採用できる教師データ数
読み別カバレッジ各漢字・読みペアの採用件数
多様性似た文脈や構文への偏りの少なさ
ラベル精度対象読み・全文かな読みの正確性
学習効果追加データによるG2P精度の改善
  • 特に重要なのは「学習効果」。仮に10万件の教師データを追加しても、G2Pモデルの性能がほとんど改善しなければ、そのデータの価値は低いかもしれない
  • 逆に、難しい読みの高品質な例文を1万件追加するだけで、読み分け精度が大きく改善する可能性もある
  • 目指すべきなのは、最も多くのデータを作ることではなく、最も効率よくモデルの弱点を減らすこと

Data-Centric AIという考え方

  • こうした発想は、Data-Centric AIという考え方にもつながっている
  • 従来のAI開発では、モデルのアーキテクチャやパラメータ数、学習方法を改善することに注目が集まりやすかった
  • しかし、モデルを変えなくても、学習データの品質や構成を改善することで性能が向上する場合がある
  • Data-Centric AIは、データの品質、ラベルの正確性、カバレッジ、一貫性などを重視する考え方
  • 今回のG2Pモデル開発でも、モデルを大きくすることだけが正解ではない
    • 誤った読みの教師データを減らす
    • 難しい読みの例文を増やす
    • 文脈の多様性を高める
    • 全文かな読みの表記規則を統一する
    • 学習後の失敗例から追加データを作る
  • もちろん、データ改善だけでモデルの能力上限を超えられるわけではないが、学習データの品質を高めることは、モデルの能力を十分に引き出すうえで欠かせない

GPUリソースの使い方

  • この考え方を取り入れると、GPUの使い方も変わる
  • 単純に最も大きなLLMを8枚のGPUで動かし、100万件を一気に生成する方法だけが最適とは限らない
  • 例えば、4枚で大型Qwenを動かして例文を生成し、残り4枚で小型モデルを並列実行して読みを検証する構成も考えられる
  • あるいは、生成工程と検証工程を時間帯ごとに切り替え、GPUを柔軟に配分する方法もある
  • 重要なのは生成モデル単体の速度ではなく、パイプライン全体の処理能力
    • どれだけ速く生成できても、検証工程が遅ければデータが滞留する
    • 検証が速くても生成品質が低ければ、ほとんどが廃棄されてしまう
  • 工場と同じように、工程ごとの処理速度と歩留まりを測り、ボトルネックを改善する必要がある
  • RTX 5090を8枚使う目的は、単に大きなLLMを動かすことではなく、高品質な教師データを安定して生産できる仕組みを構築すること

クラウドAPIとローカルGPUを組み合わせる

  • 工程ごとに必要な品質とコストは異なるため、すべてを同じモデルでやる必要はない。工程に応じてクラウドAPIとローカルGPUを組み合わせるのがおすすめ
  1. カタログ・タクソノミーを設計する
    • 見本を作る前に、そもそもどういう種類の読み・文脈をカバーすべきかというクラス設計(タクソノミー)を先に決める
    • 例えば、読みの種類(一般的な読み・文脈依存の読み・難読・低頻度の読み)や、文脈のカテゴリ(口語・文語・ニュース文体など)を、カタログとして整理しておく
    • これを先に決めないと、次の見本作りの段階で、カバー範囲が偏った見本しか作れなくなる
    • このとき、カバレッジ(タクソノミーの各セルを1件以上埋められているか)とデンシティ(各セルをどれだけ厚く・多様に埋められているか)という2つの軸で、カタログの充実度を確認する
    • 対象の漢字・読みペアのように母集団(取りうる組み合わせの全体)があらかじめ分かっている場合は、カバレッジとデンシティの両方を100%に近づける、いわば「C100D100」を目標にできる
    • カバレッジだけを追うと、各セルに1件ずつしかなく多様性がないデータになる。デンシティだけを追うと、すでに多いセルばかりが増え、タクソノミー全体では穴が残る。両方を意識する必要がある
  2. 見本だけClaude Opusで作る
    • カタログの各カテゴリについて、1,000〜1万件程度の質の高い見本を、Claude Opusで作る(目安コストは数十〜100ドル程度)
    • 見本は量より質が重要な工程なので、最も高性能なモデルに任せる価値がある
  3. 大量生成は手元のGPUで作る
    • その見本を手本として、ローカルのモデルで100万件規模の候補を生成する
    • ここはコストより量が重要な工程なので、ローカルGPUの計算資源を使う
  4. 品質チェックは安いモデルに任せる
    • 全件の採点をHaiku 5.5のような軽量モデルに任せ、基準を満たさないものを捨てる(全件でも目安100〜200ドル程度)
    • 検品は全件に対して行う必要があるが、1件あたりの判定自体は軽量なモデルでも十分なことが多い
  • このように、設計(カタログ・タクソノミー)、見本づくり(少量・高品質・高コスト)、量産(大量・低コスト)、検品(全件・中コスト)という工程ごとの特性に応じてモデルを使い分けることで、全体のコストを抑えながら歩留まりを上げられる
  • 工場でも、まず設計図を描き、試作品の設計は熟練の技術者に任せ、量産は自動化されたラインで行い、検品は専用の検査装置で全数チェックするのが普通。モデルの役割分担も同じ発想

まとめ

  • 高性能なLLMで見本を作り、ローカルLLMで大量生産し、別のモデルや辞書で検品して基準を満たさないものを除外する、という一連の流れが「工場」と捉えると整理しやすい
  • 歩留まりを測り、不良品が多い工程を改善することが、GPUの増設に匹敵するほど効果を持つ場合がある
  • この一連の流れは、Synthetic Data Generation・Knowledge Distillation・LLM-as-a-Judge・Rejection Sampling・Data Flywheelといった既存の技術・概念に対応している
  • 完成した教師データでG2Pモデルを学習し、苦手な読みを発見して次のデータ生成に反映する、というData Flywheelを回し続けることが本質
  • 最初は「どのLLMを使えば100万件を速く作れるか」を考えていたが、今は、必要なデータを見極め、品質を測定し、継続的に改善できる仕組みのほうが価値があると考えている
  • その仕組みが完成すれば、100万件は最終目標ではなく通過点になる
  • G2Pに限らず、LLMを使って専門分野の教師データを生成するプロジェクトでは、この「工場」と「歩留まり」の考え方が重要になるはず

参考文献

Built with Hugo
テーマ Stack は Jimmy によって設計されています。