深度学习算法 Q-learning 原理

Shirley ·
更新时间:2024-11-15
· 907 次阅读

Q-learning
Q-learning 是 value-based 的方法,在这种方法中我们不是要训练一个 policy,而是要训练一个critic网络。critic 并不直接采取行为,只是对现有的 actor ,评价它的好坏。

Value-Fuction
critic 给出了一个 value function ,代表在遇到游戏的某个 state 后,采取策略为的actor  一直玩到游戏结束,所能得到的 reward 之和。

 (即critic)的输入是某个state,输出是一个scalar标量。上图游戏画面中左边的  很大,因为当前怪物比较多,防护罩也没被摧毁,从此时玩到游戏结束得到的 reward 就会比较多;而相对的右边的  就比较小。综上 critic 的输出取决于两点:

state,这个就是左右图对比,刚才说过了
actor 的策略 ,如果是个很弱的actor即便左图可能也得到很低的reward。
 

怎么计算呢?

计算的2种方式:
 1、Monte-Carlo (MC) based approach :


将作为的输入最终输出 ,而实际上应该得到的cumulative reward是。这其实和 regression problem 很相似,因为我们的目标就是通过训练让  越来越接近  ,即理想情况下(这里为了方便,假设学习率为1,原始的公式为)。

注意:是一个网络,因为在游戏中,不可能所有的image都看过,所以将做成网络来提高泛化性。

2、Temporal-difference (TD) approach


MC based的方法要求遇到 后把游戏玩到结束,如果游戏太长的话,那就可能收集不到多少数据去让网络去拟合。

而 TD 只需要从  玩到  就行,因此只需要算 (这里为了方便,假设学习率和衰减系数都为1,原始的公式为)。

那么 应该要越接近才是正确的结果,所以将网络往这个方向去train,就可以把这个function训练出来。

MC v.s. TD :


MC 方法的问题在于最后得到的  的方差很大(  是 在遇到 的情况下使用策略 的actor一直玩游戏直到结束得到的实际 reward,是一个随机变量,因为游戏是有随机性的,所以每一次得到  是不一样的)。 

假设 是k步 reward 的求和,而根据公式 ,最终会相差 倍。所以最后  的方差很大,即每次算出来的   都会相差很多。

而用 TD base 中有随机性的部分是 ,它的方差比较小。但 TD 的问题在于  可能不准确。

下面举个例子看它们的区别:


可以看出,同一个actor,用MC based和TD,算出来的结果是不一样的,两种结果没有绝对的正确与否。

其中,在第一个episode中,出现后的reward变为0。

在Monte-Carlo方法中,就会认为是一个不好的state,才导致后来的的reward变为0,所以  为0.

而TD方法中, 会认为 后  得到 reward 为 0 只是一个巧合,与  无关。大部分情况下  还是会得到 3/4 的 reward,所以认为  为3/4。(因为)

Q-function:


的输入是一个 (s, a) 的 pair,然后输出一个cumulated reward的期望值。这里的cumulated reward指的是在state s下强制采取 action a(不管这个actor认为在state s下采取action a是不是好的,都强制采取a),然后用这个actor  一直玩到游戏结束所得到的cumulated reward。

Q(s_t,a_t) = Q(s_t,a_t) + \alpha (r_t + \gamma maxQ(s_{t+1},a_{t+1})-Q(s_t,a_t))

   (这里为了方便,假设学习率和衰减系数都为1,原始的公式为)

Q(s_t,a_t) = Q(s_t,a_t) + \alpha (r_t + \gamma maxQ(s_{t+1},a_{t+1})-Q(s_t,a_t))

以上是Q function的两种常见的写法。

如果action可以穷举,则可以使用右边的写法;否则,使用左边的写法。

critic 看上去只能评价某个 action 的好坏,但是实际上可以直接用它来做 reinforcement learning。方法是只要学到一个  的 Q function  ,就能有办法找到一个更好的 actor ,这样就能不断更新policy   。

什么叫  比 π 好呢?

就是说面对所有 state s 时,使用策略  得到的 value 一定比使用策略  得到的Q value 大,即: 

找  的方法是,对于已经学到的 Q function  ,在某个给定的 state 下,分别带入可能的 action,看看哪一个 action 使得Q value最大,把使得函数值Q value最大的 a,作为以后面对该 state 时采取的 action。

下图证明了 :

Q-Learning使用技巧:
技巧1:使用Target network


Q-function的训练,参考了TD的方法,即。

现在以、作为输入,则输出的结果,由上图可以得出,这个结果应该尽可能接近以、作为输入,则输出的结果再加上的结果。

也是一个类似回归的问题,但是这里不同于前面的Monte-Carlo (MC) based approach和Temporal-difference (TD) approach的回归问题,这里的是一直在变化的,即要去拟合的目标,其实是一直在变化,这就对训练产生很大的干扰。

所以

将以、作为输入的网络(也叫Target network)固定住,这样也变成一个固定的值,然后让以、作为输入的网络去拟合这个固定的值。
经过N次训练后,将左边的网络的参数覆盖掉Target network,形成新的Target network
重复1、2的步骤一直训练下去。

技巧2:使用exploration


Q-learning方法是根据查表来估值的,只有在状态执行过动作之后,我们才能估得出。即便是使用DQN(就是说将Q-function改为一个network,把查表的过程变成network的输入输出)减缓了这个问题,但也可能存在一些状态没执行过动作,没办法估出。

现在在状态s下,都没有采取过action 、、,所以所有的Q-value都为0。接下来与环境的互动中,sample到在状态s下,采取动作,会使得Q-value从0变成1。

可以知道,接下去在状态s下就会一直采取动作,而不会去尝试可能未来会获得更大reward的、。

为了解决这个问题可以使用以下两种方法:

1、Epsilon Greedy


假设为0.3,那就会有0.7(1-0.3)的几率会使用以往的经验去执行动作,而剩下0.3的概率随机去试探新的动作

会随着训练的进行不断减少,就是说在一开始的时候的值会大一点,因为还不知道哪个action是好的,所以还要提高探索(exploration)的次数。随着训练的进行,开始知道哪些action是好的哪些是不好的,就可以减少探索(exploration)的次数。

 2、Boltzmann Exploration


因为Q-value可能有正有负,所以先取exp全部转成正的。然后除以分母,做Normalization。

这样就将所有动作的Q value转化为概率,概率的大小和Q value的大小有关。然后通过概率的大小去选择不同动作a,概率大的被选到的次数就会多,概率小的被选到的次数就会少,这样即便Q value小的action也还是有可能会被选到。

技巧3:使用Replay Buffer


把actor的每笔experience (st,at,rt,st+1)放到一个buffer里面,其中buffer里面的exp可能来自采取不同policy的actor(假设actor和环境互动一万次后就更新参数,而buffer里面能存放5万个的exp,就会导致buffer里有5种不同的actor的exp),当buffer满了再替换旧的exp。训练过程时每次从buffer里面sample一个batch(比如说100个exp)出来训练。

因为buffer里有采取不同policy的actor的exp,所以导致这个训练过程变成off-policy的。但是因为我们只用一个exp训练,并不是整个trajectory,所以off-policy也没关系。

这样做的好处:

1、训练过程中与环境交互很耗时间,而Replay Buffer可以使得之前的actor的exp被反复利用到,减少很Env互动次数;

2、增加数据多样性,降低batch内相关性,提高泛化性能,训练效果更好。

最后放一张完整的Q-Learing的过程图:


作者:NO23412号菜狗



q-learning 深度学习算法 学习 深度学习 算法

需要 登录 后方可回复, 如果你还没有账号请 注册新账号