改进点
之前的 值学习方法(Q-learning),表格型,因为值函数(状态值函数V(s)或状态动作值函数Q(s,a))是以表格形式存储 Q_table 。现实状态空间 连续、无穷,所以 值函数 近似 利用函数 直接 拟合状态值函数或状态动作值函数 。
- s,a 分别是状态 s 和动作 a 的向量表示,
- 函数 Qϕ(s,a) 通常是一个参数为ϕ 的函数,比如
神经网络
,输出为一个实数,称为Q网络(Q-network)
。
所以:【DQN 是指基于深度学习的 Q-learning 算法,主要结合了价值函数近似(Value Function Approximation)
与神经网络技术,并采用了 目标网络 target Network 和 经历回放 Experience replay 的方法进行网络的训练。】
学习的是啥?(1)Vπ(s)
value-based 学习的是 critic (评论家),而不是策略。
一种评论家-- State Value Function Vπ(s) -- 评论家的输出值取决于状态state 和演员 (actor) π。【注意:评论家都是绑一个演员的,评论家没有办法去凭空去评价一个状态的好坏】。
critic 作用:它是在衡量某一个演员( π)的好坏,而不是衡量一个状态的好坏【Policy Evaluation(策略评估)】。
怎么衡量Vπ(s)?State Value Function Estimation
MC-采样
训练 Vπ(s) 网络时,是一个 回归问题,网络的输出就是一个值:在输入 sa 的时候,输出的值跟 Ga 越近越好,输入 s_bsb 的时候,输出的值跟 Gb 越近越好。
这里的 G 是 累计奖励【玩游戏的时候,看做一个随机变量】,也就是 从某一状态开始到一个回合游戏结束后,才可以更新网络。导致 MC方法 问题是 方差大,
TD-时序差分
在游戏的某一个情况,某一个状态 s_t 的时候,采取动作 a_t,得到奖励r_t,跳到状态st+1,就可以使用 TD 的方法 。
注意:!!在训练的时候,并不是直接去估测 V,而是希望得到的结果 V 可以满足这个式子。
训练 Vπ(s) 网络:希望它们两个相减的 loss 跟 r_t越接近,训练下去,更新 V 的参数
MC 和 TD 的差别
这里体现了 不同的 方法 ,考虑了 不同 的假设:
第一个回合, s_a得到奖励 0 以后,再跳到 s_b 也得到奖励 0:
-
一个可能是: s_a是一个标志性的状态,只要看到 s_a 以后,s_b 就会拿不到奖励,s_a可能影响了 s_b。 MC 的算法的话,把 s_a 影响 s_b 这件事考虑进去。
-
另一个可能是:看到 s_a 以后,s_b的奖励是 0 这件事只是一个巧合,并不是 s_a所造成,而是因为说 s_b 有时候就是会得到奖励 0,这只是单纯运气的问题。其实平常 s_b会得到奖励期望值是 3/4,跟 s_a是完全没有关系的。
学习的是啥?(2)Qπ(s,a)
另一种评论家-- Q-function,又叫state-action value function(状态-动作价值函数)
。
--输入 的是 (s,a)对。
【??注意:
Q-function 有一个需要注意的问题是,这个演员π,在看到状态 s 的时候,它采取的动作不一定是 a。
Q-function 假设在状态 s 强制采取动作 a。不管你现在考虑的这个演员π, 它会不会采取动作 a,这不重要。在状态 s 强制采取动作 a。接下来都用演员 π 继续玩下去,就只有在状态 s,我们才强制一定要采取动作 a,接下来就进入自动模式,让演员π 继续玩下去,得到的期望奖励才是Qπ(s,a) 。】
critic 作用:有了这个 Q-function,我们就可以决定要采取哪一个动作,我们就可以进行策略改进(Policy Improvement)
。找到 π′ ,使得对所有可能的状态 s 而言,Vπ′(s)≥Vπ(s)。
*** 这里: ***
- 这个 π′ 是用 Q-function 推出来的,没有另外一个网络决定 π′ 怎么交互,有 Q-function 就可以找出π′。
- 但是这边有另外一个问题就是,在这边要解一个 arg max 的问题,所以 a 如果是连续的就会有问题。如果是离散的,a 只有 3 个选项,一个一个带进去, 看谁的 Q 最大,没有问题。
*** Q-function 有两种写法:****
- 输入是状态跟动作,输出就是一个标量;
- 输入是一个状态,输出就是好几个值。
目标网络 Target Network
Qπ(st,at) 是网络的输出,rt+Qπ(st+1,π(st+1)) 是目标,在训练过程中 目标一直变化 会很难训练(因为是同一个模型 Qπ,),所以 解决方法是 :左边的 目标 固定住 ,那么输出的值是一个定值,即训练的时候,只更新左边的 Q 网络的参数,而右边的 Q 网络的参数会被固定住。
就变成是一个回归问题。训练时,希望左边模型的输出的值跟目标越接近越好,最小化它的均方误差。
【过程:
1.开始两个网络是一样的,然后在训练的时候,把右边的 Q 网络固定住
2.梯度下降,调左边网络 的参数
3.可能更新 100 次以后才把这个参数复制到右边的网络去,把它盖过去。目标值 发生变化
4.重新再训练】
探索 Exploration
原因:【使用 Q-function 的时候,policy 完全取决于 Q-function。给定某一个状态,就穷举所有的 a, 看哪个 a 可以让 Q 值最大,它就是采取的动作。
这个跟策略梯度不一样,在做策略梯度的时候,输出其实是随机的。我们输出一个动作的分布,根据这个动作的分布去做采样, 所以在策略梯度里面,你每次采取的动作是不一样的,是有随机性的。】
方法:
1.Epsilon Greedy (ε-greedy)
2. Boltzmann Exploration
像是策略梯度【网络的输出是一个期望的动作空间上面的一个的概率分布,再根据概率分布去做采样。】。
根据 Q 值 去定一个概率分布 ,先取指数,再做归一化, 然后把exp(Q(s,a)) 做归一化的这个概率当作是你在决定动作的时候采样的概率。
经验回放 Experience Replay
Replay Buffer 又被称为 Replay Memory,存储策略
π(不同的) 和 环境互动 时,收集的数据。 【会用到过去的经验数据,也可以消除样本之间的相关性。
【打破数据相关性,神经网络的训练效果为什么就不好?--》在神经网络中通常使用随机梯度下降法,如果样本是相关的,那么估计的梯度也会呈现出某种相关性。如果不幸的情况下,后面的梯度估计可能会抵消掉前面的梯度量。从而使得训练难以收敛。】
】
有了 buffer 以后,怎么训练 Q 的模型,怎么估 Q-function?
做法:迭代 训练 Q-function
在每次迭代里面,从这个 buffer 里面随机挑一个 batch 出来,里面有一把的经验,根据这把经验去更新你的 Q-function。【历史数据】
DQN
用深度卷积神经网络CNN近似拟合状态动作值函数Q(s,a)。 上面3个tip
输入是距离当前时刻最近的 4 帧图像,该输入经过 3 个卷积层和 2 个全连接层的非线性变化后,最终在输出层输出每个动作对应的 Q 值。
技巧
- 在 Atari 游戏里面,一般 mini-batch 设置为 32。
- Experience replay 用在新问题上一般为 10^6。