DSR学习笔记及试验
主要参考文献:
[1] Gershman, Samuel J. "The successor representation: its computational logic and neural substrates." Journal of Neuroscience 38.33 (2018): 7193-7200. [2] Kulkarni, Tejas D., et al. "Deep successor reinforcement learning." arXiv preprint arXiv:1606.02396 (2016). | |
APA |
---|
引言
一般强化学习算法分为两类:model-based和model-free。Model-based的算法比较典型的有值迭代(value iteration)和蒙特卡洛方法(Monte-Carlo methods),通过reward函数和状态转移函数的学习来估计值函数。而后者不考虑模型的具体表达形式,从状态-动作-奖励序列信号中直接估计值函数,比较典型的算法就是时序差分学习(TD learning)。
以上两类算法各有优劣,从算法的计算效率来看,model-free更胜一筹,因为它从经验数据中对值函数进行估计,不需要对状态空间中的所有状态进行遍历,因此特别适用于像神经网络这样基于数据的函数拟合器。但是其缺点就是一旦采样数据的分布发生变化,或者环境发生了变化,则之前学习到的参数统统失效,甚至有的时候一些细微的变化都会导致性能大幅度下降,也就是所谓的“灾难性遗忘(catastrophic forgetting)”问题, (其实在我看来就是因为神经网络暴力拟合数据所造成的,你从一个样本中抽取数据进行训练,那么这个神经网络几乎只能工作在这个样本中,一单你拿其他样本的数据喂给神经网络,输出的结果几乎是无效的,这也是我后面想做的研究方向:world model 或者是其他的更偏向于model-based或者说是折中一点的算法研究。)因此,从算法的灵活性来看,model-free的算法表现较差。而model-based算法则正好反过来,它在计算效率上不如model-free算法节省资源,但是模型更加灵活。这是因为model-based算法具有模型本身的一些先验知识,因此当环境发生变化的时候,可以从模型参数上对模型进行相应的修正,则算法依然能够表现得很好。但是这类算法在状态空间比较大的时候,将会特别消耗计算资源,甚至不可求解。那能不能找到一种算法,能够从计算效率(efficiency)和灵活性(flexibility)之间进行折中呢?这就引入了今天要介绍的Successor Representations。这里我们还是引用一张经典的图来描述SR
SR基础数学知识
在普通的Q-learning中,我们计算Q值的公式为:
agent的目标是利用Q函数的贝尔曼方程的形式找到一个action: 使得
达到最大。
而在SR算法中,我们计算Q值是通过将reward值和SR函数表达式相乘得到,即:
其中
我们可以直观理解为在状态s下,采取动作a, 转移到每个状态 分别对应的频率是多大,在普通的SR中,M其实就是一个三维的矩阵,每一纬度的size为:(n_actions, n_state, n_state),
其实就是一个一维向量,代表从s转移到
的奖励是多少。相关代码我已经上传至github, 有兴趣的同学可以看一下。https://github.com/deepBrainWH/MLAlgorithm/blob/master/reinforcement_learning/SR/sr_brain.py
根据SR的公式我们不难发现,SR算法的更新包括两部分:对R的更新和对M的更新。有了这些基础知识之后我们再来继续探讨下DSR。
DSR算法
根据上面SR算法的描述,我们不难发现SR算法要求状态空间有限,并且行为空间有限。但是当我们的环境极其复杂时,状态空间有限这个条件很难满足,就像让agent玩视频游戏,不可能采样到每一帧视频。并且当每个状态的size太大时,计算效率会急剧下降。因此在论文[2]中引入了状态空间压缩这个算法。论文中的具体网络结构如下图所示:
同样我也使用TensorFlow进行了相应的实现:
代码位置:https://github.com/deepBrainWH/MLAlgorithm/blob/master/reinforcement_learning/SR/dsr_brain_keras.py
网络分为4个部分,第一部分就是编码层,对应于论文中原图的, 编码后输出一个固定维度的
, 也就是上面说的状态空间压缩,无论状态的size是多大,都将其压缩到一个固定的维度。decode部分就是一个解码器,这部分训练就是使用普通的监督学习进行训练的。
网络的第二部分输出的是一个矢量R, 代表在S状态下的奖励值。第三部分就相当于SR算法中的M(s, s_, a)函数,其结构如下:
有几个动作就对应几个action网络,每个action输出的是一个维度与一模一样的向量。网络中我们计算R(s)的方式为:
我们估计Q值的计算方式为:
m的更新方式为:
其中
说了一大堆公式,可能很多人还云里雾里,简而言之就是输入一个状态s, 我们的DSR网络第三部分会输出每个action对应的m值,然后我们拿着这个m值依次和网络输出的想成,选择值最大的那个action作为agent的选择动作。网络的学习损失函数也分为三部分损失: