编者按:本文作者是专注于机器学习和数据科学的专家Emmanuel Ameisen,他在自己的博客上分享了对深度学习的理解,用简明扼要的方式为大家讲述了深度学习的基本概念。
最近,我受邀在北京的O’Reilly人工智能会议上分享自己在NLP领域的所学。当时我有幸参加了一场由Unity Technologies举办的关于深度强化学习的培训,这场由Arthur Juliani领导的会议给了我很大启发,下面我会分享我的收获。
在我们与各大公司的交谈中,我们发现了许多有趣的深度强化学习的应用、工具和结果。同时,深度强化学习的应用(例如AlphaGo)往往非常深奥、难以理解。在这篇文章中,我会以一种通俗易懂的方式介绍深度强化学习的核心要点。
深度强化学习领域已经出现了大量研究成果,比如让计算机学习雅达利游戏、在Dota2中战胜人类玩家,或者打败世界顶尖围棋选手。与只关注认知的传统深度学习问题不同,深度强化学习加入了可以影响环境的动作,比传统多了一个维度。例如传统深度学习解决的是“这幅画中有停止标志吗”这样的问题,而深度强化学习还会研究“目的地在哪、应该怎样到达”的问题。例如在对话系统中,传统的深度学习的目的是找到对应问题的正确回答。而深度强化学习则关注如何组合出正确的句子顺序才能获得一个积极的结果,例如怎样回答才能让顾客开心。
这就让深度强化学习在需要提前计划和适应的任务中非常受欢迎,例如制造业或自动驾驶。然而行业的实际应用赶不上理论发展。其中主要原因是深度强化学习常常需要一个智能体进行数百万次的实验,如果想快速实现这一点,就需要一个模拟环境。这里可以参考Unity的教程创建一个模拟环境。
接下来,我将详细讲述目前深度强化学习领域的几种主流算法。
深度强化学习可以击败顶尖围棋选手,但是想搞清楚它是怎么做到的,首先要了解几个简单的概念。我们先从简单的开始。
假设你面前有四个箱子,每次只能打开一个,每个里面的装的钱(奖励)不一样,你的目标就是在一定的游戏次数中,最后拿到的总钱数是最大的。这个经典游戏被称为“多臂赌博机问题(multi-armed bandit problem”)。这个问题的核心就是控制游戏次数,同时利用已知信息选择最佳对象。
这里我们要用到一种将行为映射到预计奖励中的价值函数——Q函数。首先,我们把所有的Q值定成同样的。然后,我们会在每次选择箱子后更新Q值,基于箱子中的钱有多少。这样可以让我们学习一个好的价值函数,我们会用一个神经网络估计Q函数在四个箱子上潜在的表现。
价值函数告诉我们预测的每次结果如何,策略是决定在哪一步停止的函数。也就是说,我们可能会选择具有最高Q值的策略。但这在实际中表现得很糟,因为Q值的估计在刚开始时表现得非常离谱,根本不足以计入试错经验。这就是为什么我们需要在策略中加入一项机制鼓励探索。其中一种方法就是利用贪婪算法,即用概率ϵ进行随机选择。最初,当概率接近于1时,选择更随机。随着概率的降低就会学习到更多关于箱子的知识。最终我们知道了那个更好。
在实际中,我们也许想选择另一种更精妙的方法,不用随机选择或挑选最优策略。其中一种方法就是Boltzmann Exploration,它可以根据目前的情况改变概率,加入随机因子。
这里不同的背景颜色代表不同的平均奖励
上一个例子的背景是假设状态相同,挑选四个完全相同的箱子。而更真实的情况却有很大不同,其中有不同的状态。现在箱子后面的背景在三种颜色之间不断变化,每个箱子的价值是在变的。所以我们需要学习一个Q函数来决定箱子的选择和背景颜色。这一问题被称为“语境下的多臂赌博机问题”。
我们用的方法和此前相同,唯一需要加入神经网络的是额外的密集层,将输入向量作为目前状态的代表。
这里我们学习如何移动蓝色立方体,让它到达绿色立方体那里,同时不碰到红色方块
这里还有一种可以让我们的方法比其他方法更简单的关键因素。在大多数环境中,例如迷宫,我们采取的每一步动作都会影响周围环境。如果在网格中行进,有可能会得到奖励(也可能什么都没有),但是下一步我们就出在完全不同的状态下了。这就是计划的重要性。
首先,我们会将Q函数定义为目前状态下立即的奖励以及未来全部行为都结束后的部分奖励。如果Q估计的状态精确,那么这种方法就有用,所以我们先要学习如何做出正确估计。
我们要用一种成为Temporal Difference(TD)Learning的方法,学习一个好的Q函数。这种方法只关注最近的几步行为,例如TD(1)只用接下来的两步来评估奖励。
意外的是,我们可以用表示目前状态的TD(0)和对下一步奖励的评估得到不错的结果。网络的结构不变,但是我们需要在犯错之前进行下一步行动,然后用这个错误对梯度进行反向传播,就像传统深度学习那样,之后再对值进行重新估计。
蒙特卡罗介绍
预测最终成功的另一种方法就是蒙特卡罗估计。该方法要将目前策略下所有可能都运行以便知道结束,然后用这一结果对每次得到的状态进行评估。这让我们在每次动作时都能有效传播值而不是简单地移动。与之而来的代价就是会在估计值中引入噪声。
此前的方法使用神经网络近似估计预测值,将一些状态和动作映射到数值上。例如在迷宫中共有49个位置和四种动作,在这个环境下,我们试着学习如何让球体在二维平面上保持平衡,每一步我们会决定让平板往哪个方向倾斜。这里的状态空间就是连续的,好消息是我们可以使用神经网络来估计函数。
这里插播一下off-policy和on-policy的区别:之前我们用的方法是off-policy,也就是我们可以从任意策略中生成数据并从中学习。on-policy的方法智能从动作中学习。这就限制了我们学习的过程因为我们必须有一个建立在策略之上的探索策略,但是可以将结果直接绑定在推理上,同时让我们学习得更高效。
我们这里将使用的方法称为策略梯度,这是一种on-policy方法。之前,我们首先学习了一个价值函数Q,然后在这之上建立了策略。在Vanilla策略梯度中,我们仍然使用蒙特卡罗估计,但是我们直接从损失函数那里学习策略,这样增加了选到有奖励的可能性。因为我们是在策略上进行学习的,就不能用贪婪算法这样的方法,只能用一种称为熵正则化的方法,它估计的概率更加广泛,也鼓励我们做出更多大胆的选择。
模型中输入的是像素
这是用深度学习的另一个好处因为深度神经网络擅长处理视觉问题。当人类玩游戏时,我们接收到的信息不是一串状态,而是一张图片。
基于图像的学习结合了卷积神经网络和强化学习。在这一环境中,我们关注的是原始图像而不是特征,同时在网络中加入了一个2层的CNN。我们甚至可以看看网络在生成值时会做什么动作。在下面的例子中,我们可以看到网络利用目前的分数和远处的障碍预测目前的价值,用近处的障碍决定做出怎样的动作。
这里我注意到,深度学习对超参数很敏感。例如稍微调整一下折扣率,就会完全阻止神经网络的学习。这个问题已经普遍存在了,但是自己亲眼看到还是很有趣的。
目前为止,我们已经在分散和连续的状态空间中进行了实验,但是我们研究的每个环境都有着分散的动作空间:我们可以向四个方向移动或者将板子向左向右倾斜。理想情况下,对于类似自动驾驶的产品,我们想学习连续的动作,例如转动方向盘。在这个3D环境下,我们可以选择倾斜板子到任意值,这也让我们对动作有了更多控制,但是动作空间也更大了。
下面是区分各种算法的几个概念:
并列(parallelizing):A3C是最常见的方法之一。它为actor critic添加了异步步骤,使其能并行运行。这让它在合理时间内解决更多有趣的问题。演化方法可以进一步并行化,并且表现得很不错。
课程学习(curriculum learning):在很多情况中,随机运行可能不会得到任何奖励。这使得探索过程变得非常棘手,因为我们永远学不到任何有价值的东西。在这样的情况下,我们可以简化问题,先解决一个简单版本的问题,然后用基础模型再解决更复杂的环境。
记忆:例如,利用LSTM,我们可以记住过去发生了什么,然后用序列进行决策。
基于模型的强化学习:目前有好几种方法可以帮助算法建立它们学习的环境模型,这样它们可以推断出环境是如何工作的,同时只用做简单的动作就能得到较高奖励。AlphaGo就结合了模型和计划。
至此,我的总结就结束了,希望你能觉得有用!如果你想深入了解强化学习,我推荐以下资料:
Arthur Juliani的博客:medium.com/emergent-future/simple-reinforcement-learning-with-tensorflow-part-0-q-learning-with-tables-and-neural-networks-d195264329d0
UCL教授David Silver的课程:www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html