.. _deep-learning: ========================== MegEngine 深度学习入门教程 ========================== .. admonition:: 适用人群 & 前置知识要求 :class: note 本套教程适合那些对于深度学习基本概念和流程不太了解的初学者,强调通过实践加深对理论的理解。 借助一系列的代码实战,你将循序渐进地熟悉这个领域,并掌握 MegEngine 框架的基本使用。 在阅读本套教程前,你需要具备一定的 Python 基础,了解最基本的大学工科数学知识。 .. toctree:: :maxdepth: 1 :hidden: megengine-basics linear-regression linear-classification neural-network convolutional-neural-network model-development-basic 内容安排与组织 -------------- 这套 MegEngine 深度学习入门教程由多个章节组成: .. list-table:: :header-rows: 1 :widths: 20 40 40 * - 核心主题 - 知识点 - 编程练习 * - :ref:`框架基础使用 ` - :class:`~.Tensor` / :mod:`~.functional` / :mod:`~.autodiff` / :mod:`~.optimizer` / 计算图 / 损失函数... - 基于随机数据拟合一条直线 * - :ref:`线性回归 ` - 机器学习概念与流程 / MiniBatch 梯度下降 / 准备 :class:`~.DataLoader` / 评估指标... - 预测 California 房价 * - :ref:`线性分类 ` - 计算机视觉图像编码 / :mod:`.data.dataset` / 特征处理 / Softmax / Cross Entropy / ... - MNIST 手写数字分类 * - :ref:`神经网络 ` - 非线性激活函数 / 全连接神经网络 / 随机初始化 / 使用 :mod:`~.module` / 深度学习调参... - Fashion-MNIST 服饰分类 * - :ref:`卷积神经网络 ` - RGB 三通道彩色图片 / 卷积运算... - CIFAR-10 彩色图片分类 * - :ref:`模型开发技巧 ` - 模型保存与加载 / 使用预训练模型 / ResNet / 模型开发常见 Tricks ... - 阅读和运行 Models 代码 每个章节中将专注于向你解释一定的概念、示范相应的代码, 并且在章节末会提供一个综合性的编程实践任务,以帮助你将当前章节中提到的概念串联起来。 一些章节的末尾会提供拓展材料,这些内容不是必须掌握的, 但很有挑战性,不妨试试看,完成后会有更加深刻的理解 (你也可以选择跳过这些部分)。 不同章节之间的内容是循序渐进安排的,当前章节的任务不会依赖于后续章节中的知识点, 但为了巩固理解,可能会刻意地与前面章节中出现的内容进行对比,在回忆的同时引发更多的思考, 因此要求读者顺序阅读,并花一些时间进行消化理解。 否则的话,当我们提及曾经出现过的概念时,你可能会不知所措。 .. dropdown:: :fa:`question,mr-1` 你还会看到一些折叠性质的内容 在解释某些概念时,教程中会以可折叠的样式来提供一些补充材料,默认不会展开。 这些材料就像是书籍中会出现的旁注或者脚注,可能是人物传记、历史背景等等性质的内容, 意在作为拓展解释,但不是必须完全掌握的细节(毕竟我偶尔也想插入一些冷笑话)。 .. dropdown:: :fa:`eye,mr-1` MegEngine 深度学习入门教程不会涉及到的内容 从 MLOps 的角度来看,本套教程仅仅向你介绍了如何在最基本的情景下使用 MegEngine 进行模型开发: * 数据的采集和标注也充满学问,本教程中使用的都是公开可获取的数据集,因此不会提及上述流程。 * 实践完所有教程后,你会对如何得到一个预训练好的 ResNet 模型有基本的了解, 至此可被称为是一名刚刚入门的 “人工智能模型训练师(炼丹师傅)” 了。 但要想让我们的模型发挥作用,还需要了解如何 *将模型部署到实际的生产环境中进行高效推理。* 这时需要关注更多地是性能以及业务需求。 * 另外,这套教程仅仅会告诉你如何把 “训练模型” 这件事做对(跑起来), 把事情做好则是下一个阶段的目标。 你会接触到 MegEngine 的一些高级功能概念,比如分布式训练、量化、混合精度等等... MegEngine 是一个训推一体、动静结合、灵活高效的框架,届时你会发现它的真正魅力。 这套教程使用了常见的计算机视觉任务作为实践。 其实 MegEngine 还可以用来解决自然语言处理、音频、强化学习等领域的任务, 但这些任务的数据没有那么直观,因此在入门教程中不会引入这些领域知识。 强调一下,这套教程的核心是帮助用户学习 MegEngine, 在这个过程中, 会尽可能地让读者意识到:“为什么我们需要借助深度学习框架来完成这些任务? 它代替用户完成了什么步骤?” 理解设计初衷,可以帮助你成为更好的 MegEnginer, 从而写出更加规范、高效的代码。除了解释 What is... 和 How to ... 以外,理解 Why ... 也很重要。 这套教程还将培养你查询和阅读官方文档的好习惯,权威性很重要。 一些问题可能会在非官方的问答论坛或博客中得到解答,但其对原理和机制的解释可能有误。 与其它材料对比 -------------- 这套教程的内容组织很大程度上参考了 Stanford 大学的 CS229, CS230, CS231n 等课程的讲义材料, 但与这些材料相比又有很大的不同。例如 CS229 是一门机器学习课程, 本套教程中使用了其中广义线性模型的讲解思路,却不关注数学推导的细节与概率解释。 这是因为 MegEngine 作为一个深度学习框架,其自动求导机制可以帮助用户专注于网络结构设计, 因此很难再遇到需要手推反向传播过程的情况(至少初学者不会因此而被劝退)。 这并不是说数学并不重要,只是在初学阶段,亲自动手实践建立直觉上的理解会更关键, 想要直接从高度抽象凝练的段落中学习和吸收知识,可能会比较困难; 可如果我们亲手去编码、去调试,就能够更快地掌握这些概念。 我们会使用与 CS229 中不完全一致的数学符号(文末有参考表),以便于在实践时更容易写出形式相似的代码。 CS 229 中的其它机器学习模型与算法也可以使用 MegEngine 实现,但我们仅仅关注线性模型部分。 从 Logistic 回归后,我们开始过渡到神经网络模型,这一部分的叙述灵感来自于 CS230. 但我们在教程中会非常早地提到 Mini-batch 梯度下降与向量化的相关概念,并提供相关实践; 因此在演示完单样本的计算逻辑后,后续的代码都会直接展示 Mini-batch 写法。 本套教程中选择以多个计算机视觉任务作为主线,每次编码就好像打怪升级进入下一个关卡。 选用了 MNIST、Fashion-MNIST 和 CIFAR10 等经典数据集作为练习,难度都是递增的。 我们在教程中简单介绍了一些计算机视觉知识,在 CS231n 和一些传统计算机视觉教材中会有更详细的解释。 希望这套 MegEngine 教程能够帮助你在学习 MegEngine 使用的同时,培养对深度学习知识的直觉理解, 最关键的是:建立信心。这样你在将来阅读更多理论性的材料时,能够及时地将这些概念附着在有形的基础之上。 .. seealso:: 如果你对机器学习理论比较感兴趣,一个比较好的阅读材料是由 `Kevin Patrick Murphy `_ 撰写的 《 `Probabilistic Machine Learning: An Introduction `_ 》, 在完成本教程的学习后,读者能够自然地衔接到该书第一部分的简介内容。 书中有比较多现代机器学习主流内容的介绍,且提供了代码示例。 请保持质疑与宽容 ---------------- .. admonition:: 出现在教程中的代码未必代表最佳实践 :class: warning 我们在组织 MegEngine 教程时,尽可能以教学为主要目的来提供相关内容。 出于易于理解的目的,一些演示代码的写法并不靠近实际工程生产中的最佳实践,甚至有可能是不推荐用法。 当经历过初学者阶段后,可以在 :ref:`user-guide` 中或 :ref:`megengine-reference` 中寻找最佳实践。 开源社区也是我们学习 MegEngine 用法的好地方,推荐几个 MegEngine 官方维护项目: * `Models `_: 采用 MegEngine 实现的各种主流深度学习模型; * `Awesome MegEngine `_: 官方收录的 MegEngine 有关项目。 .. note:: 如果你发现文档中有含义模糊不清的内容,请第一时间向 MegEngine 团队进行反馈。 在我们上大学后,会发现曾经在高中学习过的一些理论知识可能 “并不是那么正确”,接着构筑新的认知。 MegEngine 中的教程也一样,它仅仅代表着这些内容是作者认为的,当前阶段最容易被读者接受的认知形式。 事物的发展是呈螺旋上升的,你可能会在其它地方看到对同一事物的不同论述,有时相似,有时相悖。 因此读者需认识到这套教程的意义仅仅在于帮助初学者入门,不代表着永恒客观的真理。 你甚至会在一些教程中看到我们故意地先给出 “错误” 用法,再给出正确做法 —— 这并不意味着对于前一个教程阶段的学习者,“错误” 的东西就不应该被学习。 这些都是旅途上的好风景,抵达终点后,除了寻找下一个目标,也最好回头看看。 当我们学会使用更加高级的工具来表达和交流理论知识时,请勿觉得入门材料表达的过于浅显。 此时它们不再是为你而准备的,你应当寻找更加适合你这个阶段的材料进行研究和学习。 人们经常因为 “知识的诅咒” 而犯下错误,觉得高级的、抽象的就是更好的,事实上往往因人而异。 我们希望每个 MegEngine 只需要学习一次教程中的内容,在后续的日常使用中, 不再会需要去看长篇累牍的解释,只需要查阅 :ref:`user-guide` 和 :ref:`megengine-reference` 即可。 这套教程可能需要花大量时间去打磨和验证,如果你觉得你有更好的想法,欢迎提出。 数学符号参照表 -------------- .. list-table:: :header-rows: 1 * - 符号举例 - 含义 - 数学索引形式 - 编程索引形式 * - :math:`x \in \mathbb{R}` - 标量 - / - / * - :math:`\boldsymbol{x} \in \mathbb{R}^{n}` - n 维向量 - :math:`{x}_{i}` - ``x[i]`` * - :math:`X \in \mathbb{R}^{m\times n}` - m 行 n 列矩阵 - :math:`{x}_{i,j}` - ``x[i][j]`` * - :math:`\mathsf{X} \in \mathbb{R}^{r \times g \times b}` - 3 维张量 - :math:`{x}_{i,j,k}` - ``x[i][j][k]`` 注意:在使用数学描述时,索引从 1 开始;在使用编程描述时,索引从 0 开始。