5.Q-learning
目录
简介
上篇文章里讲了MC算法和TD算法,不过用的是V值函数,这回我们学习Q函数。在贝尔曼方程那一篇文章里我们说过,Q函数可以表示成最优Bellman等式的形式,且最优的Q等价于最优的策略,又策略一定可以收敛到最优策略,Q-learning就是基于这些思想来实现的。
实现运用到的技术
前面讲到了,Q-learning实际上就是对Q值函数使用TD算法(至于为什么不用MC算法,我也不清楚,可能是因为方差太大了吧)。TD算法的核心只有一个公式:
我们通过训练拟合Q值函数,采样即时奖赏r,来训练出最优的Q值函数,也即最优策略。
但具体实现的过程中,还是用到了一些小技巧,分别是:
- Target Network(目标网络)
- Exploration(探索)
- Replay Buffer(回放缓存)
下面,我将对其分别进行讲解。
1.Target Network
TD算法,训练一个模型当做Q函数,采样。但是在实际运行过程中,会发现如果同时update左边的Q model和右边的Q model,训练会变得不太稳定。也就是说,不能让同一个模型同时输出两次Q值。因此,我们产生了Target Network的想法,即固定右边的模型参数不变,转而只更新左边的模型。
当然了,为了这两个模型在理论上用的是同一个策略,所以这种固定也并非一成不变,而是左侧模型每update一定次数就更新一次右侧的模型。
比方说玩某个游戏玩了50轮,我们更新一次右边的模型,而这50轮游戏里每一轮结束时我们都会更新左侧的模型。
采用了Target Network,能让模型训练得更加稳定。
2.Exploration
Q-learning的行为是基于Q函数的:
与Policy Gradient不同的是,这里策略产生的行为是固定的,而非一个概率分布。这就会产生一个问题:如果在初始的采样过程中某个行为先获得了一定成效,模型就会一直选择这个行为,而不会去拓展(explore)选择其他行为。
打个比方,打飞机游戏可以左移,右移,开火。刚开始的时候这三个动作在某个状态的Q值函数都是0,然后某轮游戏结束后,开火的Q值函数变成1了,接下来再碰到这个状态时模型就会直接选择开火,而不是去选择其他的动作,哪怕左移这个动作可能带来3的奖励值。
所谓的Exploration,就是不要模型这么死板的选择动作,至少不要在游戏开始的时候这么死板。
有两种解决方法,一种是Epsilon Greedy,另一种是Boltzmann Exploration。
Epsilon Greedy
非常简单,设置一个参数,每次采取行动前都取个随机数值,如果随机到数值小于,那就随机行动;反之则采取最大Q值的那个行为。
公式里的往往是动态的,在刚开始训练的时候设置的大一些,在训练一定episode之后又设置的小一些,比方说。
Boltzmann Exploration
说Boltzmann可能不了解,但叫他另一个名字softmax肯定就很多人知道了。实际公式其实也就是softmax的公式:
这样,就可以计算出每一个动作a的出现概率了。
3.Replay Buffer
如果还记得之前一篇关于on-policy和off-policy区别的文章,那就能理解这一部分了。on-policy就是policy一边采样一边训练,训练好了再用同一个agent去采样;off-policy就是一个agent只采样,另一个agent用采样得来的数据来训练模型。
Replay Buffer相当于开拓一个存储空间,用来存储采样来的经验。这里存储的经验就是一组,这些经验可能来自不同的策略,这是因为采样的模型也需要更新,只是更新的比较慢而已(比如说玩1万盘游戏更新一次)。我们用Replay Buffer中的经验来训练Target Network。
伪代码步骤
- 初始化训练模型,同时令目标模型。
- 在每一轮游戏episode:
- 在每一个时间步t:
- 基于模型(采用epsilon greedy方法)获取状态,采取动作。
- 获得即时奖励和下一个状态。
- 将存入Replay Buffer中
- 从buffer里随机采样数量为Batch_size的经验序列数组,其中batch size是自己设定的。
- 对每一个采样出来的序列(一共有batch size个这样的序列),都通过目标模型计算其目标值。
- 更新模型,令回归拟合,即满足公式。
- 每个episode后,更新目标模型。
- 在每一个时间步t:
总结
Q-learning的基本思想,就是将TD应用在Q值函数上,然后引入了三个小方法来解决实际运行中出现的问题。
接下来讨论DQN。
本文地址:https://blog.csdn.net/qq_39160779/article/details/107323028
推荐阅读