基于模型的強化學習
強化學習(RL)旨在讓智能體通過與環境互動來學習最優策略,從而最大化累積獎勵。傳統的強化學習方法如Q-learning、策略梯度等,通過大量的試錯來學習值函數或策略,樣本效率較低。而基于模型的強化學習(MBRL)則利用對環境的預測模型來加速學習過程,大大提高了樣本利用率。本章我們將系統地介紹MBRL的基本原理、核心算法、實現技巧以及代表性應用。
1. 采樣優化入門
在探討MBRL之前,我們先來回顧一下優化問題的兩大類解法:基于梯度的方法和基于采樣的方法。
1.1 基于梯度的優化
基于梯度的優化通過目標函數對參數的梯度信息來指導參數更新。給定參數 θ \theta θ 和損失函數 L ( θ ) L(\theta) L(θ),更新步驟為:
θ ← θ ? α ? θ L ( θ ) \theta \leftarrow \theta - \alpha \nabla_{\theta}L(\theta) θ←θ?α?θ?L(θ)
其中 α \alpha α 為學習率。這類方法在深度學習中被廣泛應用,優點是適用于高維參數空間,收斂速度快;缺點是需要損失函數可導,對優化問題的形式有一定要求。
1.2 基于采樣的優化
基于采樣的優化則不依賴梯度信息,而是通過在參數空間中采樣并評估樣本的性能來搜索最優解。以交叉熵方法(CEM)為例:
- 從某個分布(如高斯分布)中采樣一組參數 { θ i ~ p ( θ ) } i = 1 N \{\theta^i \sim p(\theta)\}_{i=1}^N {θi~p(θ)}i=1N?
- 評估各個樣本的損失 { L ( θ i ) } i = 1 N \{L(\theta^i)\}_{i=1}^N {L(θi)}i=1N?,選出表現最好的前k個樣本
- 用均值和方差來更新采樣分布 p ( θ ) p(\theta) p(θ)
- 重復以上過程直至找到最優解
基于采樣的優化的優點是:
- 易于并行化
- 不要求目標函數可導
- 適用于復雜的優化形式
缺點是:
- 難以處理高維參數空間
- 收斂速度較慢
在MBRL中,基于采樣的優化被廣泛用于規劃(planning)任務。例如我們可以通過在動作空間中采樣來搜索最優動作序列。
2. 基于模型的強化學習
MBRL的核心思想是學習一個對環境的預測模型,用它來推斷各種行為的后果,從而指導策略學習。相比無模型RL,MBRL能更有效地利用樣本,實現更高效、更穩定的學習。
2.1 如何學習一個好的動力學模型?
學習環境模型本質上是一個監督學習問題。我們希望學習一個函數 f ? ( s , a ) f_{\phi}(s,a) f??(s,a),使其能較好地預測在狀態 s s s 下執行動作 a a a 后,環境轉移到狀態 s ′ s' s′ 的結果。即:
min ? ? ∑ ( s , a , s ′ ) ∈ D ∥ f ? ( s , a ) ? s ′ ∥ 2 \min_{\phi} \sum_{(s,a,s')\in\mathcal{D}} \| f_{\phi}(s,a) - s'\|^2 ?min?(s,a,s′)∈D∑?∥f??(s,a)?s′∥2
其中 D = { ( s , a , s ′ ) i } \mathcal{D}=\{(s,a,s')_i\} D={(s,a,s′)i?} 為收集到的轉移數據集。
根據任務的特點,我們可以采用不同的建模方式,例如:
- 機器人控制:輸入為狀態和動作,輸出為下一狀態
- 視頻預測:輸入為之前的圖像序列,輸出為未來的圖像
- 物理引擎:在已知物理定律的基礎上,學習一些未知參數(如摩擦系數)
- 對話系統:用語言模型來預測對話的后續發展
- 金融市場:股票趨勢預測模型
可見,模型的形式依賴于具體問題,但萬變不離其宗,都是在擬合狀態轉移函數 p ( s ′ ∣ s , a ) p(s'|s,a) p(s′∣s,a) 。接下來的問題是,如何有效利用學到的模型?
2.2 如何利用學到的動力學模型?
2.2.1 使用模型進行規劃
規劃(planning)是指在給定模型的情況下,尋找最優動作序列 { a t ? } \{a^*_t\} {at??} 以最大化未來累積獎勵。形式化地,規劃問題可以表示為:
max ? a t : t + H ∑ t ′ = t t + H r ( s t ′ , a t ′ ) \max_{a_{t:t+H}} \sum^{t+H}_{t'=t} r(s_{t'}, a_{t'}) at:t+H?max?t′=t∑t+H?r(st′?,at′?)
其中 H H H 為規劃視界, r ( s , a ) r(s,a) r(s,a) 為獎勵函數。這個問題可以通過基于梯度的優化或基于采樣的優化來求解。
基于梯度的規劃
基于梯度的規劃通過反向傳播梯度來優化動作序列。主要步驟如下:
- 用當前策略(如隨機策略)采集數據 D = { ( s , a , s ′ ) i } \mathcal{D}=\{(s,a,s')_i\} D={(s,a,s′)i?}
- 訓練模型 f ? f_{\phi} f?? 來最小化預測誤差 ∑ i ∥ f ? ( s i , a i ) ? s i ′ ∥ 2 \sum_{i} \| f_{\phi}(s_i,a_i) - s'_i \|^2 ∑i?∥f??(si?,ai?)?si′?∥2
- 通過反向傳播優化動作序列 { a t ? } = arg ? max ? a t : t + H ∑ t ′ = t t + H r ( s t ′ , a t ′ ) \{a^*_t\} = \arg\max_{a_{t:t+H}} \sum^{t+H}_{t'=t} r(s_{t'}, a_{t'}) {at??}=argmaxat:t+H??∑t′=tt+H?r(st′?,at′?)
這里第3步通過梯度上升來優化目標函數。模型 f ? f_{\phi} f?? 充當了從動作到狀態的映射,使我們能夠計算目標函數對動作的梯度。
基于采樣的規劃
基于采樣的規劃則通過在動作空間中隨機采樣,并利用模型評估軌跡質量,來搜索最優動作序列。主要步驟如下:
- 用當前策略采集數據 D = { ( s , a , s ′ ) i } \mathcal{D}=\{(s,a,s')_i\} D={(s,a,s′)i?}
- 訓練模型 f ? f_{\phi} f?? 來最小化預測誤差
- 通過采樣搜索最優動作序列:
- 隨機采樣N組長度為H的動作序列 { A t : t + H i } i = 1 N \{A^i_{t:t+H}\}^N_{i=1} {At:t+Hi?}i=1N?
- 利用 f ? f_{\phi} f?? 預測各動作序列對應的狀態軌跡,并估算累積獎勵
- 選擇獎勵最高的動作序列 A ? = arg ? max ? A i ∑ t ′ = t t + H r ( s t ′ i , a t ′ i ) A^* = \arg\max_{A^i} \sum^{t+H}_{t'=t} r(s^i_{t'}, a^i_{t'}) A?=argmaxAi?∑t′=tt+H?r(st′i?,at′i?)
這里第3步本質上是一個啟發式搜索,通過模型模擬來評估候選動作序列的優劣。這種方法的好處是易于實現、可并行化、適用于任意形式的環境模型。
對于連續動作空間,一種更高效的采樣策略是交叉熵方法(CEM):
- 從高斯分布 N ( μ , Σ ) \mathcal{N}(\mu, \Sigma) N(μ,Σ) 中采樣N個動作序列 { A i } i = 1 N \{A^i\}^N_{i=1} {Ai}i=1N?
- 評估各動作序列的累積獎勵 J ( A i ) = ∑ t ′ = t t + H r ( s t ′ i , a t ′ i ) J(A^i) = \sum^{t+H}_{t'=t} r(s^i_{t'}, a^i_{t'}) J(Ai)=∑t′=tt+H?r(st′i?,at′i?)
- 選出獎勵最高的前k個動作序列 { A i j } j = 1 k \{A^{i_j}\}^k_{j=1} {Aij?}j=1k?
- 用 { A i j } j = 1 k \{A^{i_j}\}^k_{j=1} {Aij?}j=1k? 來更新高斯分布的均值和方差
- 重復以上過程,直至分布收斂
CEM相比隨機采樣,能更快地集中到高獎勵區域進行采樣,減少搜索代價。
規劃算法總結
方法 | 優點 | 缺點 |
---|---|---|
基于梯度 | 適用高維動作空間 | 需模型可導 |
隨機采樣 | 簡單,可并行 | 采樣效率低 |
交叉熵法 | 采樣高效 | 依賴初始分布 |
以上規劃算法都是開環(open-loop)控制,即先規劃一個動作序列,然后不更新地執行到底。這對模型精度要求很高,否則容易導致誤差累積。一種常用的改進是模型預測控制(model predictive control),即每次只執行規劃出的前幾步動作,然后重新規劃。通過反復規劃來及時修正誤差,使控制更加魯棒
2.2.2 使用模型指導策略學習
規劃的一個局限是需要精確的獎勵函數,且很難處理長期回報。一種更通用的做法是利用模型來輔助策略(policy)或值函數(value function)的學習。我們可以用學到的模型來增強真實的環境交互數據。具體來說,訓練過程為:
- 用當前策略 π \pi π 在真實環境中采樣數據 D e n v \mathcal{D}_{env} Denv?
- 訓練模型 f ? f_{\phi} f?? 來擬合狀態轉移函數
- 用 f ? f_{\phi} f?? 從 D e n v \mathcal{D}_{env} Denv? 中的各個狀態出發,模擬生成數據 D m o d e l \mathcal{D}_{model} Dmodel?
- 把 D e n v \mathcal{D}_{env} Denv? 和 D m o d e l \mathcal{D}_{model} Dmodel? 合并為 D R L \mathcal{D}_{RL} DRL?
- 用 D R L \mathcal{D}_{RL} DRL? 來訓練新策略 π ′ \pi' π′ (或值函數 V V V)
- 重復以上過程,即可迭代優化策略
這個過程可以與任意的無模型RL算法相結合,關鍵是用模型模擬數據來加速策略學習。通過對 D e n v \mathcal{D}_{env} Denv? 中的各個狀態seed模擬軌跡,我們能更充分地利用采集到的真實轉移數據。相比單純地想象完整軌跡,這種做法能更好地覆蓋狀態空間。
3. 案例分析:用MBRL實現機器人靈巧操控
DeepMind在2019年提出的一個工作,展示了用MBRL讓一只仿真五指機械手學會各種靈巧操控,如旋轉棒、翻轉刀等。盡管已經過去兩年,但這個結果至今仍是五指靈巧操控領域最激動人心的成果之一。讓我們來剖析一下他們是如何做到的。
3.1 問題定義
狀態空間: 機械手和物體的位置
動作空間: 24維,控制5個手指的關節角度
模型結構: 3個全連接網絡組成的集成模型,每個網絡有2個大小為500的隱藏層
獎勵函數: 跟蹤物體軌跡的誤差 + 懲罰掉落
規劃算法: 修改版的CEM,引入時間平滑正則化和更softer的加權平均
整體訓練過程為:交替地用CEM規劃采集大約30條軌跡數據,并用新數據更新集成模型,如此反復迭代。
3.2 仿真實驗
他們首先在MuJoCo物理引擎中構建仿真環境,測試不同RL算法的表現:
- 無模型RL:
- SAC:一種actor-critic算法
- NPG:一種策略梯度算法
- 有模型RL:
- PDDM:本文提出的MBRL算法
- MBPO:利用模型數據增強的RL算法
- PETS:基于CEM的MBRL算法
- Nagabandi et al.:基于隨機采樣的MBRL,不使用集成
從結果可以看出,MBRL算法的采樣效率明顯高于無模型RL,其中PDDM的表現最佳。進一步的消融實驗表明:
- 模型容量要足夠大,但太大也會過擬合
- 集成模型至少需要3個成員
- 規劃視界是個重要的權衡:太短則短視,太長則不可靠
- CEM的改進策略是關鍵,尤其是temporally-correlated探索
可見,PDDM之所以性能卓越,緣于以下幾點優化:
- 大容量集成模型,增強了預測魯棒性
- 適度的規劃視界,權衡了可靠性和遠見性
- 改進的CEM采樣,引入了探索的時間相關性
3.3 實物實驗
為了驗證算法在實物場景中的有效性,他們搭建了一套機械手系統,包括一只24關節的ShadowHand和一套PhaseSpace運動捕捉系統。
實物訓練面臨兩大挑戰:
- 采樣成本高,需要樣本高效的算法
- 很難完全復現初始狀態,增加了訓練難度
他們先在仿真環境中預訓練策略,再遷移到實物上微調。同時為了自動化采集數據,他們額外加了一只機械臂用于在每個回合將物體重置到初始位置。最終,系統在4小時內就學會了花式轉棒的技能,展現了MBRL的強大潛力。
4. 代碼實戰
下面我們通過一個簡單的例子來演示MBRL的實現。考慮倒立擺(Inverted Pendulum)環境,狀態為擺角 θ \theta θ 和角速度 θ ˙ \dot{\theta} θ˙,動作為施加在擺基座的水平力。我們的目標是學習一個策略,使擺盡快達到并保持直立平衡。
首先導入需要的庫:
import numpy as np
import torch
import gym
import matplotlib.pyplot as plt
然后定義一個神經網絡作為環境模型:
class Model(torch.nn.Module):def __init__(self, state_dim, action_dim):super().__init__()self.fc1 = torch.nn.Linear(state_dim + action_dim, 256)self.fc2 = torch.nn.Linear(256, 256)self.fc3 = torch.nn.Linear(256, state_dim)def forward(self, state, action):x = torch.cat([state, action], dim=-1)x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x))next_state = self.fc3(x)return next_state
模型輸入當前狀態和動作,輸出預測的下一狀態。接下來我們定義MBRL算法的主要組件:
class MBRL:def __init__(self, env, model, n_plan, n_iter, n_batch=128):self.env = env self.model = modelself.n_plan = n_plan # 規劃視界self.n_iter = n_iter # 總迭代次數self.n_batch = n_batch
其中env
為強化學習環境,model
為環境模型,n_plan
為規劃視界,n_iter
為總迭代次數,n_batch
為批大小。接下來實現數據采集函數:
def collect_data(self, n_samples):states, actions, rewards, next_states = [], [], [], []state = self.env.reset()for _ in range(n_samples):action = self.env.action_space.sample()next_state, reward, done, _ = self.env.step(action)states.append(state)actions.append(action)rewards.append(reward)next_states.append(next_state)state = next_state if not done else self.env.reset()states = torch.tensor(states, dtype=torch.float32)actions = torch.tensor(actions, dtype=torch.float32)rewards = torch.tensor(rewards, dtype=torch.float32)next_states = torch.tensor(next_states, dtype=torch.float32) return states, actions, rewards, next_states
這個函數使用隨機策略采集指定數量的轉移數據,并返回狀態、動作、獎勵和下一狀態的張量。有了真實數據,我們就可以訓練模型了:
def train_model(self, states, actions, next_states):dataset = torch.utils.data.TensorDataset(states, actions, next_states)dataloader = torch.utils.data.DataLoader(dataset, batch_size=self.n_batch, shuffle=True)criterion = torch.nn.MSELoss()optimizer = torch.optim.Adam(self.model.parameters())for epoch in range(5):for batch in dataloader:state, action, next_state = batchpred_next_state = self.model(state, action)loss = criterion(pred_next_state, next_state)optimizer.zero_grad()loss.backward()optimizer.step()
模型訓練采用均方損失和Adam優化器,訓練5個epoch,每個epoch遍歷整個數據集。接下來我們實現基于CEM的規劃器:
def plan(self, state):best_reward = -np.infbest_action_seq = Nonefor _ in range(100): # CEM迭代次數action_seqs = np.random.uniform(-2, 2, size=(128, self.n_plan))rewards = np.zeros(128)for t in range(self.n_plan):actions = torch.tensor(action_seqs[:, t], dtype=torch.float32)next_states = self.model(state, actions)rewards += self.env.get_reward(state.numpy(), actions.numpy())state = next_stateselite_idxs = rewards.argsort()[-10:] # 選取前10個最優軌跡 elite_action_seqs = action_seqs[elite_idxs]if rewards.max() > best_reward:best_reward = rewards.max()best_action_seq = action_seqs[rewards.argmax()]action_seqs = elite_action_seqs.mean(axis=0) + 0.5 * elite_action_seqs.std(axis=0) * np.random.randn(*elite_action_seqs.shape)return best_action_seq[0] # 返回第一個動作
規劃器從均勻分布中采樣128條動作序列,長度為n_plan
。然后用模型模擬各條序列對應的狀態軌跡,并估算累積獎勵。接著選出獎勵最高的10條軌跡,用它們的均值和方差來更新采樣分布。迭代若干次后,返回獎勵最高的動作序列的第一個動作。
最后,我們定義主循環,交替地采集數據、訓練模型和規劃動作:
def run(self):for i in range(self.n_iter):states, actions, _, next_states = self.collect_data(1000)self.train_model(states, actions, next_states)state = self.env.reset()for t in range(200): action = self.plan(torch.tensor(state, dtype=torch.float32))next_state, _, done, _ = self.env.step(action)state = next_stateif done:breakprint(f"Iteration {i}: lasted {t} steps")
主循環共執行n_iter
次,每次采集1000條數據,并用新數據訓練模型。然后用規劃器與環境交互200步,記錄并打印生存時長。
下面我們創建環境、模型和MBRL對象,啟動訓練:
env = gym.make("InvertedPendulum-v2")
model = Model(state_dim=env.observation_space.shape[0], action_dim=env.action_space.shape[0])
mbrl = MBRL(env, model, n_plan=20, n_iter=10)mbrl.run()
運行這段代碼,你將看到倒立擺在幾次迭代后就能很快達到平衡位置并長時間維持。這充分展示了MBRL的高效性和可行性。當然,這只是一個簡單示例,實際應用還需考慮更多技術細節,如模型集成、數據緩沖、策略約束等。感興趣的讀者可以進一步閱讀MBRL的前沿文獻。
5. 展望
MBRL利用環境模型來提高樣本利用率和策略質量,是一種頗具前景的強化學習范式。近年來,隨著深度學習的發展,MBRL在高維觀察空間和連續動作空間上取得了長足的進步。一些代表性工作包括:
- ME-TRPO[Kurutach et al., 2018]:集成模型+TRPO策略優化
- SLBO[Luo et al., 2018]:基于模型的數據增強
- PETS[Chua et al., 2018]:集成模型+CEM規劃
- POPLIN[Wang and Ba, 2019]:集成模型輔助TRPO策略優化
- POLO[Lowrey et al., 2019]:策略優化結合離線數據
- DMPO[Luo et al., 2019]:決策時集成規劃
這些工作極大地拓展了MBRL的應用范圍和實用價值。但MBRL還存在不少挑戰:
- 如何學習更準確、更魯棒的環境模型?
- 如何設計更高效、更可靠的規劃和探索機制?
- 如何在模型訓練和策略優化之間權衡計算資源?
- 如何處理復雜環境中的長期因果關系和延遲獎勵?
- 如何提高模型和策略的泛化性和適應性?
這需要RL、DL、規劃、控制等領域的協同創新。展望未來,MBRL有望與以下方向深度融合:
- 元學習:提高模型和策略的快速適應能力
- 遷移學習:實現跨任務、跨域的知識復用
- 因果推斷:建模環境中的因果結構,實現更可解釋、更穩定的策略學習
- 多智能體學習:解決多個智能體互動時的博弈和協作問題
MBRL代表了AI研究的一個重要趨勢,即用知識引導數據驅動的學習。通過模型這種先驗知識,我們可以更高效、更可靠、更可解釋地學習決策。這不僅能造福強化學習本身,也為構建大模型、訓練通用 AI 系統帶來了新的思路。
Q&A
我用一個簡單的例子來解釋無模型(model-free)和有模型(model-based)強化學習的區別。
假設你要訓練一個機器人學習走路,目標是走得盡可能快。環境的狀態是機器人的關節角度和角速度,動作是施加在關節上的力矩。
無模型RL:
- 機器人嘗試隨機動作,觀察狀態變化和獲得的獎勵(與走得快慢相關)。
- 根據這些數據,直接學習一個策略函數,告訴機器人在每個狀態下應該采取什么動作。
- 不斷重復 1-2,使策略逐漸優化,最終學會快速行走。
# Model-free RL偽代碼
for episode in range(n_episodes):state = env.reset() for step in range(max_steps):action = policy(state) # 策略根據狀態直接產生動作next_state, reward = env.step(action)update_policy(state, action, reward, next_state) # 更新策略state = next_state
這種方法的特點是:
- 直接學習策略函數,沒有對環境建模
- 需要大量的試錯和樣本數據
- 更新方向完全依賴當前策略采集的數據
有模型RL:
- 機器人嘗試隨機動作,觀察狀態變化,學習一個環境模型(輸入當前狀態+動作,預測下一狀態)。
- 用學到的模型進行虛擬試錯:在頭腦中預演不同動作序列的結果,選出一個最優的方案。
- 令機器人執行這個方案并更新環境模型,不斷重復 2-3,使策略和模型共同優化。
# Model-based RL偽代碼
model = initialize_model()
for episode in range(n_episodes):state = env.reset()for step in range(max_steps): action_plan = plan_with_model(model, state) # 用模型預演,選取最優動作序列for planned_step in range(plan_horizon):action = action_plan[planned_step] next_state, reward = env.step(action)model.update(state, action, next_state) # 更新環境模型state = next_state
這種方法的特點是:
- 顯式地學習環境模型,揭示了狀態轉移規律
- 通過模型預演來選取動作,減少真實環境中的試錯
- 可利用模型產生額外的虛擬數據,加速策略學習
無模型RL就像在一個陌生的城市摸索前行,只能根據已走過的路來決定下一步走哪。而有模型RL則像拿到了一張地圖,可以提前規劃路線,少走彎路。
什么時候用model-based更好?
- 當環境狀態轉移規律較簡單、容易建模時
- 當真實環境交互代價較高時(如機器人、自動駕駛)
- 當任務涉及多步規劃、長期因果推理時
之前的無模型方法還有用嗎?
- 當環境狀態轉移復雜、難以準確建模時
- 當大量采集真實數據的成本可以接受時
- 對于反應性的決策任務,無需多步規劃時
model-free和model-based是兩種不同的思路,各有優劣,應根據具體任務來選擇。近年來,也有許多工作嘗試將兩者結合,取長補短。比如用無模型RL預訓練,再用模型fine-tune;或者在model-based RL框架下引入無模型數據增強等。