一切皆是映射:深入理解 DQN 的稳定性与收敛性
背景与挑战
深度强化学习(DRL)结合了深度学习的感知能力和强化学习的决策能力,在游戏、机器人控制等场景潜力巨大。但落地时,大家常头疼两个词:稳定性和收敛性。作为 DRL 领域的里程碑,Deep Q-Network(DQN)虽然经典,但其训练过程并不总是平滑的。
为什么 DQN 会'飘'?
简单来说,DQN 的核心矛盾在于它试图用静态的神经网络去拟合动态变化的目标值。在标准 Q-Learning 中,目标值是 $r + \gamma \max Q(s', a')$。但在 DQN 里,这个目标值依赖于当前的网络参数 $\theta$。如果网络参数更新太快,目标值就会跟着剧烈波动,导致梯度方向不稳定,模型就像在追逐一个不断后退的影子。
此外,数据的相关性也是个坑。连续采样的状态往往高度相关,破坏了独立同分布(i.i.d.)假设,让 SGD 优化器难以收敛。
关键改进策略
为了解决这些问题,业界总结了几套行之有效的组合拳:
-
经验回放(Experience Replay) 把智能体与环境交互的数据存进一个池子,采样时打乱顺序。这打破了时间相关性,让数据分布更接近 i.i.d.,相当于给训练加了个'稳定器'。
-
目标网络(Target Network) 这是最关键的技巧之一。我们维护两套网络:主网络用于计算当前 Q 值,目标网络用于计算 TD 目标。目标网络的参数每隔一段时间才从主网络复制一次,而不是每一步都变。这样目标值的变化就平滑多了。
# 伪代码示例:目标网络更新逻辑
def update_target_network(target_net, main_net, tau=0.005):
# 软更新:每次微调一点点,比硬复制更稳
for target_param, main_param in zip(target_net.parameters(), main_net.parameters()):
target_param.data.copy_(tau * main_param.data + (1 - tau) * target_param.data)
- 探索与利用的平衡 原文中断处提到的 ε-greedy 策略依然有效。初期高 ε 鼓励探索,后期低 ε 侧重利用。不过要注意,ε 衰减过快可能导致陷入局部最优,过慢则浪费样本。
结语
DQN 的稳定性不是靠单一技巧解决的,而是经验回放、目标网络以及超参数调优的综合结果。理解这些机制背后的数学直觉,比盲目调参更重要。在实际工程中,如果发现 Loss 震荡,不妨先检查目标网络更新频率,或者看看奖励是否经过了归一化处理。

