合成データは「実データ不足」の救世主ではなく、「適切に生成された場合に限り有用」な補完ツールです。統計モデル、GAN、拡散モデル、LLMの4つが主要な生成手法で、テキストデータでは近年LLMによる生成が圧倒的に優位です。ただし「元データに似ているから良い」は誤りで、多様性・忠実性・プライバシーの3軸で評価しない限り、本番モデルの劣化やプライバシー漏洩を招きます。合成データは便利な武器ですが、使い方を誤れば自分の足を撃ち抜く凶器にもなりうることを忘れてはなりません。
合成データとは
合成データ(Synthetic Data)とは、実データを元に、統計的手法やAIモデルで人工的に生成されたデータを指します。実データと同じ統計的特性を保ちつつ、個人情報や機密情報を含まない形で提供できるため、データ共有の柔軟性が大きく向上します。医療、金融、製造など、実データの取り扱いが厳しい業界で特に活用が進んでいます。
近年は、実データが十分にない機械学習タスクへのデータ拡張、レアケースの模擬、クラス不均衡の是正、プライバシー保護のための代替データといった用途で広く使われるようになりました。Gartnerの予測では、2030年までにAI開発に使われるデータの大半が合成データになるという見方もあります。
【合成データの生成・活用フロー】
[実データ] --学習--> [生成モデル]
|
v
[合成データ候補]
|
+------------+------------+
| | |
v v v
[忠実性評価] [多様性評価] [プライバシー評価]
| | |
+------------+------------+
|
v
[品質基準を満たす?]
├── Yes → 下流タスクで利用
└── No → 生成モデル再調整
MLパイプラインに合成データ生成ステップを組み込むのが近年の主流です。
合成データの生成手法
合成データの生成手法は、大きく4系統に分類できます。統計モデルはベイジアンネットワークやコピュラを使う古典的手法で、テーブルデータに向いています。GAN(Generative Adversarial Networks)は、生成器と識別器の敵対的学習で高品質な合成データを生成する手法で、画像やテーブルデータで広く使われます。拡散モデルは近年急速に発展したアプローチで、画像や音声の生成品質で他を圧倒しています。LLMはテキストデータの合成において標準的な手段になりました。
| 手法 | データタイプ | 品質 | コスト | スケーラビリティ | ツール例 |
|---|---|---|---|---|---|
| 統計モデル | テーブル | 中 | 低 | 高 | SDV, synthpop |
| GAN | 画像・テーブル | 高 | 中 | 中 | CTGAN, StyleGAN |
| 拡散モデル | 画像・音声 | 非常に高 | 高 | 中 | Stable Diffusion |
| LLM | テキスト | 高 | 中 | 非常に高 | GPT-4, Llama, Claude |
| VAE | 画像・テーブル | 中 | 中 | 高 | TVAE, β-VAE |
テーブルデータの合成では、MostlyAIやGretel、Synthetic Data Vault(SDV)などの商用・OSSツールが成熟しており、GDPRに配慮した差分プライバシー対応機能も備わっています。MLOpsの視点では、データ準備パイプラインの一環として合成データ生成を捉えるのが定石です。
LLMによる合成データ生成
テキストデータの合成は、LLMの登場で劇的に変わりました。かつてはルールベースや既存データの置換・シャッフルが主流でしたが、現代では「プロンプトでLLMに生成させる」のが第一選択です。特に指示追従データやQ&Aデータの増強では、Self-Instructと呼ばれる手法がデファクトスタンダードです。
Self-Instructの基本アイデアは単純で、少量のシード指示をLLMに見せ、「同じような形式で新しい指示を生成してください」と依頼するだけです。Alpacaで52,000件の学習データを生成したのがこの手法で、以降の指示追従モデルで広く採用されています。ただし、出力の多様性担保と品質チェックは必須で、生成しっぱなしではモデル劣化を招きます。
import json
from openai import OpenAI
client = OpenAI()
SEED_EXAMPLES = [
{"instruction": "次の文章を要約してください", "topic": "ビジネスメール"},
{"instruction": "以下の項目を箇条書きで整理してください", "topic": "会議議事録"},
]
def generate_synthetic_instructions(n: int = 50):
prompt = f"""以下のシード例を参考に、業務アシスタント向けの指示データを{n}件生成してください。
各項目は JSON 形式で、instruction と topic を含めてください。
シード例:
{json.dumps(SEED_EXAMPLES, ensure_ascii=False)}
"""
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
response_format={"type": "json_object"},
temperature=0.9,
)
return json.loads(resp.choices[0].message.content)
data = generate_synthetic_instructions(n=100)
with open("synthetic_instructions.jsonl", "w", encoding="utf-8") as f:
for item in data["items"]:
f.write(json.dumps(item, ensure_ascii=False) + "
")
上記のような仕組みで生成したデータは、ファインチューニング実践やRLHF・DPOの初期データセットとして活用できます。
合成データの品質評価
合成データの品質は、3つの軸で評価します。忠実性(Fidelity)は「実データとどれだけ統計的に近いか」で、列ごとの分布一致やペアワイズ相関の保持を見ます。多様性(Diversity)は「生成データが偏っていないか」で、n-gramのカバレッジやクラスタリング結果から評価します。プライバシー(Privacy)は「元データの情報が漏洩していないか」で、最近傍距離や再識別攻撃耐性で検証します。
| 指標 | 意味 | 計測方法 | しきい値の目安 |
|---|---|---|---|
| KS距離 | 分布の一致度 | 列ごとに算出 | 0.1未満 |
| 相関保持度 | 列間関係の維持 | 相関行列のRMSE | 0.05未満 |
| TSTR精度 | 下流タスクでの有効性 | 合成→実でのモデル精度 | 実データの90%以上 |
| n-gram多様性 | テキストの偏り | unique n-gram比率 | 実データの80%以上 |
| DCR(最近傍距離) | プライバシー | 合成-実の最近傍距離 | 実-実の平均以上 |
| メンバーシップ攻撃 | 再識別リスク | 機械学習による攻撃 | AUC 0.55以下 |
TSTR(Train on Synthetic, Test on Real)は、合成データの実用性を測る最も重要な指標です。合成データで学習したモデルが、実データでテストしても高い精度を維持できるなら、実用価値があると判断できます。
法的・倫理的考慮事項
合成データにはプライバシーリスクがついて回ります。生成モデルが実データの希少パターンを覚えこみ、合成データに出力してしまう「記憶化」が典型的な問題です。特に高次元データや外れ値を含むデータでは、合成結果から元の個人を再識別できるケースがあります。対策として、差分プライバシー(Differential Privacy)を生成モデルに組み込むアプローチが標準化されつつあります。
バイアス再現も見過ごせない問題です。実データに含まれるバイアスは、合成データにもそのまま受け継がれます。性別や人種に偏った学習データから生成した合成データで機械学習モデルを作れば、当然バイアスのあるモデルができあがります。合成データは「プライバシー問題を解決しつつ、バイアス問題も増幅させる」という、厄介な特性を持つことを認識しておくべきです。
import numpy as np
from sklearn.neighbors import NearestNeighbors
def check_privacy_distance(real_df, synth_df):
real_array = real_df.values
synth_array = synth_df.values
nn_real = NearestNeighbors(n_neighbors=2).fit(real_array)
dcr_real, _ = nn_real.kneighbors(real_array)
mean_real_real = dcr_real[:, 1].mean()
nn_synth = NearestNeighbors(n_neighbors=1).fit(real_array)
dcr_synth, _ = nn_synth.kneighbors(synth_array)
mean_synth_real = dcr_synth[:, 0].mean()
ratio = mean_synth_real / mean_real_real
print(f"DCR ratio: {ratio:.3f} (>=1.0 で良好)")
return ratio
LLMと著作権や生成AIガバナンスの観点からも、合成データの法的扱いは押さえておきたいトピックです。
まとめ
合成データは、データ不足やプライバシー制約を乗り越える強力な手段ですが、品質評価とリスク管理なしでは逆効果になります。LLMを使ったテキスト合成は実務で最も費用対効果が高く、テーブルデータではGANや統計モデルが実績あるアプローチです。重要なのは「合成したから使える」ではなく、「評価で合格したから使える」という運用規律です。実データとの健全な併用が成功の鍵になります。
よくある質問
Q. 合成データとは?
A. 実データを元に統計的手法やAIモデルで人工的に生成されたデータです。プライバシー保護、データ不足の解消、クラスバランスの調整などの目的で活用されます。
Q. 合成データで学習したモデルの精度は実データと同等ですか?
A. タスクと生成品質によります。高品質な合成データと実データを混合することで、実データのみと同等以上の精度を達成するケースも報告されています。TSTR指標で実用性を測ることを推奨します。
Q. 合成データにプライバシーリスクはありますか?
A. 生成手法によっては元データの情報が漏洩するリスクがあります。差分プライバシーの適用や、生成データと元データの類似度チェックで対策するのが標準的なアプローチです。