强化学习 7:价值函数逼近(Value Function Approximation)与DQN算法

至此,我们对于状态价值函数和动作价值函数的表示都是针对不同的状态分别储存一个数值,并且把它们当做不同的情形来更新的。这些价值函数需要一张表格来存储(Tabular Solution Method),获取某一状态或动作价值的时候通常需要一个查表操作(Table Lookup)。

这样导致了一些问题:

  • 对于那些状态空间或行为空间很大的问题几乎无法求解,造成“维度灾难”。
  • 在很多情形下,状态可能是连续分布的,这就导致状态数目可能是无穷多的。

所以,当我们遇到无穷或者庞大的状态集的时候,我们需要采取价值函数逼近法(Value Function Approximation)

参考资料

[1]叶强:《强化学习》第六讲 价值函数的近似表示

[2]搬砖的旺财:David Silver 增强学习——Lecture 6 值函数逼近

[3]张楚珩:【强化学习入门 2】强化学习策略迭代类方法

[4]刘建平:强化学习(八)价值函数的近似表示与Deep Q-Learning

[5]野风:强化学习——从Q-Learning到DQN到底发生了什么?

目录

  • 价值函数逼近(Value Function Approximation)
  • DQN算法

1 价值函数逼近(Value Function Approximation)

第一步,用函数近似来估计实际的价值函数。

[公式][公式]

第二步,把从已知状态学到的函数通用化推广至那些未知的状态中。

第三步,使用MC或TD学习来更新函数参数[公式](通常是矩阵或向量)。

价值函数近似的方法很多,例如最简单的线性回归,还有决策树、最近邻、傅里叶变换、小波变换、神经网络等。运用最广泛的是线性回归和神经网络的近似表达。

对于【状态价值函数】,神经网络的输入是状态[公式]特征向量,输出是状态价值[公式]

对于【动作价值函数】,有两种方法:①输入状态[公式]的特征向量和动作[公式],输出对应的动作价值[公式];②输入状态[公式]的特征向量,动作集合有多少个动作就有多少个输出[公式]

那么如何求出[公式]

这里就要结合机器学习算法里的一些有监督学习算法,对输入的状态提取特征作为输入,通过MC/TD计算出值函数作为输出,然后对函数参数[公式]进行训练,直到收敛。

强化学习应用的场景其数据通常是非静态、非独立均匀分布的,因为一个状态数据是可能是持续流入的,而且下一个状态通常与前一个状态是高度相关的。因此,我们需要一个适用于非静态、非独立均匀分布的数据的训练方法来得到近似函数

在理论知识上介绍详细的:参考资料[1][2]

2 DQN算法(Deep Q-Network)

2.1 概念

DQN算法就是Q-Learning和神经网络结合,将Q-Learning的Q表变成了Q-Network。

DQN利用深度卷积神经网络逼近值函数。此处的值函数对应着一组参数,在神经网络里参数是每层网络的权重,用[公式]表示,用公式表示的值函数[公式]。此时更新值函数时其实是更新参数[公式],当神经网络确定时,[公式]就表示值函数。

那么如何去训练这个网络呢?也就是如何确定参数[公式]

第一,需要一个损失函数(Loss Function);第二,需要足够的训练样本。

2.2 损失函数

在Q-Learning中,我们更新Q表是利用每步的reward和当前Q表来迭代的。

Q-Learning计算出来的目标Q值: [公式]

那么我们可以用这个计算出来的Q值作为监督学习的“标签”(真实值)来设计Loss Function。

Loss Function采用以下形式(近似值和真实值的均方差):

[公式]

2.3 更新神经网络

David Silver把更新方法分为【增量法(Incremental Methods)】和【批处理法(Batch Methods)】。前者是来一个数据就更新一次;后者是先攒一堆样本,再从中采样一部分拿来更新Q网络,称之为经验回放(Experience Replay)

如果每次得到样本就更新Q值,受样本分布影响,效果会不好。所以DQN算法采用的是【经验回放】的方法。对神经网络进行训练时,假设样本是独立同分布的。而通过强化学习采集到的数据之间存在着关联性,利用这些数据进行顺序训练,神经网络当然不稳定。经验回放可以打破数据间的关联。

前文说了,更新值函数时其实是更新参数[公式],用**随机梯度下降法(SGD)**使得损失函数值最小,求出参数。

[公式]

2.4 伪代码

基于NIPS 2013 DQN的算法流程:(截自[4]

(待完善)