DQN中的一些问题

模型始终不收敛

这篇文章使用DQN网络训练agent平衡杆的游戏,代码可以正常运行

此时,若删除target_net,只保留eval_net,多次运行后发现,有时候模型一直都不会收敛(长时间训练后,agent仍然不能维持杆的平衡,表现仍和随机action一样)。

异常情况
正常情况

为什么DQN需要两个网络

通常在网上找到的DQN代码一般都有两个网络:eval_net 和 target_net,两个网络初始时同步参数,eval_net会在每次训练后都更新参数,target_net则仅会在多次训练后(例如10次)才会和eval_net同步一次权重参数。使用过程中,用eval_net计算当前qvalue,使用target_net计算期望qvalue。为什么要这样做?

如上个问题所述,即使去掉target_net,有时候模型也能正常训练。

  1. 若仅使用一个网络,由于贝尔曼方程是一个递归方程,其函数本身也用到了自身,如果函数本身一直在变,而你又依赖这个一直在变化的函数去企图收敛一个函数,就像打靶射击移动靶位一样困难
  2. 便于实现Double DQN。Double DQN

https://ai.stackexchange.com/questions/6982/why-does-dqn-require-two-different-networks

https://blog.csdn.net/weixin_46133643/article/details/121845874?spm=1001.2014.3001.5501

Pytorch官方DQN教程模型不收敛

我将pytorch官方DQN的教程代码复制下来运行一晚,貌似也没有收敛(平衡杆游戏,橙色的线代表一段时间游戏的平均时长,越高越好。官网说运行300个episode就会有效果)

同时测试删除里面的target_net,只保留eval_net同样是不收敛

Leave a Comment