若需观看机器人系列相关博客,请劳驾至:【足式机器人无死角系列之-【强化学习基础-通用】、【仿真及训练环境】、【强化学习】:isaac-gym 与 isaac-lab 从零开始
郑重声明:该系列博客为本人 ( W e n h a i Z h u ) 独家私有 , 禁止转载与抄袭 , 首次举报有谢 , 若有需请私信授权! \color{red}郑重声明:该系列博客为本人(WenhaiZhu)独家私有,禁止转载与抄袭,首次举报有谢,若有需请私信授权! 郑重声明:该系列博客为本人(WenhaiZhu)独家私有,禁止转载与抄袭,首次举报有谢,若有需请私信授权!
回顾: 上一篇博客中,对 Q-learning 进行了介绍,其与 Sarsa 算法的差别很小,只是迭代过程中目标不一样。但是他们在数学层面解决的问题确实不一样的,Sarsa 本质上来说是解决基于动作价值的贝尔曼公式,Q-learning 算法解决的是基于动作价值的贝尔曼最优公式。Q-learning 中的 Q所指的就是动作价值,直白的说,其就是学习动作价值最高的那个策略。 |
本系列博客链接为: {\color{blue}本系列博客链接为:} 本系列博客链接为:【强化学习理论基础-通用】(01)从零开始白话给你讲,简单推导公式,深刻理解,一眼万年!:https://blog.youkuaiyun.com/weixin_43013761/article/details/143168169
本博客编写于: 20250105 ,台式机为 u b u n t u 20.04 , 3090 G e F o r c e R T X 显存 24 G { \color{purple} 本博客编写于:20250105,台式机为 ubuntu 20.04,3090 GeForce RTX 显存24G} 本博客编写于:20250105,台式机为ubuntu20.04,3090GeForceRTX显存24G:与你现在的代码,或者环境等存在一定差异也在情理之中,故切勿认为该系列博客绝对正确,且百密必有一疏,若发现错误处,恳请各位读者直接指出,本人会尽快进行整改,尽量使得后面的读者少踩坑,评论部分我会进行记录与感谢,只有这样,该系列博客才能成为精品,这里先拜谢各位朋友了。
文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证,请备注 强化学习 。 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证,请备注\color{red} 强化学习}。 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证,请备注强化学习。
一、前言
通过上一篇博客,可以知道 Q-learning 中的 Q所指的就是动作价值,直白的说,其就是学习动作价值最高的那个策略。且给出了其数学形式如下所示:
q
t
+
1
(
s
t
,
a
t
)
=
q
t
(
s
t
,
a
t
)
−
α
t
(
s
t
,
a
t
)
[
q
t
(
s
t
,
a
t
)
−
(
r
t
+
1
+
γ
max
a
∈
A
(
s
t
+
1
)
q
t
(
s
t
+
1
,
a
)
)
]
q
t
+
1
(
s
,
a
)
=
q
t
(
s
,
a
)
,
for all
(
s
,
a
)
≠
(
s
t
,
a
t
)
(01)
\color{red} \tag{01} \begin{aligned} q_{t+1}\left(s_{t}, a_{t}\right) & =q_{t}\left(s_{t}, a_{t}\right)-\alpha_{t}\left(s_{t}, a_{t}\right)\left[q_{t}\left(s_{t}, a_{t}\right)-{\color{blue} \left(r_{t+1}+\gamma \max _{a \in \mathcal{A}\left(s_{t+1}\right)} q_{t}\left(s_{t+1}, a\right)\right)}\right] \\ q_{t+1}(s, a) & =q_{t}(s, a), \quad \text { for all }(s, a) \neq\left(s_{t}, a_{t}\right) \end{aligned}
qt+1(st,at)qt+1(s,a)=qt(st,at)−αt(st,at)[qt(st,at)−(rt+1+γa∈A(st+1)maxqt(st+1,a))]=qt(s,a), for all (s,a)=(st,at)(01)需要注意到上式中的
max
a
∈
A
(
s
t
+
1
)
q
t
(
s
t
+
1
,
a
)
\max _{a \in \mathcal{A}\left(s_{t+1}\right)} q_{t}\left(s_{t+1}, a\right)
maxa∈A(st+1)qt(st+1,a) 只需要知道最大动作的价值是多少,而不需要知道其对应的动作具体是哪一个。另外在上一篇博客博客中有提到,根据编程或者方式不一样,可以实现 on-policy 与 off-policy。关于两者的区别这里就不做详细介绍了,
1.on-policy 图示
上一篇博客中针对前者绘画了图示,这里先粘贴一下,后面也会使用到。
2.off-policy 图示
该篇会对 off-policy 策略进行讲解,本人也画以一副图示,这里先粘贴出来,用来回顾使用:
3.引导
虽然通过上一篇博客 on-policy 与 off-policy 有了一定鉴别能力,但是都是基于理论上的一些判断,并没有所谓的代码实践,为了深刻理解 on-policy 与 off-policy 的出别,下面使用 Q-learning 分别实现这两者策略,以形成鲜明对比。
二、on-policy
1.基本理念
首先使用 Q-learning 算法实现 on-policy 策略,在前面学习中已经知道单纯的 MC(蒙特卡洛)、Sarsa 以及 Q-learning 算法是无法实现 on-policy 或者 off-policy。需要与动作决策策略 π \pi π 进行搭配使用。因为实现 on-policy,所以值需要一个动作决策策略 π \pi π 即可,其会负责 behavior 与环境进行交互,同时还负责 target 进行部署决策,所以 策略 π \pi π 会对自身进行优化与改善。
策略 π \pi π 对自身进行进行优化的方案,到目前为止接触过两种,分别为 Epsilon Greedy 或者 Greedy。不过因为 on-policy 中,与环境交互生成经验数据的 behavior 以及优化改进的 target 决策策略都是同一个,也就是说接下来的示例代码中只能选择 Epsilon Greedy 与 Greedy 中的一个。Greedy 每次进行策略优化时,会把动作状态价值最高的动作执行概率设置为 1 1 1,故探索性较低,需要在特定的条件下使用该算法才能达到最好效果,比如说,能够从任意状态出发,且能够访问所有的 状态-动作 对,不过这种条件的约束太强,通常不易达到。所以下面的示例中,使用 Epsilon Greedy 算法与 Q-learning 进行搭配,首先来看伪代码逻辑,如下所示:
2.伪代码
3.代码分析(基本条件)
因为这里动作价值评估的算法使用 Q-learning,其底层原理与 Sarsa 一直,依旧为 罗宾逊-蒙罗算法(Robbins-Monro algorithm)。为保证该算法的基本运转,所以迭代过程 α = α t \alpha=\alpha_t α=αt 应当满足 ∑ k = 1 ∞ α t 2 < ∞ and ∑ t = 1 ∞ α t = ∞ \sum_{k=1}^{\infty} \alpha_{t}^{2}<\infty \text { and } \sum_{t=1}^{\infty} \alpha_{t}=\infty ∑k=1∞αt2<∞ and ∑t=1∞αt=∞。所以初始要求 α > 0 \alpha>0 α>0。该部分内容细节请参考博客随机梯度下降系列博客,如:【强化学习理论基础-通用】(17)从零开始白话给你讲[数学原理]:随机近似(Stochastic Approximation),罗宾逊-蒙罗算法(Robbins-Monro algorithm)
代码中可以看到,其还要求 ϵ ∈ ( 0 , 1 ) \epsilon \in (0,1) ϵ∈(0,1),这是 Epsilon Greedy 算法(策略)的参数,该值约接近于 1 1 1,则决策结果的探索性越强,该值约接近于 0 0 0,探索能力越弱,拟合能力越强,若是为 0 0 0,其等价于 Greedy 算法。为 0 0 0 时,但是若不从所有 状态-动作 对出发一次,则容易陷入局部最优解,不适用于从特定状态出发或开始的场景。该部分详细内容可参考博客:【强化学习理论基础-通用】(15)从零开始白话给你讲[数学原理]:蒙特卡洛(MC Epsilon Greedy),探索与收敛的平衡之道
罗宾逊-蒙罗算法(Robbins-Monro algorithm)是可以从任意初始值出发,然后通过迭代优化趋向于最优解。所以 Q-learning 算法,即(01)式中,需要为所有的 状态-行为对(s,a) 设定一个初始行为价值 q 0 ( s , a ) q_0(s,a) q0(s,a)。如果是神经网络,直白的说就是进行参数初始化即可。另外,策略 π \pi π 的优化过程是由动作价值 q 0 ( s , a ) q_0(s,a) q0(s,a) 驱动的。
目的: \color{red}目的: 目的: 学习一条最优路径,将智能体从初始状态引导到目标状态(比如说终点,获得大量或最高奖励)。
4.代码分析(环境交互与价值更新)
每次循环,或者说每个 episode(回合) 过程。其首先判断当前的状态 s t s_t st 是否为目标(终点)状态,如果到达终点说明该回合结束,开始下一个 episode 迭代,否着在该回合内一直进行循环迭代。
每个 t t t 时刻,都会做类似的循环操作,设目前处于 s t s_t st 状态,那么根据 π t \pi_t πt 输入状态 s t s_t st,可以获得一个采样决策 a t a_t at,然后执行动作 a t a_t at 与环境进行交互,切换到下一个状态 s t + 1 s_{t+1} st+1,此时也会获得到一个即时奖励 r t + 1 r_{t+1} rt+1。到这里为止就收集到了数据: { s t , a t , s t + 1 , r t + 1 } (02) \color{green} \tag{02}\{s_{t},~a_t,~s_{t+1},~r_{t+1}\} {st, at, st+1, rt+1}(02) 虽然收集到到了上诉 4 4 4 个数据,但是观察(01)式,貌似并不能直接对其进行优化,虽然可以求得 q t ( s t , a t ) q_t(s_t,a_t) qt(st,at),但是却无法求得: max a ∈ A ( s t + 1 ) q t ( s t + 1 , a ) (03) \color{blue} \tag{03} \max _{a \in \mathcal{A}\left(s_{t+1}\right)} q_{t}\left(s_{t+1}, a\right) a∈A(st+1)maxqt(st+1,a)(03)上式表达的含义是,处于 s t + 1 s_{t+1} st+1 状态下,其需要再所有可能执行的动作 A \mathcal{A} A 中,找到动作价值最高动作 a m = a a_m=a am=a,参与迭代优化。找到这个动作价值最高的动作与 π \pi π 给出的概率分布 ( A t + 1 ∣ s t + 1 ) (A_{t+1}|s_{t+1}) (At+1∣st+1) 其是没有任何关系的,因为基于 s t + 1 s_{t+1} st+1 状态所有动作 a t a_t at 都需要参与动作价值评估,只有这样才能找到最大价值的动作。
也就是说,这里最大价值动作 a m = a t + 1 a_m = a_{t+1} am=at+1 并不依赖于动作决策策略 π \pi π。若是换成 Sarsa 算法则需要依赖策略 π \pi π 根据概率分布采样一个 a t + 1 a_{t+1} at+1 动作。这个地方,就是体现 Q-learning 算法解决贝尔曼最优问题,而 Sarsa 算法则是解决贝尔曼公式问题核心点。总之这里 Q-learning 会获得一个数据 a m = a t + 1 = a_m=a_{t+1}= am=at+1= 数据,且计算其对应的动作价值评估 q t ( s t + 1 , a m ) q_t(s_{t+1},a_m) qt(st+1,am),这样结合前面的四个数据 { s t , a t , s t + 1 , r t + 1 } \{s_{t},~a_t,~s_{t+1},~r_{t+1}\} {st, at, st+1, rt+1},就可完成 Q-learning 的一次迭代(对应于(01)式)。
5.代码分析(策略更新)
前面的价值更新部分,虽然决策策略 π \pi π其首先根据目前的状态 s t s_t st 生成动作 a t a_t at,且该动作与环境进行交互由状态 s t s_{t} st 切入到状态 s t + 1 s_{t+1} st+1,但是整个过程并没有没有策略 π \pi π 自身并没有更新。
价值更新部分,虽然已经求得
max
a
q
t
(
s
t
,
a
)
\max _{a} q_{t}\left(s_{t}, a\right)
maxaqt(st,a),即知道那个动作价值最高,不过可惜的的是此时的价值评估 Q-learning 策略
q
t
q_t
qt
不是最新的
\color{orange} 不是最新的
不是最新的,迭代后最新的策略是
q
t
+
1
q_{t+1}
qt+1,所以还需要重行进行一个
arg
max
\arg \max
argmax 操作,注意不是
max
\max
max 操作,也就是前者是求最优价值,而现在求最优价值对应的动作:
arg
max
a
∈
A
q
t
+
1
(
s
t
,
a
)
(04)
\color{blue} \tag{04} \arg \max _{a \in \mathcal{A}} q_{t+1}\left(s_{t}, a\right)
arga∈Amaxqt+1(st,a)(04)具体操作就是把
s
t
+
1
s_{t+1}
st+1 状态下的所有 状态-动作 对,都通过优化后的
q
t
+
1
q_{t+1}
qt+1 进行动作价值评估,然后找到最优的动作
a
=
a
m
a=a_m
a=am,然后执行如下操作进行策略更新:
π
t
+
1
(
a
∣
s
t
)
=
1
−
ϵ
∣
A
(
s
t
)
∣
(
∣
A
(
s
t
)
∣
−
1
)
if
a
=
arg
max
a
q
t
+
1
(
s
t
,
a
)
(05)
\color{green} \tag{05} \pi_{t+1}\left(a \mid s_{t}\right)=1-\frac{\epsilon}{\left|\mathcal{A}\left(s_{t}\right)\right|}\left(\left|\mathcal{A}\left(s_{t}\right)\right|-1\right) \text { if } a=\arg \max _{a} q_{t+1}\left(s_{t}, a\right)
πt+1(a∣st)=1−∣A(st)∣ϵ(∣A(st)∣−1) if a=argamaxqt+1(st,a)(05)
π
t
+
1
(
a
∣
s
t
)
=
ϵ
∣
A
(
s
t
)
∣
otherwise
\color{green}\pi_{t+1}\left(a \mid s_{t}\right)=\frac{\epsilon}{\left|\mathcal{A}\left(s_{t}\right)\right|} \text { otherwise }
πt+1(a∣st)=∣A(st)∣ϵ otherwise
6.总结
通过上述 [3.代码分析(基本条件)]、[4.代码分析(价值更新)]、[5.代码分析(策略更新)] 操作即完成了一次策略更新与价值更新过程。且在一个回合(生命周期-episode) 内,会重复执行 [4.代码分析(价值更新)]、[5.代码分析(策略更新)] 这两个操作,直到该回合结束,以继续下一个回合的迭代优化。
虽然会经历多个回合,且每个回合会迭代多次,但是每次迭代过程中,与环境交互过程即 [4.代码分析(价值更新)],该 behavior 策略为
π
\pi
π,其会生成动作
a
t
a_t
at 与环境交互。另外,策略优化过程 [5.代码分析(策略更新)],更新的 target 策略也是
π
\pi
π。故 behavior 与 target 同为动作决策策略
π
\pi
π,所以上述组合算法为 on-policy。在一次迭代过程中,数据流向如下图所示:
需要注意紫色字体箭头 A t + 1 A_{t+1} At+1,其并不依赖依赖于策略 π \pi π, 图一(on-policy) a t + 1 a_{t+1} at+1是不一样的,这正是体现其处理贝尔曼最优问题关键部分,即为 Q-learning 算法,若为 a t + 1 a_{t+1} at+1,且由策略 a t + 1 a_{t+1} at+1 传递给价值评估 q q q,则为 Sarsa 算法。另外需要提及一点每次策略与环境进行交互,获取数据 { s t , a t , r t + 1 , s t + 1 , a t + 1 } \{s_{t}, a_{t}, r_{t+1}, s_{t+1}, a_{t+1}\} {st,at,rt+1,st+1,at+1} 都是使用上一次迭代优化过后的策略 π \pi π。
此外,并非每次与环境交互都一定要进行价值 q q q 更新与策略 π \pi π 更新,可以先使用 π \pi π 与环境进行交互,收集一个回合(生命周期)的轨迹数据 τ \tau τ,然后再逐个使用数据进行优化。
三、off-policy
1.基本理念
这里将使用 Q-learning 算法实现 off-policy 策略,通过上一篇博客知道,off-policy 中两个动作决策策略 behavior 与 target 是不一样的。所以设有现在有两个策略: b e h a v i o r 策略: π b t a r g e t 策略: π T (05) \color{blue} \tag{05} \begin{matrix} behavior策略:\pi_b\\ target策略:\pi_T \end{matrix} behavior策略:πbtarget策略:πT(05)其中 π b \pi_b πb 主要用于与环境进行交互,生成一条轨迹数据。所谓的每个 episode(回合) 过程,就是 π b \pi_b πb 与环境进行交互的过程,若交互过程发现到达了终点,则认为该回合结束,价值评估策略 q q q 与 动作决策策略 π T \pi_T πT 都会停止迭代优化。另外需要注意的是,策略 π b \pi_b πb 始终不会进行自身策略的改善。
下面的伪代码中,与环境交互的动作决策策略 behavior 使用算法 Epsilon Greedy,其探索性较强,能够保证收集经验数据的多样性,尽量访问较多的 状态-动作 对; 目标策略 π T \pi_T πT 使用算法 Greedy,其会把动作价值最高动作对应被执行概率置为 1 1 1,使得算法实际部署时能输出稳定且最优动作。
2.伪代码
3.代码分析(基本条件)
基本条件与前面 on-policy 差不多保持一致,迭代过程 α = α t \alpha=\alpha_t α=αt 应当满足 ∑ k = 1 ∞ α t 2 < ∞ and ∑ t = 1 ∞ α t = ∞ \sum_{k=1}^{\infty} \alpha_{t}^{2}<\infty \text { and } \sum_{t=1}^{\infty} \alpha_{t}=\infty ∑k=1∞αt2<∞ and ∑t=1∞αt=∞。所以初始要求 α t ( s t , a t ) > 0 \alpha_t(s_t,a_t)>0 αt(st,at)>0。环境交互策略 π b \pi_b πb 为 Epsilon Greedy,其参数需满足 ϵ ∈ ( 0 , 1 ) \epsilon \in (0,1) ϵ∈(0,1)。
目的: \color{red}目的: 目的: 从基准策略 π b π_b πb 生成的经验样本中,学习一个针对所有状态的最优目标策略 π T \pi_T πT。
4.代码分析(环境交互与价值更新)
与 on-policy 方案不同的是,该方案有两个动作决策策略,分别为
π
b
\pi_b
πb,
π
T
\pi_T
πT。与环境进行交互过程,只使用到策略
π
b
\pi_b
πb,其为
Epsilon Greedy
\color{red}\text{Epsilon Greedy}
Epsilon Greedy,因为探索性强,可收集较广泛的 状态-动作 对。同理,每个 episode 表示一个回合或者说生命周期,期间会与环境进行多次交互,获得数据:
τ
=
{
[
s
0
,
a
0
]
,
[
r
1
,
s
1
,
a
1
]
,
[
r
2
,
s
2
,
a
2
]
,
⋯
}
(06)
\color{green} \tag{06} \tau=\{[s_0, a_0],[r_1, s_1,a_1],[r_2,s_2,a_2],\cdots\}
τ={[s0,a0],[r1,s1,a1],[r2,s2,a2],⋯}(06) 需要注意,其中的数据
s
s
s 与
r
r
r 由环境给出,而动作
a
a
a 来自策略
π
\pi
π,且每个时刻
t
t
t 都会与环境进行。先交互生成数据之后,再进行价值更新,价值更新的公式前面(01)式:
q
t
+
1
(
s
t
,
a
t
)
=
q
t
(
s
t
,
a
t
)
−
α
t
(
s
t
,
a
t
)
[
q
t
(
s
t
,
a
t
)
−
(
r
t
+
1
+
γ
max
a
∈
A
(
s
t
+
1
)
q
t
(
s
t
+
1
,
a
)
)
]
(07)
\color{green} \tag{07} q_{t+1}\left(s_{t}, a_{t}\right) =q_{t}\left(s_{t}, a_{t}\right)-\alpha_{t}\left(s_{t}, a_{t}\right)\left[q_{t}\left(s_{t}, a_{t}\right)-{\color{blue} \left(r_{t+1}+\gamma \max _{a \in \mathcal{A}\left(s_{t+1}\right)} q_{t}\left(s_{t+1}, a\right)\right)}\right]
qt+1(st,at)=qt(st,at)−αt(st,at)[qt(st,at)−(rt+1+γa∈A(st+1)maxqt(st+1,a))](07)该为 Q-learning 算法的核心公式,具体原理这里就不再重复,前面已经讨论得太多。这里再次提及的一点是,
max
a
∈
A
(
s
t
+
1
)
q
t
(
s
t
+
1
,
a
)
\max _{a \in \mathcal{A}\left(s_{t+1}\right)} q_{t}\left(s_{t+1}, a\right)
maxa∈A(st+1)qt(st+1,a) 只需要知道最大动作的价值是多少,而不需要知道其对应的动作具体是哪一个。
5.代码分析(策略更新)
这里的车略更新只针对于动作决策策略
π
T
\pi_T
πT,其为
Greedy
\color{red}\text{Greedy}
Greedy。上面价值更新部分,虽然已经求得
max
a
q
t
(
s
t
,
a
)
\max _{a} q_{t}\left(s_{t}, a\right)
maxaqt(st,a),即知道那个动作价值最高,不过可惜的的是此时的价值评估 Q-learning 策略
q
t
q_t
qt
不是最新的
\color{orange} 不是最新的
不是最新的,迭代后最新的策略是
q
t
+
1
q_{t+1}
qt+1,所以还需要重行进行一个
arg
max
\arg \max
argmax 操作,注意不是
max
\max
max 操作,也就是前者是求最优价值,而现在求最优价值对应的动作:
arg
max
a
∈
A
q
t
+
1
(
s
t
,
a
)
(08)
\color{blue} \tag{08} \arg \max _{a \in \mathcal{A}} q_{t+1}\left(s_{t}, a\right)
arga∈Amaxqt+1(st,a)(08)具体操作就是把
s
t
+
1
s_{t+1}
st+1 状态下的所有 状态-动作 对,都通过优化后的
q
t
+
1
q_{t+1}
qt+1 进行动作价值评估,然后找到最优的动作
a
=
a
m
a=a_m
a=am,然后执行如下操作进行策略更新:
π
T
,
t
+
1
(
a
∣
s
t
)
=
1
if
a
=
arg
max
a
q
t
+
1
(
s
t
,
a
)
π
T
,
t
+
1
(
a
∣
s
t
)
=
0
otherwise
(09)
\color{green} \tag{09} \begin{array}{l} \pi_{T, t+1}\left(a \mid s_{t}\right)=1 \text { if } a=\arg \max _{a} q_{t+1}\left(s_{t}, a\right) \\ \pi_{T, t+1}\left(a \mid s_{t}\right)=0 \text { otherwise } \end{array}
πT,t+1(a∣st)=1 if a=argmaxaqt+1(st,a)πT,t+1(a∣st)=0 otherwise (09)其更新的过程比较简单,就是把动作价值最高的动作
a
m
=
arg
max
a
q
t
+
1
(
s
t
,
a
)
a_m=\arg \max _{a} q_{t+1}\left(s_{t}, a\right)
am=argmaxaqt+1(st,a) 执行的概率设置为
1
1
1,其余动作被指定的概率设置为
0
0
0。
6.总结
通过上述 [3.代码分析(基本条件)]、[4.代码分析(价值更新)]、[5.代码分析(策略更新)] 操作即完成了一次策略更新与价值更新过程。且在一个回合(生命周期-episode) 内,会重复执行 [4.代码分析(价值更新)]、[5.代码分析(策略更新)] 这两个操作,直到该回合结束,以继续下一个回合的迭代优化。
虽然会经历多个回合,且每个回合会迭代多次,但是每次迭代过程中,与环境交互过程即 [4.代码分析(价值更新)],该 behavior 策略为
π
b
\pi_b
πb(Epsilon Greedy),其会生成动作
a
t
a_t
at 与环境交互。另外,策略优化过程 [5.代码分析(策略更新)],更新的 target 策略也是
π
T
\pi_T
πT(Greedy)。故 behavior 与 target 是两个不同的动作决策策略,所以上述组合算法为 off-policy。在一次迭代过程中,数据流向如下图所示(与文首 图二 一致):
需要注意紫色字体箭头 A t + 1 A_{t+1} At+1,其并不依赖依赖于策略 π b \pi_b πb 或者 π T \pi_T πT, 图一(on-policy) a t + 1 a_{t+1} at+1是不一样的,这正是体现其处理贝尔曼最优问题关键部分,即为 Q-learning 算法,若为 a t + 1 a_{t+1} at+1,且由策略 a t + 1 a_{t+1} at+1 传递给价值评估 q q q,
另外需要提及的一点是,通常来说 π b \pi_b πb 与 π T \pi_T πT 除了一个探索性较强,另外一个探索性较弱,但是比较稳定之外,其他地方的相似性是很高的,比如说在使用深度学习的强化学习中,通常 π b = deepcopy ( π T ) \pi_b=\text{deepcopy}(\pi_T) πb=deepcopy(πT),即 π b \pi_b πb 在每个回合结束(或者以一定时间间隔)拷贝自 π T \pi_T πT,然后再封装一层代码增加探索性。所以上面标识他们之间为孪生关系。
此外,并非每次与环境交互都一定要进行价值 q q q 更新与策略 π T \pi_T πT 更新,可以先使用 π b \pi_b πb 与环境进行交互,收集一个回合(生命周期)的轨迹数据 τ \tau τ,然后再逐个使用数据进行优化。
四、迷宫示例
为了验证 Q-learning 算法的效果,与前面博客 同样应用于迷宫游戏,这里把游戏的规则再重复一下:【强化学习理论基础-通用】(25)从零开始白话给你讲[数学原理]:时序差分(Temporal-Difference) Expected Sarsa 搭配 Epsilon Greedy 比较类似,游戏规则与参数如下:
动作: 共五个动作,上(a1)、下(a2)、左(a3)、右(a4)、保持原地不动(a5)。 奖励: 进入黄色(禁止forbidden区域)=-1、进入白色可通行(passable)区域=0、到达终点(target)蓝色区域=1。 特殊: 若触碰边界(boundary),奖励为=-1,如在最上边依旧往上走,不过机器人状态(位置保持不变) 初始: 初始状态,Q-learning 算法只能从某个固定的状态(位置)出发 注意: 为了简单示例,转移为下一个状态时,只有一种奖励,且状态状态下执行某个动作,也只能达到下一种状态,而非概率,有多个选项。 |
上面是迷宫游戏的规则,相信大家已经很熟悉了,这里把奖励单独记录一下
r
f
o
r
b
i
d
e
n
r_{forbiden}
rforbiden有改变:
r
b
o
u
n
d
a
r
y
=
−
1
,
r
f
o
r
b
i
d
e
n
=
−
1
,
r
p
a
s
s
a
b
l
e
=
0
,
r
t
a
r
g
e
t
=
1
,
γ
=
0.9
(10)
\color{green} \tag{10} r_{boundary}=-1,~~~{\color{red}r_{forbiden}=-1},~~~r_{passable}=0 ,~~~r_{target}=1,~~~\gamma=0.9
rboundary=−1, rforbiden=−1, rpassable=0, rtarget=1, γ=0.9(10) 另外还需要增加一个 Q-learning 算法迭代优化需要的学习率:
α
=
0.1
(11)
\color{green} \tag{11} \alpha=0.1
α=0.1(11)
1.Ground Truth
优先给出最优策略动作决策图 与 状态价值数字图,如下所示(后续 Q-learning 与 Epsilon Greedy 组合,得到的最优决策策略价值图,与其进行比较),设该策略为
π
G
\pi_G
πG,另外该策略初始状态,可能被随机到 5x5=25 个方格任意位置,总而言之,每个状态下的决策都是最优的:
2.轨迹数据收集
为收集较广泛的 状态-动作 对的轨迹经验数据,构建一个动作概率均匀分布的策略
π
b
\pi_b
πb,算法选择 Epsilon Greedy。初始该算法所有状态下每个动作执行的概率分布为都为
0.2
0.2
0.2(因为共五个动作),即参数
ϵ
=
1
\color{red}\epsilon=1
ϵ=1, 先看如下左右两图:
左图是策略 π b \pi_b πb 动作决策图,可以看到其每个方向箭头长度都差不多,即表示每个状态下执行每个动作的概率都是均匀分布的,使用动作决策策略执行 1 1 1 millinon step。这里从状态 s 1 , 1 s_{1,1} s1,1 出发,只收集一条轨迹数据 τ \tau τ,也就是一个回合的数据,不过注意其达到终点也不会结束,回继续就环境交互进行数据采样。从右图可以看出,轨迹数据的分布是比较均匀的,绿的折线图就表示其轨迹, s 3 , 1 s_{3,1} s3,1 的箭头可以表示最优结束状态。
3.价值与决策策略优化
收集到轨迹数据
τ
\tau
τ,其包含
1
1
1 millinon 状态-动作 对。此时就可以使用这些数据进行训练了,这里先定义 Q-learning 学习到的策略
π
T
\pi_T
πT 与 最优策略
π
G
\pi_G
πG 的误差值。其公式也比较简单,就是训练过程中每次迭代之后,两策略每个状态的状态价值先去差值,然后求模长即可。最终学习到的策略,以及训练过程的误差如下所示:
首先观察左图,把其与 图五(Ground Truth) 左图进行比较,可以看到 Q-learning 最终策略与 Ground Truth 策略的动作决策基本一致。不过注意蓝色方框虽状态 s 1 , 5 s_{1,5} s1,5 的决策不一样,不过并没有关系,因为两者的决策都是最优的。
右图是训练过程中,状态价值误差模长的变化曲线图,可以初始误差较大,但是迭代到最后,误差为 0 0 0,这是因为 Q-learning 算法动作决策方案为 Greedy,会把最优动作对应的状态执行概率置 1 1 1,否者最终优化策略误差未必为 0 0 0。
五、探索强度影响
上面示例过程中,在 2.轨迹数据收集 收集轨迹数据
τ
\tau
τ 阶段,设置 Epsilon Greedy 算法参数
ϵ
=
1
\color{red}\epsilon=1
ϵ=1,其探索性是比较强的。现在令
ϵ
=
0.5
\color{red}\epsilon=0.5
ϵ=0.5,也就是降低收集轨迹数据
τ
\tau
τ 过程中的探索性。Q-learning 迭代优化过程如下图所示:
首先看中间图示,其表示从位置出发
s
1
,
1
s_{1,1}
s1,1 出发,采用策略 Epsilon Greedy 与环境进行交互收集经验轨迹数据
τ
b
\tau_b
τb, 不过其参数
ϵ
=
0.5
\epsilon=0.5
ϵ=0.5,探索性较低,经过
1
1
1 millinon 个 step 后也并未能访问所有 状态-动作 对,甚至连所有的状态都没有完全访问到。
左边图示表示其优化后的策略决策图,可以看到其在任何状态下,都是选择向右的动作。显然该策略较差,很多状态下的最优轨迹都无法到达终点。
右边图示表示其利用采样到的数据进行迭代学习过程中,当前学习到的策略价值与 [ 1.Ground Truth] 最优策略之间的误差变化。容易看出,即使迭代到最后,误差值也没有为零。其主要的原因就是很多状态下动作决策都不是最优的。
六、结论
该篇博客讲解的内容还是挺多的,不过可以说是把 Q-learning 算法进行了十分详细的讲解。另外,把该算法同时应用于 on-policy 与 off-policy,鲜明进行对比。总的来说,on-policy 与 off-policy 的主要区别在于 behavior 与 target 是否为同一个动作决策策略,前者负责数据收集,后者负责策略改善(更新)。