基本方法
Deep Q Network的核心思想是使用神经网络表示:
$$ Q_\pi(s_t, a_t) = Net_\theta(s_t, a_t) $$其中, 不同的参数$ \theta $就对应了不同的$ \pi $. 策略$ \pi $被隐式表达了. 假设我们使得网络学习到了最好的参数$ \theta^* $. 则它应该满足:
$$ Q^*(s_t, a_t) = Net_{\theta^*}(s_t, a_t) $$$ Q^* $是Optimal Action-Value Function, 最优行动价值函数, 它的值绝对是正确的, 即它的值一定是回报的期望.
对于Agent来说, 它采取动作的方法是:
$$ a^* = \mathop{\arg\max}\limits_{a}\ Net_{\theta^*}(s_t, a) $$一般来说, 神经网络的实现是同时输出所有动作的$ Q $值:
$$ Net_\theta(s_t) = \begin{bmatrix} Q_\pi(s_t, a_1) \\ Q_\pi(s_t, a_2) \\ Q_\pi(s_t, a_3) \\ \vdots \\ Q_\pi(s_t, a_n) \end{bmatrix} $$这样效率更高, 也方便更泛化地学习.
Temporal Difference (TD) Learning
假如说我们有一个预测函数$ f(s) $. 它的作用就是根据当前状态$ s $预测一个值$ f(s) $.
为了直观一些, 这里考虑一个实际例子: 假如我需要从南京前往北京, 但是我不知道需要花费我多少时间. 我有一个时间预测函数$ f $, 它接收我现在的位置为参数, 值为到北京所需的时间.
假设$ f(南京) $的值为10小时, 也就是说我到达北京应该需要10小时. 我出发了. 但是我刚到济南, 我就不想去北京了. 也就是说我们并没有得到南京到北京这个过程中的整个数据, 也不知道南京到北京到底需要多长时间. 但是我知道南京到济南需要多长时间. 假设这是5个小时.
假如说$ f(济南) $的值为3个小时. 那么我们原本预期:
$$ f(南京) = T_{南京\rightarrow 济南} + f(济南) $$现在却发现不相等. 这说明我们的$ f $需要调整. 而需要调整到的值就是$ T_{南京\rightarrow 济南} + f(济南) $.
$ T_{南京\rightarrow 济南} + f(济南) $ 被称为TD target. $ T_{南京\rightarrow 济南} + f(济南) $相比$ f(南京) $更加可靠, 因此我们让$ f(南京) $的值修改为$ T_{南京\rightarrow 济南} + f(济南) $. 这样我们没有整个过程的结果, 只有中间的结果, 也可以进行优化.
TD Learning in DQN
我们可以先写出下面的式子:
$$ Net_\theta(s_t, a_t) \approx r_t + \gamma \cdot Net_\theta(s_{t+1}, a_{t+1}) $$由于$ Net $所表示的是回报的期望, 因此这里不是严格相等, 而是约等于.
预测值prediction即为$ Net_\theta(s_t, a_t) $.
而TD target $ r_t + \gamma \cdot Net_\theta(s_{t+1}, a_{t+1}) $其实有点为难: 因为我们不知道到底应该选择哪个动作. 我们不知道$ a_{t+1} $是什么. 因为对$ t $时刻来说, 这还没发生. 但是真的是这样吗?
作为Value-Based算法, 我们的Agent其实只会采取$ Q $值最大的动作. 因此实际上$ a_{t+1} $就是$ Q $值最大的那个动作:
$$ r_t + \gamma \cdot Net_\theta(s_{t+1}, a_{t+1}) = r_t + \gamma \cdot \max\limits_a{Net_\theta(s_{t+1}, a)} $$于是, 我们对网络的loss可以写成:
$$ \begin{align*} loss &= \frac{1}{2}(prediction - td\_target)^2 \\ &= \frac{1}{2}[Net_\theta(s_t, a_t) - r_t - \gamma \cdot \max\limits_a{Net_\theta(s_{t+1}, a)}]^2 \end{align*} $$Agent在环境中采取行动. 在$ t $时刻状态为$ s_t $, Agent采取了行动$ a_t $, 环境返回奖励$ r_t $, 和下一时刻状态$ s_{t+1} $. 也就是说$ s_{t+1} $是已知的.
考虑到一般实现中, $ Net $是个向量值函数. 即返回所有动作的$ Q $值, loss值也可以这么写:
$$ loss = \frac{1}{2}[\max{Net_\theta(s_t)} - r_t - \gamma\cdot\max {Net_\theta(s_{t+1})}]^2 $$

欢迎友好讨论~