新的目標:成功且保持隨機
DDPG 與 TD3 只最大化期望獎勵,沒別的。Soft Actor-Critic(SAC)改變了目標函數本身。它最大化的是獎勵加上策略的熵——也就是動作選擇有多隨機的一種度量。這就是最大熵強化學習目標(maximum-entropy RL objective):在任務允許的範圍內盡量不可預測,同時盡可能成功。
SAC 的最大熵目標:在獎勵之外再加上由溫度 alpha 加權的策略熵,一起最大化。
為什麼要獎勵隨機性?因為一個被推著保持寬廣的策略會自己持續探索,抗拒塌縮到單一脆弱的行為上,而且常常能找到解決任務的多種方式。這是把熵正則化(entropy regularization)從附帶獎勵提拔成目標函數裡的一等公民。
一個隨機、被壓扁的 actor
要有熵,SAC 的 actor 就必須是一個隨機策略(stochastic policy)——它輸出的是動作上的一個分布,而不是單一動作。標準選擇是被壓扁的高斯策略(squashed Gaussian policy):網路輸出一個均值與一個標準差,你從這個高斯分布抽樣,再把樣本通過 tanh 折進動作的上下限內。
tanh 壓扁讓動作保持合法,但會扭曲機率,所以 SAC 在計算熵時加上一個小修正來補償它。這是一段已知的帳務工作——值得標出來,因為忘掉它是個經典的實作 bug。
重參數化梯度
現在有個謎題:你要怎麼穿過一個隨機樣本取梯度?如果 actor 抽樣它的動作,抽樣這一步似乎會擋住梯度。解法是重參數化梯度(reparameterization gradient):把動作寫成 均值 + 標準差 × epsilon,其中 epsilon 是從標準高斯抽出的固定噪聲。隨機性現在住在 epsilon 裡,而它沒有參數,於是梯度能順暢地流過網路產生的均值與標準差。
變分自編碼器:編碼器映射到隱變數分布,取樣後再由解碼器重建。
SAC 也借用了 TD3 的裁剪雙 Q(clipped double-Q):它訓練兩個 critic,目標裡取它們的最小值,理由同樣是對抗高估。前幾篇的零件持續帶來回報。
自動調整溫度
大家最討厭調的那個超參數就是溫度 alpha——太高智能體就亂揮,太低它就提早塌縮。解法是溫度自動調整(automatic temperature tuning):不固定 alpha,改成固定一個目標熵(你想要的隨機程度,常依動作維度數來設定),讓梯度下降自己調整 alpha 來達到它。整個訓練過程中,智能體會自動維持你要求的探索程度,不多不少。
溫度的自動調節:調整 alpha,使策略的熵保持在目標水準 bar-H 附近。
# SAC actor update (reparameterized) eps = randn_like(mean) a = tanh(mean + std * eps) # reparameterized, bounded sample logp = gaussian_logprob(mean, std, ...) - tanh_correction(a) q = min(critic1(s, a), critic2(s, a)) # clipped double-Q actor_loss = (alpha * logp - q).mean() # maximize q - alpha*logp # temperature follows a target entropy alpha_loss = -(log_alpha * (logp + target_entropy).detach()).mean()
為什麼 SAC 成了預設選擇
SAC 是離策略的(所以樣本效率高,重複利用回放緩衝區),跨種子穩定,又因為溫度自動化而大致免去了瑣碎的調參。在 MuJoCo 套件上它持平或勝過 TD3,同時更穩健。對今天大多數新的連續控制問題來說,SAC 是合理的第一個嘗試對象。