用一句話講核心想法
深度確定性策略梯度(Deep Deterministic Policy Gradient, DDPG)接過上一篇的 actor-critic 圖,問了一個很乾淨的問題:如果 critic Q(s,a) 能告訴我一個動作有多好,那為什麼不直接順著 Q 的坡度去改進 actor?把 actor 的輸出往讓 Q 上升的方向推就好。
這裡的 actor 是一個確定性策略(deterministic policy):輸入一個狀態,輸出恰好一個動作,沒有隨機性。正是這點讓我們能乾淨地微分——actor 吐出的是一個我們可以推動的數值。
確定性策略梯度
具體來說,actor 的更新用的是連鎖法則。確定性策略梯度(deterministic policy gradient)說:先取 Q 對動作的梯度(如果我把扭矩推一下,價值會怎麼變?),再把它穿過 actor 對其權重的梯度。把兩者合起來,就得到每個權重該移動的方向,讓 actor 選出的動作在 critic 眼裡分數更高。
确定性策略梯度:将评论家对动作的梯度与行动者对其参数的梯度用链式法则相乘。
交互式梯度下降:一个点沿着局部坡度在弯曲曲面上滚动。
離策略機制:回放與目標網路
DDPG 是離策略(off-policy)的,也就是說它能從自己舊版本蒐集到的資料中學習。每一筆轉移(狀態、動作、獎勵、下一個狀態)都被丟進一個回放緩衝區(replay buffer),訓練時從中隨機抽取小批次。這讓每一次得來不易的機器人互動被重複利用很多次——當每一步都意味著真實馬達磨損時,這點至關重要。
讓 critic 去追自己不斷變動的預測是不穩定的,所以 DDPG 為 actor 與 critic 各保留一份緩慢移動的副本——目標網路(target networks)——用來計算學習目標。DDPG 不是猛然複製權重,而是每一步把目標往現役網路移動極小的一個比例(一種軟更新,常叫 Polyak 平均)。目標走得慢,學習就穩。
软目标更新:目标网络每步只按一个很小的比例 tau 朝在线网络缓慢靠拢,而不是整体复制。
在策略沒有隨機性時如何探索
確定性 actor 對同一個狀態永遠回傳同一個動作,所以光靠它自己永遠不會嘗試新東西。DDPG 在蒐集資料時於動作之上加入探索噪聲。原始論文用的是 Ornstein-Uhlenbeck(OU)噪聲——一種隨時間相關、平滑漂移而非抖動的噪聲——因為相關的探索對有慣性的系統(例如機器人的腿)比較溫和。
for each step:
a = actor(s) + noise # explore
a = clip(a, low, high) # respect motor limits
s2, r, done = env.step(a)
buffer.add(s, a, r, s2, done)
# learn from a random mini-batch
batch = buffer.sample()
y = r + gamma * critic_target(s2, actor_target(s2)) # target
update critic to match Q(s, a) -> y # regression
update actor along dQ/da * da/dweights # policy gradient
soft_update(targets)DDPG 何時發光,何時破裂
DDPG 是個里程碑——第一個能在許多 MuJoCo 任務上,直接從原始動作價值(action-value)估計學到好策略的方法。但實務工作者很快發現它脆弱:結果會隨著隨機種子大幅擺盪,對超參數很挑剔,而且在困難任務上 critic 往往變得過度樂觀,把 actor 拖向那些紙上看起來很棒、現實中卻失敗的動作。
正是這種過度樂觀——加上第一篇講的動作飽和(action saturation)問題——成了下一個方法 TD3 要修的東西。