程序员实用深度学习 2019

课程
作者

Jeremy Howard

发布日期

2019年1月24日

今天,程序员实用深度学习 2019版正式发布,这是该课程的第三次迭代,全部内容都是全新的,包括以前任何入门级深度学习课程从未涵盖过的应用(以及一些甚至尚未在学术论文中发表的技术)。课程共有七节课,每节课约2小时长,你应该计划每节课花费约10小时完成作业。Google CloudMicrosoft Azure 已将课程所需的一切集成到其基于GPU的平台中,还有“一键式”平台可用,例如 CrestleGradient

本课程假定你至少有一年的编码经验(最好是Python,尽管有经验的程序员在学习过程中也能掌握Python;我们提供了一份Python学习资源列表),并且完成了高中数学(课程中会根据需要引入一些大学级别的数学知识)。许多完成课程的人告诉我们,虽然需要大量努力,但这却是他们做过的最有价值的事情之一;我们强烈建议你加入课程的活跃在线社区,这将有助于你完成学习旅程。

第一节课后,你将能够用自己的数据训练出一个最先进的图像分类模型。完成这节课后,这门课程线下班(录制本材料的地方)的一些学生在各个领域发表了新的最先进成果!课程的前半部分侧重于实用技术,只介绍在实践中实际使用这些技术所需的理论。然后,在课程的后半部分,我们将深入研究理论,直到最后一课,我们将从头构建并训练一个“resnet”神经网络,其准确率接近最先进水平。

课程中的一些应用示例

涵盖的关键应用包括

我们还涵盖了这些应用所需的所有必要基础。

课程涵盖的基础知识

我们使用 PyTorch 库进行教学,它是目前最现代、最灵活且被广泛使用的库,我们还将使用 fastai 作为 PyTorch 的封装,以便更容易地应用训练深度学习模型的推荐最佳实践(同时仍可以直接使用所有底层的PyTorch功能)。我们认为 fastai 很棒,但这有偏见,因为它是我们创建的……但它是 pytorch.org 上唯一列出的通用深度学习工具包,拥有超过10,000个GitHub星标,并在许多竞赛胜利、学术论文和顶尖大学课程中使用,所以不只是我们喜欢它!请注意,你学到的概念同样适用于你使用 Tensorflow/keras、CNTK、MXNet 或任何其他深度学习库进行的任何工作;重要的是概念。如果你很好地理解了概念,学习一个新库只需要几天时间。

今年一个特别有用的新增功能是,多亏了 Zach Caceres 的出色工作,我们现在拥有了一个超强的视频播放器。它允许你搜索课程文本,并直接跳转到你想要查找的视频部分。它还在可折叠面板中显示其他课程的链接,以及课程摘要和资源(不过在移动设备上效果不好,所以如果你想在移动设备上观看,可以使用这个Youtube播放列表)。还要特别感谢 Sylvain Gugger,他对课程和 fastai 库的开发都起到了关键作用——我们非常感谢 Amazon Web Services 赞助 Sylvain 的工作。

fast.ai的视频播放器带有可搜索时间线

如果你有兴趣尝试一下,点击此处前往课程网站。现在,让我们更详细地看看每一节课。

第1课:图像分类

第一节课最重要的成果是我们将训练一个图像分类器,能够以最先进的准确率识别宠物品种。这一成功的关键在于使用迁移学习,这将成为本课程大部分内容的基础平台。我们还将了解如何分析模型以理解其失败模式。在这种情况下,我们会发现模型出错的地方与即使是育种专家也可能犯错的地方相同。

训练和分析宠物品种分类器

我们将讨论课程的整体方法,这与传统的自底向上方式不同,而是采用自顶向下的方法。因此,我们不是从理论开始,然后再转向实际应用,而是先从实际应用入手,然后逐步深入探究,在需要时学习理论。这种方法对老师来说需要更多的开发工作,但已被证明对学生非常有帮助,例如 哈佛大学 David Perkins 的教育研究就表明了这一点。

我们还会讨论如何在使用 Leslie Smith 出色的学习率查找器方法时,设置训练神经网络时最重要的超参数学习率。最后,我们将探讨一个重要但很少讨论的话题:标注,并学习 fastai 提供的一些功能,帮助你轻松为图像添加标注。

请注意,要跟着课程学习,你需要连接到安装了 fastai 库的云端 GPU 提供商(推荐,只需约5分钟,费用低于0.50美元/小时),或者自己搭建一台配备合适的 GPU 的电脑(如果你不熟悉该过程,可能需要几天才能设置好,因此我们不建议前期这样做)。你还需要熟悉我们用于运行深度学习实验的Jupyter Notebook环境的基本操作。关于这些的最新教程和建议可在课程网站上找到。

第2课:数据清洗与生产部署;从头开始实现SGD

今天的课程从学习如何使用自己的数据构建图像分类模型开始,包括以下主题:

  • 图像采集
  • 并行下载
  • 创建验证集,以及
  • 数据清洗,使用模型帮助我们发现数据问题。

我将演示所有这些步骤,以创建一个能够区分泰迪熊和灰熊这一重要任务的模型。一旦我们整理好数据集,我们将学习如何将我们的“泰迪查找器”模型投入生产,并使其在线可用。

将你的模型投入生产

自本课程录制以来,我们有一些很棒的新增内容,请务必查看:

  • 课程网站上的生产入门工具包,例如用于部署到 Render.com 的这个
  • 课程笔记本中新增的交互式 GUI,用于使用模型查找和修复标注错误或收集不正确的图像。

在课程的后半部分,我们将从头开始训练一个简单的模型,创建自己的梯度下降循环。在此过程中,我们将学习许多新的术语,所以请务必做好笔记,因为我们在整个课程中都会引用这些新术语(从这里开始,每节课都会引入更多术语)。

梯度下降的实际演示

第3课:数据块;多标签分类;图像分割

今天内容丰富!我们在第3课首先研究一个有趣的数据集:Planet 的从太空理解亚马逊。为了将这些数据整理成建模所需的形状,我们将使用 fastai 最强大(也是独一无二!)的工具之一:数据块API。在接下来的课程中,我们将多次回到这个API,掌握它将让你成为真正的 fastai 超级巨星!完成本节课后,如果你想进一步了解数据块API,请阅读 Wayde Gilliam 的这篇优秀文章:找到数据块的涅槃之路

Planet 数据集的一个重要特征是它是一个多标签数据集。也就是说:每张卫星图像可以包含多个标签,而我们之前看过的数据集每张图像只有一个标签。我们将研究处理多标签数据集所需的更改。

我们的图像分割模型结果

接下来,我们将探讨图像分割,这是一个将图像中的每个像素用一个类别进行标注的过程,该类别表示该像素所描绘的物体类型。我们将使用与早期图像分类模型类似的技术,并进行一些调整。fastai 使图像分割建模和解释就像图像分类一样容易,因此无需太多调整。

本课程的这一部分我们将使用流行的 CamVid 数据集。在未来的课程中,我们将回到它并展示一些额外的技巧。我们最终的 CamVid 模型的错误率将显著低于我们在学术文献中找到的任何模型!

如果你的因变量是连续值,而不是类别呢?我们接下来回答这个问题,研究一个关键点数据集,并构建一个能够精确预测人脸关键点的模型。

第4课:自然语言处理;表格数据;协同过滤;嵌入

在第4课中,我们将深入探讨自然语言处理(NLP),使用IMDb电影评论数据集。在这个任务中,我们的目标是预测电影评论是正面的还是负面的;这被称为情感分析。我们将使用ULMFiT算法,该算法最初是在 fast.ai 2018课程中开发的,并在2018年引发了NLP的革命,纽约时报因此宣称新系统开始破解自然语言的代码。ULMFiT 是目前已知最准确的情感分析算法。

ULMFiT概述

基本步骤如下:

  1. 创建(或,最好是下载预训练的)在大型语料库(如维基百科)上训练的语言模型(“语言模型”是指任何学习预测句子中下一个单词的模型)。
  2. 使用你的目标语料库(在本例中是 IMDb 电影评论)对该语言模型进行微调。
  3. 移除微调后的语言模型中的编码器,并用一个分类器替换它。然后对该模型进行微调,以完成最终的分类任务(在本例中是情感分析)。

在我们探索自然语言处理之后,我们将通过涵盖表格数据(如电子表格和数据库表)和协同过滤(推荐系统)来完成程序员实用深度学习中的实践应用部分。

对于表格数据,我们将看到如何使用分类变量和连续变量,以及如何使用 fastai.tabular 模块来设置和训练模型。

然后我们将看到如何使用与处理表格数据类似的思路构建协同过滤模型,但会使用一些特殊的技巧来获得更高的准确性和更具信息性的模型解释。

至此,我们已经完成了课程的前半部分,回顾了如何在以下关键应用领域构建和解释模型:

  • 计算机视觉
  • 自然语言处理
  • 表格数据
  • 协同过滤

在课程的后半部分,我们将学习这些模型是如何真正工作的,以及如何从头开始创建它们。在本节课中,我们将整合之前接触过的一些关键部分:

  • 激活
  • 参数
  • 层(仿射层和非线性层)
  • 损失函数。

在接下来的课程中,我们将更详细地回顾这些内容。我们还将学习对自然语言处理、协同过滤和表格模型很重要的一种层:嵌入层。我们将发现,“嵌入”只是针对特定类型的矩阵乘法(与独热编码矩阵相乘)的计算捷径。

第5课:反向传播;加速SGD;从头开始实现神经网络

在第5课中,我们将把训练的所有部分组合起来,以确切理解我们讨论反向传播时发生了什么。我们将利用这些知识从头创建并训练一个简单的神经网络。

从头实现的神经网络

我们还会看到如何查看嵌入层中的权重,以找出我们的模型对分类变量学到了什么。这将让我们了解哪些电影我们应该不惜一切代价避免观看…

解释电影评论嵌入

尽管嵌入在自然语言处理中的词嵌入方面最为人熟知,但对于一般分类变量(例如表格数据或协同过滤)来说,它们至少同样重要。它们甚至可以与非神经网络模型结合使用并取得巨大成功。

常见模型使用嵌入和不使用嵌入的性能比较

第6课:正则化;卷积;数据伦理

今天我们将讨论一些提高训练效率和避免过拟合的强大技术:

  • Dropout:在训练期间随机删除激活,以对模型进行正则化。
  • 数据增强:在训练期间修改模型输入,以有效增加数据量。
  • 批归一化:调整模型的参数化,使损失曲面更平滑。

单一图像的数据增强示例

接下来,我们将学习关于卷积的一切,卷积可以被视为一种权重共享的矩阵乘法变体,是现代计算机视觉模型(以及越来越多地,其他类型模型)的核心操作。

我们将利用这些知识创建类别激活图,这是一种热力图,显示图像的哪些部分对预测最重要。

卷积的工作原理

最后,我们将涵盖许多学生告诉我们是课程中最有趣和最令人惊讶的部分:数据伦理。我们将学习模型可能出错的一些方式,特别关注反馈循环,为什么它们会引起问题,以及如何避免它们。我们还将研究数据中的偏见如何导致有偏见的算法,并讨论数据科学家能够且应该提出的问题,以确保他们的工作不会导致意想不到的负面结果。

美国司法系统中算法偏见的例子

第7课:从头开始实现Resnet;U-net;生成对抗网络

在《程序员实用深度学习》的最后一课,我们将学习现代架构中最重要的一项技术:跳跃连接。这项技术最著名的应用是在 resnet 中,这也是我们在整个课程中用于图像分类的架构,并出现在许多前沿研究成果中。我们还将探讨 U-net 架构,它使用不同类型的跳跃连接极大地提高了分割结果(也适用于输出结构与输入类似的类似任务)。

Resnet跳跃连接对损失曲面的影响

然后我们将使用 U-net 架构来训练一个超分辨率模型。这是一个可以提高低质量图像分辨率的模型。我们的模型不仅会提高分辨率,还会去除 jpeg 伪影和不需要的文字水印。

为了让我们的模型产生高质量的结果,我们需要创建一个自定义的损失函数,该函数包含特征损失(也称为感知损失)以及格拉姆损失。这些技术可用于许多其他类型的图像生成任务,例如图像着色。

使用特征损失和格拉姆损失的超分辨率结果

我们将学习一种最近的损失函数,称为生成对抗损失(在生成对抗网络,即 GANs 中使用),在某些情况下可以提高生成模型的质量,代价是速度较慢。

我们在本课中展示的技术包括一些尚未发表的研究成果,它们:

  • 通过利用迁移学习,使我们能够比标准方法更快、更可靠地训练 GAN。
  • 结合了以前从未以这种方式使用过的架构创新和损失函数方法。

结果令人惊叹,训练时间仅需几个小时(而之前的方法需要几天)。

循环神经网络

最后,我们将学习如何从头开始创建循环神经网络(RNN)。这是我们在整个课程中用于自然语言处理的模型的基础,事实证明它们只是一个普通多层网络的简单重构。

感谢阅读!如果你已经读到这里,那么你可能应该前往course.fast.ai并开始观看第一个视频了!