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