欢迎来到第2部分:深入学习基础知识,它展示了如何从头构建最先进的深度学习模型。从实现矩阵乘法和反向传播的基础知识,到高性能混合精度训练,再到最新的神经网络架构和学习技术,以及两者之间的一切。它涵盖了许多构成现代深度学习基础的最重要的学术论文。优先每一种方法都是用python从头开始实现的,并详细解释(在这个过程中,我们还将讨论许多重要的软件工程技术)。在开始这部分之前,您需要完成第1部分:实践深yabo88安卓度学习的程序员

前五个教训使用Python,PyTorchfastai图书馆;最后两个教训使用斯威夫特TensorFlow的,并且共同与教克里斯·拉特纳,斯威夫特,铛,和LLVM的原创者。

的目的从基础深度学习在某些方面与第一部分相反。这一次,我们不是在学习我们马上就会用到的实用的东西,而是在学习我们可以建立的基础。这在当今尤为重要,因为这个领域发展非常迅速。在这个新课程中,我们将学习实现fastai和PyTorch库中的很多东西。实际上,我们将重新实现fastai库的一个重要子集!在此过程中,我们将练习实现文件,这是一个重要的技能,掌握时,使状态的艺术模型。

In the remainder of this post I’ll provide a quick summary of some of the topics you can expect to cover in this course—if this sounds interesting, then click on lesson 8 in the “Part 2” section of the sidebar over on the left. And if you have any questions along the way (or just want to chat with other students) there’s a very活跃论坛该课程。

第8:矩阵乘法;向前和向后传球

我们的主要目标是建立一个完整的系统,可以训练Imagenet在准确性和速度方面达到世界级的结果。所以我们需要去很多地方。

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

第1步是矩阵乘法!我们逐渐将重构,加速我们的第一,纯Python,矩阵乘法,并在这个过程将了解广播和爱因斯坦总和。然后,我们将用它来创建一个基本的神经网络直传,包括如何神经网络进行初始化(一个主题,我们将在接下来的课程将进入非常深入)先看看。

广播einsum让我们accelate MATMUL显着
广播einsum让我们accelate MATMUL显着

然后,我们将实现向后传递,包括链规则的简短复习(这是真正的所有向后传递的)。然后,我们将重构向后路径,使之更加灵活,简洁,最后我们会看到这是如何转化为PyTorch的实际工作。

从头开始反向传播
从头开始反向传播

论文讨论

第9课:丧失功能,优化和训练循环

在上节课中,我们有一个关于PyTorch的CNN默认初始化的突出问题。为了回答这个问题,我做了一些调查,然后我们开始第9课看看我是如何进行调查的,以及我学到了什么。学生们经常问“我如何做研究”,所以这是一个很好的小案例研究。

然后我们深入研究训练循环,并展示如何使其简洁和灵活。首先,我们简要地看看损失函数和优化器,包括实现softmax和交叉熵损失(和logsumexp招)。然后,我们创建一个简单的训练循环,并重构它一步一步,使之更简洁,更灵活。在这个过程中,我们将了解nn.Parameternn.Module,看他们有怎样工作nn.optim类。我们也将看到如何数据集的DataLoader真正的工作。

一旦我们已经制定的基础件,我们会在fastai的一些关键构建模块密切关注:回调DataBunch,学习者。我们将看到它们是如何起作用的,以及它们是如何实现的。然后我们将开始编写大量的回调函数来实现大量的新功能和最佳实践!

在训练循环回调
在训练循环回调

论文讨论

第10课:寻找模型内部

在第10课中,我们将更深入地探讨回调和事件处理程序的基本思想。我们将介绍在Python中实现回调的许多不同方法,并讨论它们的优缺点。然后我们快速回顾一些其他重要的基础:

  • __dunder__Python中的特殊符号
  • 如何使用您的编辑器来浏览源代码
  • 方差,标准差,协方差和相关性
  • SOFTMAX
  • 异常作为控制流
Python的特殊方法,让我们创建对象的行为像内置的那些
Python的特殊方法,让我们创建对象的行为像内置的那些

接下来,我们使用我们创建的回调系统在GPU上设置CNN训练。这是我们开始看到这个系统有多灵活的地方——我们将在本课程中创建许多回调。

一些回调,我们将在这个过程中创造
一些回调,我们将在这个过程中创造

然后我们继续这节课的主要主题:观察模型内部,看看它在训练期间是如何工作的。要做到这一点,我们首先需要了解挂钩在PyTorch,这使我们能够添加回调向前和向后传球。我们将使用挂钩训练期间跟踪我们的激活每个层中的分布变化。通过绘制这个分布,我们可以尝试找出我们的培训问题。

一个例子的时间激活直方图
一个例子的时间激活直方图

为了解决我们所看到的问题,我们试图改变我们的激活功能,并引入batchnorm。我们研究batchnorm的利弊,并记下其性能较差一些地区。最后,我们开发了一种新的归一化层的克服这些问题,它比此前公布的方案,并看到一些非常令人鼓舞的结果。

论文讨论

第11课:数据块API,以及通用的优化

我们先从简单的介绍一下所谓的逐层顺序单位方差(LSUV)智能和简单的初始化技术课11。我们从头开始实现它,然后使用上一课介绍方法来研究这个技术对我们的模型训练的影响。它看起来很不错!

然后我们来看fastai的宝石之一:数据块API。我们已经在课程的第1部分看到了如何使用这个API;但现在我们将学习如何从头创建它,在这个过程中,我们还将学习很多关于如何更好地使用它和定制它的知识。我们将仔细观察每一步:

  • 获取文件:我们将学习如何os.scandir提供了高度优化的方式来访问文件系统,并os.walk在此基础上提供了功能强大的递归树遍历抽象
  • 变革:我们创建了一个简单但功能强大名单和函数组合来实时转换数据
  • 斯普利特和标签:我们为每一个灵活的功能
  • DataBunch:我们会看到DataBunch是一个非常简单的容器,我们的DataLoader小号

接下来,我们建立一个新的StatefulOptimizer类,并表明在现代深学习培训使用的几乎所有的优化都是这一类的只是特殊情况。我们用它来增加重量腐烂,动量,亚当,和羊肉优化,并采取在气势如何改变训练的详细研究。

不同的势头合成训练样本的影响
不同的势头合成训练样本的影响

最后,我们来看看数据增强,以及基准各种数据增强技术。我们开发了新的基于GPU的数据扩张的做法,我们发现速度的东西了相当显着,并允许我们再添加更多复杂的基于经变换。

使用GPU批次级数据的增强提供了很大的加速
使用GPU批次级数据的增强提供了很大的加速

论文讨论

第12课:先进的训练技术;ULMFiT从头开始

我们实施第12课,全部采用回调一些非常重要的训练技巧:

  • 查询股价,数据增强技术,大幅提升的结果,特别是当你有较少的数据,或者更长的时间训练
  • 标签平滑,这与查询股价效果特别好,而显著改善的结果,当你有嘈杂的标签
  • 混合精确训练,在很多情况下,这种训练模型的速度要快三倍。
混合增强的一个例子
混合增强的一个例子

我们还实现xresnet,这是经典RESNET架构,可提供显着改进的微调的版本。而且,更重要的是,它的发展提供了巨大的见解是什么让一个架构工作做好。

最后,我们将展示如何实现ULMFiT从头开始,包括构建一个LSTM RNN,以及查看处理自然语言数据所需的各种步骤,以便将其传递给神经网络。

ULMFiT
ULMFiT

论文讨论

第13课:雨燕的基础知识深度学习

通过第12课结束后,我们已经完成了建造多少fastai库为Python从头开始。接下来,我们重复这个过程雨燕!最后两节课共教杰里米与克里斯·拉特纳,雨燕的原始开发商一起,并在谷歌脑雨燕的TensorFlow项目的领导。

SWIFT代码和Python代码不看所有的不同
SWIFT代码和Python代码不看所有的不同

在这一课中,克里斯解释说雨燕是什么,以及它的设计做。他分享其发展历史的见解,以及为什么他认为这是对深学习和数字节目非常适合更普遍。他还提供了斯威夫特和TensorFlow如何结合在一起的一些背景,无论是现在还是将来。接下来,克里斯展示一些关于使用类型,以确保您的代码错误更少,而让斯威夫特弄清楚你的大多数类型的为您服务。他解释了一些语法的关键部分,我们将需要开始的。

克里斯还解释了编译器是什么,以及如何LLVM编译器让开发变得更容易。然后,他展示了如何我们实际上可以访问和更改LLVM内建类型直接从斯威夫特!由于汇编语言和设计,基本的代码运行速度非常快确实 - 比Python快于简单的例子克里斯显示类约8000倍。

学习Swift中浮动的实现
学习Swift中浮动的实现

最后,我们来看看不同的方式计算斯威夫特矩阵产品,包括使用斯威夫特TensorFlow的张量类。

斯威夫特资源

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

今天的课开始时使用的方式是斯威夫特的程序员将能够以纯斯威夫特写出高性能的GPU代码的讨论。克里斯·拉特纳讨论内核融合,XLA,以及MLIR,这是即将推出雨燕程序员令人兴奋的技术。

然后Jeremy谈到了一些现在可用的东西:非常棒的C语言互操作。他展示了如何通过与现有的C库接口,使用Sox音频处理,以及vip和OpenCV图像处理作为完整的工作示例,从而快速、轻松地获得高性能代码。

斯威夫特的C互操作的幕后
斯威夫特的C互操作的幕后

接下来,我们实现了雨燕数据块API!嗯......其实在某些方面它甚至更好比原来的Python版本。我们需要一个非常强大斯威夫特功能的优势:协议(又名类型的类)。

数据块API斯威夫特!
数据块API斯威夫特!

现在,我们有足够的知识斯威夫特实现完整的全连接网络中直传斯威夫特,所以这是我们做什么!然后,我们开始寻找后向通行,并用斯威夫特的可选引用语义复制PyTorch方法。但是,我们学习如何做同样的事情在一个更“SWIFTY”的方式,使用值语义办复路中一个非常简洁和灵活的方式。

最后,我们将它们放在一起,实现通用优化器、学习器、回调等,从头开始培训Imagenette !最后的笔记本在Swift显示如何建立和使用大部分的fastai。尽管在这两个课程中没有时间涵盖所有内容。所以一定要研究一下笔记本,看看更多的快速技巧……

进一步的信息

更多的课程

我们将在未来几个月内释放更加经验教训,并将它们添加到连接的过程中,我们将调用深度学习的应用。他们会从第2部分课程页面链接,所以要留意那里。在本系列的第一将是一个关于音频处理和音频模式的教训。我迫不及待地想与大家分享吧!

在即将召开的音频教训偷偷高峰
在即将召开的音频教训偷偷高峰