一条咸鱼的强化学习之路6之值函数近似(Value Function Approximation)和DQN

一条咸鱼的强化学习之路6之值函数近似(Value Function Approximation)和DQN

一条咸鱼的强化学习之路6

之值函数近似(Value Function Approximation)和DQN

Long time no see ! Are you guys ok ? 两周没更了,可能大家早已忘却我这条咸鱼了吧...哦,对了...我估计想多了,根本就没个人好么...anyway,我反正每次写心得也都只是同内心深处的那个我在对话而已…手动微笑

废不多说,这节课的内容涉及的比较广,也非常的重要,而且相关的算法实际应用上的效果也还不错(e.g. Deepmind 成名论文:DQN in playing Atari,同一个网络玩Atari49个游戏有一半能超越人类高级玩家水平),所以就多停留了一阵子。因为我是条咸鱼,所以在接触之前呢,就感觉哇塞,这个Value Function Approximation好像很吊的样子哎,你看正好和神经网络都结合起来了,正好也能顺带着把DL的知识也补一补呢!然后现在看完了,感觉收货还是蛮多的。我们知道,在强化学习里边有两个要素,其一是价值函数(Value Function),又分为状态价值函数(V)和行动价值函数(Q),前者可用于环境model based的情况,后者可以用于环境model free的情况,知道了价值函数我们处理起来具体问题就很随意了,即你如果知道你往哪里走或者执行某个行动价值更大你肯定这样去做就好了嘛!所以价值函数就相当于是我们的一个行为准则,或者说是一本能拿在手里刻在脑子里的“秘籍”吧,这个也就是本篇所涉及的东西,是Value Based RL。强化学习的第二个要素就是策略(Policy),我们可以单纯的从策略角度通过梯度下降来寻找最优决策方法,最终得到的也是一本秘籍,这属于Policy Based RL,其中不涉及量化的价值函数问题。这两本“秘籍”理论上最终的结果是一致的。当然,所谓天下大势分分合合,我们也完全可以把这两种方式结合起来,成为Actor-Critic方法,同时学习价值函数和策略,这部分也衍生出了一些其他算法如(A3CAsynchronous Advantage Actor-Critic)等,还没仔细看……

值函数近似

再回到今天的主题,值函数近似,顾名思义,就是将价值函数近似一下,为什么要近似呢?采用准确的形式不好么?好是好,就是你想啊,针对每个状态和每个行动都要有一个值去表示的话,那要构建多么巨大的一个table啊!对于连续控制问题简直要爆炸,也没有那么大的一个储存空间去储存这些数据,再退一万步讲,即便有这么大的空间去储存,那么我们用的时候还要去搜索提取出来肯定也费劲啊,所以我们要采用值函数近似的方式来训练一个函数使它能对涉及到的每个状态都可以输出价值函数来…… 那么问题就来了,我们要怎样去做这个近似?方法的主要思想就是回归,我们要建立一套从状态(s)/行为(a)到价值函数的映射,这里就是引入了监督式学习(supervised learning)的方法,对输入的状态提取特征(feature)作为输入,通过MC/TD计算出值函数作为输出然后对函数参数w进行训练,直到收敛(converge)(可以是s→V(s,w); s,a→ Q(s,a,w); s → Q(s,a1,w), Q(s,a2,w),...)。具体方法分线性(linear)和非线性(non-linear,如神经网络),线性的训练起来理论上比较有保障,非线性的相比而言就比较玄乎了……

本节DS的课程里,根据训练数据参与的程度又将具体的训练方法分为增量法(Incremental Methods)和批处理法(Batch Methods),前者是不断用生成的数据来online更新训练,后者是从整套的数据中选取适当批次来训练。这两种方法其实我感觉是差不多的,后者是Deepmind提出来的经验回放(experience replay)思想,为的是更好的训练和收敛。所以我们可以先学习前者的过程。

我们一直在提到“训练”这个字眼,没错,这是核心,但我们先要明白我们训练的是什么,接下来还要整明白要怎么去训练!首先,关于我们训练的是什么问题,上边也提到了,我们要找到一个含有参数w的函数,将输入(s and /or a)和对应的价值函数(V/Q)对应起来。再详细一点,我们其实不是直接把输入直接扔进去的,我们首先要提取输入的一些特征向(feature),举个例子,你要控制一个机器人行走,那么feature可以是机器人距离某个地标的距离,如果你要预测股票行情,那feature可以是之前股票大盘的一些趋势,如果你想要通过看着屏幕来玩Atari游戏,那么你的feature可以是连续4帧图像的输入等。在得到这些特征向量之后,如果通过这些特征向量之间的线性结合来预测值函数的话,那这种方法就是线性方法了,同理,如果映射关系更为复杂就是非线性的了。那么等这些搞定之后,基于这个参数w我们会得到我们预测(Prediction)得到的一个价值函数值(V/Q),这个就是我们要训练的结果,也就是等大功告成以后我们的那本“秘籍”,但现在它还很弱,刚开始可能得到的结果根本就是错的,或者差的太远。那么我们的目标就是不断的训练提升我们的“秘籍”!既然要不断改进它,我们至少要拿本相对准确的参照给它看吧!我们的参照哪里来呢?对,这时候之前几节课的内容就派上用场了,我们可以通过MC/TD来计算Target,即MC→ (Gt),TD(0)→ (Rt+1 + γv(St+1,w))或TD(λ) → (Gtλ– v(St,w)) ,我们要做的就是让我们的弱“秘籍”向这个我们认为正确的方向去靠近。那么具体怎么去靠近呢?这就是第二个问题。这里,我们选择梯度下降的方法。简而言之,就是我们设定一个Loss function(L),使得L(w)=( Target – Prediction)2, 然后对L(w)求关于w的偏导,理论上在导数为零处取得极值,当然,真实的情况远比这个复杂,这只是一个主要思想。在代码实现中,我们当然也不用自己手动去算这些东西,应该有很多工具包可以做,比如线性的话sklearn直接有linear model的SGDregressor,神经网络的话有keras,tensorflow等这些工具,建好模型直接train,拟合的过程它们自己就搞定了。我感觉这些基本就是本节课要讲的最主要的思想吧。

课程后边又说的一些东西就是和收敛性(converge)有很大的关系了,毕竟我们训练一个模型不收敛的话也没什么卵用,这里边涉及到的东西太多了,课程也仅仅是列举了不同算法的一个收敛性的保证,一般就是说线性的一般收敛性都可以,MC一般也是很靠谱的,但是TD就难说了,毕竟自己都靠猜的…… 尤其是非线性+TD的时候,这个结果真的不好说…… 但还是有些小的trick可以增加一些收敛的保障性,比如说用经验回放(experience replay,将之前经历过的<s,a,r,s’>储存起来,再随机选合适数量组成minibatch喂给神经网络进行训练)和通过冻结(freeze)我们要更新的Target,让其经过c个timestep再更新,这样做的目的都是尽可能的去稳定目标和打破数据之间一些联系,随机化,这样有助于达到更快收敛的目的。

DQN

下边简略说一下DQN。作为现在蛮流行的一个算法,DQN口碑应该还是蛮好的吧,毕竟Deepmind成名一部分就是这个,Google也已经为DQN申请了专利了。DQN就是把现在的深度学习和Q-Learning做了一下结合,最初的目的是使Agent可以根据图像的pixel输入来玩Atari游戏,所以这里边开始就要对图像做处理,把没用的部分去掉,把RGB转变成黑白的,调调强度啥的,预处理完之后就是构建个深度神经网络,处理图像,就用CNN吧,多少个卷积层,多少个全连接,什么激活函数等等这一套,套路该上的就上。所以我们的输入就是连续几帧的预处理过的图像,输出的就是不同action的Q值。这就是我们最终的“秘籍”,我们在什么状态执行什么动作这些操作指南都在这本秘籍中。所以呢,等所有这些准备工作都搞定后,就开始train你的model吧,good luck!下边是基于keras的flappy bird代码的一些手记…… 估计只有我自己能看懂吧,不要在意这些细节…… 咸鱼天

ps:相关链接如下:

Ref:

Human-Level Controlthrough Deep Reinforcement Learningreadcube.com/articles/1

Demystifying DeepReinforcement Learning Guest Post (Part I): Demystifying Deep Reinforcement Learning - Nervana

Using Keras and Deep Q-Network to Play FlappyBirdUsing Keras and Deep Q-Network to Play FlappyBird

估计至少得百万次训练才能飞得ok一点吧……

编辑于 2018-04-22 11:38