原文地址:https://www.nervanasys.com/demystifying-deep-reinforcement-learning/
作者简介:
About the Author: Tambet Matiisen
下面是我的中文翻译:
强化学习介于监督和非监督学习之间。而在有监督学习中,每个培训样例都有一个目标标签,在无监督学习中,一个根本没有标签,在强化学习中,一个有稀疏的和延时的标签——奖励。只有在这些奖励的基础上,代理人才能学会在环境中行为。
Figure 1: Atari Breakout game. Image credit: DeepMind.
虽然这个想法很直观,但在实践中有许多挑战。例如,当你在突破赛中打砖块并获得一个奖励时,它通常与你在获得奖励前所做的动作(划桨动作)无关。所有的艰苦工作都已经完成了,当你正确地放置球拍并把球弹回来。这就是所谓的信贷分配问题,也就是说,前一项行动中的哪一项是负责获得奖励和在何种程度上。
一旦你想出了一个收集一定数量的奖励的策略,你应该坚持下去还是尝试一些可能带来更大回报的事情呢?在上面的突破游戏中,一个简单的策略是向左移动并在那里等待。发射时,球往往飞得比右边多,在你死前你很容易得分10分。你会满意还是想要更多?这就是所谓的探索利用困境-你应该利用已知的工作策略或探索其他,可能更好的策略。
增强学习是我们学习知识的一个重要模型。我们父母的赞扬,学校的成绩,工作的薪水,这些都是奖励的例子。无论是在商业还是在关系中,信贷分配问题和勘探开发困境每天都在出现。这就是为什么研究这个问题很重要,而游戏是一个尝试新方法的绝妙沙盒。
Markov Decision Process
现在的问题是,你如何使强化学习问题正式化,这样你就可以对它进行推理了?最常见的方法是将其表示为马尔可夫决策过程。
假设你是一个位于环境中的代理人(例如:突围游戏)。环境处于某种状态。(例如,桨的位置、球的位置和方向、每一块砖的存在等)。代理可以在环境中执行某些操作(把桨向左或向右移动)。这些行为有时会得到奖励(如分数增加)。操作会改变环境并导致一个新的状态,代理可以执行另一个操作,等等。您如何选择这些操作的规则称为策略。一般情况下的环境是随机的,这意味着下一个状态可能是随机的(例如,当你失去一个球并发射一个新的,它朝一个随机方向)。
Figure 2: Left: reinforcement learning problem. Right: Markov decision process.
一组状态和动作,以及从一个状态转换到另一个状态的规则组成了马尔可夫决策过程。经历过这样一个过程(一次游戏),形成一系列有限的状态、动作和奖励。
在这里,Si代表状态,Ai是动作,ri+1是动作结束后的奖励。这次游戏的结束状态是Sn。(如“游戏结束”屏幕)。马尔可夫决策过程依赖于马尔可夫假设,下一个状态Si + 1的概率只取决于当前状态Si和动作Ai,而不依赖于前面的状态或动作。
Discounted Future Reward
要想达到在长期表现好,我们需要考虑的不仅仅是立即奖励,我们同样也要考虑未来会得到奖励。我们应该如何达到这样的效果?考虑运行一次马尔可夫决策过程,我们可以计算这样的一次决策的总的回报。
考虑一下,从t时刻起的总的回报可以如下面这样表示:
但因为我们的环境是随机不确定的,我们永远不能够确定,如果下次我们执行相同的动作时,我们将得到同样的奖励。我们行动的步数越多,它可能性的越多,也就是会越来越发散。因此,通常使用折扣未来奖励(discounted future reward)代替。
这里γ是0到1之间的折扣系数。越遥远的奖励,我们就越不把它当一回事。很容易看出,在时间t的折扣未来奖励可以使用在时间t+1的折扣未来奖励来表示。
如果我们设定了折扣因子γ=0,那么我们的策略将是短视的,我们只依赖眼前的回报。如果我们想在即时奖励和未来回报之间取得平衡,我们应该设置折扣系数为γ=0.9或这类的数字。如果我们的环境是确定的,并且相同的操作总是得到相同的奖励,那么我们可以设置折扣因子γ=1。
一个好的代理策略是总是选择一个能最大化(折扣)未来奖励的行动。
Q-learning
在Q学习中,我们定义一个函数Q(s,a)表示当我们在状态s中执行a动作时的最大折扣未来的奖励,并从那个点继续优化。
我们认为Q(s,a)的含义是:游戏在状态s实行动作a之后的最好的可能的分数是Q(s,a)。他被称为Q函数,因为它表示给定状态下某个动作的“质量”。
这听起来像是一个令人费解的定义。如果我们仅仅知道当前的状态和动作,而不知道在这个状态和动作之后的状态和动作,我们怎么会在游戏的末尾来进行对这个状态和动作进行一个评分?是的,我们真的不行。但是,作为一个理论结构,我们可以假设存在这样一个函数。闭上眼睛,重复五次:“q(s,a)存在,Q(s,a)存在,……”。感觉到了吗?
如果你还不确信,那么考虑一下拥有这样一个函数的意义是什么。假设你处于状态,思考是否应该采取行动A或B。你想选择在比赛结束时获得最高分数的动作。一旦你有了神奇的Q函数,答案就很简单。选择具有最高值的行动!
这里π代表政策的规则,指导我们如何在每个状态选择行动的规则。
好的,我们如何得到Q函数呢?让我们只集中在一个转换上面<s, a, r, s’>。就像上一节中的打折奖励一样,我们可以利用表达的状态s’的Q函数来表达状态s和行动a的Q函数。
这就是我们所说的贝尔曼公式。如果你想一想,这是非常合乎逻辑的——这种状态和动作的最大未来奖赏是立即奖励和下次状态的最大未来奖励。
强化学习中的主要思想是,我们可以反复利用Bellman方程来近似Q函数。在最简单的情况下,Q函数可以被作为一个table来进行实现,状态和行动分别作为行和列。
Q学习算法的要点如下所示:
α在算法学习速率,控制多少以前的Q值和新提出的Q值之间的差异考虑在内。
特别是,当α=1,这就是Bellman等式。
我们在早期的学习阶段,使用Q(s’,a’)的最大值来更新Q(s,a)的做法,有可能是错的。然而,迭代逼近得更多,这个估计值就会更准确的。它已经表明,如果我们执行此更新的次数足够多,那么函数收敛,代表真实的Q值。
Deep Q Network
Breakout游戏的环境的状态可以由下面的几个东西来进行定义:球的位置和方向,下面滑板的位置,每个砖块的存在或不存在。然而,这种直观的表述是特定于游戏的。我们能想出更普遍的,适合所有游戏的表示方法吗?明显的选择是屏幕像素,它们隐含地包含了所有有关游戏情况的信息,除了球的速度和方向。两个连续的屏幕就能够计算这些。
如果我们如DeepMind论文中的同样的预处理用到游戏画面上。取出最后四张图片,将他们重新剪裁为84×84,并且转为256的灰度图。我们将会得到约有25684×84×4 = 1067870个状态.这么大的数字,比宇宙的原子的数目还多的行数要存放在一个Q-table,是不可能做到的。有人可能会争辩说,许多像素组合()不会出现,我们或许能用一个稀疏的表格,仅仅包含一些可以访问到的点来急性表示。即便如此,大多数状态都很少出现,但仍然会存在于Q-table中一段时间。理想情况下,我们很难预测哪些状态是很少出现的。
这就是深入学习的有用武的地方。神经网络特别擅长于为高度结构化的数据提供良好的特性。我们可以用一个神经网络代表我们的Q函数,以状态(四游戏屏幕)和动作作为输入和输出对应的Q值。或者我们可以只是游戏画面,输入和输出的每一个可能的行动的Q值。这种方法的优点是,如果我们要执行更新或选择最高Q值的行动,我们需要做的就是跑一次这个神经网络,然后就会得到立即所有可用行动的Q值。
Figure 3: Left: Naive formulation of deep Q-network. Right: More optimized architecture of deep Q-network, used in DeepMind paper.
The network architecture that DeepMind used is as follows:
这是一个经典卷积神经网络,它有三个卷积层,然后是两个完全连接的层。熟悉对象识别网络的人可能会注意到没有池层。但是,如果你真的考虑下它,池层会让你有平移不变性,也就是网络会对照片中的对象的移动不敏感。这对于一个像ImageNet完全意义上的分类任务,但游戏来说,球的位置是非常重要,决定了潜在的回报,我们不想放弃这个信息!
输入到网络四84×84灰度游戏屏幕。网络的输出为每个可能的动作的Q值(在Atari游戏当中是18)。Q值可以是任何的真值,这使得它变成一个回归任务,可以进行简单的平方误差损失。
考虑一个转换< s, a, r, s’ >。 在以前的Q-table算法的更新规则必须与下列替代:
1、让当前的状态跑一次神经网络,来获得所有行动的Q-values。
2、让下一个状态s’也跑一次神经网络,计算出这个输出 max a’ Q(s’, a’).
3、然后设置Q(s,a)的Q函数为r + γmax a’ Q(s’, a’),对于所有其他的行动,将Q值设置为步骤1返回的那些值。对于所有其他的行动,将Q值目标一样来自步骤1返回,使其他的输出误差0。
4、利用反向传播更新权值。
Experience Replay
到现在,我们已经知道,如何去使用Q-learning和使用卷积神经网络来估计Q函数来对对未来的回报进行一个估计。但事实证明,使用非线性函数逼近的Q值不是很稳定。有一整套技巧,你必须用它来真正使它收敛。而且花了很长时间,几乎一个星期在一个GPU上。
最重要的诀窍是经验回放(experience replay)。在游戏过程中,所有的经验< s, a, r, s’>都存储在回放内存中。在训练网络的时候,从重播记忆中的随机的小的批量(minibatches)会被用来取代最经常发生的转换。这会打破了随后的训练样本的相似性,这个反过来可能会将网络驱向一个局部的最小值。经验回放同样会使得训练任务和一般的有监督学习更加相似,这会简化调试和测试算法的过程。人们可以真的从人类游戏中收集所有的这些经验,然后在此基础上训练网络。
Exploration-Exploitation
Q-learning是想要解决credit assignment problem,它会及时的向后传播奖励,直到这个奖励到达到达那个关键的节点,这个关键的节点也就是获得如此高奖励的原因。但是我们还没有处理exploration-exploitation这个困局。
首先观察,当一个Q-table或一个Q-network随机初始化之后,然后它的预测初始的时候,是随机的。如果我们选择一个行动的最高值,该行动实际上是随机的和代理执行大概一次“探索”。随着这个Q-函数收敛,它会返回更加一致的Q-值,那么这个“探索”实际上慢慢减少了。所以可以说,Q-学习把探索作为算法的一部分。但这种探索是“贪婪的”,它解决了它发现的第一个有效策略。解决上述问题的一个简单而有效的方法是:ε探索贪婪(ε-greedy exploration),也就是带有概率ε,来选择一个随机的行动。在1-ε的概率下,遵循贪心的策略。在他们的系统DeepMind实际上随着时间的推移会减少ε,从1到0。开始的时候,系统会完全随机地最大化进行探索空间,然后它会固定到一个固定的探索率。
Deep Q-learning Algorithm
在上面的所有东西,组合成了最终的Deep Q-learning 算法,包括了experience replay。
DeepMind其实还用了更多的技巧,比如说,目标网络(target network),错误剪裁(error clipping),回报剪裁(reward clipping)等等,但这些都超出了这介绍的范围。这个算法最令人惊异的部分是它能学到任何东西。想想看–因为我们的Q函数随机初始化,它最初输出完全是没用的。并且我们使用这些没用的东西(下个状态的最优值)作为网络的目标,仅仅有时候,会出现一些小的奖励。听起来很疯狂,怎么能学到任何有意义的东西呢?事实是,它确实能够学到。