本文正在参加「金石计划」
导语
本系列笔记为b站Shusen Wang老师的强化学习课程笔记,整体按照老师讲课的思路来记录。本节课主要介绍DQN和利用TD算法来训练DQN。
Action-Value Function回顾
Return UtU_t依赖于从t时刻开始的每一个动作At和状态St,二者都具有随机性。因而UtU_t也具有随机性。
我们可以对A和S求积分,可以把他们消掉,只剩下st,ats_t, a_t,得到Qπ(st,at)Q_{pi}(s_t,a_t)。
进一步,我们可以通过对πpi求最大,可以消掉Policy函数πpi,得到最优的动作价值函数Q⋆Q^{star}。他代表了在当前状态sts_t下不管采用怎样的策略,要使Agent做动作ata_t,那么回报订多就是Q⋆(st,at)Q^{star}(s_t,a_t),不会更好。
Q⋆Q^{star}函数与Policy无关,他告诉我们基于当前状态sts_t做出动作ata_t的好坏程度,所以Q⋆Q^{star}函数可以指导Agent做决策。Agent观测到当前的状态sts_t,Q⋆Q^{star}函数可以对所有的动作打分,例如向左是1分,向上是5分,然后Agent可以根据分数来做决策。
Deep Q-Network (DQN)
DQN其实就是用一个神经网络来近似Q函数,Q⋆Q^{star}可以告诉我们选择哪种动作的平均回报。
然而,我们肯定无法精确得到Q⋆Q^{star},但是我们可以通过一个神经网络来近似,并将神经网络记作Q(s,a;w)Q(s,a;w)。神经网络的参数是w,其输入是状态s,输出是对每个动作的打分,每个动作对应于一个分数。我们用奖励作为监督信号来训练这个DQN,比如我们让模型玩上万局超级玛丽,这个神经网络就可以很精确的学到Q⋆Q^{star},就可以给出非常精准的预测。
对于不同的问题,DQN的结构可能不一样。这里举个例子,假如是玩超级玛丽,那么可以把当前的画面作为状态s经过一个卷积层成为特征向量,最后用几个全连接层把输出映射到输出向量,为对每一个动作的打分。
例如,上图的示例中向左是2000分,向上是3000分最大,所以此时应该选择向上。更加规范化的表示如下:
TD算法
训练DQN的最常用算法就是Temporal Difference (TD) Learning,即TD算法。
TD算法比较复杂,这里用一个例子先来解释一下。
假设我们想开车从纽约到亚特兰大,有一个模型Q(w)Q(w)可以预测开车出行的时间开销,假设一开始模型给出了估计值为1000分钟,这个值可能是一个随机的数值,但是随着用的人越来越多,可能模型给出的估计就会越来越准确。
但问题是:我们需要什么样的数据,又该如何更新模型?
一个最简单的方法:首先,出发前让模型给出一个预测q,比如q=1000。到了亚特兰大后,发现实际耗时为860,把这个作为target,就得到了损失L,用L去求对w的梯度,
有了梯度就可以进行梯度下降,对模型进行更新。这种算法比较朴素,即必须完整的完成一次旅途,才能对模型进行一次更新。这里有个问题:假如我们没有完成整个旅途,到了半路就不走了,那么这种情况下能否更新模型,比如我们路上到了华盛顿就结束旅途,实际上花费了300分钟。
这时,模型给出了从华盛顿到亚特兰大的估计是600,那么这时候整体的估计y=300+600=900,是一个更加可信的值。然后可以求梯度,进行梯度下降更新。
TD算法
DQN中应用TD算法
TD算法可以在不完成一次全程旅途的过程中对模型参数进行更新,将它应用到强化学习中也是同样的道理,我们不需要打完一局游戏,就能对DQN模型参数进行更新。
要想应用这个算法,那么要有以下的关系,即从纽约到亚特兰大的时间等于从纽约到华盛顿,再从华盛顿到亚特兰大的时间。那在强化学习中,也需要有类似这样的关系,等式的两侧都有一项估计值,而右边需要有一项真实观测值。而在强化学习中,也有这样一个公式,等式左边是DQN在t时刻做的估计,这是未来奖励总和的期望,等式右边有一项rtr_t是真实观测到的奖励。
接下来介绍一下为什么强化学习中存在这个公式,我们来回顾一下Discounted Return,
通过将其展开提取γgamma,可以得到下面的等式,即
Ut=Rt+γ⋅Ut+1U_t = R_t + gamma cdot U_{t+1}
接下来需要将TD算法用到DQN上,DQN的输出Q(st,at;w)Q(s_t, a_t; w)是对UtU_t的期望做出的估计。 在下一时刻,DQN的输出Q(st+1,at+1;w)Q(s_{t+1}, a_{t+1}; w)是对Ut+1U_{t+1}的估计。
左边是t时刻的预测,右边是rtr_t和t+1时刻的预测。
有了这个关系后,在t时刻,模型做出了预测Q(st,at,;wt)Q(s_t, a_t,; w_t),这里的sts_t是当前的状态,ata_t是已经做出的动作,wtw_t是模型当前的参数。
到了t+1时刻,我们观测到了真实的奖励rtr_t,还观测到了新的状态st+1s_{t+1},有了状态st+1s_{t+1},我们就可以用DQN算出下一个动作at+1a_{t+1},在t+1时刻,我们知道了rt,st+1,at+1r_t, s_{t+1}, a_{t+1},我们就可以计算TD target yty_t,他等于奖励rtr_t和γgamma乘上DQN在t+1t+1时刻的预测。
而t+1时刻的动作at+1a_{t+1}是通过DQN对每个动作进行打分,然后取得分最大的那个动作得到的。
最终的Loss就是两者差的平方。之后,通过梯度下降就可以更新模型参数。
总结
本节课介绍了Value-based Reinforcement Learning,这节课用到了最优动作价值函数Q⋆Q^{star},首先对UtU_t求期望,把除了st,ats_t, a_t之外的变量给去掉,然后再关于策略函数πpi求一个最大化,去掉了πpi。
Q⋆Q^{star}函数根据当前状态sts_t对每个动作进行打分,分数代表了每个动作的好坏程度,只要有了Q⋆Q^{star}函数就能使用Q⋆Q^{star}函数控制Agent运动,每一个时刻Agent只需要选出分数最高的动作,执行这个动作就可以了。
然而,我们并没有这样一个Q⋆Q^{star}函数,而价值学习的目标就是为了学习出这样一个Q⋆Q^{star},DQN就是用一个神经网络来近似Q⋆Q^{star}函数,DQN可以记作Q(s,a;w)Q(s,a;w),其参数为w,接收输入为状态ss,其输出是对每一个动作aa的打分,
一开始DQN的参数都是随机的,Agent会根据DQN的指导不断的尝试,强化学习就是根据奖励来更新模型参数让模型越来越好,这节课讲了用TD算法来更新模型参数,该算法是学习DQN最常用的算法。TD算法不断重复这个过程:
- 首先,观测到当前的状态sts_t和已经执行的动作ata_t;
- 用DQN做一次计算,输入是状态sts_t,输出是对每个动作aa的打分,把输出记作qtq_t;
- 用反向传播对DQN进行求导,得到梯度dtd_t;
- 由于Agent已经执行了动作ata_t,环境会给出新的状态st+1s_{t+1}和奖励rtr_t;
- 有了st+1s_{t+1}和rtr_t后,就可以根据这个公式得出TD target为yty_t;
- 最后,做一次梯度下降更新模型的参数w
这样,就完成了一次TD算法的迭代。