参考:
- 《动手学强化学习》 张伟楠、沈键、俞勇
- 强化学习课程:https://www.bilibili.com/video/BV1oN4y1F7UM/
- 强化学习入门 第三讲 蒙特卡罗方法:https://zhuanlan.zhihu.com/p/25743759
- 强化学习进阶 第六讲 策略梯度方法:https://zhuanlan.zhihu.com/p/26174099
- 强化学习入门 第四讲 时间差分法(TD):https://zhuanlan.zhihu.com/p/25913410
- A2C、A3C:https://blog.csdn.net/qq_43838114/article/details/127257760
本文是对以上参考链接的学习总结,如果错误欢迎指出~
动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到目标问题的解。
动态规划会保存已解决的子问题的答案,在求解目标问题的过程中可以直接使用。
使用动态规划求解的核心在于寻找最优的策略 π \pi π以最大化值函数,动态规划方法要事先知道环境的状态转移函数和奖励函数。
对当前策略进行策略评估,得到其状态价值函数,根据该状态价值函数进行策略提升以得到一个更好的新策略
当知道奖励函数和状态转移函数时,就可以根据下一个状态的价值来计算当前状态的价值了,也就是在当前策略下对当前状态进行评估。
即
V k + 1 ( s ) = ∑ a ∈ A π ( a ∣ s ) ( r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V k ( s ′ ) ) \begin{aligned} V_{k+1}(s)=\sum\limits_{a\in \mathcal{A}}\pi(a|s)\left(r(s,a)+\gamma \sum\limits_{s'\in \mathcal{S}}P(s'|s,a)V_k(s')\right) \end{aligned} Vk+1(s)=a∈A∑π(a∣s)(r(s,a)+γs′∈S∑P(s′∣s,a)Vk(s′))
可知, V k = V π V_k=V_\pi Vk=Vπ是以上更新公式的一个不动点。当 k → ∞ k \rightarrow \infty k→∞时,序列 { V k } \{V_k\} {Vk}会收敛到 V π V_\pi Vπ。
在每一个状态选择动作价值最大的动作,即 π ′ ( s ) = arg max a q π ( s , a ) = arg max a { r ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V π ( s ′ ) } \pi'(s)=\arg\max\limits_a q_\pi(s,a)=\arg\max\limits_a \{r(s,a)+\gamma\sum\limits_{s'}P(s'|s,a)V_\pi(s') \} π′(s)=argamaxqπ(s,a)=argamax{r(s,a)+γs′∑P(s′∣s,a)Vπ(s′)}
此时,策略 π ′ \pi' π′能够比策略 π \pi π更好,或者至少一样好。
算法流程:
可以被认为是一种策略评估只进行了一轮更新的策略迭代算法,价值迭代中不存在显示的策略,只维护一个状态价值函数。
算法流程:
蒙特卡洛方法是一种基于概率统计的数值计算方法,通常使用重复随机抽样,利用概率统计方法从抽样结果中归纳出想要得到的目标数值估计。
使用蒙特卡洛方法估计一个策略在一个马尔可夫决策过程中的状态价值,可以用策略在MDP上采样很多条序列,计算从这个状态出发的回报再求期望,公式为 V π ( s ) = E π [ G t ∣ S t = s ] ≈ 1 N ∑ i = 1 N G t ( i ) V_\pi(s)=E_\pi[G_t|S_t=s]\approx \frac{1}{N}\sum\limits_{i=1}^N G_t^{(i)} Vπ(s)=Eπ[Gt∣St=s]≈N1i=1∑NGt(i)
利用蒙特卡罗方法求状态 s s s处的值函数时,可以分为第一次访问蒙特卡罗方法和每次访问蒙特卡罗方法。
根据大数定律有,当 N ( s ) → ∞ N(s) \rightarrow \infty N(s)→∞时,有 v ( s ) → v π ( s ) v(s) \rightarrow v_\pi(s) v(s)→vπ(s)
该算法是一种基于值函数的强化学习方法,其动作价值更新用到了当前状态 s s s、当前动作 a a a、获得的奖励 r r r、下一个状态 s ′ s' s′、下一个动作 a ′ a' a′,因此得名Sarsa。
在不知道奖励函数和状态转移函数的情况下,可以直接用时序差分算法来估计动作价值函数 Q Q Q:
q ( s t , a t ) ← q ( s t , a t ) + α [ r t + γ q ( s t + 1 , a t + 1 ) − q ( s t , a t ) ] q(s_t,a_t)\leftarrow q(s_t,a_t)+\alpha [r_{t}+\gamma q(s_{t+1},a_{t+1})-q(s_t,a_t)] q(st,at)←q(st,at)+α[rt+γq(st+1,at+1)−q(st,at)]
之后,可以采用贪婪算法或 ε − s o f t \varepsilon-soft ε−soft贪婪策略来选取在某个状态下动作价值最大的动作,即 arg max a q ( s , a ) \arg \max\limits_{a} q(s,a) argamaxq(s,a)。
在实际算法实现的过程中,主要维护一张表——Q_table()
,该表用来存储当前策略下所有状态动作对的价值,在与环境交互时,用贪婪算法或 ε − s o f t \varepsilon-soft ε−soft贪婪策略根据动作价值选取动作来和环境交互,再根据得到的数据用时序差分算法更新动作价值估计。
算法流程:
Sarsa算法中动作价值函数的更新只用到了一步时序差分,这样的估计方式使得估计价值与真实价值偏差较大,因此可以使用n步的奖励来估计当前状态的价值,也就是对应的多步Sarsa算法:
q ( s t , a t ) ← q ( s t , a t ) + α [ r t + γ r t + 1 + ⋯ + γ n q ( s t + n , a t + n ) − q ( s t , a t ) ] q(s_t,a_t)\leftarrow q(s_t,a_t)+\alpha[r_{t}+\gamma r_{t+1}+\dots+\gamma^n q(s_{t+n},a_{t+n})-q(s_t,a_t)] q(st,at)←q(st,at)+α[rt+γrt+1+⋯+γnq(st+n,at+n)−q(st,at)]
因为探索是强化学习能够获得更好策略的一个非常重要的方式,为了防止强化学习算法只单纯的利用已知价值最大的动作,可以设计一种较为温和的探索方式: ε − s o f t \varepsilon-soft ε−soft。该策略使得采用动作集中的每个动作的概率都大于0,也就是尽可能保证每个状态都能访问到。
ε − s o f t \varepsilon-soft ε−soft策略如下:
π ( a ∣ s ) = { ϵ / ∣ A ∣ + 1 − ϵ i f a = arg max a ′ q ( s , a ′ ) ϵ / ∣ A ∣ 其 他 动 作 \pi (a|s)=\begin{cases} \epsilon/|A|+1-\epsilon \qquad if \quad a=\arg\max_{a'}q(s,a') \\ \epsilon/|A| \qquad 其他动作 \end{cases} π(a∣s)={ϵ/∣A∣+1−ϵifa=argmaxa′q(s,a′)ϵ/∣A∣其他动作
即有 1 − ϵ 1-\epsilon 1−ϵ的概率采用动作价值最大的那个动作,有 ϵ \epsilon ϵ的概率从动作空间中随机采取一个动作
TD的off-policy版本。
该算法的时序差分更新方式为:
q ( s t , a t ) ← q ( s t , a t ) + α [ r t + γ max a q ( s t + 1 , a ) − q ( s t , a t ) ] q(s_t,a_t)\leftarrow q(s_t,a_t)+\alpha[r_{t}+\gamma \max\limits_a q(s_{t+1},a)-q(s_t,a_t)] q(st,at)←q(st,at)+α[rt+γamaxq(st+1,a)−q(st,at)]
具体流程为:
算法 | Q-learning | Sarsa |
---|---|---|
相同点 | 基于时序差分的思想 | 基于时序差分的思想 |
不同点 | q ( s t , a t ) ← q ( s t , a t ) + α [ r t + γ max a q ( s t + 1 , a ) − q ( s t , a t ) ] q(s_t,a_t)\leftarrow q(s_t,a_t)+\alpha[r_{t}+\gamma \max\limits_a q(s_{t+1},a)-q(s_t,a_t)] q(st,at)←q(st,at)+α[rt+γamaxq(st+1,a)−q(st,at)] | q ( s t , a t ) ← q ( s t , a t ) + α [ r t + γ q ( s t + 1 , a t + 1 ) − q ( s t , a t ) ] q(s_t,a_t)\leftarrow q(s_t,a_t)+\alpha [r_{t}+\gamma q(s_{t+1},a_{t+1})-q(s_t,a_t)] q(st,at)←q(st,at)+α[rt+γq(st+1,at+1)−q(st,at)] |
策略 | 离线策略(off-policy) | 在线策略(on-policy) |
Q-learning算法更新动作价值函数采用贪婪法策略,选择当前最大的动作价值函数更新,此时采用的a并不会被真正执行;与环境交互时还是会按照epsilon-soft法的策略选择a | Sarsa优化的是它实际执行的策略,它直接拿下一步会执行的action来去优化Q,即在学习的过程中,用一种策略去做action的选取,也用同一种策略去做优化。 |
2.3和2.4展示的方法更多的是基于表格Q_table
来进行更新学习的,但是在状态或动作数量非常大,或状态和动作连续的时候,就无法使用表格的方式来进行强化学习。因此,可以考虑使用神经网络来表示函数 Q Q Q。
假设神经网络拟合函数的参数为 w w w,则每一个状态 s s s下所有可能动作 a a a的 Q Q Q值为 q w ( s , a ) q_w(s,a) qw(s,a),用于拟合函数的神经网络为 Q Q Q网络。网络的输入是当前状态,输出是agent根据当前状态得到的所有动作的动作价值函数。
为了重复利用经验数据,同时打散各状态之间的相关性,DQN中提出了经验回放策略。具体操作方式是将每次从环境采样得到的四元组数据(状态、动作、奖励、下一状态)
放到replay buffer中,训练网络的时候,随机采样若干数据进行训练。
进一步的,为了更高效的利用数据,还有一种优先回放算法,也就是给replay buffer中的各条数据设定不同的采样概率,也可以理解为数据的优先级。一般情况下,认为具有较大TD偏差的数据对于参数更新量越大,学习效率越高,对应的优先级也就越高。
目标网络是DQN算法的另一个技巧。
DQN算法的更新目标是让 q w ( s , a ) q_w(s,a) qw(s,a)逼近 r + γ max a ′ ∈ A q w ( s ′ , a ′ ) r+\gamma \max\limits_{a' \in \mathcal{A}}q_w(s',a') r+γa′∈Amaxqw(s′,a′),可以看到,在利用梯度上升法更新网络参数的同时,还使得网络学习的目标也发生了变化,这种学习方式很不稳定。
因此可以使用两套网络进行训练学习:
DQN算法流程:
该算法主要用来解决DQN对Q值的过高估计,在动作选择数过多的环境中,Q值的过高估计会更严重
DQN算法中首先选取了当前状态下的最优动作,接着根据最优动作计算对应价值。由于神经网络的误差,这种方式下容易产生正向误差积累,也就是出现了目标的过高估计,为了解决这一问题,提出了Double DQN网络。
Double DQN算法提出使用两套神经网络来完成,即将目标改写为: q w − ( s ′ , arg max a ′ q w ( s ′ , a ′ ) ) q_{w^-}(s',\arg\max\limits_{a'}q_{w}(s',a')) qw−(s′,arga′maxqw(s′,a′))
具体做法为:一套神经网络 q w q_w qw来选取价值最大的动作,另一套神经网络 q w − q_{w^-} qw−来计算该动作的价值。将其与传统DQN算法结合,即使用训练网络来选取动作,使用目标网络来计算动作的价值。
该算法能够很好地学习到不同动作的差异性,在动作空间较大的环境下非常有效
该方法将状态价值函数和优势函数分开建模,以期智能体能更好地处理与动作关联度较小的状态。
在Dueling DQN中,Q网络被建模为 q η , α , β ( s , a ) = V η , α ( s ) + A η , β ( s , a ) − max a ′ A η , β ( s , a ′ ) q_{\eta,\alpha,\beta}(s,a)=V_{\eta,\alpha}(s)+A_{\eta,\beta}(s,a)-\max_{a'} A_{\eta,\beta}(s,a') qη,α,β(s,a)=Vη,α(s)+Aη,β(s,a)−maxa′Aη,β(s,a′),其中,
总结:
在该算法中,智能体根据当前策略直接和环境交互,利用采样得到的完整的轨迹数据(从开始到结束)直接计算策略参数的梯度,进而更新当前策略。该算法使用蒙特卡洛方法来估计梯度策略中的 Q π θ Q^{\pi_\theta} Qπθ。
具体流程为:
A2C的全称是Advantage Actor Critic。 A2C的出现是为了解决AC的高方差问题。
动作的回报都是正值并不代表动作都是好的,有些未探索到的动作可能得到的回报会比该动作更好。为了有选择地学习更好的行为,常常给Q值增加一个基线,使得反馈有正有负,在不改变策略梯度的同时,降低方差。这里的基线通常用状态的价值函数来表示。
此时的梯度可以表示为:
g = E π [ ( Q π ( s t , a t ) − V π ( s t ) ) ▽ θ log π θ ( a t ∣ s t ) ] g=E_\pi[(Q_\pi(s_t,a_t)-V_\pi(s_t)) \bigtriangledown_\theta \log \pi_\theta(a_t|s_t)] g=Eπ[(Qπ(st,at)−Vπ(st))▽θlogπθ(at∣st)]
A3C全称为异步优势动作评价算法(Asynchronous advantage actor-critic)。
A3C使用了异步的方式来解决网络训练时数据独立同分布的问题,异步是指数据并非同时产生,其模型如下:
PPO属于在线策略算法,因为即使优化目标中包含重要性采样的过程,但是只用到了上一轮策略的数据,而不是过去所有策略的数据。
PPO是A-C框架,actor网络负责输出策略,critic网络负责输出value-function(或者advantage-function)辅助actor进行评估。
在深度模型更新参数的过程中,可能由于步长太长,使得策略突然变差。所以,可以通过设置一些限制条件,划定参数更新的区域,使得参数的更新只在所划区域上进行。这种方法称为信任区域策略优化(trust region policy optimization,TRPO)算法。
假设当前策略为 π θ \pi_\theta πθ,参数为 θ \theta θ,借助 θ \theta θ寻找一个更优参数 θ ′ \theta' θ′,得到新的策略 π θ ′ \pi_{\theta'} πθ′,通过推导得到的算法目标如下:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \max_\theta E_…
PPO算法基于TRPO的思想,但是实现更加简单。主要有两种形式,一种是PPO-惩罚,一种是PPO-截断。
PPO-penalty用拉格朗日乘数法将KL散度的限制放入目标函数中,将其转换成一个无约束的优化问题,在迭代的过程中不断更新KL散度前的系数。即:
arg max θ E s ∼ v π θ k E a ∼ π θ k ( ⋅ ∣ s ) [ π θ ′ ( a ∣ s ) π θ k ( a ∣ s ) A π θ k ( s , a ) − β D K L ( π θ k ( ⋅ ∣ s ) , π θ ′ ( ⋅ ∣ s ) ) ] \arg\max_\theta E_{s\sim v^{\pi_{\theta_k}}}E_{a\sim \pi_{\theta_{k}}(\cdot|s)}\left[\frac{\pi_{\theta'}(a|s)}{\pi_{\theta_k}(a|s)}A^{\pi_{\theta_k}}(s,a) -\beta D_{KL}(\pi_{\theta_{k}}(\cdot|s),\pi_{\theta'}(\cdot|s)) \right] argθmaxEs∼vπθkEa∼πθk(⋅∣s)[πθk(a∣s)πθ′(a∣s)Aπθk(s,a)−βDKL(πθk(⋅∣s),πθ′(⋅∣s))]
令 d k = D K L v π θ k ( π θ k , π θ ′ ) d_k=D_{KL}^{v^{\pi_{\theta_k}}}(\pi_{\theta_k},\pi_{\theta'}) dk=DKLvπθk(πθk,πθ′), β \beta β按照如下规则更新:
δ \delta δ是超参数,用于限制学习策略和前一轮策略的差距
PPO-clip对目标函数进行限制,保证新旧参数的差距不会过大:
arg max θ ′ E s ∼ v π θ k E a ∼ π θ k ( ⋅ ∣ s ) [ min ( π θ ′ ( a ∣ s ) π θ k ( a ∣ s ) A π θ k ( s , a ) , c l i p ( π θ ′ ( a ∣ s ) π θ k ( a ∣ s ) , 1 − ϵ , 1 + ϵ ) A π θ k ( s , a ) ) ] \arg\max_{\theta'} E_{s\sim v^{\pi_{\theta_k}}}E_{a\sim \pi_{\theta_{k}}(\cdot|s)}\left[\min\left( \frac{\pi_{\theta'}(a|s)}{\pi_{\theta_k}(a|s)}A^{\pi_{\theta_k}}(s,a),clip\left(\frac{\pi_{\theta'}(a|s)}{\pi_{\theta_k}(a|s)},1-\epsilon,1+\epsilon\right)A^{\pi_{\theta_k}}(s,a) \right)\right] argθ′maxEs∼vπθkEa∼πθk(⋅∣s)[min(πθk(a∣s)πθ′(a∣s)Aπθk(s,a),clip(πθk(a∣s)πθ′(a∣s),1−ϵ,1+ϵ)Aπθk(s,a))]
其中,
深度确定性策略梯度(deep deterministic policy gradient,DDPG)算法,它能够使用离线策略算法来处理动作空间无限的环境,通过构造一个确定性策略,用梯度上升的方法来最大化 Q Q Q值。
该算法依旧使用actor-critic架构,critic网络表示动作价值 q q q,actor网络表示策略 μ \mu μ。
确定性策略梯度定理为:
▽ θ J ( π θ ) = E s ∼ v π β [ ▽ θ μ θ ( s ) ▽ a q w μ ( s , a ) ∣ a = μ θ ( s ) ] \bigtriangledown_\theta J(\pi_\theta)=E_{s\sim v^{\pi_\beta}}[\bigtriangledown_\theta\mu_\theta(s)\bigtriangledown_aq_w^\mu(s,a)|_{a=\mu_\theta(s)}] ▽θJ(πθ)=Es∼vπβ[▽θμθ(s)▽aqwμ(s,a)∣a=μθ(s)]
其中, π β \pi_\beta πβ是用来收集数据的行为策略。
该定理可以理解为,假设已有函数 q q q,给定状态 s s s,由于现在动作空间是无限的,因此,利用确定性策略 μ \mu μ来找到使 q ( s , a ) q(s,a) q(s,a)值最大的动作 a a a,即 μ ( s ) = arg max a q ( s , a ) \mu(s)=\arg\max_aq(s,a) μ(s)=argmaxaq(s,a),此时动作也是确定的,不具有随机性。
DDPG在实现时需要4个神经网络,其中actor和critic各用一个网络,并各自都再有一个目标网络。DDPG中,目标网络使用公式: w − ← τ w + ( 1 − τ ) w − w^{-}\leftarrow \tau w+(1-\tau)w^{-} w−←τw+(1−τ)w−对参数进行更新,这种方式称为软更新,其中 τ \tau τ是一个比较小的数,当其值为1时,与DQN的更新方式一样
为了解决 Q Q Q函数的过高估计问题,DDPG使用训练网络来选取动作,使用目标网络来计算动作的价值对 Q Q Q网络进行更新。同时,DDPG在行为策略上引入随机噪声 N \mathcal{N} N来增强探索能力。
DDPG算法的具体流程为:
随机策略 | 确定性策略 | |
---|---|---|
policy | π ( a ∣ s ; θ ) \pi(a|s;\theta) π(a∣s;θ) | π ( s ; θ ) \pi(s;\theta) π(s;θ) |
input | s s s | s s s |
output | 动作空间上的概率分布,每个动作都有一个对应发生的概率值 | 确定的动作(一个值或是一个向量) |
control agent | 从概率分布中随机采样动作让agent执行 | 确定的动作,没有随机性 |
场景 | 离散控制 | 连续控制 |
Soft Actor-Critic(SAC)算法是离线策略算法,属于最大熵强化学习的范畴,该算法提出使用一个Actor表示策略函数。
最大熵强化学习是指除了要最大化累积奖励,还要使得策略更加随机,因此修改强化学习的目标为:
π ∗ = arg max π E π [ ∑ t r ( s t , a t ) + α H ( π ( ⋅ ∣ s t ) ) ] \pi^*=\arg\max_\pi E_\pi \left[\sum_t r(s_t,a_t) + \alpha H(\pi(\cdot|s_t)) \right] π∗=argπmaxEπ[t∑r(st,at)+αH(π(⋅∣st))]
其中, α \alpha α是一个正则化系数,控制熵的重要程度。如果想探索更多的动作可能,就可以适当增大 α \alpha α的取值来增强探索能力,减少策略陷入较差的局部最优的可能。
SAC算法中,定义两个动作价值函数 q q q,也就是说有两个动作价值网络,其参数分别为 w 1 w_1 w1和 w 2 w_2 w2,并且这两个网络分别有一个目标网络,其参数分别为 w 1 − w^-_1 w1−和 w 2 − w_2^- w2−;定义一个策略函数 π \pi π,也就是说有一个策略网络,其参数为 θ \theta θ。同时,为了能够自动化调整熵的正则化项系数 α \alpha α,算法约束了熵的均值需要大于 H 0 H_0 H0,导出 α \alpha α的损失函数,在算法中进行 α \alpha α的更新。
具体算法流程如下: