Q learning 算法是一种value-based的强化学习算法,Q是quality的缩写,Q函数 Q(state,action)表示在状态state下执行动作action的quality, 也就是能获得的Q value是多少。算法的目标是最大化Q值,通过在状态state下所有可能的动作中选择最好的动作来达到最大化期望reward。
Q learning算法使用Q table来记录不同状态下不同动作的预估Q值。在探索环境之前,Q table会被随机初始化,当agent在环境中探索的时候,它会用贝尔曼方程(ballman equation)来迭代更新Q(s,a), 随着迭代次数的增多,agent会对环境越来越了解,Q 函数也能被拟合得越来越好,直到收敛或者到达设定的迭代结束次数。
以一个例子来介绍Q learning算法
游戏介绍
下图是一个迷宫游戏,agent小老鼠最开始在(0,0)位置,它想走到(1,2)的位置去获取一大堆奶酪,当它到达(1,2)位置的时候,它能得到10分,(1,1)位置是一个毒药,小老鼠走到这个位置会得-10分,其他有的位置放有数量不同的奶酪,根据奶酪的个数得到不同的正向分数,如+1和+2,(0,2)位置什么都没有,它的reward为0。当小老鼠达到一大堆奶酪或者毒药的位置时,游戏结束。小老鼠的可以选择的动作有4个,分别是向上,向下,向左,向右移动。
Q table
我们使用Q table来存储agent在不同state下选择不同动作可以获得的Q value。state是指老鼠所在的位置,action是老鼠在这个位置上所有能选择的动作。表的每一行表示一个state,每一列表示一个action。表中的值表示在这个state和action的最大期望未来reward。Q table最开始的时候会被初始化,比如初始化为0。如下图所示:
在这个游戏中,可以建立一个6*4的表,初始化的Q table如下图所示:
选择action
游戏开始后,我们根据Q table来选择action。
但是由于Q table都被初始化为0了,所有动作的值都是一样的,怎么进行动作选择了?
exploitation-exploration
这里会采用一个exploitation-exploration的方法,它用的-greedy 策略选择action。
exploitation :根据当前的信息,由训练的模型做出最佳的决策,即选择Q value最大的动作。
exploration:探索未知的领域,比如在某个state下随机选择一个action。
做exploitation和exploration的目的是获得一种长期收益最高的策略,这个过程可能对short-term reward有损失。如果exploitation太多,那么模型比较容易陷入局部最优,但是exploration太多,模型收敛速度太慢。这就是exploitation-exploration权衡。
比如我们设=0.9,随机化一个[0,1]的值,如果它小于,则进行exploration,随机选择动作;如果它大于,则进行exploitation,选择Q value最大的动作。
在训练过程中,在刚开始的时候会被设得比较大,让agent充分探索,然后逐步减少,agent会开始慢慢选择Q value最大的动作。如下图所示:
由于刚开始,比较大,agent随机选择一个action。假如在start位置时,agent选择了往右走的动作,到达small cheess位置,如下图所示:
Q value更新
agent从start位置执行一个right动作,走到small cheese位置,得到了一个实时奖励 + 1分,然后我们更新Q table里第一行第二列的值。
更新的方法是用贝尔曼方程(Bellman equation),下面是Q learning算法更新的方法:
是实时奖励,是指在下一个状态,选择使下一个状态达到最大的动作后得到的值。表示未来的长期奖励。
组成在下的实际Q 值,它由实时奖励和未来的长期奖励组成。
是在下的估计Q值,实际Q值和估计Q值的差值表示为。
是学习率,表示每次更新的幅度,是指在的基础上以差值和学习率的乘积的幅度进行变化。
当实际值和估计值的差值趋于0的时候,就不再继续变化,Q 表趋于稳定,说明得到了一个收敛的结果。
下面来看看state为start,action为right时的具体是怎么计算的,设,,
首先我们计算在(start,right)的位置上的。是指实际Q值减去估计Q值。即时奖励加上长期奖励组成实际Q值,是初始化的值。
在计算时,我们将1cheess状态下所有的状态的Q值计算出来,选择最大的。由于都是0,所以为0。然后将=1代入进去,得到=0.1。
我们将Q表上更新,如下图所示。
这时,agent到达了small cheese状态,用和上面同样的方法选择action,获得reward,然后更新。
agent在每一个step的时候都会用上面的方法迭代更新一次Q table,直到Q table不在更新或者到达游戏设置的结束局数。
Q learning算法流程
总结Q learning 算法的流程如下图,我们的最终目的就是得到一个训练得比较好的Q table,Q table里面的不同位置的值就是我们要训练的结果。当模型训练好了以后,agent会学会怎么去玩这个游戏,我们就可以应用此模型了。
当开始一局的新的游戏,agent会根据Q table去查找到到达目的地的最优路径。
Q learning算法的伪代码
如下:
Q learning算法的代码实现:
以下有两个Q learing算法的代码应用:
1.用Q learning 算法学会玩走迷宫游戏:https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/tree/master/contents/2_Q_Learning_maze
参考:
1. Q learning介绍:https://www.freecodecamp.org/news/diving-deeper-into-reinforcement-learning-with-q-learning-c18d0db58efe/
2. Q leaning算法:https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/2-1-A-q-learning/