下一期 fast.ai 课程 将几乎完全基于我们开发的新框架,该框架构建在 Pytorch 之上。Pytorch 是一种不同类型的深度学习库(动态而非静态),它已被我们最尊敬的许多(如果不是大多数)研究人员采用,并且在 最近一次 Kaggle 竞赛 中,几乎所有前 10 名的选手都使用了它。
今年,我们花了大约一千小时研究 Pytorch 才达到这一阶段,我们对它所带来的可能性感到非常兴奋。未来几周,我们将撰写多篇文章,讨论这一决定的各个方面。首先,我们将简要总结这一决定的背景及其影响。然而,也许最好的总结是下面这段摘自我们第一课开头的片段:
fast.ai 的教学目标
fast.ai 的目标是让深度学习达到“无需教学”的境界。我们认为,目前需要高中数学基础、一年编程经验和七周学习才能成为世界级深度学习实践者,这是不可接受的(尽管这已经比任何类似水平的课程要求都低了)。每个人都应该能够使用深度学习来解决他们的问题,其所需教育程度不应超过使用智能手机。因此,我们每年的主要研究目标是能够将更广泛、更快、更准确的深度学习应用教授给基础要求更低的人。
我们希望我们的学生能够解决他们最具挑战性和最重要的问题,改变他们的行业和组织,我们相信这是深度学习的潜力所在。我们不仅仅是教人们如何在这一领域找到现有工作,而是要让他们超越这一点,走得更远。
因此,自我们首次开设深度学习课程以来,我们一直在持续整理最佳实践,对许多技术进行基准测试和开发,并通过 Kaggle 排行榜和学术界的最新成果来验证它们。
我们为何尝试 Pytorch
当我们开发第二期课程 面向程序员的前沿深度学习 时,我们开始遇到所选库(Keras 和 Tensorflow)的局限性。例如,当今自然语言处理中最重要的一项技术也许是使用 注意力模型(attentional models)。我们发现当时 Keras 中没有有效的注意力模型实现,而 Tensorflow 的实现没有文档、变化迅速且过于复杂。我们最终在 Keras 中自己编写了实现,结果花费了很长时间,并且非常难以调试。接着,我们将注意力转向实现动态教师强制(dynamic teacher forcing),我们在 Keras 或 Tensorflow 中都找不到其实现,但它对于准确的 神经机器翻译模型 来说是一项关键技术。我们再次尝试自己编写,但这次根本无法使其工作。
当时,Pytorch 的第一个预发布版本刚刚推出。Pytorch 的承诺在于它被构建为一个动态而非静态计算图的框架(关于这一点将在后续文章中详细介绍)。据称,动态框架将允许我们编写常规 Python 代码,并使用常规 Python 调试工具来开发我们的神经网络逻辑。事实证明,这些说法完全准确。我们在使用 Pytorch 的头几个小时内就从头实现了注意力模型和动态教师强制。
Pytorch 对我们和学生的一些益处
我们第二期课程的重点是让学生能够阅读和实现最新的研究论文。这很重要,因为目前为止深度学习应用的研究范围非常有限,主要集中在学术界恰好感兴趣的几个领域。因此,使用深度学习解决许多实际问题需要深入理解底层技术,并能够根据特定问题和数据实现定制化的版本。由于 Pytorch 使我们和我们的学生能够利用常规 Python 代码的所有灵活性和能力来构建和训练神经网络,我们得以解决范围更广泛的问题。
Pytorch 的另一个好处是,它使我们能够让学生更深入地理解我们所讲解的每个算法的运行过程。使用像 Tensorflow 这样的静态计算图库,一旦你声明性地表达了计算,它就被发送到 GPU,在那里像黑盒一样处理。但采用动态方法,你可以完全深入到计算的每个层面,准确地看到发生了什么。我们相信学习深度学习的最佳方式是通过编码和实验,所以动态方法正是我们学生所需要的。
令我们惊讶的是,我们还发现许多模型在 Pytorch 上的训练速度比在 Tensorflow 上快得多。这与流行的观点完全相反,流行的观点认为静态计算图应该能够进行更多优化,从而在 Tensorflow 中带来更高的性能。实际上,我们看到一些模型快一些,一些慢一些,这方面的情况每个月都在变化。关键问题似乎在于:
- Pytorch 中改进的开发者生产力和调试体验可以带来更快的开发迭代,从而实现更好的实现
- Pytorch 中更小、更集中的开发社区倾向于寻找“重大突破”,而不是投资于每个函数的微观优化。
我们为何在 Pytorch 之上构建新框架
不幸的是,对于课程第一部分来说,Pytorch 远非一个好的选择,第一部分旨在让没有机器学习背景的人也能入门。它不像 Keras 那样拥有清晰简单的模型训练 API。每个项目仅实现神经网络训练的基础功能就需要几十行代码。与 Keras 不同的是,Keras 的默认设置经过深思熟虑,尽可能有用,而 Pytorch 需要详细指定所有内容。然而,我们也意识到 Keras 可以做得更好。我们注意到在使用 Keras 时反复犯同样的错误,比如在该打乱数据时忘记打乱,或者反之。此外,许多最近的最佳实践没有被整合到 Keras 中,尤其是在快速发展的自然语言处理领域。我们想知道是否可以构建一个比 Keras 更好、能够快速训练世界级深度学习模型的工具。
经过大量的研究和开发,事实证明答案是肯定的,我们可以做到(在我们偏颇的看法中)。我们构建的模型比使用 Keras 的模型更快、更准确、更复杂,但代码量却少得多。我们已经实现了最近的论文中提到的技术,这些技术可以在多个领域更可靠地训练出更准确的模型。
关键在于创建一个面向对象(OO)类,它封装了所有重要的数据选择(例如预处理、数据增强、测试集、训练集和验证集、多类别分类与单类别分类与回归等等)以及模型架构的选择。一旦做到这一点,我们就能在很大程度上自动为该模型和该数据找出最佳的架构、预处理和训练参数。突然间,我们的生产力大幅提高,并且错误少了很多,因为所有可以自动化的事情都实现了自动化。但我们也提供了自定义每个阶段的能力,以便我们可以轻松尝试不同的方法。
生产力的提高使我们能够尝试更多技术,在此过程中,我们发现了一些当前被认为是标准实践但实际上效果极差的方法。例如,我们发现 批量归一化(batch normalisation)(几乎所有现代 CNN 架构都使用)与模型 预训练和微调(pretraining and fine-tuning)(如果可能,每个项目都应该使用)相结合,在使用标准训练方法时,可能导致准确率下降 500%。 (我们将在未来的文章中深入讨论这个问题。)这项研究的结果正在直接整合到我们的框架中。
该框架将首先在十月底面向我们的 USF 校内学生 进行有限发布,并在年底左右公开发布。(到时候我们需要取个名字了!欢迎提出建议……)(如果你想参加校内课程,国际奖学金 项目仍有空位。)
你应该学习什么?
如果你觉得现在新的深度学习库层出不穷,那么你需要为未来几个月和几年内更快的变化速度做好准备。随着更多人进入这一领域,他们将带来更多的技能和想法,并尝试更多不同的事物。你应该假定今天学习的任何特定库和软件都会在一两年内过时。想想网络编程领域一直在发生的库和技术栈的变化数量——而网络编程是一个比深度学习更成熟、增长更慢的领域。因此,我们坚信学习的重点在于理解底层技术及其在实践中的应用方式,以及在新工具和新技术发布时如何快速掌握其专业知识。
到课程结束时,你将理解框架内部几乎所有的代码,因为每一课我们都会深入一层,确切理解构建和训练模型时发生的一切。这意味着你将学会现代深度学习中最重要的最佳实践——不仅仅是知道如何使用它们,更理解它们如何真正工作以及如何实现。如果你想在另一个框架中使用这些方法,你将具备在需要时进行开发所需的知识。
为了帮助学生在需要时学习新框架,我们将花一节课学习使用 Tensorflow、MXNet、CNTK 和 Keras。我们将与学生一起将我们的框架移植到这些其他库中,这将成为一些很棒的课堂项目。
我们还将花一些时间研究如何将深度学习模型投入生产。除非你的工作规模达到 Google 级别,否则最佳方法可能是为你的 Pytorch 模型创建一个简单的 REST 接口,在 CPU 上运行推理。如果你需要扩展到非常高的流量,可以将模型(只要它不使用某些类型的定制)导出到 Caffe2 或 CNTK。如果需要在移动设备上进行计算,可以像上面提到的那样导出,或者使用设备上的库。
我们如何看待 Keras
我们仍然非常喜欢 Keras。它是一个很棒的库,对于相当简单的模型来说,比之前出现的任何东西都要好得多。在 Keras 和我们的新框架之间迁移非常容易,至少对于 Keras 支持的任务和架构子集来说是这样。Keras 支持许多后端库,这意味着你可以在许多地方运行 Keras 代码。
据我们所知,它有一种独特的架构定义方法,要求自定义层的作者创建一个 build()
方法,该方法告诉 Keras 对于给定的输入会产生什么形状的输出。这使得用户更容易创建简单的架构,因为他们几乎不必指定层的输入通道数。对于像 Densenet 这样连接(concatenate)层的架构,它可以使代码变得相当简单。
另一方面,它倾向于使得模型的定制变得更加困难,尤其是在训练过程中。更重要的是,后端的静态计算图,加上 Keras 需要额外的 compile()
阶段,意味着一旦模型构建完成,就很难定制其行为。
fast.ai 和 Pytorch 的下一步
我们期望在教授课程以及从学生那里获得反馈和想法的过程中,我们的框架以及我们教授 Pytorch 的方式会有很大的发展。在过去的课程中,学生们开发了许多有趣的项目,其中许多项目帮助了其他学生——我们期望这种情况会继续下去。考虑到深度学习的加速进展,到明年这个时候,很可能会出现截然不同的硬件或软件选项,使得今天的技术变得相当过时。不过,基于我们从 Pytorch 开发者那里看到的新技术的快速采纳情况,我们猜测他们至少在一段时间内会保持领先地位……
在下一篇文章中,我们将更详细地讨论 Pytorch 的一些突出特性,以及更广泛的动态库。