作为一个新手,写这个强化学习-基础知识专栏是想和大家分享一下自己学习强化学习的学习历程,希望对大家能有所帮助。这个系列后面会不断更新,希望自己在2021年能保证平均每日一更的更新速度,主要是介绍强化学习的基础知识,后面也会更新强化学习的论文阅读专栏。本来是想每一篇多更新一点内容的,后面发现大家上CSDN主要是来提问的,就把很多拆分开来了(而且这样每天任务量也小一点哈哈哈哈偷懒大法)。但是我还是希望知识点能成系统,所以我在目录里面都好按章节系统地写的,而且在github上写成了书籍的形式,如果大家觉得有帮助,希望从头看的话欢迎关注我的github啊,谢谢大家!另外我还会分享深度学习-基础知识专栏以及深度学习-论文阅读专栏,很早以前就和小伙伴们花了很多精力写的,如果有对深度学习感兴趣的小伙伴也欢迎大家关注啊。大家一起互相学习啊!可能会有很多错漏,希望大家批评指正!不要高估一年的努力,也不要低估十年的积累,与君共勉!
接下来的几个博客将会分享以下有关DQN算法及其改进,包括DQN(Nature)、Double DQN、 Multi-step DQN、Pirority Replay Buffer、 Dueling DQN、DQN from Demonstrations、Distributional DQN、Noisy DQN、Q-learning with continuous actions、Rainbow、Practical tips for DQN等。
DQN from Demonstrations(DQfD解决DQN冷启动问题)
对于以值函数为核心的 Q-Learning 算法来说,前期的算法迭代很难让模型快速进入一个相对理想的环境,更何况由于前期值函数估计存在较大偏差,与环境交互
得到的采样与最优策略存在一定的差别,这更增加了学习的难度。于是论文 Deep Q-learning from Demonstrations 提出了一种在与real-world交互之前,先用准备好的优质采样轨迹进行预训练,用value function来模仿示范者,以实现agent与env在交互之初就可以用上较为完善的TD,这样就相当于直接站在巨人的肩膀上, 学习速度自然会快很多。只要我们有办法取得一定数量的优质轨迹,就可以通过监督学习完成与环境交匹前的预训练。除了使用监督学习预训练,我们还要使用强化学习完成 DQN 模型原本方法中的训 练。最终模型的目标函数变成了多个学习目标结合的形式:
J
(
q
)
=
J
D
Q
(
q
)
+
λ
1
J
n
(
q
)
+
λ
2
J
E
(
q
)
+
λ
3
J
L
2
(
q
)
J(q)=J_{\mathrm{DQ}}(q)+\lambda_{1} J_{n}(q)+\lambda_{2} J_{E}(q)+\lambda_{3} J_{L 2}(q)
J(q)=JDQ(q)+λ1Jn(q)+λ2JE(q)+λ3JL2(q)
这个目标函数包含了4个子目标。
- J D Q ( q ) : J_{\mathrm{DQ}}(q): JDQ(q): Deep Q-Learning 的目标函数。
- J n ( q ) : J_{n}(q): Jn(q): 以 n n n 步回报估计法为目标的 Q-Learning 目标函数。
- J E ( q ) : J_{E}(q): JE(q): 利用准备数据进行监督学习的目标函数,用于示范动作的分类。
- J L 2 ( q ) : J_{L 2}(q): JL2(q): 参数L2的正则
其中, λ n \lambda_{n} λn 用于平衡不同目标函数之间的权重。
其中,第三项 supervised large margin classification loss至关重要, 因为示范集的一大问题就是只包含 了一小部分的状态空间, 很多状态-动作根本就没有数据。如果只是用Q-learning update的方式 更新, 网络会朝着那些ungrounded variables的方向更新,并且受到bootstrap的影响, 这将传播到其他state。同时,准备好的行动也存在一定的噪声,其中的行动并不是真正的行动,为了避免上面提到的问题,这里用了大间距分类损失作为监督学习的loss:
J
E
(
Q
)
=
max
a
∈
A
[
Q
(
s
,
a
)
+
l
(
a
E
,
a
)
]
−
Q
(
s
,
a
E
)
J_{E}(Q)=\max _{a \in A}\left[Q(s, a)+l\left(a_{E}, a\right)\right]-Q\left(s, a_{E}\right)
JE(Q)=a∈Amax[Q(s,a)+l(aE,a)]−Q(s,aE)
a
E
a_{E}
aE 是expert的示范动作;
l
(
a
E
,
a
)
l\left(a_{E}, a\right)
l(aE,a) 是margin function,
a
=
a
E
a=a_{E}
a=aE 的时候为0, 其余为正值。
与以往的imitation learning有很大的不同,这里学的是action的Q值, 而不是单纯的模仿 action。这个loss迫使agent的动作的Q值至少比示范动作Q值低一个margin。引入了这个loss就可以使未发生的动作的value确定为合理的value, 并使greedy的policy能够受到这个模仿了示范者的value function的引导。
权衡一下,利用SL与RL中的Bellman equation, 将专家数据看成一个软的初始化约束, 在pretraining的时候, 约束专家数据中的action要比这个state下其他的action高一个 l l l 值。这里其 实是做了一个loss的权衡: 这个 l l l 值导致的action差别的loss高,还是不同action导致达到下个状态的 s ′ s^{\prime} s′ 的产生的loss高,如果专家的SL带来的Ioss高的话,那么以专家的loss为主, 如果是 RL的loss高的话, 那么这个约束就会被放宽, 选择RL中的action。简要来说,如果最终选出的动作与专家动作不同,说明其他某个动作的价值至少不会弱于专家动作太多,这样对模型的约束相对来说是一个比较合理的约束。
第一项与第二项中1步Q-learning loss用于约束连续状态之间的value并使学习到的Q网络满足Bellman方程。n步Qlearning loss用于将 expert的trajectory传递到更早的状态, 以实现更好地pre-training,这是因为价值需要一定的时间的训练才能跳过前面波动比较大的时期,进入相对平稳的更新时期,所以我们不仅使用下一时刻的回报,而且还将此后更多时刻的回报加入目标值中,使模型更新更快。
r
t
+
γ
r
t
+
1
+
…
+
γ
n
−
1
r
t
+
n
−
1
+
max
a
γ
n
Q
(
s
t
+
n
,
a
)
r_{t}+\gamma r_{t+1}+\ldots+\gamma^{n-1} r_{t+n-1}+\max _{a} \gamma^{n} Q\left(s_{t+n}, a\right)
rt+γrt+1+…+γn−1rt+n−1+amaxγnQ(st+n,a)
第四项目标函数用来防止模型过拟合。
除此之外,算法还有一些其他的设定:
- 由于为预训练准备的样本质量比较高,我们可以对其进行反复利用,因此它们在训练过程中不会被换出来,全部永久存在于 Replay Buffer 中。
- 同样,由于准备数据和交互数据的来源和质量不同,因此在从 Replay Buffer 中随机抽取样本时,准备数据和交互得到的数据拥有不同的采样概率; 模型一开始只接受准备数据的学习,不进行模型模拟采样,这样确保了模型前期的快速成长。
- 算法也使用了常见的 Target Network、Priority Replay Buffer 等技巧。
完整的算法流程图如下:
上一篇:强化学习的学习之路(二十一)_2021-01-21: Dueling DQN(Dueling networkarchitectures for deep reinforcement learning)
下一篇:强化学习的学习之路(二十三)_2021-01-23:Distributional DQN:A Distributional Perspective on Reinforcement Learning