在Q-learning中很重要的一点,是要去预估未来收益,所以在离散情况下,一般用的是table-based Q-learning算法。它会给出一张表,不断去迭代,直到这张表收敛稳定。当状态空间太大,例如围棋和游戏,就要用深度神经网络。
强化学习存在的两点问题:
1.信用分配问题(credit assignment problem) 击中砖块并且得分和前一时刻如何移动横杆没有直接关系;前面某一时刻的横杆移动有作用。
2.探索-利用困境(exploration-exploitation dilemma)游戏开始,只发射球,不移动横杆,你总是能得10分的;满足于得分还是去探索更多的可能性?(可能更好或者更坏)
先看一看什么是打折的未来奖励:未来有不确定性,所以在计算马尔科夫决策过程的时候通常计算打折的未来奖励。
写成递推式:
Q-learning:Q(s, a)函数,用来表示智能体在s状态下采用a动作并在之后采取最优动作条件下的打折的未来奖励:
实际上这是很难得到的,你怎么能通过游戏某一时刻的状态估算出最终游戏结束时的分数呢?但是可以假设这个函数是存在的,即Q函数。
得到了Q-函数,你只要选取Q-函数值最大的动作(policy明确)
我们可以采用与打折的未来奖励相同的方式定义这一状态下的Q函数
贝尔曼公式实际非常合理。对于某个状态来讲,最大化未来奖励相当于最大化即刻奖励与下一状态最大未来奖励之和。
所以Q-learning实质上是有递归思路的。
下面介绍一下Deep Q Network,还是在弹球问题中:
能不能设计一种通用的表示游戏状态的方法呢? => 屏幕像素
采用连续两个游戏屏幕的像素,球速和方向等各种信息也可以表示出来
屏幕大小84*84,每个像素点有256个灰度值,总共256^(84*84*4)~10^67970种可能的状态
Q-table有10^67970行,且非常稀疏(有很多状态遇不到!!)
用一个神经网络对Q-函数进行建模
神经网络接收一个状态(连续四步的屏幕)和一个动作(向左,向右,不动或发射),然后输出对应的Q-函数的值
改造一下:只接受一个状态作为输入,然后输出所有动作的分数(具体来讲是动作个数大小的向量),这样一次前向运算可以得到所有动作的得分。
这里是一个有监督问题,loss function:
我们可以用Q-learning的算法估计未来奖励,并能够用一个卷积神经网络近似Q-函数。但使用Q 值近似非线性的Q-函数可能非常不稳定。即使使用很多小技巧使得这个函数收敛。在单GPU上也可能需要一个星期的时间训练模型。
和DQN相比,通常大家对梯度策略其实更感兴趣,因为Q-learning可能会存在收敛问题。