状态太多时怎么办:函数近似、TD 参数更新与 DQN 的数学直觉
适合读者已经理解表格型 TD / Q-learning但还不清楚函数近似与 DQN 为什么必要的人。预计阅读9 分钟。关键词函数近似、TD error、梯度更新、经验回放、目标网络。前面几篇默认一个重要前提状态和动作都可以枚举。于是无论是V(s) 还是Q(s,a)我们都可以直接存在一张表里。但一旦状态变成图像、文本、连续坐标或者环境规模很大这种做法马上失效。表格法的问题不再是“算不算得动”而是“根本存不下也覆盖不完”。这时强化学习就必须从“查表”转向“函数逼近”。也就是说我们不再给每个状态—动作对单独存一个值而是训练一个带参数的函数让它去预测价值。从图 1 可以看出这个转变带来了三件事节省存储不再保存海量表项而是只保存参数w获得泛化相似状态可以共享表示未见过的(s,a)也可能得到合理估计引入近似误差函数族有限未必能精确表示真实价值函数。于是强化学习的学习对象也变了从“更新某个表项的数值”变成“调整参数让整个函数更接近目标价值”。1. 从表格 Q 值到参数化价值函数函数近似里动作价值通常写成其中w是参数向量。它可以是线性模型中的权重也可以是神经网络里的参数。在线性近似里常写成在深度强化学习里往往就是一个深度网络。这样做的核心思想很简单用少量参数去逼近一个原本巨大甚至连续的价值表。在表格法里Sarsa 或 Q-learning 可以直接修改某个Q(s,a)。但在函数近似中不是一个独立表项而是参数w的输出。你想改某个估计值本质上只能去改参数。因此更新公式自然变成了这里的三个部分各司其职图 2 把这个更新拆得很直观。以 Sarsa 风格目标为例对应的 TD 误差是如果换成 Q-learning则把目标里的下一动作替换为最大动作从数学上看这个更新和监督学习非常像先构造一个目标再用梯度法让当前预测朝目标靠近。不同之处在于这个目标本身也是由强化学习过程动态产生的。3. 为什么深度版本会变得不稳定一旦由神经网络表示表达能力大幅增强但同时也出现了新的不稳定来源。问题在于Q-learning 的目标里本来就含有“下一状态的价值估计”。如果生成目标的网络和被训练的网络是同一个网络那么它就会出现一种很麻烦的现象模型一边预测目标一边又去追自己刚预测出来的目标。这会导致学习目标不断漂移甚至出现过估计和发散。4. DQN两个网络 经验回放DQNDeep Q-Network正是针对这个问题提出的工程化解决方案。它保留了 Q-learning 的 TD 学习框架但加入了两个关键稳定器目标网络target network经验回放replay buffer4.1 两个网络分别干什么DQN 中通常有两套参数主网络Q(s,a;w)负责学习与更新目标网络Q(s,a;w-)负责生成 TD 目标。训练时的目标写作损失函数则是主网络参数w频繁更新而目标网络参数 则通过周期性复制或软更新来慢速变化。这样做的效果是让学习目标动得更慢一些。4.2 经验回放解决什么问题强化学习数据是沿时间采样来的相邻样本高度相关。直接拿连续样本做 SGD往往不稳定。经验回放的做法是先把交互得到的转移存进 buffer训练时从 buffer 中随机抽取 mini-batch。这样做有两点好处打散时间相关性让样本更接近 i.i.d.让一条经验可以被多次复用提高样本效率。5. 这一篇真正要记住什么如果把 day5 的内容压缩成一句话那就是当状态空间太大时强化学习必须学一个“价值函数近似器”而一旦近似器是深度网络就要用 target network 和 replay buffer 去稳定学习过程。也就是说本篇的主线其实很统一函数近似解决“表格装不下”的问题TD error × 梯度给出“参数怎么更新”的数学形式DQN则回答“深度版本怎样才能学得更稳”。下一篇我们会换一个视角不再先学价值、再间接选动作而是直接优化策略本身也就是策略梯度、Actor-Critic 和 advantage 的主线。