你知道fast.ai么?
他们以提供零基础的深度学习课程而闻名,宣称:只要你有高中数学基础、一年的编程经验,就能通过七周的学习,具备一流的深度学习实践能力。
刚刚,他们宣布了一件事。
下一个fast.ai的课程,将完全基于一个使用PyTorch开发的框架,抛弃原来的TensorFlow和Keras框架。这是为什么?
△ Jeremy Howard
且听创始人Jeremy Howard详解缘由,也相当于分析了初学者该选择什么样的框架。量子位节选编译如下:
我们为什么开始尝试PyTorch?
当我们开发第二门课《面向程序员的前沿深度学习》的时候,原来选的TensorFlow和Keras框架开始让我们处处碰壁。
比如说,现在自然语言处理中最重要的技术,大概是attention模型。可是我们发现,当时在Keras上没有attention模型的有效实现,而TensorFlow实现没有文档、一直在改,还复杂得毫无必要。
结果是我们决定自己在Keras里做一个attention模型实现,花了好长时间,debug也非常难。
接下来,我们又开始研究dynamic teacher forcing的实现。要实现一个准确的神经网络翻译模型,dynamic teacher forcing是其中的关键,但我们无论是在Keras里还是TensorFlow里,都找不到这个模型的实现。
于是,我们又开始尝试自己搞,这次比attention模型还失败,根本就没做出来能用的。
这时候,PyTorch的第一个预发布版出现了。这个新框架不是基于静态计算图,而是一个动态的框架,这为我们带来了新的希望。它说,动态框架让我们在开发自己的神经网络逻辑时,只需要写普通的Python代码,像正常用Python一样去debug。
我们第一次用PyTorch,就用它从头开始在实现了Attention模型和dynamic teacher forcing,只用了几个小时。
PyTorch在教学的好处
上文提到的那门课,一个重要的目标就是让学生能读最近的论文,然后实现它们。
这非常重要,因为到目前为止,在一些学术界比较关注的领域,我们对深度学习应用的研究反倒很有限,因此,用深度学习解决很多现实世界问题的时候,不仅需要了解基础技术,还要能针对特定的问题和数据去实现定制化的深度学习模型。
PyTorch,就让学生们能充分利用普通Python代码的灵活性和能力,来构建、训练神经网络。这样,他们就能解决更广泛的问题。
PyTorch的另一个好处是,它能让学生们更深入地了解每个算法中发生了什么。用TensorFlow那样的静态计算图库,你一旦声明性地表达了你的计算,就把它发送到了GPU,整个处理过程就是一个黑箱。
但是通过动态的方法,你可以完全进入计算的每一层,清楚地看到正在发生的情况。我们认为学习深度学习的最佳途径就是通过编程、实验,动态的方法正是我们的学生所需要的。
令我们惊奇的是,我们还发现很多模型在PyTorch上训练比在TensorFlow上更快。这和我们所熟知的“静态计算图能带来更多优化,所以应该性能更好”恰恰相反。
在实践中我们看到,有些模型快一点,有些慢一点,每个月都不一样。问题的关键似乎在于以下两点:
PyTorch提高了开发人员的生产力和debug经验,因此可以带来更快的开发迭代和更好的实现;
PyTorch中更小、更集中的开发团队不会对每个功能都进行微优化,而是要寻求“大胜”。
为什么在PyTorch上构建一个新框架?
然而,对于课程的第一部分来说,PyTorch还远远谈不上是一个很好的选择。没有机器学习背景的人根本没法上手。
PyTorch没有Keras那样简单明了的API来训练模型,每个项目都需要几十行代码来实现一个神经网络的基础训练。另外,Keras的默认设置就挺有用,而PyTorch一切都需要详细设置。
不过,Keras还能更好。我们发现大家一直在Keras里犯相同的错误,例如不能在我们有需要时打乱数据,反之亦然。另外,很多新出的最佳实践并没有被纳入Keras,特别是在快速发展的自然语言处理(NLP)领域。
所以我们在想,能不能构建一个比Keras更好的东西,用来快速训练最棒的深度学习模型。
经过一些研究和探索后,我们做到了。我们构建的模型比用Keras构建的更快、更准确、更复杂,而且更少的代码写就。最近对多个领域论文进行的实现,都证明了这一点。
关键是创建一个OO分类,其中包含了所有重要的数据选择(例如预处理、增强、测试、训练和验证集、多类和单类的分类与回归等)以及模型架构的选择。
我们完成这个工作之后,就能在很大程度上自动找出模型与数据最佳的架构、预处理和训练参数。突然间,我们的工作效率大幅提升,而且很少犯错,因为一切都是自动化的。但是我们在每个阶段提供了定制化的能力,所以可以轻松尝试不同的方法。
随着工作效率的提升,我们能够尝试更多的技术,在这个过程中,我们发现了一些非常差的方法。例如,我们发现批量归一化(几乎所有最新CNN架构都用)和模型预训练及微调(每个项目也该用)的组合,可以让标准训练方式的精度下降500%。
我们稍后会逐步放出这个研究的详细情况。(我们还缺一个名字……)
— 完 —