0 前言
Q学习是一种无模型的离散异策略(off-policy)算法,它使用Q表格来处理离散观测和动作空间。
注:off-policy是指收集经验放回池的策略和最后控制智能体的目标策略不同。
在阅读下述内容之前,假设你以理解以下概念及内容:状态空间、动作空间、奖励、折扣回报、动作价值函数、最优动作价值函数及TD误差等。
1、Q-learning
强化学习的目的实际上都是根据目前的状态 s t s_t st推测出应该选择什么样的动作 a t a_t at。只不过不同的算法达到该目的的途径是不同的。
Q-learning和DQN都是通过获取(训练)一个最优动作价值函数 Q ⋆ ( s , a ) Q_{\star}(s,a) Q⋆(s,a)来得到对应的状态下应该做什么动作这件事情。
2、表格形式的Q-learning
假设状态空间
S
S
S和动作空间
A
A
A都是有限集合,那面动作价值函数就可以表示为如下的表格即
Q
π
(
s
t
,
a
t
)
Q_{\pi}(s_t,a_t)
Qπ(st,at):
(一个显而易见的问题是那怎么获取最优动作价值函数(也可以叫最优动作价值表格)呢?)
状态/动作 | a 1 a_1 a1(第一种动作) | a 2 a_2 a2(第二种动作) | a 3 a_3 a3(第三种动作) | a 4 a_4 a4(第四种动作) |
---|---|---|---|---|
s 1 s_1 s1(第一种状态) | 380 | -95 | 20 | 173 |
s 2 s_2 s2(第二种状态) | -7 | 64 | -195 | 210 |
s 3 s_3 s3(第三种状态) | 152 | 72 | 413 | -80 |
3、获取最优动作价值函数
- 初始化动作价值函数表格,可以让它是全零的表格。
- 用表格形式的Q学习算法更新表格,每次更新表格的一个元素。
- 最终表格会收敛到最优动作价值函数。
具体做法:
step1:收集训练数据,实际上就是建立经验放回池。
经验放回池中是一系列的
(
s
t
,
a
t
,
r
t
,
s
t
+
1
)
(s_t,a_t,r_t,s_{t+1})
(st,at,rt,st+1)的四元组。
经验放回池的获取可以通过任意的策略获取,通常选择
ϵ
−
g
r
e
e
d
y
\epsilon-greedy
ϵ−greedy策略,该策略如下:
a t = { a r g m a x a Q ~ ( s t , a ) 当概率 ≥ ϵ 均匀抽取动作空间中的一个动作 当概率 < ϵ a_t=\begin{cases}argmax_a\widetilde{Q}(s_t,a) \quad\quad当概率\geq \epsilon\\均匀抽取动作空间中的一个动作 \quad\quad 当概率<\epsilon\end{cases} at={argmaxaQ (st,a)当概率≥ϵ均匀抽取动作空间中的一个动作当概率<ϵ
此处我们联动一下skrl
中的智能体DQN,会发现Decision making基本上与上述内容契合
step2:基于经验放回池更新表格
注意这里更新表格的时候,每次只更新一个元素。若记
(
s
t
,
a
t
)
(s_t,a_t)
(st,at)位置的当前值为
Q
~
n
o
w
(
s
t
,
a
t
)
\widetilde{Q}_{now}(s_t,a_t)
Q
now(st,at)更新后为
Q
~
n
e
w
(
s
t
,
a
t
)
\widetilde{Q}_{new}(s_t,a_t)
Q
new(st,at)
已知四元组序列为
(
s
t
,
a
t
,
r
t
,
s
t
+
1
)
(s_t,a_t,r_t,s_{t+1})
(st,at,rt,st+1)
1、记
q
^
t
=
Q
~
n
o
w
(
s
t
,
a
t
)
\hat{q}_t=\widetilde{Q}_{now}(s_t,a_t)
q^t=Q
now(st,at)
2、记
s
t
+
1
s_{t+1}
st+1状态下,最大值为
q
^
t
+
1
=
m
a
x
a
Q
~
n
o
w
(
s
t
+
1
,
a
t
)
\hat{q}_{t+1}=max_a\widetilde{Q}_{now}(s_{t+1},a_t)
q^t+1=maxaQ
now(st+1,at)
3、记
y
^
t
=
r
t
+
γ
⋅
q
^
t
+
1
\hat{y}_t=r_t+\gamma \cdot \hat{q}_{t+1}
y^t=rt+γ⋅q^t+1,我们的目标实际上是希望
q
^
t
\hat{q}_t
q^t越接近
y
^
t
\hat{y}_t
y^t越好,因此记
δ
t
=
q
^
t
−
y
^
t
\delta_t=\hat{q}_t-\hat{y}_t
δt=q^t−y^t
4、更新
Q
~
n
e
w
(
s
t
,
a
t
)
=
Q
~
n
o
w
(
s
t
,
a
t
)
−
α
⋅
δ
t
\widetilde{Q}_{new}(s_t,a_t)=\widetilde{Q}_{now}(s_t,a_t)-\alpha\cdot \delta_t
Q
new(st,at)=Q
now(st,at)−α⋅δt
此处我们联动一下skrl
中的智能体DQN,会发现Learning algorithm基本上与上述内容契合
skrl
中的代码案例
models = {}
models["policy"] = EpilonGreedyPolicy(env.observation_space, env.action_space, device, num_envs=env.num_envs, epsilon=0.1)
cfg = Q_LEARNING_DEFAULT_CONFIG.copy()
cfg["discount_factor"] = 0.999
cfg["alpha"] = 0.4
# logging to TensorBoard and write checkpoints (in timesteps)
cfg["experiment"]["write_interval"] = 1600
cfg["experiment"]["checkpoint_interval"] = 8000
cfg["experiment"]["directory"] = "runs/torch/FrozenLake"
agent = Q_LEARNING(models=models,
memory=None,
cfg=cfg,
observation_space=env.observation_space,
action_space=env.action_space,
device=device)