【强化学习】06 —— 基于无模型的强化学习(Control)


Model-free control
Optimise the value function of an unknown MDP

简介

继续上一讲的内容【强化学习】05 —— 基于无模型的强化学习(Prediction

在生活中,我们会遇见许多可以被建模成MDP的问题:

ElevatorParallel ParkingShip Steering
BioreactorHelicopterAeroplane Logistics
Robocup SoccerQuakePortfolio management
Robot walkingGame of Go

对于大部分真实世界中的问题,模型可以分为两类:

  • MDP模型是已知的,但是规模太大,只能通过采样进行
  • MDP模型是未知的,只能通过在经验中进行采样

本章还会引入一组概念:在线策略学习离线策略学习。通常来说,在线策略学习要求使用在当前策略下采样得到的样本进行学习,一旦策略被更新,当前的样本就被放弃了,就好像在水龙头下用自来水洗手;而离线策略学习使用经验回放池将之前采样得到的样本收集起来再次利用,就好像使用脸盆接水后洗手。因此,离线策略学习往往能够更好地利用历史数据,并具有更小的样本复杂度(算法达到收敛结果需要在环境中采样的样本数量),这使其被更广泛地应用。

在线策略学习(On-policy)

  • “Learn on the job”
  • 利用策略 π \pi π的经验采样不断改进策略 π \pi π

离线策略学习(Off-policy)

  • “Look over someone’s shoulder”
  • 利用另外一个策略 μ \mu μ不断改进策略 π \pi π

On-policy Monte-Carlo Control

我们在动态规划算法(【强化学习】04 ——动态规划算法)那一讲中介绍了策略迭代的过程,从一个起始的价值函数出发,follow一个策略 π \pi π,经过不断的策略评估与策略提升,最后使得策略收敛到最优的策略 π ∗ \pi^* π

在这里插入图片描述
基于状态价值函数 V ( s ) V(s) V(s)的策略提升需要MDP模型:

π ′ ( s ) = argmax ⁡ a ∈ A R s a + P s s ′ a V ( s ′ ) \pi^{\prime}(s)=\operatorname*{argmax}_{a\in\mathcal{A}}\mathcal{R}_s^a+\mathcal{P}_{ss^{\prime}}^aV(s^{\prime}) π(s)=aAargmaxRsa+PssaV(s)

但是对于无模型的强化学习,我们是无法得知奖励函数 R s a \mathcal{R}_s^a Rsa以及状态转移函数 P s s ′ a \mathcal{P}_{ss^{\prime}}^a Pssa,因此需要基于动作价值函数进行贪婪策略提升: π ′ ( s ) = argmax ⁡ s ∈ A Q ( s , a ) \pi^{\prime}(s)=\operatorname*{argmax}_{s\in\mathcal{A}}Q(s,a) π(s)=sAargmaxQ(s,a)

同样地,基于动作价值函数的策略迭代过程如下图所。对于策略评估部分,可以采用Monte-Carlo策略评估,使得 Q = q π Q=q_\pi Q=qπ,之后利用贪婪策略进行提升。

在这里插入图片描述
不过单纯的用贪婪算法进行策略提升会存在局部最优解的问题,因为贪婪算法不能很好地权衡探索 Exploration和利用 Exploitation,因此得到的策略很有可能是次优的。下面用一个例子说明:

如下图所示,开启左边的门的期望奖励是4,而右边的是2。但是若一次开启左边的门得到的奖励是0,而右边始终可以获得奖励,采用贪婪策略很容易会使得我们去选择开启右边的门,虽然这样始终能获得奖励,但是是非最优的。

在这里插入图片描述

很容易想到【强化学习】02—— 探索与利用中采用 ϵ − g r e e d y \epsilon-greedy ϵgreedy的策略: π ( a ∣ s ) = { ϵ / m + 1 − ϵ i f   a ∗ = a r g m a x   Q ( s , a ) ϵ / m o t h e r w i s e \left.\pi(a|s)=\left\{\begin{array}{ll}\epsilon/m+1-\epsilon&\quad\mathrm{if~}a^*=\mathrm{argmax~}Q(s,a)\\\epsilon/m&\quad\mathrm{otherwise}\end{array}\right.\right. π(as)={ϵ/m+1ϵϵ/mif a=argmax Q(s,a)otherwise

  • 所有 m m m个动作均以非零概率进行尝试
  • 1 − ϵ 1 −\epsilon 1ϵ 的概率选择贪心动作
  • ϵ \epsilon ϵ的概率选择任意动作

这里涉及到一个定理,去证明对于任意的 ϵ − g r e e d y \epsilon-greedy ϵgreedy策略 π \pi π,关于 Q π Q_\pi Qπ ϵ − g r e e d y \epsilon-greedy ϵgreedy策略 π ′ \pi' π是策略 π \pi π的提升,即 V π ′ ( s ) ≥ V π ( s ) V_{\pi'}(s)\ge V_\pi(s) Vπ(s)Vπ(s) Q π ( s , π ′ ( s ) ) = ∑ a ∈ A π ′ ( a ∣ s ) Q π ( s , a ) = ϵ / m ∑ a ∈ A Q π ( s , a ) + ( 1 − ϵ ) max ⁡ a ∈ A Q π ( s , a ) ≥ ϵ / m ∑ a ∈ A Q π ( s , a ) + ( 1 − ϵ ) ∑ a ∈ A π ( a ∣ s ) − ϵ / m 1 − ϵ Q π ( s , a ) = ∑ a ∈ A π ( a ∣ s ) Q π ( s , a ) = v π ( s ) \begin{aligned} Q_\pi(s,\pi^{\prime}(s))& =\sum_{a\in\mathcal{A}}\pi^{\prime}(a|s)Q_{\pi}(s,a) \\ &=\epsilon/m\sum_{a\in\mathcal{A}}Q_\pi(s,a)+(1-\epsilon)\max_{a\in\mathcal{A}}Q_\pi(s,a) \\ &\geq\epsilon/m\sum_{a\in\mathcal{A}}Q_\pi(s,a)+(1-\epsilon)\textcolor{red}{\sum_{a\in\mathcal{A}}\frac{\pi(a|s)-\epsilon/m}{1-\epsilon}}Q_\pi(s,a) \\ &=\sum_{a\in\mathcal{A}}\pi(a|s)Q_\pi(s,a)=v_\pi(s) \end{aligned} Qπ(s,π(s))=aAπ(as)Qπ(s,a)=ϵ/maAQπ(s,a)+(1ϵ)aAmaxQπ(s,a)ϵ/maAQπ(s,a)+(1ϵ)aA1ϵπ(as)ϵ/mQπ(s,a)=aAπ(as)Qπ(s,a)=vπ(s)

也可以在每经历一个Episode之后就策略评估或策略提升。
在这里插入图片描述

  • 策略评估部分采用 Monte-Carlo策略评估,不过要注意 Q ≈ Q π Q ≈ Q_π QQπ(当前的策略估计不一定能够收敛到 Q π Q_π Qπ,如果直接采用贪婪策略,则无法探索到其他可能会带来更高价值的动作,从而使得结果次优)
  • 策略提升采用 ϵ − g r e e d y \epsilon-greedy ϵgreedy策略提升

GLIE

基于 ϵ − g r e e d y \epsilon-greedy ϵgreedy算法,我们其实只能得到近似的 Q ≈ Q π Q ≈ Q_π QQπ,因为该算法没有一个终止条件,会导致其一直在探索。

因此我们必须关注以下两个方面:

  • 一方面我们不想丢掉任何更好信息和状态;
  • 另一方面随着我们策略的改善我们最终希望能终止于某一个最优策略,因为事实上最优策略不应该包括一些随机行为选择。

因此,我们希望得到一个这样的学习方法:

  1. 在学习开始时有足够的探索;
  2. 最终得到的策略没有探索,是一个确定性的策略。

于是我们将引入GLIE算法

Greedy in the Limit with Infinite Exploration (GLIE),在有限的时间内进行无限可能的探索

Definition
1. 所有已经经历的状态行为对(state-action pair)会被无限次探索 lim ⁡ k → ∞ N k ( s , a ) = ∞ \lim_{k\to\infty}N_k(s,a)=\infty limkNk(s,a)=
2. 策略最终要趋向于贪婪策略(因为要达到最优策略)。 lim ⁡ k → ∞ π k ( a ∣ s ) = 1 ( a = argmax ⁡ a ′ ∈ A Q k ( s , a ′ ) ) \lim_{k\to\infty}\pi_k(a|s)=\mathbf{1}(a=\underset{a^{\prime}\in\mathcal{A}}{\operatorname*{argmax}}Q_k(s,a^{\prime})) limkπk(as)=1(a=aAargmaxQk(s,a))
Example:设计类似于双曲函数的策略。 ϵ k = 1 / k \epsilon_k=1/k ϵk=1/k, k k k为探索的Episode数目,那么该Ɛ贪婪蒙特卡洛控制就具备GLIE特性。

基于GLIE的蒙特卡洛控制流程如下:

  • 对于给定策略 π \pi π,采样第 k k k个Episode: { S 1 , A 1 , R 2 , . . . , S T } ∼ π \{S_1,A_1,R_2,...,S_T\}\sim\pi {S1,A1,R2,...,ST}π
  • 对于该Episode里出现的每一个状态行为对 S t S_t St A t A_t At,更其计数和 Q Q Q函数: N ( S t , A t ) ← N ( S t , A t ) + 1 Q ( S t , A t ) ← Q ( S t , A t ) + 1 N ( S t , A t ) ( G t − Q ( S t , A t ) ) \begin{aligned}&N(S_t,A_t)\leftarrow N(S_t,A_t)+1\\&Q(S_t,A_t)\leftarrow Q(S_t,A_t)+\frac1{N(S_t,A_t)}\left(G_t-Q(S_t,A_t)\right)\end{aligned} N(St,At)N(St,At)+1Q(St,At)Q(St,At)+N(St,At)1(GtQ(St,At))
  • 基于新的 Q Q Q函数改善以如下方式改善策略: ϵ ← 1 / k π ← ϵ -greedy ( Q ) \begin{aligned}\epsilon&\leftarrow1/k\\\pi&\leftarrow\epsilon\text{-greedy}(Q)\end{aligned} ϵπ1/kϵ-greedy(Q)

定理:GLIE蒙特卡洛控制能收敛至最优的状态行为价值函数。

MC vs. TD Control

  • 时许差分(TD)相比于蒙特卡洛(MC)的优点
    • 基于不完整episode进行学习
    • 在线学习
    • 拥有更低的方差
  • 因此可以考虑将TD用于Control之中
    • 使用TD来更新 Q ( s , a ) Q(s,a) Q(s,a)
    • 使用 ϵ − g r e e d y \epsilon-greedy ϵgreedy 策略提升算法
    • 每一个时间步长更新状态-动作价值函数

On-policy Temporal Difference Control

本章接下来将要讲解无模型的强化学习中的两大经典算法:SarsaQ-learning,它们都是基于时序差分(temporal difference,TD)的强化学习算法。

Sarsa

SARSA(State-Action-Reward-State-Action)是一种基于值函数的强化学习算法,用于解决马尔可夫决策过程(MDP)中的控制问题。SARSA算法同时考虑当前的状态和动作,以及下一步的状态和动作来决定以后的行为,是一个(状态-动作-奖励-状态-动作) ⟨ S , A , R , S ′ , A ′ ⟩ \langle S,A,R,S',A'\rangle S,A,R,S,A五元组。在这里插入图片描述

在SARSA算法中,智能体按照一定的策略(如ε-greedy策略)选取动作,并根据环境的反馈(奖励信号)更新值函数。SARSA算法的更新规则为:
Q ( s , a ) ← Q ( s , a ) + α [ r + γ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) \leftarrow Q(s, a) + \alpha [r + \gamma Q(s', a') - Q(s, a)] Q(s,a)Q(s,a)+α[r+γQ(s,a)Q(s,a)]

使用SARSA的在线策略控制

在这里插入图片描述
每个时间步长:
• 策略评估: Q ( s , a ) ← Q ( s , a ) + α [ r + γ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) \leftarrow Q(s, a) + \alpha [r + \gamma Q(s', a') - Q(s, a)] Q(s,a)Q(s,a)+α[r+γQ(s,a)Q(s,a)], Q ≈ Q π Q ≈ Q_π QQπ
• 策略改进: ε − g r e e d y ε-greedy εgreedy策略改进

Sarsa伪代码
在这里插入图片描述
注:在线策略时序差分控制(on-policy TD control)使用当前策略进行动作
采样。即,SARSA算法中的两个“A”都是由当前策略选择的,这也保证了数据分布的一致性。

Example1 Windy Gridworld

有一股侧风从格栅中间向上吹过。标准动作为(上,下,左,右)。但在中间区域,有一股自下而上的风,会使得原本的动作发生改变,风的强度标注在栅格下方的数字。例如,如果你是目标G右侧的一个单元格,那么向左侧的动作会将你带到目标上方的单元格。
在这里插入图片描述

  • 每步的奖励 = -1,直到智能体抵达目标网格
  • 无折扣因子

训练结果如下图所示:
在这里插入图片描述
可以看到,随着训练的进行,Sarsa训练一个Episode所用的时间越来越少,即,达到目标的速度越来越快。

Forward View Sarsa(λ)

在这里插入图片描述
类似TD(λ), Q λ Q^λ Qλ组合了所有的 Q t ( n ) Q_t^{(n)} Qt(n),并且赋上了相应的权值 ( 1 − λ ) λ n − 1 (1-\lambda)\lambda^{n-1} (1λ)λn1,累计奖励为: Q t λ = ( 1 − λ ) ∑ n = 1 ∞ λ n − 1 Q t ( n ) Q_t^\lambda=(1-\lambda)\sum_{n=1}^\infty\lambda^{n-1}Q_t^{(n)} Qtλ=(1λ)n=1λn1Qt(n)使用下式进行更新:
Q ( S t , A t ) ← Q ( S t , A t ) + α ( Q λ − Q ( S t , A t ) ) Q(S_t,A_t)\leftarrow Q(S_t,A_t)+\alpha\left(Q^λ-Q(S_t,A_t)\right) Q(St,At)Q(St,At)+α(QλQ(St,At))

这就是Forward View Sarsa(λ),使用它更新Q价值需要遍历完整的Episode,我们同样可以反向理解Sarsa(λ).

Backward View Sarsa(λ)

类似于Backward View TD(λ),引入Eligibility Trace的概念,不同的是这次的E值针对的不是一个状态,而是一个状态行为对: E 0 ( s , a ) = 0 E t ( s , a ) = γ λ E t − 1 ( s , a ) + 1 ( S t = s , A t = a ) \begin{aligned}E_0(s,a)&=0\\E_t(s,a)&=\gamma\lambda E_{t-1}(s,a)+\mathbf{1}(S_t=s,A_t=a)\end{aligned} E0(s,a)Et(s,a)=0=γλEt1(s,a)+1(St=s,At=a)
Q值更新 δ t = R t + 1 + γ Q ( S t + 1 , A t + 1 ) − Q ( S t , A t ) Q ( s , a ) ← Q ( s , a ) + α δ t E t ( s , a ) \begin{aligned}\delta_t&=R_{t+1}+\gamma Q(S_{t+1},A_{t+1})-Q(S_t,A_t)\\Q(s,a)&\leftarrow Q(s,a)+\alpha\delta_tE_t(s,a)\end{aligned} δtQ(s,a)=Rt+1+γQ(St+1,At+1)Q(St,At)Q(s,a)+αδtEt(s,a)

在这里插入图片描述

Sarsa(λ) Gridworld Example
下图则用了格子世界的例子具体解释了Sarsa和Sarsa(λ)算法区别,详细解释请参考《强化学习》第五讲 不基于模型的控制
在这里插入图片描述

Sarsa 代码

LearningRL/Hands-on-RL/Sarsa_Cliff_Walking.py

部分结果(部分算法波动性较大)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Off-Policy Learning

什么是离线策略学习

  • 使用目标策略 π ( a ∣ s ) \pi(a|s) π(as)进行值函数评估( V π ( s ) o r Q π ( s , a ) V^{\pi}(s)orQ^{\pi}(s,a) Vπ(s)orQπ(s,a)
  • 用行为策略 μ ( a ∣ s ) \mu(a|s) μ(as)收集数据(行为策略可以是未知的)。 { S 1 , A 1 , R 2 , . . . , S T } ∼ μ \{S_1,A_1,R_2,...,S_T\}\sim\mu {S1,A1,R2,...,ST}μ

使用离线策略学习的重要性

  • 平衡探索 Exploration和利用 Exploitation
  • 通过观察人类或其他智能体学习策略
  • 重用旧策略所产生的经验
  • 遵循探索策略时学习最优策略
  • 遵循一个策略时学习多个策略

重要性采样Importance Sampling

当用行为策略 μ ( a ∣ s ) \mu(a|s) μ(as)所收集的数据去学习另一个策略(估计一个不同分布的期望)时,可以用到重要性采样(Importance Sampling)。于是有以下公式:
E x ∼ p [ f ( x ) ] = ∫ x p ( x ) f ( x ) d x = ∫ x q ( x ) p ( x ) q ( x ) f ( x ) d x = E x ∼ q [ p ( x ) q ( x ) f ( x ) ] \begin{aligned} \mathbb{E}_{x\sim p}[f(x)]& =\int_xp(x)f(x)dx \\ &=\int_xq(x)\frac{p(x)}{q(x)}f(x)dx \\ &=\mathbb{E}_{x\sim q}\left[\frac{p(x)}{q(x)}f(x)\right] \end{aligned} Exp[f(x)]=xp(x)f(x)dx=xq(x)q(x)p(x)f(x)dx=Exq[q(x)p(x)f(x)] x ∼ p x\sim p xp表示采样到的 x x x服从 p p p分布。将每个实例的权重重新分配为 β ( x ) = p ( x ) q ( x ) \beta(x)=\frac{p(x)}{q(x)} β(x)=q(x)p(x)从而满足在 q q q中采样得到的 x x x也满足 x ∼ p x\sim p xp.

使用重要性采样的离线策略蒙特卡洛

  • 使用策略𝜇产生的累计奖励评估策略 π \pi π
  • 根据两个策略之间的重要性比率(importance ratio)对累计奖
    G t G_t Gt加权
    对每个片段乘以重要性比率,最后再连乘
    { s 1 , a 1 , r 2 , s 2 , a 2 , . . . , s T } ∼ μ G t π / μ = π ( a t ∣ s t ) μ ( a t ∣ s t ) π ( a t + 1 ∣ s t + 1 ) μ ( a t + 1 ∣ s t + 1 ) . . . π ( a T ∣ s T ) μ ( a T ∣ s T ) G t \begin{gathered}\{s_1,a_1,r_2,s_2,a_2,...,s_T\}\thicksim\mu\\G_t^{\pi/\mu}=\frac{\pi(a_t|s_t)}{\mu(a_t|s_t)}\frac{\pi(a_{t+1}|s_{t+1})}{\mu(a_{t+1}|s_{t+1})}...\frac{\pi(a_T|s_T)}{\mu(a_T|s_T)}G_t\end{gathered} {s1,a1,r2,s2,a2,...,sT}μGtπ/μ=μ(atst)π(atst)μ(at+1st+1)π(at+1st+1)...μ(aTsT)π(aTsT)Gt
  • 最后更新值函数以逼近修正的累计奖励值
    V ( s t ) ← V ( s t ) + α ( G t π / μ − V ( s t ) ) V(s_t)\leftarrow V(s_t)+\alpha\left(\textcolor{red}{G_t^{\pi/\mu}}-V(s_t)\right) V(st)V(st)+α(Gtπ/μV(st))
  • 注意:
    • 无法在𝜋非零而𝜇为零时使用重要性采样
    • 重要性采样将显著增大方差(variance)

使用重要性采样的离线策略时序差分

  • 使用策略𝜇产生的时序差分目标评估策略𝜋

  • 根据重要性采样对时序差分目标𝑟 + 𝛾𝑉(𝑠′)加权

  • 仅需要一步来进行重要性采样修正
    V ( S t ) ← V ( S t ) + α ( π ( A t ∣ S t ) μ ( A t ∣ S t ) ( R t + 1 + γ V ( S t + 1 ) ) − V ( S t ) ) \begin{aligned}&V(S_t)\leftarrow V(S_t)+\\&\alpha\left(\textcolor{red}{\frac{\pi(A_t|S_t)}{\mu(A_t|S_t)}\left(R_{t+1}+\gamma V(S_{t+1})\right)-V(S_t)}\right)\end{aligned} V(St)V(St)+α(μ(AtSt)π(AtSt)(Rt+1+γV(St+1))V(St))

  • 具有比蒙特卡洛重要性采样更低的方差

  • 策略仅需在单步中被近似

Q-Learning

  • Q-Learning无需重要性采样
  • 根据行为策略选择动作 a t ∼ μ ( ⋅ ∣ s t ) a_t{\sim}\mu(\cdot|s_t) atμ(st)
  • 根据目标策略选择后续动作 a t + 1 ′ ∼ π ( ⋅ ∣ s t ) a'_{t+1}{\sim}\pi(\cdot|s_t) at+1π(st)
  • a t + 1 ′ a'_{t+1} at+1去更新 Q ( s t , a t ) Q(s_t,a_t) Q(st,at)
    Q ( s t , a t ) ← Q ( s t , a t ) + α ( r t + 1 + γ 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+1}+\gamma\boxed{Q(s_{t+1},a_{t+1}^{\prime})}-Q(s_t,a_t)) Q(st,at)Q(st,at)+α(rt+1+γQ(st+1,at+1)Q(st,at))
  • 允许行为策略和目标策略都进行改进
  • 目标策略𝜋可以是关于𝑄(𝑠, 𝑎)的贪心策略 π ( s t + 1 ) = arg ⁡ max ⁡ a ′ Q ( s t + 1 , a ′ ) \pi(s_{t+1})=\arg\max_{a′}Q(s_{t+1},a′) π(st+1)=argamaxQ(st+1,a)
  • 行为策略𝜇是关于𝑄(𝑠, 𝑎)的ε-贪心策略
  • Q-学习目标函数可以简化为
    r t + 1 + γ Q ( s t + 1 , a t + 1 ′ ) = r t + 1 + γ Q ( s t + 1 , arg ⁡ max ⁡ a t + 1 ′ Q ( s t + 1 , a t + 1 ′ ) ) = r t + 1 + γ max ⁡ a t + 1 ′ Q ( s t + 1 , a t + 1 ′ ) \begin{aligned} r_{t+1}+\gamma Q(s_{t+1},a_{t+1}^{\prime})& =r_{t+1}+\gamma Q(s_{t+1},\arg\max_{a_{t+1}^{\prime}}Q(s_{t+1},a_{t+1}^{\prime})) \\ &=r_{t+1}+\gamma\max_{a_{t+1}^{\prime}}Q(s_{t+1},a_{t+1}^{\prime}) \end{aligned} rt+1+γQ(st+1,at+1)=rt+1+γQ(st+1,argat+1maxQ(st+1,at+1))=rt+1+γat+1maxQ(st+1,at+1)
  • Q-学习更新方式
    Q ( s t , a t ) ← Q ( s t , a t ) + α ( r t + 1 + γ max ⁡ a t + 1 ′ 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+1}+\gamma\max_{a'_{t+1}}Q(s_{t+1},a'_{t+1})-Q(s_t,a_t)) Q(st,at)Q(st,at)+α(rt+1+γat+1maxQ(st+1,at+1)Q(st,at))
  • 定理:Q-学习控制收敛到最优状态-动作值函数 Q ( s , a ) → Q ∗ ( s , a ) Q(s,a)\to Q^*(s,a) Q(s,a)Q(s,a)
  • 在这里插入图片描述
  • 收敛性证明

Q-learnig versus Sarsa

  • Sarsa
    • 对于 Sarsa,它的更新公式必须使用来自当前策略采样得到的五元组 ⟨ S , A , R , S ′ , A ′ ⟩ \langle S,A,R,S',A'\rangle S,A,R,S,A,因此它是在线策略学习方法;
  • Q-learnig
    • 使用四元组 ⟨ S , A , R , S ′ ⟩ \langle S,A,R,S'\rangle S,A,R,S来更新 Q ( s , a ) Q(s,a) Q(s,a).该四元组并不需要一定是当前策略采样得到的数据,也可以来自行为策略,因此它是离线策略算法。

Q-learning的伪代码
在这里插入图片描述

class Qlearning():
    def __init__(self, env, gamma, alpha, epsilon, numOfEpisodes, numOfActions=4):
        self.env = env
        self.gamma = gamma
        self.alpha = alpha
        self.epsilon = epsilon
        self.numOfEpisodes = numOfEpisodes
        self.numOfActions = numOfActions
        # 初始化Q(s, a)表
        self.Q_table = np.zeros([self.env.nrows * self.env.ncols, numOfActions])

    # Choose A from S using policy derived from Q (e.g., epsilon-greedy)
    def ChooseAction(self, state):
        if np.random.random() < self.epsilon:
            action = np.random.randint(self.numOfActions)
        else:
            action = np.argmax(self.Q_table[state])
        return action

    def QlearningRun(self):
        # 记录每一条序列的回报
        returnList = []
        # 显示10个进度条
        for i in range(10):
            # tqdm的进度条功能
            with tqdm(total=int(self.numOfEpisodes / 10), desc='Iteration %d' % i) as pbar:
                # 每个进度条的序列数
                for episode in range(int(self.numOfEpisodes / 10)):
                    # initialize state
                    state = self.env.Reset()
                    done = False
                    episodeReward = 0
                    # Loop for each step of episode:
                    while not done:
                        # Choose A from S using policy derived from Q (e.g., epsilon-greedy)
                        action = self.ChooseAction(state)
                        # Take action A, observe R, S'
                        stateprime, reward, done = self.env.Step(action)
                        episodeReward += reward
                        # Update
                        TD_error = reward + self.gamma * self.Q_table[stateprime].max() \
                                 - self.Q_table[state, action]
                        self.Q_table[state,action] += self.alpha * TD_error
                        state = stateprime
                    returnList.append(episodeReward)
                    if (episode + 1) % 10 == 0:  # 每10条序列打印一下这10条序列的平均回报
                        pbar.set_postfix({
                            'episode':
                                '%d' % (self.numOfEpisodes / 10 * i + episode + 1),
                            'return':
                                '%.3f' % np.mean(returnList[-10:])
                        })
                    pbar.update(1)
        return returnList
Q-learning算法最终收敛得到的策略为:
^ooo ovoo ovoo ^ooo ^ooo ovoo ooo> ^ooo ^ooo ooo> ooo> ovoo 
ooo> ooo> ooo> ooo> ooo> ooo> ^ooo ooo> ooo> ooo> ooo> ovoo 
ooo> ooo> ooo> ooo> ooo> ooo> ooo> ooo> ooo> ooo> ooo> ovoo 
^ooo **** **** **** **** **** **** **** **** **** **** EEEE 

seed = 0时的对比
在这里插入图片描述
十次训练平均:

在这里插入图片描述

可以看到在当前的参数设置下,Q-learning的奖励回报略低于Sarsa。

参考

[1] 伯禹AI
[2] https://www.deepmind.com/learning-resources/introduction-to-reinforcement-learning-with-david-silver
[3] 动手学强化学习
[4] Reinforcement Learning

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuan〇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值