# Input-dependent specialization — reproducible follow-up

2023–2024年の卒業研究で提案した `data-dependent sample weight` の核心を、
小さな対照実験として再検証するためのコードです。

## 問い

入力によって生成規則が切り替わるデータでは、各入力を担当するexpertを学ぶモデルが、
すべてのexpertを一様に学習・平均するモデルより良くなるか。
逆に、規則が一つしかないデータで不要なroutingを導入すると何が起きるか。

## 比較

- `linear`: 単一の線形回帰
- `mlp`: 非線形な単一モデル。routingなしでも境界を表現できる強い比較対象
- `uniform_ensemble`: 2個の線形expertを全データで学習し、一様平均
- `aggregate_moe`: 入力依存weightで予測を混合し、混合後の誤差を最小化
- `sample_weight_moe`: 入力依存weightを各expertのsample weightとして使用
- `sample_weight_warmstart`: 前半を混合後の誤差で学習し、後半をsample weightへ切り替え
- `oracle_partition`: 真のregimeを知る2本の線形回帰。達成可能な上限の参考値

## 実行

```bash
uv run --with torch==2.13.0 python research/ensemble_specialization/experiment.py
```

リポジトリルートからは `make thesis-retest` でも同じ20 seedの追試を実行できます。

短い動作確認:

```bash
uv run --with torch==2.13.0 python research/ensemble_specialization/experiment.py \
  --seeds 2 --epochs 80 --output /tmp/ensemble-specialization-smoke
```

出力先には、run単位の `runs.csv`、集約済みの `summary.csv`、条件・環境・結果を含む
`results.json` が生成されます。データはseedから生成され、外部データを必要としません。
結果ファイルには実行環境と実験コードのSHA-256も記録します。GPU・PyTorchのビルドが
異なる環境では浮動小数点演算の差があり得るため、完全なbitwise一致ではなく集約結果の
再現を確認対象とします。

## 読み方

この実験は、元論文の高次のNegative Correlation項を再現するものではありません。
まず `data-dependent sample weight` という問題設定だけを分離し、効く条件と壊れ方を
確かめる段階です。結果を見てから、旧正則化項をablationとして追加します。
