MegEngine 深度学习入门教程

适用人群 & 前置知识要求

本套教程适合那些对于深度学习基本概念和流程不太了解的初学者,强调通过实践加深对理论的理解。 借助一系列的代码实战,你将循序渐进地熟悉这个领域,并掌握 MegEngine 框架的基本使用。 在阅读本套教程前,你需要具备一定的 Python 基础,了解最基本的大学工科数学知识。

内容安排与组织

这套 MegEngine 深度学习入门教程由多个章节组成:

核心主题

知识点

编程练习

框架基础使用

Tensor / functional / autodiff / optimizer / 计算图 / 损失函数…

基于随机数据拟合一条直线

线性回归

机器学习概念与流程 / MiniBatch 梯度下降 / 准备 DataLoader / 评估指标…

预测 California 房价

线性分类

计算机视觉图像编码 / data.dataset / 特征处理 / Softmax / Cross Entropy / …

MNIST 手写数字分类

神经网络

非线性激活函数 / 全连接神经网络 / 随机初始化 / 使用 module / 深度学习调参…

Fashion-MNIST 服饰分类

卷积神经网络

RGB 三通道彩色图片 / 卷积运算…

CIFAR-10 彩色图片分类

模型开发技巧

模型保存与加载 / 使用预训练模型 / ResNet / 模型开发常见 Tricks …

阅读和运行 Models 代码

每个章节中将专注于向你解释一定的概念、示范相应的代码, 并且在章节末会提供一个综合性的编程实践任务,以帮助你将当前章节中提到的概念串联起来。 一些章节的末尾会提供拓展材料,这些内容不是必须掌握的, 但很有挑战性,不妨试试看,完成后会有更加深刻的理解 (你也可以选择跳过这些部分)。

不同章节之间的内容是循序渐进安排的,当前章节的任务不会依赖于后续章节中的知识点, 但为了巩固理解,可能会刻意地与前面章节中出现的内容进行对比,在回忆的同时引发更多的思考, 因此要求读者顺序阅读,并花一些时间进行消化理解。 否则的话,当我们提及曾经出现过的概念时,你可能会不知所措。

与其它材料对比

这套教程的内容组织很大程度上参考了 Stanford 大学的 CS229, CS230, CS231n 等课程的讲义材料, 但与这些材料相比又有很大的不同。例如 CS229 是一门机器学习课程, 本套教程中使用了其中广义线性模型的讲解思路,却不关注数学推导的细节与概率解释。 这是因为 MegEngine 作为一个深度学习框架,其自动求导机制可以帮助用户专注于网络结构设计, 因此很难再遇到需要手推反向传播过程的情况(至少初学者不会因此而被劝退)。 这并不是说数学并不重要,只是在初学阶段,亲自动手实践建立直觉上的理解会更关键, 想要直接从高度抽象凝练的段落中学习和吸收知识,可能会比较困难; 可如果我们亲手去编码、去调试,就能够更快地掌握这些概念。

我们会使用与 CS229 中不完全一致的数学符号(文末有参考表),以便于在实践时更容易写出形式相似的代码。

CS 229 中的其它机器学习模型与算法也可以使用 MegEngine 实现,但我们仅仅关注线性模型部分。 从 Logistic 回归后,我们开始过渡到神经网络模型,这一部分的叙述灵感来自于 CS230. 但我们在教程中会非常早地提到 Mini-batch 梯度下降与向量化的相关概念,并提供相关实践; 因此在演示完单样本的计算逻辑后,后续的代码都会直接展示 Mini-batch 写法。 本套教程中选择以多个计算机视觉任务作为主线,每次编码就好像打怪升级进入下一个关卡。 选用了 MNIST、Fashion-MNIST 和 CIFAR10 等经典数据集作为练习,难度都是递增的。 我们在教程中简单介绍了一些计算机视觉知识,在 CS231n 和一些传统计算机视觉教材中会有更详细的解释。

希望这套 MegEngine 教程能够帮助你在学习 MegEngine 使用的同时,培养对深度学习知识的直觉理解, 最关键的是:建立信心。这样你在将来阅读更多理论性的材料时,能够及时地将这些概念附着在有形的基础之上。

参见

如果你对机器学习理论比较感兴趣,一个比较好的阅读材料是由 Kevin Patrick Murphy 撰写的 《 Probabilistic Machine Learning: An Introduction 》, 在完成本教程的学习后,读者能够自然地衔接到该书第一部分的简介内容。 书中有比较多现代机器学习主流内容的介绍,且提供了代码示例。

请保持质疑与宽容

出现在教程中的代码未必代表最佳实践

我们在组织 MegEngine 教程时,尽可能以教学为主要目的来提供相关内容。 出于易于理解的目的,一些演示代码的写法并不靠近实际工程生产中的最佳实践,甚至有可能是不推荐用法。 当经历过初学者阶段后,可以在 用户指南 中或 API 参考 中寻找最佳实践。

开源社区也是我们学习 MegEngine 用法的好地方,推荐几个 MegEngine 官方维护项目:

  • Models: 采用 MegEngine 实现的各种主流深度学习模型;

  • Awesome MegEngine: 官方收录的 MegEngine 有关项目。

注解

如果你发现文档中有含义模糊不清的内容,请第一时间向 MegEngine 团队进行反馈。

在我们上大学后,会发现曾经在高中学习过的一些理论知识可能 “并不是那么正确”,接着构筑新的认知。 MegEngine 中的教程也一样,它仅仅代表着这些内容是作者认为的,当前阶段最容易被读者接受的认知形式。 事物的发展是呈螺旋上升的,你可能会在其它地方看到对同一事物的不同论述,有时相似,有时相悖。 因此读者需认识到这套教程的意义仅仅在于帮助初学者入门,不代表着永恒客观的真理。 你甚至会在一些教程中看到我们故意地先给出 “错误” 用法,再给出正确做法 —— 这并不意味着对于前一个教程阶段的学习者,“错误” 的东西就不应该被学习。 这些都是旅途上的好风景,抵达终点后,除了寻找下一个目标,也最好回头看看。

当我们学会使用更加高级的工具来表达和交流理论知识时,请勿觉得入门材料表达的过于浅显。 此时它们不再是为你而准备的,你应当寻找更加适合你这个阶段的材料进行研究和学习。 人们经常因为 “知识的诅咒” 而犯下错误,觉得高级的、抽象的就是更好的,事实上往往因人而异。 我们希望每个 MegEngine 只需要学习一次教程中的内容,在后续的日常使用中, 不再会需要去看长篇累牍的解释,只需要查阅 用户指南API 参考 即可。

这套教程可能需要花大量时间去打磨和验证,如果你觉得你有更好的想法,欢迎提出。

数学符号参照表

符号举例

含义

数学索引形式

编程索引形式

\(x \in \mathbb{R}\)

标量

/

/

\(\boldsymbol{x} \in \mathbb{R}^{n}\)

n 维向量

\({x}_{i}\)

x[i]

\(X \in \mathbb{R}^{m\times n}\)

m 行 n 列矩阵

\({x}_{i,j}\)

x[i][j]

\(\mathsf{X} \in \mathbb{R}^{r \times g \times b}\)

3 维张量

\({x}_{i,j,k}\)

x[i][j][k]

注意:在使用数学描述时,索引从 1 开始;在使用编程描述时,索引从 0 开始。