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

news2024/12/23 9:59:37

文章目录

  • 简介
  • On-policy Monte-Carlo Control
    • GLIE
    • MC vs. TD Control
  • On-policy Temporal Difference Control
    • Sarsa
      • Example1 Windy Gridworld
      • Forward View Sarsa(λ)
      • Backward View Sarsa(λ)
      • Sarsa 代码
  • Off-Policy Learning
    • 重要性采样Importance Sampling
    • 使用重要性采样的离线策略蒙特卡洛
    • 使用重要性采样的离线策略时序差分
  • Q-Learning
    • Q-learnig versus Sarsa
  • 参考

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】应用层协议--HTTP协议及HTTP报文格式

目录 1、HTTP是什么 2、HTTP请求与响应 3、HTTP请求的两种方法(get和post)及区别 (面试题) 4、几种常见的错误的说法 5、HTTP协议的特点 6、应用场景 7、HTTP报文格式 8、面试题&#xff1a;HTTP常见的状态码都有哪些&#xff1f; 1、HTTP是什么 HTTP协议是在Web上进行…

Day08File类IO流字符集

File:代表文本和文件夹 File类只能对文件本身进行操作&#xff0c;不能读写文件里面存储的数据。 创建File类的对象 路径写法 绝对路径:从盘符开始 File file new File(“D:\\ceshi\\a.txt”); 相对路径:不带盘符&#xff0c;默认直接到当前工程下的目录寻找文件 F…

Ubuntu 安装 npm 和 node

前言 最近学习VUE&#xff0c;在ubuntu 2204 上配置开发环境&#xff0c;涉及到npm node nodejs vue-Cli脚手架等内容&#xff0c;做以记录。 一、node nodejs npm nvm 区别 &#xff1f; node 是框架&#xff0c;类似python的解释器。nodejs 是编程语言&#xff0c;是js语言的…

[AUTOSAR][诊断管理][ECU][$19] 读取ECU的DTC故障信息

一、简介 在车载诊断中常用的诊断协议有ISO 14229等&#xff0c;在协议中主要定义了诊断请求、诊断响应的报文格式及ECU该如何处理诊断请求的应用。其中ISO 14229系列标准协议定义了用于行业内诊断通信的需求规范&#xff0c;也就是UDS。UDS主要应用于OSI七层模型的第七层——…

LInux系统编程(3)

取得拓展属性 #include <sys/types.h> #include <attr/xattr.h>ssize_t getxattr(const char* path, const char* key, void* value, size_t size); ssize_t lgetxattr(const char* path, const char* key, void* value, size_t size); ssize_t fgetxattr(int fd,…

FreeRTOS 任务的创建与删除

目录 1. 什么是任务&#xff1f; 2. 任务创建与删除相关函数 任务创建与删除相关函数有如下三个&#xff1a; 任务动态创建与静态创建的区别&#xff1a; xTaskCreate 函数原型​编辑 vTaskDelete 函数原型 3. 创建两个任务进行点灯实操 使用CubeMX快速移植 1.增加两个…

【谢希尔 计算机网络】第4章 网络层

目录 网络层 网络层的几个重要概念 网络层提供的两种服务 网络层的两个层面 网际协议 IP 虚拟互连网络 IP 地址 IP 地址与 MAC 地址 地址解析协议 ARP IP 数据报的格式 IP 层转发分组的过程 基于终点的转发 最长前缀匹配 使用二叉线索查找转发 网际控制报文协议…

2023CSPS 种树 —— 二分+前缀和

This way 题意&#xff1a; 一开始以为是水题&#xff0c;敲了一个二分贪心检查的代码&#xff0c;20分。发现从根往某个节点x走的时候&#xff0c;一路走来的子树上的节点到已栽树的节点的距离会变短&#xff0c;那么并不能按照初始情况贪心。 于是就想着检查时候用线段树…

2023-1024‍节日(内含表白代码)

文章目录 一、前言二、代码实现三、动态展示四、总结 一、前言 1024可以是计算机操作系统的进制单位&#xff0c;也可以是&#x1f9d1;‍&#x1f4bb;程序员们的特殊纪念日。 每年10月24日被行业认定为“程序员节”。 今天&#xff0c;正是一年一度的“1024程序员节”在此纪…

LeetCode讲解篇之面试题 01.08. 零矩阵

文章目录 题目描述题解思路题解代码 题目描述 题解思路 遍历矩阵&#xff0c;若当前元素为零&#xff0c;则将该行和该列的第一个元素置零 遍历第一行&#xff0c;若当前元素为零&#xff0c;则将当前列置零 遍历第一列&#xff0c;若当前元素为零&#xff0c;则将当前行置零 …

Kong:高性能、插件化的云原生 API 网关 | 开源日报 No.62

Kong/kong Stars: 35.2k License: Apache-2.0 Kong 是一款云原生、平台无关且可扩展的 API 网关。它以高性能和插件化的方式脱颖而出&#xff0c;提供了代理、路由、负载均衡、健康检查和认证等功能&#xff0c;并成为编排微服务或传统 API 流量的中心层。 以下是 Kong 的核心…

浏览器面试题及答案【集合目录】

前言&#xff1a; 欢迎浏览和关注本专栏《 前端就业宝典 》&#xff0c; 不管是扭螺丝还是造火箭&#xff0c; 多学点知识总没错。 这个专栏是扭螺丝之上要造火箭级别的知识&#xff0c;会给前端工作学习的小伙伴带来意想不到的帮助。 本专栏将前端知识拆整为零&#xff0c;主要…

kr第三阶段(二)32 位汇编

编译与链接 环境配置 masm32 masm32 是微软的 masm32 的民间工具集合。该工具集合除了 asm32 本身的汇编器 ml 外还提供了&#xff1a; SDK 对应的函数声明头文件和 lib 库。32 位版本的 link&#xff08;原版本是 16 位&#xff0c;这里的 32 位版本的 link 来自 VC 6.0&a…

IDEA工具第二篇:自定义Java方法注释模板 | 京东云技术团队

网上搜索类似的文章有很多&#xff0c;但是一味的复制粘贴总会出现各种奇葩问题&#xff0c;最后然并卵&#xff01;今天特意自己研究琢磨一下&#xff0c;将最终结果分享给大家&#xff0c;100%亲测可用。 一、说明 想必大家都用过Eclipse的方法注释生成&#xff0c;方法上输…

Django结合Celery进行异步调用

目录 Celery介绍 相关环境 相关配置 1、在proj/proj/目录下创建一个新的celery.py模块 定义 Celery 实例&#xff1a; 2、在proj/proj/__init__.py 模块中导入这个应用程序。 3、在各自模块中定义任务文件tasks.py 4、settings.py配置 服务启动 异步调用 Celery介绍 C…

ChatGPT AIGC 办公自动化拆分Excel工作表

在职场办公中对数据的操作,经常需要将一份表格数据拆分成多个表。 但是在Excel中进行表格拆分的步骤比较多。 在Excel中拆分工作表的步骤: 1.打开您的Excel工作簿,选择您要拆分的工作表。 2.右键单击工作表标签(通常在底部),选择“移动或复制”。 3.在“移动或复制”…

SpringCloud和Kubernetes的区别

又见小道仙&#xff1a; https://blog.csdn.net/Tomwildboar/article/details/129531315 对于SpringCloud在实际项目中并未使用过&#xff0c;只是自学过SpringCloud和SpringCloud Alibaba&#xff0c;也基于学习搭建过demo。 对于Kubernetes&#xff0c;目前这家公司就是使用…

SpringBoot引入包报红,无法使用Maven依赖

今天又是一年一度的程序员节&#xff0c;希望各位编码的小伙伴们能够健健康康&#xff0c;开开心心。 最近弄了一个SpringBoot项目&#xff0c;今天拉取代码的时候发现文件都变成了这样子 平时常用的依赖包都用不了了&#xff0c;重新加载&#xff0c;重新install都无效&#…

浏览器标签上添加icon图标;html引用ico文件

实例 <link rel"shortcut icon" href"./XXX.ico" type"image/x-icon">页面和图标在同一目录内 则 <link rel"shortcut icon" type"text/css" href"study.ico"/>可以阿里矢量图库关键字搜索下载自己…

【tg】9 : InstanceImpl 、 虚拟的音频渲染设备FakeAudioDeviceModuleImpl

代码分布 WebRTC-Manager 线程:manager线程 G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\InstanceImpl.h Manager 使用的是 WebRTC-Manager 线程 InstanceImpl 对Manager 的封装和调用 #