【Spinning Up】成为一名深度强化学习研究者

1. 必要的背景知识
1.1 扎实的数学背景

概率与统计、随机变量、贝叶斯理论、概率论中的链式法则、期望、标准差、重要性采样、多变量积分、梯度以及泰勒展开。

1.2 必要的深度学习知识

包括标准架构(多层神经网络、vanilla RNN、LSTM、卷积层、GRU、残差网络、注意力机制),常见的正则化方法(权重衰减、dropout),标准化(批标准化、layer norm、weight norm)以及优化方法(SGD、momentum SGD、Adam等等)。了解reparameterization。

1.3 熟悉至少一个深度学习库

Tensorflow或Pytorch是很好的选择。不需要了解所有事情,但是至少要对能写出一个小程序来做监督学习这件事很自信。

1.4 对强化学习中的主要概念和术语烂熟于心

包括状态、动作、轨迹、策略、奖赏、价值函数、动作值函数等。

2. 在实践中学习
2.1 写出自己的实现

你需要实现尽可能多的核心深度强化学习算法,并且要求你的实现尽可能短且正确。这是目前来看最好的理解这些算法如何工作,而且能直观感受到它们各自的性能特点的方法。

2.2 简单是关键

你应该首先从简单的算法入手,然后逐步增加复杂度。如果你一开始就做很复杂的工作,那么很可能会失败,而且你会花费数周的时间来调试。

2.3 哪些算法?

你应该先从vanilla policy gradients(也被称作REINFORCE)、DQN、A2C、PPO、DDPG出发。先写个单线程的实现,然后再尝试写出多线程的实现。

2.4 要注意理解每个算法

强化学习中的代码常常会悄悄地出错,也就是说,代码能运行起来,但是逻辑上出了些问题,比如计算的方程有问题、数据被放到了错误的位置等。要解决这些问题,需要我们多多阅读文献,并参考已经有的实现,如果可能的话。

2.5 从文献里寻找什么

当你基于文章来实现一个算法时,一定要彻底地搜寻利用这篇文章,尤其是消解分析(ablation analyses)和补充材料。消解分析能让你直观了解哪些参数或子程序对算法正常工作有重要影响;而补充材料通常会给你一些例如网络架构和最优参数方面的信息。

2.6 不要拘泥于文章中的细节

有时,文章中给出的小技巧并非必要,你应该尝试尽可能简单的实现。

2.7 不要拘泥于已有的实现

已有的实现可以参考,但是不能拘泥于细节,比如一些工程上的细节。

2.7 在简单的环境中尽快迭代

为了调试你的实现,先尝试在简单的环境中进行测试,比如:CartPole-v0, InvertedPendulum-v0, FrozenLake-v0, 以及HalfCheetah-v2(运行大概100到250步即可)

2.8 如果不工作,先考虑是不是出了bug

尤其是当你使用了跟文献中相同的参数,即使超参数会极大影响强化学习算法的表现。另一方面,又是环境也会影响强化学习算法的表现,所以确保你的实现在多个环境中测试通过。

2.9 测试所有东西

要做很多测试来看看究竟发生了什么。通常可以参考的东西有:累积奖赏、幕长、值函数估计、损失的平均值、标准差、最大最小值等,以及一些探索参数(如epsilon)。

规模化你的实现

当你的实现在简单的环境中测试通过后,换到更复杂的环境中进行测试。

3. 开发一项研究工程
3.1 从探索文献、了解整个领域开始入手。

在强化学习领域中,有很多子领域,比如:sample efficiency, exploration, transfer learning, hierarchy, memory, model-based RL, meta learning, and multi-agent 等。可以从我们列举的一些关键文章来寻找灵感:找到一篇你感兴趣的文章,然后通读这篇文章,然后深挖related work和citations部分。通过这样做,你就能找到哪些是未解决的问题,以及你可以在哪些方面做出些有影响力的工作。

3.2 产生idea的方法:

1)在已有方法上改进。复现已有方法是一项很有帮助的做法,因为这样你就知道已有方法的缺陷在哪里了。
2)专注于未解决的基准。为了解决这个未解决的基准,你可能需要尝试很多已有的方法,同时发明一些你自己的方法;它的困难在于,为了解决这个问题,你可能需要作出很多一系列的突破,这意味着在很长时间内,你在这个问题本身上没有任何进步。
3)创造一个新的问题。不同于在已有的问题和方法上面进行研究,尝试一个全新的未被研究的领域,然后在这个领域上作出突破。你可能还要找到一个好的基准。但是这样的问题往往是可遇不可求的。
避免重复造轮子。当你有一个新想法时,先仔细查阅一下是否已有人做了一样的工作。

4. 做严格的强化学习研究

当你想出一个新的想法,并且确保这个想法目前没有人做后。测试你的想法,如果它有效果,那这太棒了!但是这还不够,你还要证明你的工作是有贡献的(contribution)。你可以选择在已有的测试域(test domain)上测试你的想法,然后挑战现有的最好的结果(SOTA);或者也可以尝试在一个新的测试域上测试,但是这样的话,可能就没有已有结果进行参考,你需要测试已有算法,找出一个最好的结果进行比较。

4.1 建立公平的比较

如果你从头开始实现你的基线(baseline),而不是直接与另一篇论文的数字进行比较,那么花同样多的时间来调整(tuning)你的基线和你自己的算法是很重要的,这会保证比较是公平的。同样,要确保其他的因素都一样。(题外话)事实证明,设计出一个能比基准具有绝对优势的算法是一项很艰难的工作。

4.2 消除作为混杂因素的随机性

随机种子对于学习具有很大的影响。所以最好在至少3个不同的随机种子上测试;如果想更加彻底,需要在10个以上的随机种子上测试。

4.3 运行高度集成(high-integrity)的实验

不要把所有结果中的最好的一部分放在文章里。相反,重新开始一个新的实验,并在这个新实验里测试所有的算法,包括你的算法,并作为你最终的结果。使用调参阶段来提出假设,并使用最后一次运行来得出您的结论。

4.4 分别检查每个部分

做研究的另一个关键方面是进行消融分析(ablation analysis)。 你提出的任何方法都可能具有多个设计决策需要考虑,例如体系结构选择或正则化技术,每个决策都可能分别影响性能。 你需要在你的工作中声明这些决策能够共同起作用,但这实际上是几条变相的捆绑声明:对于每个这样的设计元素,都要有一个声明(claim)。 通过系统地评估如果将其替换为替代设计选择或将其完全删除会发生什么,您可以弄清楚如何正确地归功(credit)您的方法所带来的好处。 这使您可以自信地提出每个单独的主张,并提高工作的整体实力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值