人間のランク評価という「弱い教師信号」だけから、最適な実験条件を最小回数で導き出す。
製造業・材料開発の現場では、新しい素材やプロセス条件を探索するとき、2つの根本的な壁に直面する。
実験コストの壁。
温度・圧力・配合比率といった操作パラメータの組み合わせは連続的で無限に存在するが、実験は時間・コスト・材料の面で非常に高価である。やみくもに試すことは許されない。
評価の非定量性の壁。
工業製品の品質(質感、光沢、強度感)は「目で見てわかる」ものであり、数字に落とせないことが多い。熟練技術者が「これはA品、これはB品」とランク付けすることが、現場における唯一の現実的な評価手段である。
この2つの壁が同時に存在するため、従来の機械学習や数値最適化手法はそのまま適用できなかった。
「人間のランク評価」という弱い教師信号だけから、最適な実験条件を自動提案するシステムを、最小実験回数で構築する。
FORGEは以下の2つの推論器を、クローズドループの中で同時に育成する。
| 推論器 | 役割 |
|---|---|
Reward Model h(C, A) |
ランク評価(A/B/C)の背後にある連続的な「真の良さ」を推定する |
Surrogate Model f(C, A) |
任意の条件・操作量に対して、スコアの予測値と不確実性を返す |
そして能動学習(Active Learning)によって「次にどの実験をすれば、最もシステムが成長するか」を計算し、人間の認知的コストも含めた総実験コストを最小化する。
A > B > C には順序があるが、「AとBの差」と「BとCの差」は等間隔ではない。単純な数値変換では情報が歪む。
解決: 順序回帰(Ordinal Regression)によって、ランクの背後に潜む連続スコア(潜在変数)を確率モデルとして推定する。
初期データは条件のバリエーションが数種類しかない。見たことのない条件に対しても予測できる汎化が必要である。
解決: 条件を記述子ベクトルに変換し、特徴量空間上での「知識の転移」を実現する。
操作量が連続値であるため、全パターンを試すことは不可能。内部で数理最適化ソルバーを走らせる必要がある。
解決: scipy.optimize.differential_evolution により、操作量の物理的な制約範囲内でグローバル最適解を探索する。
データがない領域では予測が不安定になる。予測値だけでなく「その予測がどれだけ信頼できるか」を定量化しなければ、誤った実験を提案してしまう。
解決: ガウス過程回帰(Gaussian Process)により予測値 μ と不確実性 σ を同時に出力し、獲得関数(UCB/EI)で探索と活用のバランスを制御する。
┌─────────────────────────────────────────────────────────┐
│ D = { (C_i, A_i, S_i, H_i, Ŷ_i) } ← DataStore │
└───────────────────┬─────────────────────────────────────┘
│
┌────────────┴─────────────┐
▼ ▼
┌─────────────┐ ┌──────────────────┐
│ Reward Model│ │ Surrogate Model │
│ h(C,A) → Ŷ │ │ f(C,A) → (μ, σ) │
│ │ │ │
│ Ordinal │ Ŷ を付与│ Gaussian │
│ Regression │ ────────▶│ Process (GP) │
└─────────────┘ └────────┬─────────┘
│ μ, σ
┌────────▼─────────┐
│ Acquisition Func │
│ α = UCB / EI │
│ argmax over A │
└────────┬─────────┘
│ 次の実験提案 (C*, A*)
┌────────▼─────────┐
│ Human Feedback │
│ 実験 → S → H入力│
└──────────────────┘
│ データ追加
└──────────▶ D を更新 → ループへ
Phase 0 初期化 スキーマ定義・既存データのインポート
↓
Phase 1 Reward Model ランクH → 潜在スコアŶ へのマッピング
↓
Phase 2 Surrogate ŶをもとにGPモデルを学習・更新
↓
Phase 3 提案生成 獲得関数を最大化し次の実験条件 (C*, A*) を算出
↓
Phase 4 人間評価 実験 → 観測S → ランクH を入力 → Dに追加
↓
└────────────────────────────────────────── Phase 1 へ戻る
# インストール
pip install -e .
# スキーマ定義(初回のみ)
python -m forge init --config config/default.yaml
# データインポート
python -m forge import --file path/to/data.csv
# ループ実行(Phase 1 → 2 → 3 → 人間入力待ち)
python -m forge loop --condition "temp=250,pressure=1.2"
# 現状サマリー
python -m forge statusPython 3.11+
├── mord 順序回帰 (Reward Model)
├── gpytorch ガウス過程 (Surrogate Model)
├── scipy 最適化ソルバー (Acquisition)
├── click CLI
└── rich コンソール表示
forge/
├── CLAUDE.md
├── REQUIREMENTS.md
├── README.md
├── config/
│ └── default.yaml
├── data/
│ ├── schema.yaml
│ └── dataset.csv
├── models/
│ ├── reward_model.pkl
│ └── surrogate_model.pt
├── forge/
│ ├── cli.py
│ ├── data/
│ ├── models/
│ ├── optimization/
│ └── loop/
└── tests/
| 記号 | 名称 | 説明 |
|---|---|---|
C |
Condition | 前提環境・素材特性。制御不可。記述子ベクトルとして入力。 |
A |
Action | 温度・圧力・比率など。自由に制御できる連続値パラメータ。 |
S |
State | 実験後の生の観測結果(質感・画像・波形など)。 |
H |
Human Feedback | 人間によるランク評価(例: A/B/C)。唯一の教師信号。 |
Ŷ |
Latent Yield | ランクの背後にある連続スコア。Reward Modelが推定。 |
μ, σ |
予測平均・不確実性 | Surrogate Modelの出力。獲得関数の入力となる。 |