(零基础可以看懂)深度强化学习之DQN类算法之第1篇-2013年NeurIPS版本的DQN(含代码)-《强化学习系列专栏第4篇》

(零基础可以看懂)深度强化学习之DQN类算法-第1篇(含代码)-《强化学习系列专栏第4篇》

背景

    DQN是由Deep Q-Learning缩写而来。从名字中可以看出,其本质上还是一种Q-Learning算法,只不过结合了深度学习。2013年的时候,位于伦敦的DeepMind(现在已经被谷歌收购了,也就是Alpha Go的父母)在NeurIPS发表了一篇名为《Playing Atari with Deep Reinforcement Learning》的论文,它出人不意的将神经网络引进到了Q-Learning算法中。该模型可以通过训练后,让其自主的玩那种我们小时候玩的小霸王的那种游戏(暴露了我的年龄,哈哈)。下面,我开始讲解这篇论文,并将我自己复现的代码放上来。

论文原文链接

《Playing Atari with Deep Reinforcement Learning》

介绍

    读懂这篇论文还需要知道一些前置的知识,前置的知识我已经讲解过了,在我的博客上,我附一下链接。

第1篇:(零基础可以看懂)强化学习中的动态规划(贝尔曼方程)(含代码)-《强化学习系列专栏第1篇》
第2篇:(零基础可以看懂)强化学习中的蒙特卡罗应用(贝尔曼方程)(含代码)-《强化学习系列专栏第2篇》
第3篇:(零基础可以看懂)强化学习中的时间差分算法(含代码)-《强化学习系列专栏第3篇》

    与Q-Learning的区别在于,DQN使用了神经网络当作其Q函数(Q table),由于神经网络的连续及非线性的特征,使得神经网络可以表示“无限多”的状态。

模型关键部分解释

我们这里以打乒乓这个游戏举例子,在gym里面名称为“Pong-v0”。游戏如下图,
(零基础可以看懂)深度强化学习之DQN类算法之第1篇-2013年NeurIPS版本的DQN(含代码)-《强化学习系列专栏第4篇》

①算法中使用了一个名为replay memory的变量D(代码中实际上是一个队列)去存储情形(当前的状态,当前的行为,当前行为的奖励,下一个状态),然后训练的时候,从变量D中随机选取batch_size个样本去训练神经网络部分。这样做的目的是为了防止训练数据的连续性导致模型的不够泛化(因为是随机抽取的,所以可以保证每次抽取出来的训练数据不是连续的)。这个replay memory是有最大存储限制的,论文中是设置了D的最大长度是100万。

②为了减少状态的数量,论文中对图片进行了预处理,由于图片是210160(高宽)尺寸的,并且有128种颜色,也就是说图片有3个通道。于是论文中,首先将图片转为灰度图,转换完之后,图片就只有1个通道了。接着,再对该灰度图进行下采样到11084的尺寸。最后,再将图片的中间区域裁剪出来,裁剪成8484尺寸大小的图片。只有经过这样预处理过后的图片,才可以放到神经网络里面进行前向传播。经过预处理后的图片如下图所示,
(零基础可以看懂)深度强化学习之DQN类算法之第1篇-2013年NeurIPS版本的DQN(含代码)-《强化学习系列专栏第4篇》
③由于如果只放一张图片到神经网络里面去,神经网络并不会捕捉到动态的信息,比如球到底是从左边往右边飞,还是从右边往左边飞(玩游戏是一个类似视频一样有前后动态关系的一种场景),因此,要想让神经网络知道这是一个动态的状态,我们将此时此刻这1帧图片,再加前3帧图片,组成4个通道,放到神经网络里,这样一来,神经网络就知道“前因后果”中的“前因”了,它就知道球从哪个方向飞过来了。

④神经网络部分其实是对图片进行一个特征提取,然后映射到可行的动作的数量的维度上。神经网络的结构是这样的:
    第1层:首先,网络的输入是4幅 84 ∗ 84 84*84 8484大小的图片,4幅图片组成4个通道。所以,网络的输入数据的shape是[batch_size, 4, 84, 84],接着,使用16个 8 ∗ 8 8*8 88大小,上下左右步长均为4的卷积核,进行卷积操作,然后使用ReLU进行**。此时输出的shape为[batch_size, 16, 20, 20]。
    第2层:使用32个 4 ∗ 4 4*4 44,上下左右步长均为步长为2的卷积核,进行卷积操作,然后使用ReLU进行**。此时输出的shape为[batch_size, 32, 9, 9]。接着将其压平,变成[batch_size, 2592]的shape。
    第3层:使用 2592 ∗ 256 2592*256 2592256大小的全连接层进行全连接操作。然后使用ReLU**函数**,此时输出的shape为[batch_size, 256]。
    第4层:使用 256 ∗ 动 作 数 量 256*动作数量 256大小的全连接层进行全连接操作。此时输出的shape为[batch_size, 动作数量]。在打乒乓球的游戏中,动作数量为6。

我们讲完了关键的要点,我们直接将算法的伪代码放上来。
(零基础可以看懂)深度强化学习之DQN类算法之第1篇-2013年NeurIPS版本的DQN(含代码)-《强化学习系列专栏第4篇》
伪代码中需要注意的点如下:
①capacity N就是所设置的D的最大长度。
Φ 1 Φ_1 Φ1其实就是对图像所作的预处理的操作。
③该算法和Q-Learning一样,使用了ε-greedy的方法。
④store transition ( Φ t , a t , r t , Φ t + 1 ) (Φ_t, a_t, r_t, Φ_{t+1}) (Φt,at,rt,Φt+1) in D这句话要注意,存储是当前的状态(也就是当前帧的图片),当前的行为,当前行为所获得的奖励,下一个状态(也就是下一帧图片)。
⑤标签值 y j y_j yj是会变化的,如果下一个状态游戏已经结束,那么 y j = r j y_j=r_j yj=rj,否则还要加上一项上述图中的公式。
⑥使用的是MSE作为损失函数。

代码

待填入

代码复现、详细讲解及我的Github地址

完整代码地址:https://github.com/haitaifantuan/reinforcement_leanring