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 教程时,尽可能以教学为主要目的来提供相关内容。 出于易于理解的目的,一些演示代码的写法并不靠近实际工程生产中的最佳实践,甚至有可能是不推荐用法。 当经历过初学者阶段后,可以在 用户指南 中或 megengine-reference 中寻找最佳实践。

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

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

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

备注

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

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

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

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

数学符号参照表#

符号举例

含义

数学索引形式

编程索引形式

\(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 开始。