はじめに
2026年2月のarXivから以下の論文
[1] J. Fan, et. al. SafeGen-LLM: Enhancing Safety Generalization in Task Planning for Robotic Systems
のまとめと、実装例を作成。
1. 概要
- physical AI の task planningに関する論文
- 用意した正解planningに対して SFT と GRPO を実施する
- 安全面に配慮するためGRPO時の報酬で安全性を加味する
下図のように
左の initial state から始めて、右の Goal state へ至るplanningをする。「eを掴んで机の上に置く」「eの上にbを置く」などのplanを正しい順序で生成するタスク。
その際に左の Safety constraint を守る必要があり、これをいかに学習に取り組むかが本論文の焦点。
1.1 全体的な流れ
下図のように
datasetを作成し(上図中の左)、教師あり学習させ(上図中の右上)、GRPOで強化学習する(上図中の右下)。
2. 背景
従来の記号的Plannerは、状態・行動・目標を明示して探索する。その一方で、問題規模が増すと探索が難しくなり、入力形式も厳密である。LLMは自然言語や構造化テキストから柔軟に計画を生成できるが、次の失敗を起こし得る。
- 形式エラー:実行器が解釈できないActionを出力する。
- 前提条件違反:持っていない部品を置こうとするなど、現在状態では実行できないActionを選ぶ。
- 安全制約違反:タスクを達成できても、途中に禁止状態を作る。
- 目標未達成:各Actionを実行できても、最終状態が目標を満たさない。
SafeGen-LLMは、正しい計画例によるSFTと、形式検証結果を報酬にしたGRPOを組み合わせ、LLMが安全なAction Sequenceを生成する確率を高める。
3. Task Planningの定式化とPDDL3
3.1 状態、Action、目標、安全制約
論文では、ロボットの計画問題を次の組で表す。
\mathcal{P}=(\mathcal{S},\mathcal{A},s_0,G,\mathcal{C})
- $\mathcal{S}$:状態空間
- $\mathcal{A}$:実行可能な行動の集合
- $s_0$:初期状態
- $G$:達成すべき目標条件
- $\mathcal{C}$:安全制約の集合
Action Sequenceを次のように表す。
\pi=[a_1,a_2,\ldots,a_n]
これを実行すると、$s_0\rightarrow s_1\rightarrow\cdots\rightarrow s_n$ という状態遷移が生じる。安全な計画には、目標達成と安全制約の双方が必要である。
\text{find }\pi\quad\text{s.t.}\quad s_n\models G\ \land\ \pi\models\mathcal{C}
$\models$ は「満たす」を意味する。 $s_n\models G$ は最終状態が目標を満たすこと、$\pi\models\mathcal{C}$ は行動列全体が安全制約を満たすことである。つまり、ゴールさえ達成すれば途中経過は問わない、という計画ではない。
3.2 PDDL3で安全制約を記述する
PDDL(Planning Domain Definition Language)では、行動の前提条件(Precondition)と、その行動による状態変化(Effect)を記述する。PDDL3は、計画全体に対する時間的制約も表現できる。
例えば、壊れやすいブロックの上に他のブロックを置かないという制約は、概念的に次のようになる。
(:constraints
(always
(forall (?x - fragile-block ?y - block)
(not (on ?y ?x)))))
ここで always は全状態で条件を満たすことを意味する。Appendix Dには sometime-before、always、at-most-once などを用いた各ドメインの具体例が掲載されている。
4. 学習用データセットの生成
SafeGen-LLMは、実ロボットを繰り返し動かして教師データを集めるのではなく、記号的な計画問題を生成し、既存PlannerとValidatorで正解を作る。
論文のデータ作成手順は次の通りである。
- PDDL2の問題生成器で計画問題を作成し、同型・重複に近い問題を除外する。
- 問題にドメイン固有の安全制約を加え、PDDL3として表現する。
- OPTICで制約付きの計画を探索する。
- VALで前提条件・目標・安全制約を検証し、成功した計画だけを残す。
- 入力(Domain/Problem/Constraints)と正解のAction Sequenceのペアに変換する。
対象は以下の4ドメインである。
| ドメイン | タスク | 代表的な安全制約 |
|---|---|---|
| Blocksworld | ブロックの積み替え | 安全な積み順序 |
| Ferry | フェリーで車両を輸送 | 積載・輸送順序 |
| Grippers | グリッパーによる物体搬送 | 特定グリッパーの利用禁止など |
| Spanner | 工具を集めてナットを締結 | 締結順序、工具室への入室制限 |
学習時の出力は、推論文章ではなくAction Sequenceのみに限定される。例えば以下のような形式である。
(pickup b1)
(stack b1 b2)
(pickup b3)
(stack b3 b0)
5. SFTによる計画形式・行動規則の学習
最初の学習段階は、検証済みの正解計画を模倣するSupervised Fine-Tuning(SFT)である。以下のように
\mathcal{L}_{\mathrm{SFT}}(\theta)
=-\mathbb{E}_{(x,y)\sim\mathcal{D}_{\mathrm{SFT}}}
\left[\log\pi_\theta(y\mid x)\right]
データの各問題・制約に対して作成した正解の対数尤度を最大化させる。
$x$ :問題・制約を含む入力
$y$ :正解Action Sequence
$\pi_\theta$ :LLMの生成確率分布
実際にはLLMはそれまでの自信の出力トークン $y_{<t}$ を入力として次のトークン $y_t$ を出力しているので、
\mathcal{L}_{\mathrm{SFT}}(\theta)
=-\mathbb{E}_{(x,y)\sim\mathcal{D}_{\mathrm{SFT}}}
\left[\sum_{t=1}^{T}\log\pi_\theta(y_t\mid x,y_{<t})\right]
となる。
SFTの役割は、Actionの書式、利用可能な物体・行動、前提条件、制約に沿う典型的な計画を学習させることである。ただし、SFTだけでは「教師例と異なるが正しい計画」を直接評価することが難しい。
6. GRPOによる安全性の強化学習
6.1 何を生成し、どこから報酬を得るのか
SFT済みモデルに同じ問題 $x$ を与え、複数のAction Sequenceを確率的にサンプリングする。
y_1,\ldots,y_K\sim\pi_\theta(\cdot\mid x)
これらの候補を VALによる形式検証 で採点する。VLAで行動を実行して報酬を得るわけではない。モデル自身の生成結果を評価するのでOn-policyだが、報酬計算には環境ロールアウトを必要としない。
論文Appendix Aでは、1入力あたり$K=8$候補、Sampling Temperatureは$0.6$としている。
6.2 5段階のReward
論文のRewardは、計画失敗の原因を5つに分類する。
| 分類 | 内容 | 報酬範囲 |
|---|---|---|
| $c_1$ | 出力形式エラー | −1.0 |
| $c_2$ | 安全制約違反 | −0.9〜−0.6 |
| $c_3$ | 行動の前提条件違反 | −0.6〜−0.3 |
| $c_4$ | 目標未達成 | −0.4〜−0.1 |
| $c_5$ | 安全に目標達成 | +1.0 |
安全違反は、前提条件違反や目標未達成よりも低い報酬となる。単純な正誤判定ではなく、失敗の種類の優先順位を明示している点が重要である。
成功と形式エラーは固定報酬であり、中間の3カテゴリでは進捗に応じて報酬を補間する(論文式(8))。
r(x,y)=r_k^-+(r_k^+-r_k^-)\,\rho_k(x,y)
\qquad (k\in\{2,3,4\})
進捗の定義は失敗カテゴリによって異なる(論文式(9))。
\rho_k(x,y)=
\begin{cases}
\dfrac{t_v}{L_{\mathrm{ref}}}, & k\in\{2,3\}\\[6pt]
\dfrac{n_{\mathrm{sat}}}{n_{\mathrm{total}}}, & k=4
\end{cases}
- $t_v$:初めて安全制約・前提条件に違反したステップ
- $L_{\mathrm{ref}}$:正解計画の長さ
- $n_{\mathrm{sat}}/n_{\mathrm{total}}$:達成したGoal述語の割合
例えば正解の長さが10で、4番目のActionで初めて安全制約違反が発生した場合、進捗は$4/10=0.4$である。安全違反の報酬区間を使うと次のようになる。
r=-0.9+\bigl(-0.6-(-0.9)\bigr)\times0.4
=-0.78
同じ種類の違反でも、より長く妥当な行動を続けた候補には相対的に高い報酬が与えられる。なお、基準に生成計画の長さではなく正解計画の長さを使うのは、短い計画を生成して進捗率だけを高める操作を抑えるためである。
6.3 GRPOのAdvantageとPolicy更新
GRPOでは、同じ問題から生成した$K$候補の報酬を比較する。論文式(5)のAdvantageは次の通りである。
A_i=r(x,y_i)-\frac{1}{K}\sum_{j=1}^{K}r(x,y_j)
報酬がグループ平均より高い候補は$A_i>0$、低い候補は$A_i<0$となる。論文式(6)の簡略化された目的関数は以下。
\mathcal{L}_{\mathrm{GRPO}}(\theta)
=\mathbb{E}_{x,\,y_i\sim\pi_\theta}
\left[A_i\log\pi_\theta(y_i\mid x)\right]
つまり、このadvantageを加味した対数尤度を最大化させる。
7. Curriculum Learning:難しい問題を段階的に増やす
著者らはGRPOの学習を安定させるため、問題の構造的な難易度からEasy・Medium・Hardを作り、学習が進むにつれてHardの割合を増やしている。
Blocksworldでは、ブロック数$n$に対して難易度を$d=n^2$と定義する。他ドメインでも、車両数・部屋数・物体数などを用いる。
| GRPOの進行段階 | Easy | Medium | Hard |
|---|---|---|---|
| 前半(0〜30%) | 70% | 25% | 5% |
| 中盤(30〜70%) | 40% | 40% | 20% |
| 後半(70〜100%) | 20% | 40% | 40% |
また、4ドメインから均等に問題を取り出すDomain-balanced batchingを利用し、特定分野への偏りを抑える。
8. 実験結果
8.1 SFTとGRPOの効果
Qwen3-14Bの実験結果(論文Table II)は以下である。成功率は、目標達成と安全制約充足の両方を満たした割合である。
SFTによって、まず形式と基本的な行動規則を学習し、GRPOによってさらに計画成功率が改善している。Llama-8Bでも、SFT後の50〜92%からGRPO後の78〜94%に改善している。Qwen3-14BのGRPO後の安全制約違反率は各ドメインで0〜2%と報告されている。
8.2 入力形式を変えた場合
Qwen3-14Bの学習後モデルに対し、入力をPDDL3、自然言語、JSONに変換したときの平均成功率は次の通りである。
学習時のPDDL3形式から別の表現へ一定程度汎化している。ただし、自然言語では11.5ポイント低下しており、表現形式の差は依然として課題である。
8.3 実機検証
著者らはBlocksworldを対象に、Elephant RoboticsのmyCobot 280を用いた実機デモも報告している。安全制約を考慮しない例では積み替え中に衝突が発生し、SafeGen-LLMの計画ではその衝突を回避できた。
ただし、実機評価は限定された設定のデモであり、多様な産業設備・未知の幾何形状への一般化を示すものではない。
9. 論文の位置付けと限界
SafeGen-LLMの要点は、安全制約を文章でプロンプトに書くだけでなく、検証結果を報酬としてLLMの重みに反映することである。正解Action Sequenceとの文字列一致を評価する方式と違い、Expertと異なる行動順序でも、目標と安全条件を満たせば高い評価を与えられる。
一方、次の制限がある。
- 形式モデルへの依存:PDDL3の前提条件・Effect・制約が現実を十分に表していなければ、検証が通っても実環境で安全とは限らない。
- 知覚との分離:カメラ・LiDARから状態や制約を推定する部分は、本研究の主な対象ではない。
- 幾何的な実行可能性:衝突判定、到達可能性、把持力、制御誤差などの評価は別途必要である。
- 学習規模と再現性:論文は主に記号的ベンチマークで評価し、公式コード・データ一式の公開は少なくとも本稿作成時点で確認できない。また本文と付録には学習用データ分割の記述差がある。
Physical AIへ展開するなら、センサー情報→Scene Graph/状態表現→LLM Planner→PDDLやシミュレータによる検証、という構成が自然である。ただし、これらは本論文で実証された構成ではなく、今後の研究に向けた拡張案である。
10. Gemma 4 E2BでSFT→GRPOを試した実装
本論文の公式コードは公開されてないので、簡単な実装デモを作成した。今回のデモは、既存のGemma 4 E2Bの4bit量子化+LoRA学習環境に、Blocksworld用のデータ生成、Reward関数、GRPO学習を追加したものである。
10.1 論文と実装の違い
| 項目 | 論文 | 今回のPoC |
|---|---|---|
| モデル | Mistral-7B、Llama-8B、Qwen3-14B | google/gemma-4-E2B-it |
| 対象ドメイン | Blocksworld等の4領域 | Blocksworldのみ |
| データ生成 | PDDL問題生成+OPTIC | Pythonで問題生成+BFS |
| 検証・Reward | PDDL3+VAL | Python製の状態遷移検証器 |
| SFT/GRPO | LoRA/QLoRA+GRPO | 4bit QLoRA+TRL GRPO |
| データ数 | 論文Appendix C:学習2,000、テスト200 | 学習80、テスト16(既定) |
| GRPO候補数 | 8 | 4(初期設定) |
| GPU | H100 80GB | RTX 3090 24GBを想定 |
したがって、これは論文の完全再現ではなく、SFT→Reward→GRPOの仕組みを検証するミニ実装である。
10.2 追加した主要ファイル
src/
make_safegen_dataset.py # JSONLデータ生成
safegen_blocks.py # Blocksworld状態遷移・BFS・計画採点
safegen_reward.py # GRPOに渡すReward関数
train_sft_safegen.py # SFT
train_grpo_safegen.py # GRPO
evaluate_safegen.py # SFT/GRPOモデルの評価
Dockerfile.safegen # 学習用Docker環境
tests/test_reward.py # 報酬のユニットテスト
make_safegen_dataset.py は同じ問題について2つの形式を作成する。SFT用は入力と正解計画を含む prompt / completion、GRPO用は prompt / problem_json である。後者の problem_json はモデルへの入力ではなく、Reward計算用の状態・目標・制約情報である。
SFTでは、completion_only_loss=True を指定して正解Action Sequenceに対するクロスエントロピーを最小化する。モデル本体は4bit量子化し、言語モデル側のLoRAアダプタを更新する。Gemma 4の言語モデルへのLoRA適用は、PEFTのtarget_modulesを明示する必要がある場合がある。
10.3 Reward関数
src/safegen_reward.py では、TRLの GRPOTrainer が生成した応答を取り出し、Blocksworldの検証器へ渡す。
import json
from safegen_blocks import grade_plan
from safegen_reward import completion_to_text
# 学習時のReward関数の主要部分を抜粋。
def safegen_reward(completions, problem_json, **kwargs):
rewards = []
for output, problem in zip(completions, problem_json):
spec = json.loads(problem)
plan_text = completion_to_text(output)
result = grade_plan(plan_text, spec)
rewards.append(float(result.reward))
return rewards
grade_plan() は、出力書式→前提条件→安全制約→目標達成の順でAction Sequenceを確認し、論文と同じ5種類の報酬区間を返す。ただし、検証器は一般のPDDL3/VALではなく、4ブロックを対象にした簡易な記号的シミュレータである。
GRPOで利用する主な設定は、num_generations=4、temperature=0.6、beta=0.01、scale_rewards=False などである。scale_rewards=False は、論文の式(5)のように平均を引く相対Advantageに近づけるための設定である。実際の損失計算や正規化の細部はTRLのバージョンに依存する。
10.4 実行コマンド
リポジトリのルートを /workspace にマウントした学習用Dockerコンテナ内で実行する例を示す。
# データ生成と報酬の単体テスト
python3 src/make_safegen_dataset.py --out-dir /workspace/data
python3 -m unittest discover -s tests -v
# Stage I:SFT
python3 src/train_sft_safegen.py
# Stage II:GRPO(まず少数ステップで動作確認)
python3 src/train_grpo_safegen.py --steps 5 --generations 4
SFTとGRPOで保存されるLoRAアダプタはそれぞれ次のディレクトリである。
outputs/gemma4-e2b-safegen-sft/
outputs/gemma4-e2b-safegen-grpo/
実装途中では、AutoProcessor がオフライン環境で前処理設定を読み込めない問題、PEFTがGemma 4のLoRA挿入先を自動認識できない問題、TRLが古いPyTorchのFSDP APIに依存して失敗する問題が発生した。今回のテキスト専用タスクでは AutoTokenizer を利用し、LoRAの target_modules を言語モデル側に限定し、PyTorchとTRLの互換バージョンを揃えることで学習を進めた。再現時は pip freeze で正常動作したバージョンを保存しておくことが重要である。
学習後は同じテスト問題を用いて、次のように比較する。
python3 src/evaluate_safegen.py \
--adapter /workspace/outputs/gemma4-e2b-safegen-sft
python3 src/evaluate_safegen.py \
--adapter /workspace/outputs/gemma4-e2b-safegen-grpo
評価指標はタスク成功率だけでなく、安全制約違反、前提条件違反、目標未達成、形式エラーの比率を含めるべきである。今回は学習80問題、評価16問題という小規模なPoCであり、改善が観測されても、汎化性能については複数Seedや難易度を変えた評価が必要である。
10.5 今後の拡張
次の段階では、今回のPython検証器を論文と同じPDDL3+VALに置き換えることが考えられる。その後、Isaac Sim等で幾何的な実行可能性を評価することで、記号的な安全性と物理的な制約を組み合わせたTask Planningへ拡張できる。
11. まとめ
- SafeGen-LLMは、LLMが生成したAction Sequenceを形式検証で採点し、その報酬をGRPOの学習信号として使う研究である。SFTは計画の書式と基本的な行動規則を学習し、GRPOは安全制約を重視するよう生成方策を改善する
- ORBITなどと同様に、計画のRewardを計算するためにVLAや実機を毎回動かす必要がない







