近期深度强化学习领域日新月异,其中最酷的一件事情莫过于 OpenAI 和 DeepMind 训练智能体接收人类的反馈而不是传统的奖励信号。本文作者认为复现论文是提升机器学习技能的最好方式之一,所以选择了 OpenAI 论文《Deep Reinforcement Learning from Human Preferences》作为 target,虽获得最后成功,却未实现初衷。如果你也打算复现强化学习论文,那么本文经验也许是你想要的。此外,本文虽对强化学习模型的训练提供了宝贵经验,同时也映射出另外一幅残酷画面:强化学习依然难免 hype 之嫌;强化学习的成功不在于其真正有效,而是人们故意为之。
瑞士卢加诺大学信息学硕士 Tim Dettmers 对本文的点评
首先,整体而言,强化学习问题要远比预期的更为棘手。
主要原因是强化学习本身非常敏感,需要纠正大量的细节,如果不这么做,后面诊断问题所在会非常难。
实例 1:基本实现完成之后,训练效果并未跟上。我对问题所在充满各种想法,但经过数月的苦思冥想,发现问题出现在关键阶段中的奖励归一化和像素数据。尽管想通了这点,却仍未搞明白整个问题:像素数据进入的奖励探测器网络的准确度刚刚好,我花了很长时间终于明白仔细检查已预测的奖励足以发现奖励归一化漏洞。一句话,搞明白发生了什么问题几乎是偶然性的,找出最终可以导向正确路径的微小的不一致性。
实例 2:最后的代码清理完成之后,我多少有些错误地实现了 dropout。奖励探测器网络需要一对视频片段作为输入,由权重共享的两个网络同等处理。如果你添加 dropout,并在每个网络中不小心给了它相同的随机种子,每个网络将获得不同的 dropout,因此视频片段将不会被同等处理。正如结果表明完全修正它会破坏训练,尽管网络的预测准确度看起来一模一样。
找出被破坏的那一个。没错,我也没找到。
在我印象中这种情况非常普遍(比如《Deep Reinforcement Learning Doesn't Work Yet》)。我的解读是你要像对待数学问题一样对待强化学习项目。它不同于编程问题,你可以在数天内完成它;它更像是你在解决一个谜题,没有规律可循,唯一的方法是不断尝试,直到灵感出现彻底搞明白。
这需要你不断尝试,并对实现过程中的困惑保有最敏锐的嗅觉。
该项目中有很多这样的点,其中唯一的线索就是那些看起来无关紧要的小事情。比如,某些时候采用不同帧之间的差异作为特征会更加奏效。通过一些新特征继续向前会非常诱人,但我很困惑当时在我工作的简单环境中会造成如此大的差异。这只有通过思考这些困惑并意识到采用不同帧之间的差异,才能给正则化问题提供线索。
我不完全确定如何使人在这方面做更多,但我目前最好的猜测是:
学习识别困惑的感觉。「事情不太对的感觉」有很多种,有时是代码很丑,有时是担心浪费时间在错误的事情上。但有时是「你看到了一些意料之外的事情」。能够精确知道令自己不舒服的事情很重要,因此你可以……
培养思考困惑来源的习惯。一些不舒服的原因最好选择忽略(比如原型设计时的代码风格),但困惑并不是。一旦遇到困惑。立即调查其来源对你来说很重要。
无论如何:做好每次卡住数周的准备。(并相信坚持下来就会攻克难关,并留意那些小的细节。)
说到和过去的编程经验的区别,第二个主要学习经验是观念模式的区别,即需要长时间的工作迭代。
调试过程大致涉及 4 个基本步骤:
收集关于问题性质的证据;
基于已有证据对问题作出假设;
选择最可能成立的假设,实现一个解决办法,看看结果如何;
重复以上过程直到问题解决。
在我做过的大部分编程工作都习惯于快速反馈。如果有程序不工作了,你可以在数秒或数分钟内做出改变并查看有没有奏效。收集证据是很简单的工作。实际上,在快速反馈的情况下,收集证据可能比作出假设要简单得多。当你能凭直觉想到解决方案(并收集更多证据)时,为什么还要花费那么多时间考虑所有的可能性呢?换句话说,在快速反馈的情况下,你可以通过尝试而不是仔细考虑并迅速地缩小假设空间。
但当单次运行时间达到 10 小时的时候,尝试和反馈的策略很容易使你浪费很多的时间。
并行运行多个解决方案会有帮助,如果(a)你有计算机集群的云计算资源;(b)由于上述的强化学习中的各种困难,如果你迭代得太快,可能永远无法意识到你真正需要的证据。
从「多实验、少思考」到「少实验、多思考」的转变是提高效率的关键。当调试过程需要耗费很长的迭代时间时,你需要倾注大量的时间到建立假设上,即使需要花费很长的时间,比如 30 分钟甚至 1 小时。在单次实验中尽可能详实地检验你的假设,找到能最好地区分不同可能性的证据。
转向「少实验、多思考」的关键是保持细节丰富的工作日志。当每次实验的运行时间较少的时候,可以不用日志,但在实验时间超过一天的时候,很多东西都容易被忘记。我认为在日志中应该记录的有:
日志 1:你现在所需要的具体输出;
日志 2:把你的假设大胆地写出来;
日志 3:简单记录当前的进程,关于当前运行实验想要回答的问题;
日志 4:实验运行的结果(TensorBoard 图,任何其它重要观测),按运行实验的类型分类(例如按智能体训练的环境)。
我起初记录相对较稀疏的日志,但到了项目的结束阶段,我的态度转变成了「记录我头脑中出现过的所有东西」。这很费时,但也很值得。部分是因为某些调试过程需要交叉参照结果,这些结果可能是数天前或数周前做出的。部分是因为(至少我认为)思考质量的通常提升方式是从大量的更新到有效的心理 RAM。
典型日志
为了从所做的实验中得到最大的效果,我在实验整个过程中做了两件事:
首先,持记录所有可以记录的指标的态度,以最大化每次运行时收集的证据量。有一些明显的指标如训练/验证准确率,但是在项目开始时花费一点时间头脑风暴,研究哪些指标对于诊断潜在问题比较重要是很有益的。
我这么推荐的部分原因是由于事后偏见:我发现哪些指标应该更早记录。很难提前预测哪些指标有用。可能有用的启发式方法如下:
对于系统中的每个重要组件,考虑什么可以被度量。如果是数据库,那么度量它的增长速度。如果是队列,则度量各个项的处理速度。
对于每个复杂步骤,度量其不同部分所花费时间。如果是训练循环,则度量运行每个批次要花费多长时间。如果是复杂的推断步骤,则度量每个子推断任务所花费的时间。这些时间对之后的性能 debug 大有裨益,有时候甚至可以检查出难以发现的 bug。(例如,如果你看到某个部分花费时间很长,那么它可能出现内存泄露。)
类似地,考虑搜集不同组件的内存使用情况。小的内存泄露可能揭示所有问题。
另一个策略是查看别人使用什么度量指标。在深度强化学习中,John Schulman 在其演讲《Nuts and Bolts of Deep RL Experimentation》中给出了一些好主意(视频地址:https://www.youtube.com/watch?v=8EcdaCk9KaQ;slides 地址:http://joschu.net/docs/nuts-and-bolts.pdf;摘要:https://github.com/williamFalcon/DeepRLHacks)。对于策略梯度方法,我发现策略熵是判断训练是否开始的优秀指标,比 per-episode 奖励更加敏锐。
不健康和健康的策略熵图示例。失败模式 1(左):收敛至常数熵(随机选择动作子集)。失败模式 2(中):收敛至零熵(每次选择相同的动作)。右:成功的 Pong 训练运行中的策略熵。
如果你在记录的指标中看到了一些可疑的现象,记得注意混淆,宁可假设它很重要也不要轻视,比如一些数据结构的低效实现。(我因为忽视了每秒帧数的微小而神秘的衰减,导致好几个月没找到一个多线程 bug。)
如果你能一次性看到所有指标,那么 debug 就容易多了。我喜欢在 TensorBoard 上有尽可能多的指标。用 TensorFlow 记录任意指标有点棘手,因此考虑使用 easy-tf-log(https://github.com/mrahtz/easy-tf-log),它提供简单的 tflog(key, value) 接口,无需任何额外设置。
另一件有助于从运行中获得更多信息的事情是,花时间尝试和提前预测失败。
多亏了事后偏见,在回顾实验过程时往往很容易发现失败原因。但是真正令人挫败的是在你观察之前,失败模式就已经很明显了。开始运行后,第二天回来一看失败了,在你开始调查失败原因之前,你就已经发现:「噢,一定是因为我忘记 frobulator 了」。
简单的事情是有时你可以提前触发「半事后观察」。它需要有意识的努力——在开始运行之前先停下来思考五分钟哪里可能出错。我认为最有用的是:
问问自己:「如果这次运行失败了,我会有多惊讶?」
如果答案是「不会很惊讶」,那么想象自己处于未来情境中:运行失败了,问自己:「哪些地方可能出问题:」
修复想到的问题。
重复以上过程直到问题 1 的答案是「非常惊讶」(或至少是「要多惊讶就多惊讶」)。
总是会有很多你无法预测的失败,有时你仍然遗漏了一些明显的事情,但是这个过程至少能够减少一些因为没有提前想到而出现的愚蠢失误。
最后,该项目最令人惊讶的是花费时间,以及所需的计算资源。
前者需要从日历时间的角度来看。我最初的估计是它作为业余项目,应该花费 3 个月时间,但它实际上用了 8 个月。(而我一开始预估的时间就已经很消极了!)部分原因是低估了每个阶段可能花费的时间,但是最大的低估是没有预测到该项目之外出现的其他事情。很难说这个规律有多广泛,但是对于业余项目来说,把预估时间乘以 2 可能是不错的方法。
更有趣的是每个阶段实际花费的时间。我原本的项目计划中主要阶段时间表基本如下:
写代码不费时,费时的是调试。事实上,在一个所谓的简单环境上花费的时间 4 倍于最初的实现。(这是我第一个花了数小时的业余项目,但所得经验与过去的机器学习项目相似。)
注:从一开始就仔细设计你认为什么应该是强化学习的「简单」环境。尤其是,仔细思考:(a)你的奖励是否真正传达解决任务的正确信息,是的,这很容易弄砸;(b)奖励是仅依赖之前的观测结果还是也依赖当前的动作。在你进行任意的奖励预测时,后者都可能是相关的。
第二个令人惊讶的事情是项目所需的计算时间。我很幸运可以使用学校的机房,虽然只有 CPU 机,但已经很好了。对于需要 GPU 的工作(如在一些小部分上进行快速迭代)或机房太繁忙的时候,我用两个云服务进行实验:谷歌云计算引擎的虚拟机、FloydHub。
谷歌云计算引擎挺好的,如果你只想用 shell 访问 GPU 机器,不过我更多地是在 FloydHub 上进行实验的。FloydHub 是针对机器学习的云计算服务。运行 floyd run python awesomecode.py,FloydHub 会设置一个容器,加载和运行你的代码。使 FloydHub 如此强大的两个关键因素是:
GPU 驱动预安装的容器和常用库。
每次运行都可以自动存档。每次运行时使用的代码、开始运行的命令、任意命令行输出和任意数据输出都可以自动保存,并通过网页接口设置索引。
FloydHub 的网页接口。上方:过去运行的索引,和单次运行的概览。下方:每次运行所用代码和运行的任意数据输出都可以自动存档。
第二个功能非常重要。对于任何项目,对尝试过程的详细记录和复现之前实验的能力都是绝对必要的。版本控制软件有所帮助,但是 a)管理大量输出比较困难;b)需要极大的勤勉。(比如,如果你开始一些运行,然后做了一点更改,启动了另一次运行,当你提交第一批运行的结果时,是否能够清楚看到使用了哪些代码?)你可以仔细记录或展开自己的系统,但是使用 FloydHub 压根不需要花费这么多精力。
我喜欢 FloydHub 的其他原因是:
运行结束时容器自动关闭。无需检查容器是否关闭、虚拟机是否关闭。
账单比云虚拟机更加直接。
我认为 FloydHub 的一个痛点在于不能自定义容器。如果你的代码中有大量的依赖包,你需要在所有运行启动前安装它们。这限制了短期运行上的迭代次数。当然,你可以创建一个「dataset」,其中包含了对文件系统的安装依赖包的改变,然后在每次运行起始阶段复制该 dataset 的文件(例如,create_floyd_base.sh)。这很尴尬,但仍比不上处理 GPU 驱动的时候。
FloydHub 相比谷歌云虚拟机更贵一些:1.2 美元/小时用一台 K80 GPU 的机器,对比 0.85 美元/小时用一台配置相似的虚拟机。除非你的预算很有限,我认为 FloydHub 带来的额外便利是值得的。只有在并行运行大量计算的时候,谷歌云虚拟机才是更加划算的,因为你可以在单个大型虚拟机上堆栈。
总的来说,该项目花了:
计算引擎上 150 个小时的 GPU 运行时间和 7700 个小时的(wall time × cores)的 CPU 运行时间。
FloydHub 上 292 个小时的 GPU 运行时间。
大学计算机集群上的 1500 个小时(wall time, 4 to 16 cores)的 CPU 运行时间。
我惊讶地发现在实现项目的 8 个月期间,总共花费了 850 美元(FloydHub 花了 200 美元,谷歌云虚拟机花了 650 美元)。
但是即使花了这么多的精力,我在项目的最后阶段仍然遇到了很大的惊(jing)喜(xia):强化学习可能不太稳定以至于我们需要使用不同的随机种子重复运行多次以确定性能。
例如当我感觉完成了基本工作,我就会直接在环境上执行端到端的测试。但是即使我一直使用最简单的环境,我仍然遇到了非常大的问题。因此我重新回到 FloydHub 进行调整并运行了三个副本,事实证明我认为优秀的超参数只在三次测试中成功了一次。
三个随机种子的两个出现失败(红/蓝)是很少见的。
为了让你确切感受到需要做的计算的量级:
使用 A3C 和 16 个工作站,Pong 需要 10 个小时来训练;
这是 160 个 CPU 小时;
训练 3 个随机种子,则是 480 个 CPU 小时。
至于计算开销:
对于 8 核机器,FloydHub 大约每小时花费 0.5 美元;
因此 10 小时需要花费 5 美元;
同时运行 3 个随机种子,则每次运行需要花费 15 美元。
从《Deep Reinforcement Learning Doesn't Work Yet》这篇文章中,我们知道,那些不稳定性是正常的、可接受的。实际上,即使「五个随机种子(常用的报告指标)也可能不足以得到显著的结果,因为通过仔细的选择,你可以得到非重叠的置信区间。」
因此在 OpenAI Scholars programme 中提供 25000 美元的 AWS 信贷实际上并不疯狂,这可能正是确保你的计算可靠的大致成本。
我要表达的意思是,如果你想要完成一个深度强化学习项目,确保你知道你正趟进的是什么浑水,确保你已经准备好付出多少时间成本和多少经济成本。
总之,复现一篇强化学习论文很有趣。但在这之后,回头看看你有哪些技能真正得到了提升。同时,我也很好奇复现一篇论文是不是对过去数月时间的最佳利用。
一方面,我确实感觉到了机器学习工程能力的提升。我在识别常见的强化学习实现错误上更有自信了;我的工作流程在整体上变得更好了;从这篇特定的论文中,我学到了关于分布式 TensorFlow 和非共时设计的很多东西。
另一方面,我并不认为我的机器学习研究能力有很大提高(这才是我当初的真正目的)。和实现不同,研究的更加困难的部分似乎总在有趣但易驾驭、具体的思想,以及你确实花费时间实现并认为得到最高回报的思想之后出现。挖掘有趣的思想似乎取决于(a)丰富的概念词汇;(b)对思想的良好品味。我认为阅读有影响力的论文、写总结,并对它们做严谨分析是兼顾两者的好办法。
因此,无论你想提高工程技能还是研究技能,深度考虑都是值得的。如果你在某方面比较欠缺,最好启动一个项目来针对性提高。
如果你想要提高两者,最好是先阅读论文,直到你找到真正感兴趣的东西,能用简洁的代码进行实现,并尝试对其进行扩展。
如果你希望处理一个强化学习项目,下面是一些更具体的注意内容。
选择需要复现的论文
分为几部分查找论文,并避免需要多个部分协同处理的论文。
强化学习
如果我们的强化学习是作为更大系统中的一个组件,请不要尝试自己实现强化学习算法。这是一个很大的挑战,并且我们也能学习到非常多的东西,但是强化学习目前仍然不够稳定,我们不能确定到底是大型系统存在问题还是作为系统一部分的强化学习存在问题。
在做任何事前,先要查看用基线模型在我们的环境上训练智能体有多么困难。
不要忘了归一化观察值,因为模型很多地方都要使用这些观察值。
一旦我们认为模型已经基本好了就直接完成一个端到端的测试,那么成功的训练要比我们预期的更加脆弱。
如果我们正在使用 OpenAI Gym 环境,注意在-vo 的环境中,当前动作有 25% 的时间会被忽略,并复制前面的动作以替代,这样会减少环境的确定性。如果我们不希望增加这种额外的随机性,那么就要使用-v4 环境。另外,默认环境只会从模拟器中每隔 4 帧抽取一次,以匹配早期的 DeepMind 论文。如果不希望这种采样,可以使用 NoFrameSkip 环境控制。结合上面的确定性与不跳过采样,我们可以使用 PongNoFrameskip-v4。
一般机器学习
由于端到端的测试需要很长时间才能完成,因此如果我们需要做一些重构会浪费大量时间。我们需要在第一次实现就检查错误并试运行,而不是在训练完后重新编写代码与结构。
初始化模型大概需要花 20s,且因为语法检测会浪费大量的时间。如果你不喜欢使用 IDE 或只能在服务器用 shell 访问与编辑,那么可以花点时间为编辑器配置 linter。或者每当我们尝试运行时遇到语法错误,可以花点时间令 linter 可以在在未来捕捉它。
不要仅仅使用 Dropout,我们还需要注意网络实现中的权重共享,批归一化同样也需要注意这一点。
在训练过程中看到内存占用有规律地上升?这可能是验证集过大。
如果使用 Adam 作为优化器发现一些奇怪的现象,那可能是因为 Adam 动量有问题。可以尝试使用 RMSprop 等不带动量的优化器,或设置 Adam 的超参数β1 为零。
TensorFlow
如果你想调试计算图中某个内部节点,可以使用 tf.Print,这个函数会打印该节点在每一次运行计算图时的输入。
如果你仅为推断过程保存检查点,则通过不保存优化器的参数而节省很多空间。
Session.run() 会出现很大的计算开销,如果可以的话将一个批量中的多个调用分组并运行计算图。
如果在相同机器上运行多个 TensorFlow 实例,那么就会得到 GPU 内存不足的报错。这可能是因为其中一个实例尝试保存所有的 GPU 内存,而不是因为模型过大的原因。这是 TF 的默认选项,而如果需要修改为只保存模型需要的内存,可以查看 allow_growth 选项。
如果你希望从一次运行的多个模块中访问计算图,那么应该可以从多个线程中访问相同的计算图,但目前锁定为只允许单线程一次读取。这看起来与 Python 全局解释器锁不同,TensorFlow 会假定在执行繁重任务前释放。
在使用 Python 过程中,我们不需要担心溢出问题,在 TensorFlow 中,我们还需要担心以下问题:
> a = np.array([255, 200]).astype(np.uint8)
> sess.run(tf.reduce_sum(a))
199
如果 GPU 不可用,注意使用 allow_soft_placement 返回到 CPU。如果你编码的东西无法在 GPU 运行,那么可以移动到 CPU 中:
with tf.device("/device:GPU:0"):
a = tf.placeholder(tf.uint8, shape=(4))
b = a[..., -1]
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True))
sess.run(tf.global_variables_initializer())
# Seems to work fine. But with allow_soft_placement=False
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=False))
sess.run(tf.global_variables_initializer())
# we get
# Cannot assign a device for operation 'strided_slice_5':
# Could not satisfy explicit device specification '/device:GPU:0'
# because no supported kernel for GPU devices is available.
我们并不知道有多少运算不能在 GPU 上并行化运行,但为了安全起见,我们可以手动回退 CPU:
gpu_name = tf.test.gpu_device_name()
device = gpu_name if gpu_name else "/cpu:0"
with tf.device(device):
# graph code
心理状态
讲真,不要对 TensorBoard 上瘾。不可预测的奖励是对 TensorBoard 上瘾的完美示例:大部分时间你检测运行的如何,这没什么,但在训练过程,有时检测中忽然就中了大奖。所以有时非常刺激。如果你开始感觉每分钟都想要检查 TensorBoard,那你就需要设定合理的检查时间了。
以下是强化学习的一些入门资源:
Andrej Karpathy 的《Deep Reinforcement Learning: Pong from Pixels》很好的介绍了强化学习的理论动机与直觉:http://karpathy.github.io/2016/05/31/rl/
更多有关强化学习的理论,查看 David Silver 的文献:http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html。该资源对深度强化学习介绍不多,但却教授了理解论文时需要的词汇。
John Schulman 的《Nuts and Bolts of Deep RL Experimentation》课程中包含了很多实践时的注意点,链接:https://www.youtube.com/watch?v=8EcdaCk9KaQ。
想要了解深度强化学习的现状,可以查看以下文章:
Alex Irpan 写的《Deep Reinforcement Learning Doesn't Work Yet》。
Vlad Mnih 的视频《Deep RL Bootcamp Frontiers Lecture I: Recent Advances, Frontiers and Future of Deep RL》,链接:https://www.youtube.com/watch?v=bsuvM1jO-4w
Sergey Levine 的《Deep Robotic Learning》演讲,注重改建机器人泛化与采样的效率,链接:https://www.youtube.com/watch?v=eKaYnXQUb2g。
Pietel Abbeel 在 NIPS 2017 上的 Keynote,讲解了深度强化学习近期的技巧。链接:https://www.youtube.com/watch?v=TyOooJC_bLY。
雷锋网
雷锋网 AI 科技评论按:上次我们报道了来自中国的决策智能企业「启元世界」,他们凭借自己的核心技术深度强化学习和决策智能平台,在 NeurIPS 2018 多智能体竞赛「炸弹人团队赛」中获得了 Learning 组冠军。
启元世界对于深度强化学习技术路线的选择,不禁让人想起了同样深耕强化学习、以围棋 AI AlphaGo 闻名世界的人工智能企业 DeepMind。同时,启元世界也和年轻人生活中不可或缺的元素 —— 游戏 —— 有着千丝万缕的联系。
但另一方面,强化学习作为一个快速发展的新兴技术领域,本身尚有许多挑战,如可复现性、可复用性和鲁棒性方面的问题可能也会限制它的实际应用。启元世界把深度强化学习用于决策智能的信心和热忱来自哪里?他们如何看待强化学习的种种挑战?他们又有哪些技术成果支撑自己的远大想法呢?抱着这些好奇,我们采访了启元世界的创始人 & CEO 袁泉。
雷锋网 AI 科技评论:启元世界的核心关注点是认知决策智能技术。我们有所耳闻的决策智能应用场景包括金融风控、医疗辅助诊断等等。启元世界目前对哪些行业场景的关注比较多?成果如何?未来还计划覆盖哪些行业场景?
袁泉:我们关注的主要是游戏、网络智能和仿真相关的行业。我们的深度强化学习等技术,其实最早也是从游戏中训练而来的,而后基于启元决策智能平台做进一步的拓展和应用。所以我们比较自然的先发掘游戏行业的应用,比如为游戏公司提供 AI 引擎和服务。我们的 AI 智能体不仅可以在游戏中替代传统的 NPC,甚至可以陪人玩得很有乐趣(AI 和人类一起玩星际争霸的视频参见这里),所以电子竞技行业是我们关注的比较多的。网络智能和仿真也是深度强化学习有优势的领域。
我们公司创办一年多,主要精力投入到核心技术和产品的研发,尤其是启元决策智能平台。启元决策智能平台经过了若干轮的迭代,内部版本号已经到了 -v0.8。目前启元的决策智能平台已经具备如下竞争优势:
第一,持续学习的能力。持续学习的能力是智能体训练中关键的一环。在训练阶段,智能体需要在学习新技能的过程中保留过去学会的技能,才能达到很高的水平。启元决策智能平台通过智能体群体匹配竞技的方式实现「自然选择」,从而达到持续学习的效果。在竞技过程中,强者留存,弱者被淘汰。在弱者被淘汰之后,空出来的位置被强者的克隆体代替,而强者的克隆体则根据新的超参设定持续进化。在固定计算资源预算的情况下,启元决策智能平台通过这套机制在探索新强者(exploration)和深挖旧强者(exploitation)之间平衡对计算资源的使用情况。
第二,支持复杂场景的多智能体联合训练。在多智能体博弈问题中,不同智能体之间的相互克制较为常见,其收敛可能性极为复杂。以炸弹人竞赛举例,在竞赛中,不同队伍的智能体风格迥异,有的善攻,有的善守。基于「鲶鱼效应」的思想(指透过引入强者,激发弱者变强的效应),启元决策智能平台在训练初期引入基于规则的高阶对手,激发初期较弱的智能体在与强者的对决中学会各种基本技能,迅速提升变强;随着训练阶段的深入,启元决策智能平台同时训练多个智能体,使其在激烈的相互对抗中完善自我。
第三,支持基于私有云集群的大规模、高并发的模拟和大规模训练。启元决策智能平台将多个模块进行组件化,并封装到了容器中(如图)。通过云端自动化的方式管理数百 CPU 以及 GPU 资源并实现容器编排,降低了调度数十个炸弹人训练任务的成本。大规模、高并发的模拟计算以及大规模的训练同时在私有云集群中进行。另外,启元决策智能平台提供分布式存储方案,并配置成共享模型池,为炸弹人智能体模型群体的持久化和共享提供支持。
2018 年我们已经尝试把一些技术商业化,目前也取得了不错的营收。2019年,启元世界计划发布第一版启元决策智能平台型产品,为更多行业客户、终端用户带去高体验的服务。
说回决策智能,它是个比较通用的技术,这种辅助决策的能力可以泛化到很多行业,甚至包括网络智能—— 其实网络中的每一个节点也都是一个可决策的智能体,决策智能有很大的发挥空间。未来可能对于电信电力、网络智能相关的行业我们也会关注。
雷锋网 AI 科技评论:决策智能在现实应用中需要考虑决策的可解释性、决策的公平性、给人类提供辩解的机会等等问题。你们对这些问题是否有所准备?
袁泉:可解释性、公平性这些都很重要。这里面不仅要给人类提供辩解的机会,也需要让 AI 解释自己的决策过程,向人展示可信任的、具备可解释性的决策,以及辅助决策的结果。比如其中一种方式是,可以把决策结果以很好的可视化呈现出来,我们过去在电商中做过的推荐系统,在生成推荐结果的时候可以同时给出几条可解释性的推荐理由。目前我们也从技术上,包括深度学习可解释性相关的技术上做更多的技术积累。
雷锋网 AI 科技评论:对于人工智能决策,有一个常被谈起的设想问题是,假如一辆高速行驶的自动驾驶汽车面前突然冲出一个行人,减速避让可能会伤害到车内的人,而不减速避让则会伤害到这个行人。决策智能能否完美地解决类似这样的问题呢?
袁泉:自动驾驶这个场景我们看的并不是很多,只能简单谈谈我对这个问题的理解。
首先,如果这是一个有智能的汽车,已经出现了这种情况,也就是说已经到了不得不做这种决策的时刻了,这就其实是一个很晚的决策时机了。其实理想的情况就是要避免这类两难决策的发生。当我们学开车的时候,最重要的一个原则就是 defensive driving,防御性驾驶。所以如果是一个真正智能的决策系统,它应该会预估到前方可能出现的意外,比如冲出来的行人或者小狗,对突发情况有一定的准备,尽量避免这样决策时机很晚的状况。决策的 timing 很重要,不应该错过最佳的决策时机。
其次,如果行进过程中确实有这种情况发生的时候,这个最大的原则肯定是保护人:保护人的生命,我觉得这应该是第一原则。这让我想到阿西莫夫的机器人三原则,其实自动驾驶汽车就是一个机器人,它在任何时候都要以不得伤害人的生命为第一原则。如果是要在行人的生命和乘客的一些小的损伤、安全性上面做一些取舍,我相信可能也应该遵从这种原则。
NeurIPS 炸弹人竞赛中,炸弹人学会准确的炸箱子,并且通过最短路径寻路吃增强药
雷锋网 AI 科技评论:在 NeurIPS 炸弹人竞赛中使用的决策智能来自启元决策智能平台上运行的强化学习算法。对于游戏竞赛来说用强化学习的学习范式是很自然的选择,那么其它领域的决策智能也是用强化学习的吗?(相比于更为直接的监督学习)
袁泉:我们团队在过去十多年中做过互联网推荐广告、图像、以及云,有很多标注数据,这种时候就用监督学习来学习大数据。但是标注数据的成本非常高,所以我们强调说,其实强化学习是更接近于人类、尤其是接近于小孩的自然学习过程。强化学习现在不仅可以适用在游戏里面,也可以用在自动驾驶。比如在真实世界中学习,哪怕积累了几百万公里的数据,你可能都很难获得有信息量的负样本(交通事故场景)。但是你在虚拟环境中,用强化学习去学习,是很容易获得这种负样本的。
所以强化学习这种范式,是可以走到游戏之外的很多别的行业的,在自动驾驶、AlphaGo 之后,还可以用来做推荐,谷歌已经用它做数据中心的节能,还包括我刚才提到的网络智能,都可以用强化学习的方式去学。
雷锋网 AI 科技评论:那么强化学习有机会全面替代监督学习吗?
袁泉:目前还不可以。监督学习的核心是它的正负反馈,样本的正负 label 其实是非常清楚和明确的一个信号,这个信号会指导机器学习系统的学习过程。但是强化学习中的「label」,也就是 reward,其实是个弱信号,它要么是由环境给定的,要么是 AI 开发人员指定的。也可以认为它其实是对监督学习强信号的一种逼近。
在一些情况下,比如说我们已经有了监督学习的大数据,而且这种任务又很关键、容错率低,那么借助监督学习的正负信号,它可以学得更明确,学的更有指向性。强化学习相对监督学习,毕竟是一个新兴的领域。监督学习通过过去几十年的发展,从理论到工业界应用成熟度是比较高的。
雷锋网 AI 科技评论:强化学习是近年来的人工智能研究热点,但是学习过程本身就有诸多困难,正如你们在介绍中说道「可复现性、可复用性和鲁棒性方面依然存在挑战」。那么你们选择强化学习作为自己的核心技术研发方向,可以谈谈有信心的理由吗?目前有哪些原创的技术成果吗?
袁泉:我们创始团队过去做了十多年的大数据、监督学习之后,看到这个新兴的技术领域就觉得很有兴趣,整个创始团队都对这个领域非常有 passion,不管是对技术本身,还是对玩游戏这件事。我们多位创始团队的成员其实都很喜欢玩游戏,尤其是一些比较有深度、有创造性的游戏。我和联合创始人海涛,十多年前就对星际争霸非常喜欢。
觉得有信心的理由的话,就是归根结底还是来自于团队和对强化学习的信仰。就像 AlphaGo 论文的一作以及主程序员、DeepMind 的科学家 David Silver 十多年前专门从英国跑到冰天雪地跟开辟了这整个领域的 Richard Sutton 学习强化学习。在这之前 David Silver 和 DeepMind 的另外一个创始人 Demis Hassabis 已经创办了一家电子游戏公司,十多年前就在探索《黑与白》这类基于 AI 的游戏。这都是他们对强化学习有信仰的证明。
目前通过这两年我们技术的积累,已经产生了不少原创性的技术成果,尤其是和游戏这种博弈场景结合起来。近几年热门的三款游戏都是这样的博弈类的游戏(MOBA)。我们目前已经有十余个专利、软件著作权作为我们这方面技术成果的体现,以及基础的技术平台 —— 启元决策智能平台。
其实当很多人还在谈论强化学习劝退文、谈到强化学习的训练不稳定的时候,我们已经在这个平台上不断打磨,让智能体能够稳定的学习和训练起来。包括这次炸弹人竞赛,我们每个阶段的训练过程是没有人类编写的先验规则参与的,都是智能体自己学出来的,学习曲线也非常漂亮,而且是两个智能体在稳定地往上提升效果。
我们这一次得了竞赛冠军之后,就已经把竞赛的成果写了一篇论文(arxiv.org/abs/1812.07297),我们近期还有一篇论文在提交,是关于如何把强化学习和演化博弈论结合起来。未来我们也会更系统地整理其中的创新点、补充更多的实验结果后,跟学界和产业界分享。
雷锋网 AI 科技评论:现阶段你们都面对(还面对)哪些技术挑战?总体解决思路如何?
袁泉:技术挑战肯定还是存在的,深度强化学习也是个新兴的方向,刚刚火起来。
深度强化学习这个方向,我们从自己业务场景和体会来看,一个很大的门槛是大规模复杂场景的智能体的训练。这也是我们启元决策智能平台尽力在解决的目标。就在 NIPS 2018 上面,加拿大很权威的教授、图灵奖得主 Judea Pearl 还在讲强化学习的这种可复现性问题。目前我们在平台上已经积累了许多技术,一定程度上解决了这些问题,但是随着比如智能体规模变大,比如上千个智能体,甚至在更复杂、更开放的环境中去训练,如何能够稳定收敛也是我们在探索的方向。
另一个问题是,在非完全信息环境下如何博弈。 AlphaGo 下围棋,是一个完全信息博弈(双方都能看到棋盘上的所有棋子的位置),但是基本上所有的游戏场景,以及现实的决策场景,都是不完全信息的。其实任何一个人做决策可能都是在不完全信息下做决策。我们提交的一些论文就是尝试把强化学习和博弈论结合起来,一起去研究,这个也是新的方向。
从决策的角度讲,决策智能目前也还是一个世界级的难题,决策过程也是人脑中最复杂的一种功能。从我们十余年前在 IBM 研究院对 Watson 的理解、在阿里电商平台的实践,以及在认知计算实验室所研读的 AI 数十年发展史来看,主要有以下几方面:一、决策过程是主观与客观、理智与情感相融合的过程,目前计算机擅于处理的是理性可计算部分,因此需要更好的建模和逼近路径; 二、影响决策的因素非常多,人是在多源信息密布的环境中进行决策,需要有效甄别和提取有效信息,同时对未知信息进行推理和假设。 三、各个行业运用决策智能的场景往往是要求实时决策,甚至是高并发决策,如互联网中通常需要在毫秒级返回给用户的推荐结果,因此对系统架构上挑战也很大。
我们优势是基于创始人、创始团队过去十余年在国际一流的研究机构、互联网企业的经验,对世界范围内整个领域有深入的洞见和实践经验,清楚技术的边界和发展路径,与伯克利、CMU、纽约大学的许多知名专家学者都建立了深入的合作机制,能比较好的将决策智能的技术研发与前沿科研统一起来,兼顾商业化的落地场景。
雷锋网 AI 科技评论:最后一个问题,您曾经在阿里工作了较长时间,那么您离开阿里创业的动力和愿景是什么?
袁泉:我从 2006 年开始做个性化推荐,最早在 IBM 的五六年主要是以研究和发表论文为主。然后 2012 年加入阿里,到 2017 年离开,非常感谢阿里这个平台,让我把过去研究算法、推荐系统的经验,能够完全应用在平台上。产品从手机淘宝、到天猫,再到双 11 项目,都成功地应用起来了。从我个人来说,非常感谢阿里这个平台,自己实现了阶段性的目标和使命。
决定离开,因为自己觉得在一个方向上做了超过十年之后,可以暂时告一段落。而且又看到以 AlphaGo 为代表的新技术,以及背后像 DeepMind 这样的有梦想的公司。所以我觉得我们这个团队也可以尝试新技术和远大的事情。我们公司的名字就叫启元世界,英文叫 Inspir.AI ,希望可以用 AI 启发更多的人。比如在游戏这样的虚拟化的场景中,可以更好地帮助人做辅助决策,以及给人提供创造性、有价值的,甚至启发人的事情。
出于这样的初心,我们希望 Build Intelligence ,打造决策智能; Incubate Worlds,构建平行世界,比如各种虚拟的游戏、虚拟的场景,甚至和 VR 结合起来的平行世界;Inspire People,通过决策智能帮助人、激发人的创造力。
上个月强化学习之父 Richard Sutton 为我们公司题词「To inspir.ai, Let us all be inspired ! 」是对我们最好的鼓励!
雷锋网
本文为 AI 研习社编译的技术博客,原标题 :
An introduction to Reinforcement Learning
作者 | Thomas Simonini
翻译 | 斯蒂芬•二狗子、Disillusion
校对 | 斯蒂芬•二狗子 审核 | 就2 整理 | 菠萝妹
原文链接:
https://medium.freecodecamp.org/an-introduction-to-reinforcement-learning-4339519de419
深度强化学习从入门到大师:简介篇(第一部分)
您将使用的一些编程环境
本文是深度强化学习课程的一部分,使用 Tensorflow 进行实践。点击这里查看教学大纲。
强化学习是一种重要的机器学习类型,其中智能体通过执行操作和查看结果来了解如何在环境中执行操作。
近年来,我们在这个迷人的研究领域看到了很多改进。例如包括 2014年的DeepMind 的 Deep Q 学习架构,在2016 年 AlphaGo 击败李世石,2017年OpenAI 和 PPO 等。
DeepMind DQN
在本系列文章中,我们将重点学习目前用于解决强化学习问题的不同架构,包括 Q-learning, Deep Q-learning, Policy Gradients, Actor Critic, and PPO.
在这第一篇文章中,您将学到:
什么是强化学习,以及奖励机制是如何成为核心理念的
强化学习的三种方法
深层强化学习的“深层”意味着什么
在深入实现 Deep Reinforcement Learning 智能体之前掌握这些内容非常重要。
强化学习背后的理念是,智能体 Agent 将通过与环境互动并获得执行行动的奖励来学习环境。
从与环境的互动中学习来自人们的自然经验。想象一下,你是一个在起居室里的孩子。你看到一个壁炉,你接近它。
它很温暖,很积极,你感觉很好 (积极奖励+1)。 你感觉火是一件好事。
但是你试着触摸火焰。哎哟! 它会烧伤你的手 (负奖励-1)。你已经明白,当你离足够远时火是积极的,因为它会产生温暖。但是太靠近它会烧伤你。
这就是人类通过互动学习的方式。强化学习是一种从行动中学习的计算方法。
让我看一个智能体学习如何玩超级马里奥的一个例子。强化学习(RL)过程可以建模为一个循环,其具体工作方式如下:
Agent从环境 Environment 获取状态S0(在我们的例子中,从超级马里奥兄弟(环境)接收游戏(状态)的 first frame )
基于该状态S0, 智能体采取行动A0(我们的智能体将向右移动)
环境转换到新状态S1( new frame )
环境给智能体带来一些奖励R1( not dead :+1)
强化学习循环输出state,action和reward的序列,agent的目的是最大化预计累计奖励(expected cumulative reward)
奖励假设函数的核心思想
为什么 Agent 的目标是最大化预期的累积奖励?
实际上,强化学习是基于奖励假设的想法。所有目标都可以通过预期累积奖励的最大化来描述。
这就是为什么在强化学习中,为了获得最佳行为,我们需要最大化预期的累积奖励。
每个时间步t的累积奖励可定义为:
这相当于
感谢 Pierre-Luc Bacon 的修正
但是,实际上,我们不能光添加这样的奖励。早期(在游戏开始时)提供的奖励更有用,因为它们比未来奖励更好预测。
假设你的 agent 是这只小老鼠而你的对手就是猫。目标是在 agent 被猫吃掉之前吃最多的奶酪。
正如我们在图中可以看到的那样, 老鼠在附近吃奶酪的可能性比接近猫的奶酪更可能( agent 越接近猫,就越危险)。
因此,猫附近的奖励,即使它更大(更多的奶酪),也应该被将打折扣。因为我们不确定 agent 能不能吃到。
为了给奖励打折,可以这样做:
我们定义了一个名为gamma的折扣率。它必须介于0和1之间。
伽玛越大,折扣越小。这意味着学习,agent 更关心长期奖励。
另一方面,伽玛越小,折扣越大。这意味着我们的 agent 更关心短期奖励(最近的奶酪)。
累积的折扣预期奖励是:
感谢 Pierre-Luc Bacon 的修正
简单来说,每个奖励将通过伽玛的时间步长指数倍进行折扣。随着时间步长的增加,猫越来越接近我们的 agent,因此未来的奖励的获得越来越不可能发生。
任务是强化学习问题的一个实例,我们可以定义两种类型的任务:情节性 和 连续性。
情节性任务(episodic tasks)
这种情况下,强化学习任务会有一个起点和终点(一个最终状态)。这会创建一个剧情:一个状态 States, 行动 Actions, 奖励Rewards, 新状态 New States 的列表
例如,想想超级马里奥兄弟,一个剧情开始于新马里奥人物的出生点出来并到结束:当马里奥被杀或者达到了关卡的末尾。
新剧情的开始
持续性任务
这些是永远持续的任务(没有终点状态)。在这种情况下,agent必须学习如何选择最佳操作并同时与环境交互。
例如, agent 进行自动股票交易。对于此任务,没有起点和终点状态。agent 会持续执行,直到我们决定阻止他。
我们有两种学习方式:
在剧集结束时收集奖励,然后计算最大预期未来奖励: 蒙特卡洛方法
估算每一步的奖励: 时序差分方法
蒙特卡洛
当剧集结束时(智能体达到“终端状态”),Agent 会查看总累积奖励,看看它的表现如何。在蒙特卡洛方法中,奖励仅在比赛结束时收到。
然后,我们运用学到知识开始一个新的游戏。 Agent 会在每次迭代时做出更好的决策。
我们来举个例子:
如果我们采取迷宫环境:
总是从同一个起点开始。
如果猫吃了老鼠或者老鼠移动超过20步,我们就会终止这一集剧情。
在剧集结束时,我们有一个 State, Actions, Rewards, 和 New States的列表
奖励总额 Gt 被统计(看看老鼠的表现如何)。
根据上面的公式更新V( st )。
然后用这个新知识开始一个新游戏。
通过运行越来越多的剧集, Agent 将学会更好, 并更好地发挥。
时序差分方法:每一步的学习
TD学习不会等到剧集结束时更新最大预期未来奖励估计:它将更新其在该经历中发生的非最终状态St的价值估计V.
该方法称为TD(0) 或一步TD(在任何单个步骤之后更新值函数)。
TD方法只等到下一步更新值估计值。在时间 t + 1,它们使用观察到的奖励 Rt + 1和当前估计值V(St + 1)立即得到TD目标。
TD目标是一个估计值:事实上,可以通过将其更新为一步目标来更新先前估计V(St)。
在研究解决强化学习问题的不同策略之前,我们必须涵盖另一个非常重要的主题:勘探/开发权衡。
勘探是寻找有关环境的更多信息。
开发是利用已知信息来最大化奖励。
请记住,我们的RL智能体的目标是最大化预期的累积奖励。但是,我们可能会陷入局部陷阱。
在这个游戏中,我们的鼠标可以有无限量的小奶酪(每个+1)。但在迷宫的顶端有一大片奶酪(+1000)。
但是,如果只专注于奖励,agent永远不会达到巨大的奶酪。它只会得到最近的奖励来源,即使这个来源很小(利用)。
但如果我们的经纪人进行了一些探索,那么它就有可能获得巨大的回报。
这就是我们所说的勘探/开采权衡。我们必须定义一个有助于处理这种权衡的规则。我们将在以后的文章中看到处理它的不同方法。
既然我们已经定义好了强化学习的主要元素,那么让我们继续讨论解决强化学习问题的三种方法。这些是基于数值,策略,模型的的方法。
基于数值
在基于数值的RL中,目标是优化价值函数 V(s)。
价值函数是一个函数,表明agent在每个状态获得的最大预期未来奖励。
每个状态的数值是以该状态为起始点,agent在未来积累的奖励总额的期望。
Agent使用此函数在逐步地中选择的状态,使其获得期望最大。
在迷宫示例中,在每个步骤中我们将采用最大值:-7,然后是-6,然后是-5(依此类推)以达到目标。
基于策略
在基于策略的RL中,我们希望在不使用值函数的情况下直接优化策略函数 π(s)。
该策略定义了给定时间的智能体行为。
action = policy(state)
通过学习一种策略函数。这使我们得到每个状态到最佳的相应操作的映射。
我们有两种策略类型:
确定性:给定状态下的策略将始终返回相同的操作。
随机:输出行动上的分别概率。
正如我们在此处看到的,该策略直接指出了针对每个步骤采取的最佳操作。
基于模型
在基于模型的 RL 中,我们对环境进行建模。这意味着我们创建了一个环境行为的模型。
问题是每个环境都需要不同的模型表示。这就是为什么我们不会在即将发表的文章中谈论这种类型的强化学习。
深层强化学习引入深层神经网络来解决强化学习问题——因此得名“深层”。
例如,在下一篇文章中,我们将研究Q-Learning(经典强化学习)和深度Q-Learning。
你将看到两者的不同之处。在第一种方法中,我们使用传统的算法来创建一个Q表,它可以帮助我们找到针对每种状态的操作。
在第二种方法中,我们将使用神经网络(根据状态(q值)来估计奖励)。
Udacity的Q learning notebook激发了上图的灵感.
工业互联网
产业智能官 AI-CPS
加入知识星球“产业智能研究院”:先进产业OT(工艺+自动化+机器人+新能源+精益)技术和新一代信息IT技术(云计算+大数据+物联网+区块链+人工智能)深度融合,在场景中构建状态感知-实时分析-自主决策-精准执行-学习提升的机器智能认知计算系统;实现产业转型升级、DT驱动业务、价值创新创造的产业互联生态链。
版权声明:产业智能官(ID:AI-CPS)推荐的文章,除非确实无法确认,我们都会注明作者和来源,涉权烦请联系协商解决,联系、投稿邮箱:erp_vip@hotmail.com。