Soft-Actor-Critic-强化学习算法
文章目錄
- Background
- Quick Facts
- Key Equations
- Entropy-Regularized Reinforcement Learning
- Soft Actor-Critic
- 學習Q.
- 學習策略。
- Exploration vs. Exploitation
- Pseudocode
- Documentation
Background
SAC算法,它以off-policy方式優化隨機策略,從而在隨機策略優化和DDPG方式之間建立了橋梁。 它不是TD3的直接后繼者,但它包含了裁剪過的double-Q技巧,并且由于SAC策略固有的隨機性,它還受益于諸如目標策略平滑之類的東西。
SAC的主要特征是熵正則化entropy regularization。 該策略經過訓練,可以最大程度地在預期收益和熵之間進行權衡,熵是策略中隨機性的一種度量。 這與探索和利用的權衡關系密切:增加熵會導致更多的探索,從而可以加快以后的學習速度。 它還可以防止策略過早收斂到不良的局部最優值。
Quick Facts
- SAC是off-policy的
- Spinningup 版本的SAC僅能用于連續動作空間的環境
- 對策略更新規則的改變可以使SAC用于處理離散動作空間
- Spinningup的SAC不能使用并行運算
Key Equations
為了解釋“SAC”,我們首先必須介紹熵正則化的強化學習設置。 在熵正則化的RL中,值函數的方程式略有不同。
Entropy-Regularized Reinforcement Learning
熵是一個可以粗略地說出隨機變量的隨機性的量。 如果對硬幣進行加權,使其幾乎總是出現正面,那么它的熵就很低。 如果權重均等并且有一半機會出現任一結果,則它具有很高的熵。
令xxx為隨機變量,服從密度函數PPP。xxx的熵HHH為:H(P)=Ex~P[?log?P(x)].H(P) = \underset{x \sim P}E[{-\log P(x)}].H(P)=x~PE?[?logP(x)].在正則熵的強化學習中,代理在每個時間步都獲得與該時間步的策略熵成正比的獎金獎勵。 這會將RL問題更改為:π?=arg?max?πEτ~π[∑t=0∞γt(R(st,at,st+1)+αH(π(?∣st)))],\pi^* = \arg \max_{\pi} \underset{\tau \sim \pi}E\bigg[{ \sum_{t=0}^{\infty} \gamma^t \bigg( R(s_t, a_t, s_{t+1}) + \alpha H\left(\pi(\cdot|s_t)\right) \bigg)}\bigg],π?=argπmax?τ~πE?[t=0∑∞?γt(R(st?,at?,st+1?)+αH(π(?∣st?)))],其中α>0\alpha>0α>0是平衡系數。(請注意:我們在這里假定了無限步長的折扣設置,此頁面的其余部分中也執行相同的操作。)現在,我們可以在此設置中定義稍有不同的值函數。VπV^\piVπ每個時間步驟的改變都包含熵獎勵:Vπ(s)=Eτ~π[∑t=0∞γt(R(st,at,st+1)+αH(π(?∣st)))∣s0=s]V^{\pi}(s) = \underset{\tau \sim \pi}E\bigg[{ \left. \sum_{t=0}^{\infty} \gamma^t \bigg( R(s_t, a_t, s_{t+1}) + \alpha H\left(\pi(\cdot|s_t)\right) \bigg) \right| s_0 = s}\bigg]Vπ(s)=τ~πE?[t=0∑∞?γt(R(st?,at?,st+1?)+αH(π(?∣st?)))∣∣∣∣∣?s0?=s]除了第一次,QπQ^\piQπ的改變也包含熵獎勵:Qπ(s,a)=Eτ~π[∑t=0∞γtR(st,at,st+1)+α∑t=1∞γtH(π(?∣st))∣s0=s,a0=a]Q^{\pi}(s,a) = \underset{\tau \sim \pi}E\bigg[{ \left. \sum_{t=0}^{\infty} \gamma^t R(s_t, a_t, s_{t+1}) + \alpha \sum_{t=1}^{\infty} \gamma^t H\left(\pi(\cdot|s_t)\right)\right| s_0 = s, a_0 = a}\bigg]Qπ(s,a)=τ~πE?[t=0∑∞?γtR(st?,at?,st+1?)+αt=1∑∞?γtH(π(?∣st?))∣∣∣∣∣?s0?=s,a0?=a]有了這些定義,VπandQπV^\pi\ and\ Q^\piVπ?and?Qπ以下面的方式連接:Vπ(s)=Ea~π[Qπ(s,a)]+αH(π(?∣s))V^{\pi}(s) = \underset{a \sim \pi}E[{Q^{\pi}(s,a)]} + \alpha H\left(\pi(\cdot|s)\right)Vπ(s)=a~πE?[Qπ(s,a)]+αH(π(?∣s))QπQ^\piQπ的Bellman方程為:Qπ(s,a)=Es′~P,a′~π[R(s,a,s′)+γ(Qπ(s′,a′)+αH(π(?∣s′)))]=Es′~P[R(s,a,s′)+γVπ(s′)].\begin{aligned}Q^{\pi}(s,a) &=\underset{s' \sim P,a' \sim \pi}E\bigg[{R(s,a,s') + \gamma\left(Q^{\pi}(s',a') + \alpha H\left(\pi(\cdot|s')\right) \right)}\bigg] \\ &= \underset{s' \sim P}E\bigg[{R(s,a,s') + \gamma V^{\pi}(s')}\bigg]. \end{aligned}Qπ(s,a)?=s′~P,a′~πE?[R(s,a,s′)+γ(Qπ(s′,a′)+αH(π(?∣s′)))]=s′~PE?[R(s,a,s′)+γVπ(s′)].?
我們在熵調整后的設置中設置值函數的方式有些隨意,實際上我們可以做得不同(例如,使QπQ^\piQπ在第一時間步長包括熵獎勵)。 關于該主題的論文,定義的選擇可能略有不同。
Soft Actor-Critic
SAC同時學習一個策略πθ\pi_\thetaπθ?,兩個Q-function Q?1,Q?2Q_{\phi_1},Q_{\phi_2}Q?1??,Q?2??,現在有兩種SAC的標準版本:一種使用一個固定的熵正則系數α\alphaα,另一種用一個熵的限制通過在訓練過程中正在變化的α\alphaα.出于簡單,Spiningup使用一個固定熵正則的系數,但是一般地實踐者更喜歡用限制熵的那個版本.
經過一些時間,SAC算法有些改變,老版本的sac除了Q-functions之外學習一個值函數VψV_{\psi}Vψ?;接下來會聚焦于當前版本,即不用額外的值函數.
學習Q.
Q-functions的學習與TD3的相似,但有某些關鍵地方不同.
相同點:
1.類似TD3, Q-functins都是通過對一個共同目標的回歸,用MSBE最小化來學習的.
2.類似TD3,共同的目標使用目標Q-網絡計算的,同時目標Q-網絡在訓練過程中通過polyak averaging Q-網絡的參數而得到.
3.類似TD3,共同的目標使用 the clipped doube-Q技巧.
不同點:
1.不同于TD3,目標包含一項從SAC的熵正則項.
2.不同于TD3,下一個狀態的動作不是從目標target策略得來的,而是從當前current策略得來的.
3.不同于TD3,它沒有明確的目標策略平滑.TD3修煉一個確定性策略,所以它通過加入隨機噪聲到下一個狀態的動作來達到平滑的效果.SAC訓練一個隨機策略,所以從概率隨機性而來的噪聲足以獲得一個類似的效果.
在我們構建Q-loss之前,討論一下熵正則的貢獻是怎么產生的.我們考慮之前熵正則的QπQ^\piQπ從循環的Bellman方程開始,用熵定義重寫:
Qπ(s,a)=Es′~R,a′~π[R(s,a,s′)+γ(Qπ(s′,a′)+αH(π(?∣s′)))]=Es′~P,a′~π[R(s,a,s′)+γ(Qπ(s′,a′)?αlogπ(a′∣s′))]\begin{aligned}Q^\pi(s,a) &=\underset{s'\sim R,a'\sim\pi}E\bigg[ R(s,a,s')+\gamma\bigg(Q^\pi(s',a')+\alpha H(\pi(\cdot|s'))\bigg)\bigg] \\ & = \underset{s'\sim P,a'\sim\pi}E\bigg[ R(s,a,s')+\gamma\bigg( Q^\pi(s',a')-\alpha log\pi(a'|s')\bigg) \bigg] \end{aligned}Qπ(s,a)?=s′~R,a′~πE?[R(s,a,s′)+γ(Qπ(s′,a′)+αH(π(?∣s′)))]=s′~P,a′~πE?[R(s,a,s′)+γ(Qπ(s′,a′)?αlogπ(a′∣s′))]?
RHS是對下一個狀態(來自緩沖區)和下一個操作(來自當前current策略,而不是緩沖區)的期望。因為它是一個期望,我們能用樣本來近似它:Qπ(s,a)≈r+γ(Qπ(s′,a~′)?αlogπ(a~′∣s′)),a~′~π(?∣s′).Q^\pi(s,a)\approx r+\gamma(Q^\pi(s',\tilde a')-\alpha log \pi(\tilde a'|s')),\ \ \tilde a'\sim\pi(\cdot|s').Qπ(s,a)≈r+γ(Qπ(s′,a~′)?αlogπ(a~′∣s′)),??a~′~π(?∣s′).
>用a~′\tilde a'a~′ 表示下一個動作,而不是a′a'a′,即接下來的動作必須從當前策略中重新算出(對比之下,r和s′r\ 和\ s'r?和?s′是從緩存中得到).
SAC用這種樣本對target的近似即對每個Q-function設置MSBE loss,這里唯一還不確定的是使用哪個Q函數來計算樣本backup:類似TD3,SAC使用clipped double-Q技巧,以及在兩個Q的近似中取最小的Q值.
把這些整合起來,SAC中的Q-網絡的損失函數為:L(?i,D)=E(s,a,r,s′,d)~D[(Q?i(s,a)?y(r,s′,d))2],L(\phi_i, {\mathcal D}) =\underset{(s,a,r,s',d) \sim {\mathcal D}}{{\mathrm E}}\Bigg[\bigg( Q_{\phi_i}(s,a)-y(r,s',d)\bigg)^2\Bigg],L(?i?,D)=(s,a,r,s′,d)~DE?[(Q?i??(s,a)?y(r,s′,d))2],其中目標為:y(r,s′,d)=r+γ(1?d)(minj=1,2Q?targ,j(s′,a~′)?αlogπθ(a~′∣s′)),a~′~πθ(?∣s′).y(r,s',d)=r+\gamma(1-d)\bigg(\underset{j=1,2}{min}Q_{\phi_{targ,j}}(s',\tilde a')-\alpha log\pi_\theta(\tilde a'|s')\bigg),\ \tilde a'\sim\pi_\theta(\cdot|s').y(r,s′,d)=r+γ(1?d)(j=1,2min?Q?targ,j??(s′,a~′)?αlogπθ?(a~′∣s′)),?a~′~πθ?(?∣s′).
學習策略。
在每個狀態中,策略應該以未來回報的期望加上未來熵的期望的最大化去選擇動作。即它應最大化Vπ(s)V^\pi(s)Vπ(s),我們能將其擴展進:Vπ(s)=Ea~π[Qπ(s,a)+αH(π(?∣s))]=Ea~π[Qπ(s,a)?αlog?π(a∣s)].\begin{aligned}V^{\pi}(s) &= \underset{a \sim \pi} E[{Q^{\pi}(s,a)} + \alpha H\left(\pi(\cdot|s)\right)] \\ &= \underset{a \sim \pi}E[{Q^{\pi}(s,a) - \alpha \log \pi(a|s)}].\end{aligned}Vπ(s)?=a~πE?[Qπ(s,a)+αH(π(?∣s))]=a~πE?[Qπ(s,a)?αlogπ(a∣s)].?我們優化策略的方法利用了重新參數化技巧,其中通過計算狀態、策略參數和獨立噪聲的確定性函數從πθ(?∣s)\pi_\theta(\cdot|s)πθ?(?∣s)中抽取樣本。 為了說明:按照SAC論文的作者,我們用一個壓縮的高斯策略,這意味著根據以下取樣:a~θ(s,ξ)=tanh?(μθ(s)+σθ(s)⊙ξ),ξ~N(0,I).\tilde{a}_{\theta}(s, \xi) = \tanh\left( \mu_{\theta}(s) + \sigma_{\theta}(s) \odot \xi \right), \;\;\;\;\; \xi \sim \mathcal{N}(0, I).a~θ?(s,ξ)=tanh(μθ?(s)+σθ?(s)⊙ξ),ξ~N(0,I).
該策略與我們在其他策略優化算法中使用的策略有兩個主要區別:
1.壓縮函數。 SAC策略中的 tanh可確保將動作限制在有限范圍內。 VPG,TRPO和PPO策略中沒有此功能。 它還會改變分布:在 tanh 之前,SAC策略像其他算法的策略一樣是factored Gaussian,但在 tanh之后卻不是。 (不過,您仍然可以以相近的形式計算動作的對數概率:有關詳細信息,請參見文章附錄。)
2.標準偏差的參數化方式。 在VPG,TRPO和PPO中,我們用與狀態無關的參數向量表示log std devs(對數標準差)。 在SAC中,我們將對數標準差表示為神經網絡的輸出,這意味著它們以復雜的方式依賴狀態。 根據我們的經驗,具有獨立于狀態的對數標準差的SAC是無效的。 (您能想到原因嗎?或者最好:進行實驗以進行驗證?)
重新參數化技巧使我們可以將對動作的期望(包含一個痛點:分布取決于策略參數)重寫進對噪聲的期望(這消除了痛點:現在分布不依賴參數):Ea~πθ[Qπθ(s,a)?αlog?πθ(a∣s)]=Eξ~N[Qπθ(s,a~θ(s,ξ))?αlog?πθ(a~θ(s,ξ)∣s)]E_{a \sim \pi_{\theta}}[{Q^{\pi_{\theta}}(s,a) - \alpha \log \pi_{\theta}(a|s)} ]= E_{\xi \sim \mathcal{N}}[{Q^{\pi_{\theta}}(s,\tilde{a}_{\theta}(s,\xi)) - \alpha \log \pi_{\theta}(\tilde{a}_{\theta}(s,\xi)|s)}]Ea~πθ??[Qπθ?(s,a)?αlogπθ?(a∣s)]=Eξ~N?[Qπθ?(s,a~θ?(s,ξ))?αlogπθ?(a~θ?(s,ξ)∣s)]為了得到策略損失,最后一步是我們需要用我們的函數近似器替代QπθQ^{\pi_{\theta}}Qπθ?。 與TD3不同(它用Q?1Q_{\phi_1}Q?1??,即第一個Q近似器),SAC使用minj=1,2Q?j\underset{j=1,2}{min}{Q_{\phi_j}}j=1,2min?Q?j??(即兩個Q近似中最小的)。 因此,策略的優化根據max?θEs~D,ξ~N[minj=1,2Q?j(s,a~θ(s,ξ))?αlog?πθ(a~θ(s,ξ)∣s)],\max_{\theta} E_{s \sim \mathcal{D} , \xi \sim \mathcal{N}}\bigg[{\underset{j=1,2}{min}{Q_{\phi_j}}(s,\tilde{a}_{\theta}(s,\xi)) - \alpha \log \pi_{\theta}(\tilde{a}_{\theta}(s,\xi)|s)}\bigg],θmax?Es~D,ξ~N?[j=1,2min?Q?j??(s,a~θ?(s,ξ))?αlogπθ?(a~θ?(s,ξ)∣s)],除了min-double-Q技巧,隨機性和熵項外,它與DDPG和TD3策略優化幾乎相同。
Exploration vs. Exploitation
SAC通過熵正則化訓練隨機策略,并以on-policy方式進行探索。 熵正則化系數α\alphaα明確控制探索-利用權衡,較高的α\alphaα對應于更多的探索,而較低的α\alphaα對應于更多的利用。 正確的系數(導致學習最穩定/最高獎勵的系數)可能因環境而異,可能需要仔細調整。
在測試時,要查看該策略如何充分利用其所學知識,我們將消除隨機性,并使用均值動作而不是分布中的一個樣本。 這往往會提高原始隨機策略的性能。
在訓練開始時,我們的SAC使用了一個技巧來改善探索。 對于開始時有固定數量的步驟(使用start_steps關鍵字參數設置),代理將執行動作,這些動作是從均勻隨機分布的有效動作中采樣的。 之后,它將恢復為正常的SAC探索。
Pseudocode
## 之前的版本
## 動作離散型
Documentation
spinup.sac(env_fn, actor_critic=, ac_kwargs={}, seed=0, steps_per_epoch=5000, epochs=100, replay_size=1000000, gamma=0.99, polyak=0.995, lr=0.001, alpha=0.2, batch_size=100, start_steps=10000, max_ep_len=1000, logger_kwargs={}, save_freq=1)
Parameters:
- env_fn – A function which creates a copy of the environment. The environment must satisfy the OpenAI Gym API.
- actor_critic – A function which takes in placeholder symbols for state, x_ph, and action, a_ph, and returns the main outputs from the agent’s Tensorflow computation graph:
- ac_kwargs (dict) – Any kwargs appropriate for the actor_critic function you provided to SAC.
- seed (int) – Seed for random number generators.
- steps_per_epoch (int) – Number of steps of interaction (state-action pairs) for the agent and the environment in each epoch.
- epochs (int) – Number of epochs to run and train agent.
- replay_size (int) – Maximum length of replay buffer.
- gamma (float) – Discount factor. (Always between 0 and 1.)
- polyak (float) – Interpolation factor in polyak averaging for target networks. Target networks are updated towards main networks according to:θtarg←ρθtarg+(1?ρ)θ\theta_{targ}\leftarrow\rho\theta_{targ}+(1-\rho)\thetaθtarg?←ρθtarg?+(1?ρ)θwhere ρ\rhoρ is polyak. (Always between 0 and 1, usually close to 1.)
- lr (float) – Learning rate (used for both policy and value learning).
- alpha (float) – Entropy regularization coefficient. (Equivalent to inverse of reward scale in the original SAC paper.)
- batch_size (int) – Minibatch size for SGD.
- start_steps (int) – Number of steps for uniform-random action selection, before running real policy. Helps exploration.
- max_ep_len (int) – Maximum length of trajectory / episode / rollout.
- logger_kwargs (dict) – Keyword args for EpochLogger.
- save_freq (int) – How often (in terms of gap between epochs) to save the current policy and value function.
總結
以上是生活随笔為你收集整理的Soft-Actor-Critic-强化学习算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Twin Delayed DDPG(TD
- 下一篇: 强化学习-Vanilla Policy