Q-Learning基础

一 背景

在前面的一小节中, 涉及到了一种蛇棋的游戏。 我们具有上帝视角,知道环境运转的细节,即知道状态的转移概率。但是在现实中,大部分都没有这种上帝视角, 所以在这部分对蛇棋游戏进行升级:我们将不再对玩家显示棋盘信息和骰子可能的投掷数目。 每次玩家选择完所使用的手法后, 玩家将直接得到棋子的下一个位置, 而不会知道其他任何信息。

在这种新的规则下, 新算法大致思路是:

1. 确定一个初始策略

2. 用这个策略进行游戏,得到一些游戏序列

3. 一旦游戏的轮数达到一定的数目, 就可以认为这些游戏序列代表了当前策略与环境的交互表现,就可以将这些序列聚合起来,得到状态对应的值函数。

4. 得到了值函数, 就相当于完成了策略的评估过程, 这样就可以继续按照策略迭代的方法进行策略改进的操作,得到更新后的策略。如果策略更新完成,则过程结束;否则回到步骤2.

解决的方法有:蒙特卡罗法和时序差分法。

二 蒙特卡罗法

假设通过一些方法, 从状态s和行动a开始不断与环境交互,得到了大量的样本序列。

                                        

对应的回报序列为

通过上述的样本序列逼近真实的期望值,那么公式就可以近似等于:

                                                

如果序列是有限的, 我们也可以直接使用序列产生的回报和作为价值:

                                                

蒙特卡罗法:

1. 让Agent和环境交互得到序列

2. 通过序列计算出每一时刻的价值

3. 将这些价值累积到值函数进行更新

4. 根据更新的值函数更新策略

要计算期望价值, 要将所有观察到的长期回报求平均值, 那么令状态行动价值为q, 当前的时间为t,积累的数量为N,我们要求的值为, 当前已知的值为 和 N, 每一时刻的价值为,于是:

                                                         

                                                               

                                                              

                                                            

具体代码如下:

ModelFreeAgent
蒙特卡罗方法

蒙特卡罗方法问题之一:方差较大

三 时序差分法

时序差分法TD是一种结合了蒙特卡罗法和动态规划法的方法。迭代公式是:

时序分差法核心迭代公式
TD代码

注意点: 更新值函数用的是完整的序列

四 Q-Learning

Q-Learning 迭代公式

迭代更新核心公式

SARS 算法遵从了交互序列, 根据下一步的真实行动进行价值估计;Q-Learning算法没有遵循交互序列, 而在下一时刻选择了使价值最大的行动。

核心代码

五 DQN算法

Q-Learning模型本身不太稳定,原因在于:

1. 计算当前状态行动下的价值目标值: 

2. 网络模型的更新:

可以看出模型通过当前时刻的回报和下一时刻的价值估计进行更新。这里存在一些隐患, 前面提到数据样本差异可能造成一定的波动, 由于数据本身存在不稳定性, 每一轮迭代都可能产生一些波动, 如果按照上面的计算公式,这些波动会立刻反映到下一个迭代的计算中,这样就很难得到一个平稳的模型。因此引入了目标网络的概念,引入一个结构完全相同的模型, 目标网络,原本的网络被称为表现模型,具体如下:

1. 在训练开始时, 俩个模型使用完全相同的参数

2. 在训练过程中, 表现网络得到的目标价值由目标网络得到;然后用它和表现网络的估计值进行比较得出目标值并更新表现网络。

3. 每当训练完一定轮数迭代后,表现网络的参数同步给目标网络。

六 Double Q-Learning

虽然DQN方法提高了模型的稳定性, 但它并没有解决另一个问题,Q-Learning对价值过高估计的问题。

我们已经知道目标网络求解价值值的公式:

                                

其中表示目标网络的参数。 将公式进一步展开, 可以得到更详细的公式内容:

                        

公式展开后,我们发现采用目标网络结构后, 模型在选择最优行动和计算目标值时依然使用了同样的参数模型, 这样必然会造成对价值过高的估计。为了尽可能减少对高估的影响, 一个简单的办法就是把选择最优行动和估计最优行动俩部分的工作分离, 我们用表现网络完成最优行动的选择工作, 这样就可以得到:

                        

通过这样的变化, 算法在三个环节的模型安排如下:

1. 采样: 表现网络

2. 选择最优行动: 表现网络

3. 计算目标价值:目标网络

七 Dueling DQN

Dueling DQN是一种基于DQN的改进算法, 它的主要突破点在于利用模型结构将值函数表示成更细致的形式, 这使得模型能够拥有更好的表现。如下公式:

                                 

V(s)状态的值函数和优势函数A(s, a)。如果所有状态行动的值函数不相同, 一些状态行为的价值q(s, a)必然会高于状态的价值v(s), 当然也会有一些状态行动对低于价值, 于是优势函数可以表示出当前行动和平均表现之间的区别:如果优于平均表现,那么优势函数为正;反之则为负。

这样分解输出的有点在于:

1. 通过这样的分解, 我们不但可以得到状态和行动的q值,还可以同时得到V值和A值。 

2. 从网络训练角度来看, 我们从原本需要训练|A|个取值为的数值, 变成了训练一个取值为的数值, 和|A| 个均值为0, 实际上取值为[-C, C]的数值.

3. 对于一些强化学习的问题来说, A值的取值范围远比V值小,这样将俩者分开训练更容易保持行动之间的排列顺序。由于我们需要从所有行动中挑选出价值最高的的, 因此不同行动之间的价值需要保持一定的区分度。由于A值的数值范围比较小,因此它对模型更新更敏感,这样模型在更新时会更容易考量与其他行动的相对变化量, 也就不会因为一次的更新使得原本的行动排序被意外打破。

八 冷启动问题

强化学习问题都遇到了"冷启动"的问题。对于以值函数为核心的Q-Learning 算法来说, 前期的算法迭代很难让模型快速进入一个相对理想的环境, 更何况由于前期值函数存在较大偏差, 与环境交互得到的采样与最优策略存在一定的差别,增加了学习的难度。

本书中的思路是利用预先准备好的优质采样轨迹加快模型前期的训练速度。对一个未经任何训练的模型来说, 模仿优质采样轨迹的行动是一个不错的选择,因为模型训练初期Agent的策略相对较差, 从交互训练中学习效果不会很好, 而优质行动本身来自较强的策略, 这样就相当于直接站在巨人的肩膀上, 学习速度自然会快很多。只要我们有办法取得一定数量的优质轨迹,就可以通过学习完成与环境交互前的与训练。

除了使用监督学习预训练以外, 我们还要使用强化学习完成DQn模型原本方法中的训练。最终模型的目标函数变成了多个学习目标的形式:

                            

这个目标函数包含了4个子目标。

1. : Deep Q-Learning的目标函数

2. :   以n步回报法估计法为目标的Q-Learning目标函数

3. :利用准备数据进行监督学习的目标函数

4.: L2正则的目标函数

对于序列比较长的问题, 这种方法有一个缺陷,那就是价值需要一定时间的训练才能跳过前面波动的时期,进入相对稳定的更新时期。为了使模型的更新进行的更快, 我们可以将上面的公式进一步展开, 不仅用下一时刻的回报,而是将此后更多时刻的回报加入目标值中。

            

这个估计方法公式被称为n步回报的估计法,可以看出这个方法结合了蒙特卡罗法的特点,在公式中使用了更多真实的交互回报,这样更容易在模型训练早期将值函数做快速更新,一般来说可以设置成n=10.

你可能感兴趣的:(Q-Learning基础)