漫谈DQN之Q-Learning

时间:2021-01-10 04:29:07

DeepMind于2013年12月份在arixv上发表了一篇论文Playing Atari with Deep Reinforcement Learning,该论文介绍了一种将传统的强化学习与深度学习相结合的模型,它可以直接根据屏幕像素点输出游戏动作。随后,2015年2月份DeepMind文章 Human-level Control through Deep Reinforcement Learning作为Nature封面被刊登,该文章的深度强化学习模型无需修改直接玩49种游戏,而且有一半游戏的表现已经超越人类,同时,DeepMind也被Google立即收购。

虽然早在上个世纪就有学者提出将强化学习与神经网络进行结合,但是深度强化学习无疑是DeepMind带火的,也算是DeepMind的“专利”,而AlphaGo则是彻底让大众也了解了这个“专利”。近日,DeepMind宣布将于今年5月份在中国乌镇挑战围棋冠军柯洁并增加人机团队赛,届时我们拭目以待。我们不禁要问一个问题,为什么深度强化学习如此高效?传统的强化学习需要对所有状态空间进行迭代,但是现实中很多问题的状态空间接近无穷,使用传统的迭代方法已经无法取得进展。由于深度神经网络具有强大的表征能力,并且随机梯度下降算法也可以很好地保证神经网络易于学习、收敛,当然,这其中还涉及很多技巧,例如经验回放、策略网络、价值网络、价值截断等等,因此,二者结合是必然的趋势,毕竟强化学习的未来不仅仅只是玩游戏而已,面对现实错综复杂的环境,如果不能有效地对环境状态进行模拟,那强化学习是没有实用价值的。

未来一段时间博客将聚焦于DQN的算法以及实践,今天先介绍一下Q-Learning算法基础。

在Q-Learning中,函数Q(s,a)是代表机器人在状态s时采取动作a所得到的未来价值回报,可能有读者就有疑问了,当前我采取了动作a,我怎么知道我当前这个做法在未来的价值回报是多少?确实不能,如果我们仅仅知道当下的状态、动作,而不知道紧接下来的动作及其回报。

怎么求Q(s,a)是一个摆在我们面前的大问题,虽然我们无法确切的知道Q(s,a)是多少,但是我们可以在心里面假想这个Q(s,a)一定是存在的,一旦Q(s,a)存在,于是我们在每一个状态s时,只需采取满足Q(s,a)最大的那个动作a了。

如何计算Q(s,a)?我们可以回顾一下Bellman方程,即前后两个相邻的Q(s,a)必须满足的关系,简单说就是当前采取的行动的最大价值回报等于瞬时回报加上下一个状态的最大回报。顺此思路,Q-Learning的做法就是使用此Bellman方程不断逼近Q(s,a)

Q-Learning最简单最直接的做法就是构建一个状态-动作表,该表中存储着每个状态采取每个动作时候的Q值。该做法的流程可以总结如下:

假设状态数目为A,动作数目为B

  • 随机初始化数组Q[A, B]


  • 定义或获取初始状态s


  • 重复以下步骤直到数组Q收敛


    (1) 选取一个动作a并且执行


    (2) 接受回报R,同时转移到下一个状态s’


    (3) 更新Q[s , a]的值


    (4) 状态变为s’,并返回到步骤(1)

可以看到,使用Q[s,a]来进行Q-Learning的算法流程非常简单,不过上述算法中有以下几个值得思考的关键点:
第一,如何选取动作a?

如果仅仅是采取贪婪的算法,在每个状态s处挑选让此状态达到最大值的动作a,这种做法眼光太狭隘,只注重眼前利益,不顾长远回报,其使得expoitation达到了最大,exploration却最小,最终陷入局部最优。因此比较好的办法是在选取动作a的时候,既要注重expoitation,又要考虑exploration,可以采取e-greedy算法,设定一定的概率让机器人随机采取动作,其余时候贪婪做出决策。

第二,如何更新Q[s,a]的值?

前面说了,由Bellman方程可知,Q[s,a]=R+max(Q[s',:]),从梯度下降的角度看,这个新的Q[s,a]是在s状态下求出的最大未来回报,也是我们渴望逼近的值,但是我们在更新旧的Q[s,a]的时候,不能将此新的Q[s,a]直接替代旧的Q[s,a],因为这个新的Q[s,a]只是我们的一种估计,甚至是一种带噪声的估计。因此,不能直接使用新的Q[s,a]去取代旧的Q[s,a],而应该是让旧的Q[s,a]朝着新的Q[s,a]走一小步,用公式描述就是:

Q[s,a]=Q[s,a]+lr*(R+gamma*max(Q[s',:])-Q[s,a])
其中lr是学习率,gamma是折扣因子,之所以使用折扣因子是因为,环境可能是随机的,我们无法完全确保在下一次采取同样的动作还是会得到同样的回报值。折扣因子一般介于0和1之间。

第三,除了使用e-greedy算法选取动作,是否还可以使用其他技巧?

答案是可以的,比如,在每一个状态s时,当我们计算Q[s,:]的最大值时可以先随机添加一点高斯噪声到Q[s,:]上再求最大值,这样也可以起到了exploration的作用,这种方法的好处就是我们在鼓励exploration的同时也照顾了Q值,而不是纯粹的随机选取。我想,在训练的不同阶段,我们可以组合这两种技巧,比如在训练开始的时候,采取e-greedy算法,而一定周期以后,就采取添加噪声的算法。

由于本次讲的Q-Learning算法较为基础,因此代码演示就由下次一起讲解。Q-Learning算法是一种离策略算法(off-policy),即其Q函数更新不同于选取动作时遵循的策略,换句话说,Q函数更新时计算了下一个状态的最大价值,但是取那个最大值的时候的行动与当前策略是无关的。下次将讲解sarsa算法,它是一种在策略算法(on-policy),并且逐步介绍如何使用深度神经网络来替代数组Q[s,a]进行学习,平台采用OpenAI的gym。


题图:The First Google Team in 1999


你可能会感兴趣的文章有:

漫谈DQN之基础概念

漫谈DQN之GridWorld代码实现