【新智元导读】DeepMind开始称霸强化学习的DQN算法,都有哪些训练技巧?
过去十多年里,DeepMind在人工智能的发展中绝对有着重要的地位,从AlphaGo, AlphaZero到AlphaStar,再到如今的AlphaFold 2,每次DeepMind发布新产品似乎都要彻底消灭该行业。
围棋界天才少年柯洁都不再下传统围棋,跑去练习云顶之弈。弈一时,悟一世,切换赛道誓在新概念围棋夺生涯第九冠(bushi)。
DeepMind在围棋、星际争霸和德州扑克等取得的巨大成就,实际上都归功于DeepMind于2013年发布的DQN算法,也是深度学习和强化学习的首次成功结合。
Deep Q-Networks (DQN) 于 2013 年首次发布,仅将游戏的像素值作为网络的输入,成功在一套雅达利(Atari)游戏中超越之前的所有模型的得分,甚至有三个还超越了骨灰级玩家的得分。
论文链接:https://arxiv.org/pdf/1312.5602.pdf
智能体直接从经验中进行学习,并成功学习到有效的行动在当年是一项重大突破,也让通用人工智能AGI的重回大众视线:计算机在诸多任务中获得的智能,也许比人类更强!
不过DQN的训练并没有想象中那么简单!
Q-learning是什么?
Q-learning是强化学习(RL)的经典算法,简单来说,RL智能体与环境进行交互,如果采取的行动是「好」的,就会获得奖励,否则获得惩罚,强化学习算法的目标是最大化智能体获得的长期奖励总和。
在强化学习智能体和环境之间的交互循环中,每个时间步(timestep),智能体需要选择一个行动(action)来改变环境(environment)的状态(state)。环境也提供一个奖励信号(reward signal)以表示智能体的行动是否有利。
处于一个特定的游戏状态或采取一个行动的未来奖励是不难估计的,难的是你的行动对环境的影响可能是不确定的,这也意味着你得到的奖励也是不确定的。尤其是在我们不知道环境的运行规则,或是在很遥远的未来且状态数很多的情况下,我们怎么能知道一个行动会带来什么奖励呢?
比如说,玩《超级马里奥》某一关时,最佳的行动可能是在第一帧跳跃,但如果奖励一直在关卡的最后阶段,要怎么才能知道这个行动的价值?
Q-learning采取的方法是学习一个行动-价值函数(action-value function),也被称为Q函数。
Q函数为每个(状态,行动)组合分配一个价值,用来表示在某一状态下采取某一行动时预期未来回报的估计,并且Q函数为所有状态都定义了一个价值。
在Q-learning中,智能体通过与环境互动和更新采取的(状态,行动)的Q值来学习Q-函数估计价值。在采取一个行动之后,用环境中新状态的Q值来更新所有Q值。重复迭代,最终可以估计出该状态的Q值,并根据这一估计采取行动。
一些简单的游戏通过这种方式可以估计出所有的(状态,行动)对的价值,但对于雅达利游戏来说,(状态,行动)的组合数量实在是太多了,想存储在一个简单的表格中基本是无法实现的。
比如说在打砖块游戏中,如果只用球拍和球,在一个300*800像素的屏幕上,状态的数量就达到了10的9次方到10的11次方,海量的状态空间情况下,引入深度神经网络就显得很必要了。
神经网络不好训
Q-Learning和神经网络的结合在理论上是非常强大的。Q-learning可以让智能体学习任何决策任务,而神经网络可以表示任何函数。如果成功训练,就会有大量的潜在应用场景得以实现,比如自动驾驶汽车、机器人技术等。
但要训练Q-learning和神经网络的组合是非常困难的。即使经过多次在不同状态下采取行动并获得奖励的迭代,有时性能也不会提高。常见的情况就是,智能体的性能在明显改进之后开始出现下降。
在DeepMind发布DQN论文后,这种情况仍然很常见。
Q-learning算法的每个更新步骤都是基于该步的经历,但是,如果每走一步就更新的话,算法会因为抽样误差(sampling error)而导致不稳定的更新,而抽样误差是由任意分布中抽取数据点导致的。
如果你在最近的数据点的序列上进行训练,那么你看到的数据肯定都是相似的,因为通常需要很多个时间步才能遍历到整个状态空间,所以你访问的下一个状态与你当前所处的状态基本上就算密切相关。样本之间的这种相关性会使得学习效率低下,而将它们打散后,通过打破相关性可以改善学习效果。
为了缓解这种情况,DeepMind在DQN算法中引入了一种新机制:经验重放(Experience Replay),其中经验指的是智能体在一个时间段内观察到的状态、行动、奖励和下一个状态。经验重放将每个时间段的状态、行动、奖励和后续状态存储在内存中,并在每个时间段从中随机选择一批。
对数据进行抽样训练,使每次更新使用的经验随机化,就可以打破数据点之间的关联性,能够降低更新的方差。由于每一步的经验都被用于许多权重的更新,这也意味着训练需要更少的数据。
在Q-Learning中,有三个使用Q函数的地方:
- 为了得到第一个状态的Q值
- 用于评估哪个后续状态的Q值最高,以选择一个行动
- 找到该后续状态的Q值
将Q-learning与神经网络结合起来,如果直接将同一个网络用于这三个地方,也就意味着如果模型高估了一个状态的价值,那前面的状态也会被高估,因为Q-learning使用最大行动价值作为最大预期行动价值的估计,可能会导致学习到一个错误的Q-函数估计。
不过在学习过程中,数值估计不精确是很正常的,也就是说,高估是很常见的。
如果对Q值的高估在各个状态都是一致的,那这就不是一个问题。如果所有的Q值都有类似的变化,那么我们选择的行动也会是一样的。但从经验上看,实际运行通常不是这样的,也就意味着由近似的Q值产生的策略(policy)不一定会收敛到最佳策略。
解决高估问题的方法是使用Double DQN,也是DeepMind在2015年发表的另一篇论文中提出的。
论文链接:https://arxiv.org/pdf/1509.06461.pdf
Double DQN指的是模型拥有两个深度神经网络,模型使用正在训练的网络在与环境互动时进行行动选择,Q-函数估计更新使用后续状态的Q值,这就是第二个目标网络派上用场的地方。
目标网络通常是网络的一个旧版本,用来寻找具有后续状态的最大Q值的行动,而原始网络用来评估这个后续行动的Q值。通过将用于行动选择和行动评估的Q值解耦,就不太可能选择到高估的值了。
自此,训练DQN的坑基本都被填上了,不过强化学习后续还取得了其他重大进展,比如围棋领域的AlphaGo,星际争霸、德州扑克等领域都被攻克。
但一切都是自DQN发布之后,深度强化学习才进入春天,DQN也展现了其解决通用问题的潜力。
参考资料:https://blog.delta-academy.xyz/why-deepmind-dqn-hard-to-train