推出程序员前沿深度学习:2018版

课程
作者

Jeremy Howard

发布日期

2018年5月7日

关于课程

今天我们发布了2018版 程序员前沿深度学习,这是 fast.ai 免费深度学习课程的第二部分。就像我们的第一部分 程序员实用深度学习 一样,除了高中数学和一年编程经验之外,没有其他先决条件——我们会沿途教授你需要的所有其他知识。本课程包含所有新材料,包括自然语言处理分类领域新的最先进成果(比先前已知方法提高多达20%),并展示了如何在 Imagenet 和 CIFAR10 上复现最近 打破记录的性能 结果。主要使用的库是 PyTorch 和 fastai(我们在这篇文章中解释了我们为什么使用 PyTorch 以及为什么创建了 fastai 库)。

七节课中的每一节都包括一个大约两小时长的视频、一个交互式 Jupyter notebook 以及在 fast.ai 论坛上的一个专用讨论帖。课程涵盖了许多主题,包括:使用 SSD 和 YOLOv3 进行多目标检测;如何阅读学术论文;使用自定义头部定制预训练模型;更复杂的数据增强(用于坐标变量、逐像素分类等);自然语言处理迁移学习;使用新的 fastai.text 库处理非常大的(十亿+ token)文本语料库;运行和解释消融研究;最先进的自然语言处理分类;多模态学习;多任务学习;用于 seq2seq 的带注意力机制的双向 LSTM;神经机器翻译;定制 ResNet 架构;GANs、WGAN 和 CycleGAN;数据伦理;超分辨率;使用 U-Net 进行图像分割。

Jeremy 介绍目标检测

课程内容

第8课

第8课首先快速回顾了我们在第一部分学到的知识,并介绍了本课程这一部分的新重点:前沿研究。我们讨论了如何阅读论文,以及构建自己的深度学习盒子来运行实验所需的条件。即使你以前从未阅读过学术论文,我们也会教你一种方法,让你不会被符号和写作风格所淹没。这一部分的另一个不同之处在于,我们将深入研究 fastai 和 PyTorch 库的源代码:在本课中,我们将向你展示如何快速浏览代码并建立对代码的理解。我们还将了解如何使用 Python 的调试器来加深你对正在发生的事情的理解,以及如何修复错误。

本课的主要主题是目标检测,这意味着让模型在图像中的每个关键对象周围绘制一个框,并正确标记每一个。你可能会惊讶地发现,我们可以使用从未训练过检测的 Imagenet 分类器的迁移学习!主要有两个任务:找到并定位对象,然后对其进行分类;我们将使用一个单一模型同时完成这两个任务。这种多任务学习通常比为每个任务创建不同的模型效果更好——这让许多人觉得相当反直觉。为了在利用预训练模型的同时创建这个自定义网络,我们将使用 fastai 灵活的自定义头部架构。

第9课

在本课中,我们将从单目标检测转向多目标检测。事实证明,这个微小的差异使得事情变得更具挑战性。事实上,大多数学生认为这是整个课程中最具挑战性的一课。并不是因为任何一个部分本身高度复杂,而是因为有很多部分,所以它真正考验了你对我们目前所学基础知识的理解。所以,如果第一次看时许多细节不清楚,请不要担心——在你完成其余课程的过程中,不时回顾本课,你会发现它越来越有意义!

我们的重点是单发多框检测器 (SSD) 以及相关的 YOLOv3 检测器。这些是处理多目标检测的方法,通过使用一个损失函数来结合来自多个对象的定位和分类损失。它们还使用一种自定义架构,该架构利用了 CNN 不同层的不同感受野。我们还将了解在这种因变量也需要增强的情况下如何处理数据增强。最后,我们讨论了一个简单但强大的技巧,称为Focal Loss,它被用于在该领域获得最先进的结果。

锚框示例,多目标检测的关键

第10课

在回顾了我们学到的目标检测知识后,第10课我们进入自然语言处理,首先介绍新的 fastai.text 库。这是 torchtext 的替代品,在许多情况下更快更灵活。这节课的很多内容你会非常熟悉——我们涵盖了与第4课很多相同的基础。但本课将向你展示如何通过使用自然语言处理迁移学习来获得更准确的结果。

迁移学习彻底改变了计算机视觉领域,但到目前为止,它在自然语言处理领域的影响力还不大(在某种程度上甚至被简单地忽略了)。在本课中,我们将展示如何通过预训练一个完整的语言模型来大大超越基于简单词向量的先前方法。我们将使用这个语言模型来展示文本分类领域新的最先进结果。

如何完成和理解消融研究

第11课

在第11课中,我们将学习如何将法语翻译成英语!为此,我们将学习如何向 LSTM 添加注意力机制以构建一个序列到序列 (seq2seq) 模型。但在开始之前,我们将回顾一些关键的 RNN 基础知识,因为对这些基础知识的扎实理解对于理解本课的其余部分至关重要。

Seq2seq 模型是一种输入输出都是序列的模型,并且它们的长度可以不同。翻译是一个很好的 seq2seq 任务示例。因为每个翻译的词可以对应于源句子中任意位置的一个或多个词,所以我们学习一个注意力机制来确定在每个时间步应该关注哪些词。我们还将学习一些其他提高 seq2seq 结果的技巧,包括教师强制 (teacher forcing)双向模型

本课结束时,我们将讨论精彩的 DeVISE 论文,该论文展示了我们如何在同一个模型中同时使用文本和图像,从而弥合文本和图像之间的鸿沟!

一个简单的序列到序列 (seq2seq) 模型

第12课

本课开始时,我们将深入探讨 YOLOv3 中使用的 DarkNet 架构,并利用它更好地理解在实现类 ResNet 架构时可以做的所有细节和选择。这里讨论的基本方法正是我们赢得 DAWNBench 竞赛所用的方法!

然后我们将学习生成对抗网络 (GANs)。本质上,这是一种不同类型的损失函数。GANs 有一个相互对抗的生成器判别器,在此过程中它们结合起来创建一个生成模型,能够生成高度逼真的输出。我们将研究 Wasserstein GAN 变体,因为它更容易训练,并且对一系列超参数具有更强的鲁棒性。

CycleGAN 论文

第13课

在第13课的开始,我们将介绍CycleGAN,这是 GANs 领域的一个突破性想法,它允许我们在没有直接(成对)训练数据的情况下生成图像。我们将用它来将马变成斑马,反之亦然;这可能不是你现在需要的应用……但其基本思想很可能适用于各种非常有价值的应用。我们的一名学生已经在使用它来创造一种新的视觉艺术形式。

但生成模型(以及我们讨论的许多其他技术)既可以造福社会,也同样容易造成伤害。因此,我们花了一些时间讨论数据伦理。这是一个真正值得单独开一门完整课程的主题;虽然我们无法在有限的时间内深入讨论所有细节,但希望你能对一些关键问题有所了解,并知道在哪里可以学到更多。

本课结束时,我们考察了风格迁移,这是一个有趣的方法,它允许我们以我们喜欢的任何方式改变图像的风格。这种方法需要我们优化像素而不是权重,这是一种看待优化的有趣的不同方式。

偏见是当前数据伦理中的一个重要主题

第14课

在最后一课中,我们将深入探讨超分辨率,这是一种惊人的技术,它基于卷积神经网络,能够恢复图像中的高分辨率细节。在此过程中,我们将了解一些用于更快、更可靠地训练生成卷积网络的现代技术。

最后,我们来看一下图像分割,特别是使用U-Net 架构,这是一种最先进的技术,赢得了许多 Kaggle 竞赛,并在工业界广泛使用。图像分割模型允许我们精确地对图像的每个部分进行分类,精确到像素级别。

对象分割示例