欢迎来到 第2部分:从基金会进行深度学习,其中显示了如何从头开始构建最先进的深度学习模型。从实现矩阵乘法和反向传播的基础,到高性能的混合精度训练,再到最新的神经网络体系结构和学习技术,以及介于两者之间的一切,它带您一路走。它涵盖了构成现代深度学习基础的许多最重要的学术论文,代码优先”教学中,每种方法都是从头开始用python实现的,并进行了详细说明(在此过程中,我们还将讨论许多重要的软件工程技术)。在开始本部分之前,您需要完成 第1部分:面向程序员的实用深度学习.

前五节课程使用Python, 火炬法泰 图书馆;最后两节课的使用 Swift for TensorFlow,并与 克里斯·拉特纳,是Swift,clang和LLVM的原始创建者。

的目的 从基础进行深度学习 在某些方面与第1部分相反。这次,我们不是在学习将立即使用的实际事物,而是在学习可以建立的基础。如今这尤为重要,因为这个领域发展得如此之快。在这门新课程中,我们将学习实现fastai和PyTorch库中的许多东西。实际上,我们将重新实现fastai库的重要子集!在此过程中,我们将练习实施论文,这是制作最新模型时掌握的一项重要技能。

在本文的其余部分中,我将提供您可以期望在本课程中涵盖的一些主题的快速摘要—如果听起来很有趣,请单击侧边栏“第2部分”部分中的第8课。剩下。如果您在途中有任何疑问(或只想与其他学生聊天), 活动论坛 该课程。

第八课:矩阵乘法;前进和后退

我们的主要目标是建立一个完整的系统,该系统可以在准确性和速度方面将Imagenet训练成世界一流的结果。因此,我们需要覆盖很多领域。

我们训练CNN的路线图
我们训练CNN的路线图

步骤1是矩阵乘法!我们将逐步重构和加速我们的第一个纯Python矩阵乘法,并在此过程中学习广播和爱因斯坦求和。然后,我们将使用它来创建基本的神经网络正向传递,包括对神经网络如何初始化的初步了解(在接下来的课程中,我们将深入探讨这一主题)。

广播和einsum让我们大大加速了matmul
广播和einsum让我们大大加速了matmul

然后,我们将实现向后传递,包括链规则的简要更新(实际上就是所有向后传递)。然后,我们将重构向后的路径以使其更加灵活和简洁,最后,我们将了解如何将其转换为PyTorch的实际工作方式。

从头开始传播
从头开始传播

讨论论文

第9课:损失函数,优化器和训练循环

在上一课中,我们对PyTorch的CNN默认初始化有一个悬而未决的问题。为了回答这个问题,我做了一些研究,然后从第9课开始,了解我如何进行这项研究以及我学到了什么。学生经常问“我该怎么做”,所以这是一个很好的小案例研究。

然后,我们将深入研究培训循环,并展示如何使其简洁而灵活。首先,我们简要介绍损失函数和优化器,包括实现softmax和交叉熵损失(以及 对数表达式 trick). 的n we create a simple training loop, and refactor it step by step to make it more concise and more flexible. In the process we’ll learn about nn.Parameter and nn.Module和 see how they work with nn.optim classes. We’ll also see how Dataset and DataLoader really work.

掌握了这些基本要素之后,我们将仔细研究fastai的一些关键构建块: 打回来, 数据束学习者。我们将看到它们如何提供帮助以及如何实施。然后,我们将开始编写大量回调,以实现许多新功能和最佳做法!

训练循环中的回调
训练循环中的回调

讨论论文

第10课:查看模型内部

在第10课中,我们将更深入地研究回调和事件处理程序的基本概念。我们研究了用Python实现回调的许多不同方式,并讨论了它们的优缺点。然后,我们快速回顾一下其他一些重要的基础:

  • __dunder__ Python中的特殊符号
  • 如何使用编辑器浏览源代码
  • 方差,标准差,协方差和相关性
  • 软最大
  • 控制流程例外
Python的特殊方法使我们可以创建行为类似于内置对象的对象
Python的特殊方法使我们可以创建行为类似于内置对象的对象

接下来,我们使用创建的回调系统在GPU上设置CNN训练。在这里,我们开始了解该系统的灵活性-在本课程中,我们将创建许多回调。

我们将在本课程中创建的一些回调
我们将在本课程中创建的一些回调

然后,我们继续本课的主题:在模型内部查看,以了解其在训练期间的行为。为此,我们首先需要了解 钩子 在PyTorch中,这使我们可以向前后传递中添加回调。在训练过程中,我们将使用挂钩来跟踪激活在每一层中的变化分布。通过绘制此分布图,我们可以尝试确定我们的培训存在的问题。

时间激活直方图示例
时间激活直方图示例

为了解决我们看到的问题,我们尝试更改激活功能,并引入batchnorm。我们研究了batchnorm的优缺点,并指出了一些性能不佳的地方。最后,我们开发了一种新型的规范化层来克服这些问题,将其与以前发布的方法进行比较,并看到一些令人鼓舞的结果。

讨论论文

第11课:数据块API和通用优化器

我们从第11课开始,简要介绍一种称为分层逐次顺序单位差异(LSUV)的智能,简单的初始化技术。我们从头开始实现它,然后使用上一课中介绍的方法来研究此技术对我们的模型训练的影响。看起来不错!

然后,我们看一下Fastai的亮点之一:Data Block API。在本课程的第1部分中,我们已经了解了如何使用此API。但是现在我们学习了如何从头开始创建它,并且在此过程中,我们还将学到很多有关如何更好地使用和自定义它的知识。我们将仔细研究每个步骤:

  • Get files: we’ll learn how os.scandir provides a highly optimized way to access the filesystem, and os.walk provides a powerful recursive tree walking abstraction on top of that
  • Transformations: we create a simple but powerful list and function composition to transform data on-the-fly
  • 拆分和标签:我们为每个标签创建灵活的功能
  • 数据束: we’ll see that 数据束 is a very simple container for our DataLoaders

Next up, we build a new StatefulOptimizer class, and show that nearly all optimizers used in modern deep learning training are just special cases of this one class. We use it to add weight decay, momentum, Adam, and LAMB optimizers, and take a detailed look at how momentum changes training.

动量变化对综合训练实例的影响
动量变化对综合训练实例的影响

最后,我们看一下数据扩充,并对各种数据扩充技术进行基准测试。我们开发了一种新的基于GPU的数据增强方法,发现该方法可以大大加快速度,并允许我们添加更复杂的基于扭曲的转换。

使用GPU批处理级别的数据增强可大大提高速度
使用GPU批处理级别的数据增强可大大提高速度

讨论论文

第十二课:高级培训技巧;从零开始的ULMFiT

我们在第12课中实现了一些非常重要的培训技术,全部使用了回调:

  • MixUp,一种数据增强技术,可以显着改善结果,尤其是当您的数据较少或可以训练更长的时间时
  • 标签平滑,特别适用于MixUp,在标签嘈杂时可以显着改善结果
  • 混合精度训练,在许多情况下,训练模型的速度提高了大约3倍。
混合增强的一个例子
混合增强的一个例子

我们还实施 xresnet,它是经典resnet体系结构的经过调整的版本,可进行实质性改进。而且,更重要的是,它的开发为使体系结构正常运行提供了深刻的见解。

最后,我们展示如何实现 超低价 从零开始,包括构建LSTM RNN,并研究处理自然语言数据以使其传递到神经网络所需的各个步骤。

超低价
超低价

讨论论文

第13课:Swift的基础知识

在第12课结束时,我们已经从头开始为Python构建了很多fastai库。接下来,我们重复Swift的过程!最后两节课由Jeremy与Swift的原始开发人员以及Google Brain的Swift for TensorFlow项目的负责人Chris Lattner共同教授。

Swift代码和Python代码看起来并没有什么不同
Swift代码和Python代码看起来并没有什么不同

在本课中,克里斯解释了什么是Swift,以及它的设计用途。他分享了有关其发展历史的见解,以及为什么他认为这更适合更广泛的深度学习和数值编程。他还提供了一些关于Swift和TensorFlow如何结合在一起的背景,无论现在还是将来。接下来,克里斯展示了一些有关使用类型的信息,以确保您的代码具有更少的错误,同时让Swift为您找出大多数类型。他还解释了一些入门所需的关键语法。

克里斯还解释了什么是编译器,以及LLVM如何使编译器开发更容易。然后他展示了我们如何直接从Swift直接访问和更改LLVM内置类型!得益于编译和语言设计,基本代码的运行速度确实非常快-在克里斯向班级展示的简单示例中,它比Python快大约8000倍。

了解Swift中`float`的实现
了解Swift中`float`的实现

Finally, we look at different ways of calculating matrix products in Swift, including using Swift for TensorFlow’s Tensor class.

迅捷资源

第十四课:C互操作;协议;全部放在一起

今天的课程从讨论Swift程序员将如何用普通Swift编写高性能GPU代码的方式开始。克里斯·拉特纳(Chris Lattner)讨论了内核融合,XLA和MLIR,这是Swift程序员很快就会想到的令人兴奋的技术。

然后,杰里米(Jeremy)谈论了现在可用的东西:很棒的C语言互操作程序。他展示了如何通过Sox音频处理以及VIPS和OpenCV图像处理作为完整的工作示例,通过与现有C库进行接口来快速,轻松地获得高性能代码。

Swift的C互操作幕后花絮
Swift的C互操作幕后花絮

接下来,我们在Swift中实现Data Block API!嗯...实际上在某些方面 更好 而不是原始的Python版本。我们利用了一个非常强大的Swift功能: 协议 (又名 类型类)。

Swift中的数据块API!
Swift中的数据块API!

现在,我们拥有足够的Swift知识,可以在Swift中实现完整的全连接网络正向传递,这就是我们要做的!然后,我们开始查看向后传递,并使用Swift的可选 参考语义 复制PyTorch方法。但是,然后我们学习如何使用“更快速”的方式来做相同的事情 价值语义 以非常简洁和灵活的方式进行向后传递。

最后,我们将所有内容放在一起,实施我们的通用优化器,学习器,回调等,以从头开始训练Imagenette! Swift的最终笔记本显示了如何在Swift中构建和使用大部分fastai.vision库,尽管在这两节课中没有时间来介绍所有内容。因此,请务必研究笔记本以查看更多Swift技巧...

更多信息

更多课程

在接下来的几个月中,我们将发布更多课程,并将其添加到我们称为的附加课程中 深度学习的应用。它们将与第2部分课程页面相关联,因此请密切注意。本系列的第一部分将是有关音频处理和音频模型的课程。我迫不及待想与大家分享!

即将到来的音频课上的高峰
即将到来的音频课上的高峰