CycleQDは、Sakana AIが2024年10月にarXivへ投稿し、ICLR 2025に採択された論文「Agent Skill Acquisition for Large Language Models via CycleQD」で提案されたモデルマージ手法です。タスクごとにファインチューニングした専門家モデルを進化的アルゴリズムで掛け合わせ、追加の勾配学習なしで複数スキルを持つ1つのモデルを作ります。この記事では論文の仕組みと実測スコアの正しい読み方に加え、公開コードを動かすときに論文どおりの設定にならない箇所まで、一次情報に当たって整理します。
まとめ
| 項目 | 内容 |
|---|---|
| 提案元 | Sakana AI(Kuroki ら4名) |
| 論文 | arXiv:2410.14735・ICLR 2025採択 |
| 中核 | 巡回するMAP-Elites+マージ交叉+SVD突然変異 |
| ベースモデル | Llama3-8B-Instruct(画像側はSAM-ViT Huge) |
| 3タスク平均 | CycleQD 52.4/gpt-3.5-turbo 53.7 |
| 計算コスト | 約410 H100 GPU時間(専門家の学習は別) |
| 公開コード | Apache-2.0・2024年10月以降コード更新なし |
| 公開configの既定 | 論文の最終構成ではない(上書きが必要) |
判断材料は4つです。CycleQDはファインチューニングの代わりではなく、K個の専門家モデルを先に作ってから使う後段の手法です。論文の「gpt-3.5-turbo並み」は3タスク平均52.4対53.7のことで、上回ってはいません。マージの成否は元モデルの近さに左右され、類似度とスコアの相関は0.83でした。そして公開リポジトリをそのまま実行すると、突然変異と親選択が、論文のアブレーションで「突然変異なし」より成績が悪かった組み合わせになります。
CycleQDの論文・公開コード・公開モデル
CycleQDは製品でもAPIでもなく、査読を通った研究成果と参照実装、それに学習済みの重みのセットです。
arXiv v1からICLR 2025採択までの時系列
論文の初版は2024年10月16日にarXiv:2410.14735として公開され、v4が2025年2月17日に出ています。arXivのComments欄には「To appear at the 13th International Conference on Learning Representations (ICLR 2025)」とあります。著者はSo Kuroki、Taishi Nakamura、Takuya Akiba、Yujin Tangの4名で、所属はいずれもSakana AIです。日本語圏で知られたのは2024年12月3日のSakana AI公式ブログ(日本語版)以降です。このブログは生物の「ニッチ(生態的地位)」の比喩から説明を始めますが、論文本文はその語を使わず、MAP-Elitesの巡回適用として定式化しています。謝辞によると、研究はNEDOと経済産業省が主催するGENIACのプロジェクト(JPNP20017)として実施されました。
GitHubとHugging Faceで公開されているもの
参照実装はGitHubのSakanaAI/CycleQDにApache-2.0で置かれています。mainブランチの全8コミットのうちコードに触れたのは2024年10月16日の初回だけで、残る7件はREADME.mdの変更です(最終は2025年2月1日、star数48件。2026年11月3日にGitHub APIで確認)。論文の再現用スナップショットと考えてください。
重みはHugging Faceに4本あります。専門家モデルのLlama-3-8B-Instruct-OS-Expert、-Coding-Expert、-DB-Expertと、CycleQDで作ったLlama-3-8B-Instruct-CycleQD-CSです。どれもライセンスはMeta Llama 3 Community Licenseで、CycleQD-CSのモデルカードには「research and development purposes only」「not intended for commercial use」と明記されています。業務システムに組み込む前提で評価するなら、この記載が最初の関門になります。
K個のアーカイブを巡回させる品質と行動特徴
名前のCycleは、品質(Quality)と行動特徴(Behavior Characteristics, BC)の役割を世代ごとに回すことを指します。これはCycleQDの特徴の一つで、論文はモデルマージによる交叉とSVD突然変異も従来のMAP-Elitesとの差として挙げています。
i = t mod K でアーカイブを切り替える構造
CycleQDはスキルの数と同じK個のアーカイブを持ちます。世代tではi = t mod K番目のアーカイブを選び、そのタスクの性能を品質に、残るK-1個のタスクの性能をBCに割り当てます。論文の計算機科学タスクではK=3(コーディング・OS・DB)で、BCは「最も弱い専門家の性能の85%」から「最も強い専門家の性能の115%」までを15分割し、1つの格子に1モデルだけを残しました。1アーカイブは15×15で最大225体、3つ合わせて675体が上限です。生成した1体はK個すべてのアーカイブの更新に使われます。総世代数は1200で、1スキルあたり400世代に相当し、平均スコアは1000世代付近で頭打ちになりました。
データ配合の調整が要らなくなる理由
複数タスクを1回のファインチューニングで学ばせると、どのタスクのデータを何割混ぜるかの試行錯誤が残ります。CycleQDは各世代で1タスクの指標しか最適化しないので、目的関数を重み付きで1本にまとめる必要がありません。配合の考え方はファインチューニング用データセットの作り方|サンプル形式・必要件数・品質要件【2026年10月】で扱っていますが、CycleQDはその工程を「マージした結果を測る」問題に置き換えたと捉えると位置づけがはっきりします。
マージ交叉・SVD突然変異・集約の中身
骨格は遺伝的アルゴリズムとは?交叉・突然変異の仕組みとPython実装、収束を早める設定と同じで、交叉と突然変異の対象をLLMのパラメータ行列に置き換えています。
負の重みを許すタスクベクトルの線形結合
交叉ではタスクベクトルτ = θ − θ_base(ファインチューニング後の重みからベースの重みを引いたもの)を使います。子モデルの重みは、2つの親のτを係数ω1/(ω1+ω2)、ω2/(ω1+ω2)で重み付けして足し、さらにベースモデルの重みθ_baseを加えて作ります。ωは平均μ・標準偏差σの正規分布から独立に引き、論文はμ=1.0、σ=0.03を使いました。論文は「ωは正である必要がない」と書いており、負の係数を許すことで専門家の間を内挿するだけでなく外側へ出る余地を残しています。
ガウス摂動ではなく特異値方向へ動かす突然変異
交叉だけでは子は親の線形結合にとどまり、専門家が張る範囲から出られません。そこで交叉の後に突然変異を入れます。論文は、決め打ちのガウス分布から摂動を足す一般的な方法は自由度が大きすぎて過学習すると述べ、代わりに子のタスクベクトルの各行列をτ_l = U_l Σ_l V_l^T と特異値分解し、特異値に[0, w_max]の一様乱数を掛けて再構成する方法を採りました。実験ではw_max=0.3です。layer normのような階数1の行列はそのまま通します。
最終的な1モデルを作る集約
最後に各アーカイブのエリートのタスクベクトルτ_kを、性能f_kのソフトマックスβ_kで重み付けして足し合わせます。同点なら新しいモデルを採ります。論文が報告するCycleQDのスコアはすべてこの集約モデルのものです。Elite samplingの係数α_low=0.5、α_high=0.8を含むハイパーパラメータは、少数世代の予備実験で決めたと付録A.1.3に書かれており、網羅的な探索はしていません。
計算機科学3タスクの実測スコアと「gpt-3.5-turbo並み」の中身
評価はコーディング(EvalPlusのMBPP+のBase Testsによるpass@1)、OS操作とDB操作(AgentBench、成功率)の3つです。データは最適化用とテスト用に分割され、OSでは専門家モデルとGPTモデルのいずれも解けなかった問題が事前に除外されています。表は論文Table 1から抜粋しました。
| 手法 | MBPP | DB | OS | 平均 |
|---|---|---|---|---|
| gpt-4 | 83.6 | 36.5 | 63.7 | 61.3 |
| gpt-3.5-turbo | 82.0 | 41.6 | 38.5 | 53.7 |
| Llama3-8B-Instruct | 67.3 | 5.3 | 25.2 | 32.6 |
| FT(DB専門) | 65.8 | 42.4 | 28.5 | 45.6 |
| FT(全データ) | 67.3 | 37.1 | 36.7 | 47.0 |
| マージ(学習なし) | 72.9 | 24.7 | 42.6 | 46.7 |
| マージ(NSGA-II) | 75.9 | 42.4 | 36.4 | 51.6 |
| CycleQD | 76.4 | 38.2 | 42.6 | 52.4 |
平均52.4は全データでのファインチューニング(47.0)を5.4ポイント上回り、gpt-3.5-turboの53.7に迫ります。読み方の条件は2つです。GPT系のMBPPの値は著者の計測ではなくDubey et al. 2024からの引用だと、Table 1の注に書かれています。そして平均で勝っても、DBではDB専門のファインチューニングとNSGA-IIマージの42.4に対し38.2で、4.2ポイント負けています。DBの精度が最優先なら、DB専門モデルを1本作るほうが結果は上です。CycleQDの価値は単一タスクの最高点ではなく、3タスクを1モデルで高い水準に揃える点にあります。
アブレーションで効いた設計と逆効果だった選択肢
論文Table 2は、設計要素を1つずつ足して寄与を切り分けています。自分で実装を取り込むなら最も役に立つ表です。
| 構成 | MBPP | DB | OS | 平均 |
|---|---|---|---|---|
| QD(巡回なし)・変異なし・ランダム | 70.4 | 28.8 | 43.7 | 47.6 |
| CycleQD・変異なし・ランダム | 72.9 | 33.5 | 41.9 | 49.4 |
| CycleQD・ガウス変異・ランダム | 73.4 | 30.0 | 42.2 | 48.5 |
| CycleQD・SVD変異・ランダム | 75.9 | 38.2 | 41.1 | 51.7 |
| CycleQD・SVD変異・Elite | 76.4 | 38.2 | 42.6 | 52.4 |
巡回の導入で+1.8、SVD突然変異で+2.3、Elite samplingで+0.7でした。目を引くのは3行目です。ガウス突然変異を入れた構成は48.5で、突然変異を入れない49.4より0.9ポイント低く、SVD突然変異は51.7で上回りました。この比較の範囲では、摂動の入れ方次第で無変異より悪くなりえます(SVDが性能向上の必要条件だとまでは言えません)。この3行目の演算子の組み合わせが、後述する公開コードの既定と同じである点には注意してください。
汎化性能とタスク追加で見えた副作用
論文Table 3は、学習に使っていないタスクでの性能をベースモデル=1.00として比べています。CycleQDは未学習のHumanEval+で1.10、BigCodeBenchで1.03とコーディング側に汎化し、言語系はReasoning 0.95、GSM8K 0.88、読解0.98、常識推論1.02で、平均は0.99でした。コーディング専門モデル(Reasoning 0.57・平均0.92)と比べれば劣化は小さいものの、GSM8Kの0.88は12%の低下で、算術推論を含む用途に載せるなら自分の評価セットで確かめる必要があります。評価の組み立て方はLLM評価とは?指標・データセット設計・評価ツールの選び方を実装視点で解説【2026年版】が参考になります。
計算機科学の3タスクに画像の質問応答(TextVQA)を足した4タスク実験もあります。CycleQDのVQAは54.1で専門家単体の51.4を上回った一方、既存3タスクはMBPPが76.4→72.9、DBが38.2→32.4、OSが42.6→39.6とすべて下がりました。この実験は総世代数を1200に固定しており、巡回の担当世代は1タスク400世代から300世代になります。ただし、既存タスクの性能低下がその配分だけに起因するとは確認されていません。
画像セグメンテーションで見えたモデル類似度の壁
画像側ではSAM-ViT Hugeをベースに、カモフラージュ物体(CAM)、ポリープ(POL)、皮膚病変(SKL)、葉(LEA)の4つの専門家を作り、2つずつマージしました。スコアは対応する専門家の性能を1.00とした値です。
| 専門家ペア | 平均スコア | モデル類似度 |
|---|---|---|
| CAM+POL | 0.97 | 0.98 |
| POL+SKL | 0.96 | 0.99 |
| CAM+SKL | 0.92 | 0.97 |
| SKL+LEA | 0.83 | 0.95 |
| CAM+LEA | 0.70 | 0.88 |
| POL+LEA | 0.62 | 0.93 |
類似度0.97以上の3ペアは0.92〜0.97を保ち、0.95以下のペアは0.83、0.70、0.62にとどまりました。論文はスコアと類似度の相関を0.83と報告しています。ただし関係は単調ではなく、最下位の0.62は類似度0.93のPOL+LEAで、類似度が最も低いCAM+LEA(0.88)の0.70を下回りました。マージの成否は元モデルの近さに強く依存するものの、類似度だけでは結果を予測しきれない、というのが正確な読み方です。
公開コードを動かす手順
READMEの手順は短いものの、依存の固定が2024年初頭のままなので、環境の条件を先に確認してください。
公開実装のOS・Python・依存ライブラリ要件
requirements.txtはvllm==0.3.0を固定しています。PyPIのvllm 0.3.0はtorch==2.1.2とxformers==0.0.23.post1を要求し、配布されているwheelはLinux x86_64向けのPython 3.8〜3.11だけです。macOSやPython 3.12以降では、そのままでは入りません。DBとOSのタスクはDockerコンテナで評価するため、Dockerも要ります。ベースモデルmeta-llama/Meta-Llama-3-8B-InstructはHugging Faceでライセンス同意と承認が要るゲート付きモデルなので、アクセス申請を先に済ませておきます。
CycleQDの依存導入と単一・複数ワーカー起動
READMEに沿うと、依存の導入と単一ワーカーでの起動は次のとおりです(EvalPlusはREADMEが指定するコミットに固定します)。
# 本体の依存(vllm==0.3.0 が torch==2.1.2 を連れてくる)
pip install -r requirements.txt
pip install git+https://github.com/evalplus/evalplus@1895d2f6aa8895044a7cf69defc24bd57695e885
pip install celery redis
# 評価器(同梱の fishfarm)。OSタスクのデータもこの配下にある
cd evaluation/fishfarm
pip install -e .
# DBタスク用(MySQLコンテナ)
docker pull mysql
pip install mysql-connector-python==8.0.32 docker==6.1.2
# OSタスク用のイメージをビルド
python data/os_interaction/images.py build -c data/os_interaction/configs/std.yaml -r .
# リポジトリ直下に戻り、単一ワーカーで実行
cd ../..
python3 main.py
複数GPUに分けるときは、RabbitMQとRedisをDockerで立ててからpython3 main.py -m celery.mode=workerでワーカーを、python3 main.py -m celery.mode=mainで親を起動します。キューの設計はCelery(Python)とは:分散タスクキューの仕組みとブローカー選定・冪等性設計を解説で扱っています。MySQLコンテナに接続できないときは/proc/sys/fs/aio-max-nrを増やすようREADMEにあります。設定ファイルのwandb欄はyour_entityのような仮の値なので、自分のWeights & Biasesのプロジェクト名に書き換えます。
論文の設定に近づけるHydraの上書き
設定はHydraで組み立てられているため、コマンドラインの引数で差し替えられます。論文の最終構成に近づける第一段階として、演算子の種類と交叉・突然変異の係数を次のように上書きします。これだけではBC範囲やElite sampling、SVD変異の実装差は解消しません。
python3 main.py \
qd/mutation=svd_uniform_noise \
qd/sampling=elite_sampling \
qd.crossover.std=0.03 \
qd.mutation.mutation_rate=0.3 \
qd.mutation.seed_model_svd_path=/data/llama3_svd.pt
Hydra 1.3.8で公開configを読み込み、この上書きでSVDUniformMutator・EliteSampler・std: 0.03・mutation_rate: 0.3に変わることを確認しました。mutation_rateは実装上、一様乱数に掛ける上限なので、論文のw_maxに当たります。
公開configと論文の食い違い
公開リポジトリの既定値は、論文の設定と何か所も一致しません。READMEには書かれていないので、再現を試す前に把握してください。
公開configと論文の演算子・係数・BC範囲の差
| 項目 | 公開configの既定 | 論文の設定 |
|---|---|---|
| 突然変異 | gaussian_noise | SVD変異 |
| 親の選び方 | random_sampling | Elite sampling |
| 交叉のσ | 0.01 | 0.03 |
| SVD変異の上限 | 0.1 | w_max=0.3 |
| BCの下限 | 0.0 | 最弱専門家の85% |
| BCの上限 | MBPP 0.75/DB・OS 0.45 | 最強専門家の115% |
まず確認すべきなのは上の2行です。既定の組み合わせは、突然変異と親選択の種類がアブレーション表の3行目に対応します。ただし交叉のσやBC範囲も異なるため、公開configで平均48.5を再現できるとは限りません。python3 main.pyだけで走らせた結果を「CycleQDの再現」と呼ぶのは誤りになります。
BCの範囲はconfigs/task/*.yamlに固定値で書かれています。main.pyのload_task_configsはこのファイルをOmegaConf.loadで直接読むので、Hydraの引数では変えられません。自分の専門家モデルの性能から85%と115%を計算し、ファイルを書き換えてください。もう1点、sampler/elite_sampler.pyは係数0.5と0.8を固定で持っていますが、正規化式が0.5 + 正規化値 × 0.8なので、重みは論文式の0.5〜0.8ではなく0.5〜1.3の範囲になります。
SVD辞書ファイルを自分で作る必要
SVD変異を選ぶと、svd_uniform_mutator.pyが起動時にllama3_svd.ptをtorch.loadします。ところが、このファイルを作るスクリプトはリポジトリにありません(svdで全ファイルを検索して確認)。読み込み側から必要な形式はわかります。タスク名ごとの辞書で、normを含まない全パラメータについて<パラメータ名>.U、.S、.Vを持ち、コードのコメントには「モデルの重みではなくタスクベクトルのSVD」とあります。
実装の動きは論文の式とも違います。論文は子モデルのタスクベクトルをその都度分解する式ですが、公開コードは事前に計算した辞書を読み、選択中のタスク名の成分から作った摂動を子の重みに加えます。どのモデルのタスクベクトルを分解したかは公開されていないため、次のコードは専門家3本のタスクベクトルを分解する一例です(公式のスクリプトではありません)。
import torch
from transformers import AutoModelForCausalLM
BASE = "meta-llama/Meta-Llama-3-8B-Instruct"
EXPERTS = { # キーは configs/config.yaml の tasks と同じ名前にする
"agentbench_os": "SakanaAI/Llama-3-8B-Instruct-OS-Expert",
"mbpp": "SakanaAI/Llama-3-8B-Instruct-Coding-Expert",
"agentbench_db": "SakanaAI/Llama-3-8B-Instruct-DB-Expert",
}
def load(path):
return AutoModelForCausalLM.from_pretrained(
path, torch_dtype=torch.bfloat16).state_dict()
def svd_of_task_vector(base, expert):
out = {}
for k, w in base.items():
if "norm" in k: # 変異側も norm を飛ばす
continue
tau = (expert[k] - w).float()
u, s, vh = torch.linalg.svd(tau, full_matrices=False)
out[f"{k}.U"] = u.to(torch.bfloat16)
out[f"{k}.S"] = s.to(torch.bfloat16)
out[f"{k}.V"] = vh.T.contiguous().to(torch.bfloat16) # 変異側は v.T で使う
return out
base = load(BASE)
svd_dict = {t: svd_of_task_vector(base, load(p)) for t, p in EXPERTS.items()}
torch.save(svd_dict, "llama3_svd.pt")
このコードは、形を縮めたトイの重みで辞書を作り、リポジトリのSVDUniformMutatorに読み込ませて検証しました(torch 2.2.2。検証時はTensor.cudaをCPU上で値を返す処理に差し替えており、CUDAでの動作確認ではありません)。norm以外の行列が変化してnormは変化せず、U・S・Vからの再構成の最大絶対誤差はトイのdown_proj行列で約0.0016でした。容量の見積もりも要ります。Llama 3 8Bの行列形状から計算すると、bf16で1タスク約21.6GB、3タスクで約65GBです。モデル本体の同じ範囲(約16.1GB)より大きくなります。辞書全体はCPUメモリに読み込まれ、変異時には選択中の1タスクのU・S・Vが行列ごとにGPUへ転送されます。保存容量、CPUメモリ、GPU上の一時行列を分けて見積もってください。
CycleQDを採用すべきでない条件
次のどれかに当たるなら、CycleQDより別の方法を選ぶほうが確実です。
- 単一タスクの精度が最優先。DBの結果どおり、専門家1本のほうが強い
- 専門家モデルを用意できない。K個のファインチューニング済みモデルが出発点になる
- マージしたいモデルの構造や語彙が異なる。公開実装は同じベースモデル由来の専門家を前提としており、そのままの適用は避ける
- GPU予算が厳しい。論文の実測はH100で約410 GPU時間、全データのファインチューニング(約200 GPU時間)の2倍強
- 商用で重みを使いたい。公開モデルはLlama 3ライセンスで、カードに研究開発用途限定と書かれている
4点目には補足があります。論文は、超過分の大半は最適化ではなくエージェントタスクの評価にかかったこと、GPUメモリの都合でマージ処理をCPUで実行したことを付録A.1.7で説明しています。410時間はこの実装・この評価設定での実測値です。噛み合うのは、業務ドメインごとのファインチューニング済みモデルが同じベースから複数あり、1本に統合したい場面です。専門家の作り方はPEFTとLoRAの違いとは?peftライブラリの使い方とQLoRA・DoRAの比較【2026年10月】とファインチューニングのやり方|必要なGPUメモリとLoRA学習コード、評価・デプロイまでで扱っています。自社データで複数の専門モデルを統合する構成を検討しているなら、生成AI導入支援でベースモデルの選定から相談を受けています。
関連研究M2N2と進化的モデルマージの系譜
Sakana AIのモデルマージ研究はCycleQDの後も続いています。2025年8月22日に公開された「Competition and Attraction Improve Model Fusion」(arXiv:2508.16204)はM2N2(Model Merging of Natural Niches)を提案し、GECCO 2025にフルペーパーとして採択されました。著者はJoão Abrantes、Robert Tjarko Lange、Yujin Tangで、Yujin TangがCycleQDと共通です。
M2N2は、パラメータをどこで区切ってマージするかを固定グループとして手で決める制約を外し、境界を動的に動かします。自然界の資源競争に着想を得た多様性の維持と、相性の良いペアを選ぶ誘引の指標を組み合わせ、MNIST分類器をゼロから進化させられること、言語モデルと画像生成モデルのマージにも使えることを示しました。名前に「Natural Niches」を冠するのは論文としてはこちらで、実装はSakanaAI/natural_nichesとして公開されています。設計判断がアブレーションで検証されたCycleQDは教材として今も有用ですが、これから実装するならM2N2も比較の候補に入れてください。
よくある質問
CycleQDは誰が開発した何ですか?
Sakana AIの研究チームが発表した、複数の専門家LLMを進化的アルゴリズムでマージする学術研究の手法です。論文(arXiv:2410.14735)はICLR 2025に採択され、参照実装がGitHubに、学習済みの重みがHugging Faceに公開されています。APIやSaaSとしては提供されていません。
CycleQDはGPT-3.5を超えたのですか?
超えていません。計算機科学3タスクの平均はCycleQD 52.4、gpt-3.5-turbo 53.7で、論文の表現も「on par(同等)」です。タスク別ではOS(42.6対38.5)で上回り、MBPP(76.4対82.0)とDB(38.2対41.6)で下回ります。8Bのモデルでこの水準に届いた点が成果です。
CycleQDの公開コードはそのまま論文を再現できますか?
そのままでは再現できません。既定の設定はガウス変異とランダム選択で、論文のアブレーションで平均48.5だった組み合わせです(σやBC範囲も論文と異なります)。Hydraの引数でSVD変異とElite samplingに切り替え、BCの範囲はタスクの設定ファイルを書き換えます。SVD変異に必要なllama3_svd.ptは自分で作る必要があります。
CycleQDのモデルは商用利用できますか?
公開されている重みは推奨できません。コードはApache-2.0ですが、Hugging FaceのCycleQD-CSと専門家3本はMeta Llama 3 Community Licenseで、CycleQD-CSのカードには研究開発用途に限り商用を想定しないと書かれています。業務利用を検討する場合は、ベースモデルと学習データの利用条件を確認したうえで、自社の専門家モデルから統合モデルを作る方法が候補になります。
CycleQDと一般的なモデルマージの違いは何ですか?
重みを固定比率で混ぜる一般的なマージと違い、CycleQDは混合比を進化的に探し、さらに特異値分解した方向へ摂動を加えて専門家の範囲の外も探ります。論文の比較では、学習なしの単純なマージが3タスク平均46.7、CycleQDが52.4でした。マージの仕組みに近い発想として、大きいモデルの能力を小さいモデルへ移す知識蒸留(Model Distillation)とは?LLM蒸留のやり方とPyTorch実装・規約の注意もあります。