当前位置: 首页 > news >正文

知识蒸馏(Knowledge Distillation)

Distilling the Knowledge in a Neural Network

知识蒸馏原理

1、Summarize

知识蒸馏技术 通过从大型的教师模型向小型的学生模型转移知识来实现模型压缩和优化。

知识蒸馏的核心思想是 利用教师模型在大量数据上积累的丰富知识,通过特定的蒸馏算法,使学生模型能够学习并吸收这些知识,从而达到与教师模型相似的性能。

这个过程能够显著减少模型的复杂度和计算开销,同时尽可能保留较大模型的性能。

知识蒸馏通常应用于那些结构复杂的神经网络模型上,这些模型具有众多层次和大量参数,被当作教师模型来使用。如下图所示,在知识蒸馏过程中,一个小的“学生”模型通过模仿大的“教师”模型,学习和吸收教师模型中的知识,从而获得与教师模型相似甚至更高的准确度。

在这里插入图片描述

知识蒸馏系统通常由三部分组成,分别是 知识(Knowledge)蒸馏算法(Distillation algorithm)师生架构(Teacher-student architecture)

  • 知识部分指的是从教师模型中提取的有价值的信息,可以是输出的 logits(未归一化概率)、中间层的特征表示或者模型参数等。
  • 蒸馏算法是用于将教师模型的知识传递给学生模型的具体方法和技术,确保学生模型能够有效学习和吸收这些知识。
  • 师生架构则是指教师模型和学生模型的设计和配置方式,包括它们之间的交互模式和训练过程。通过这三部分的协同工作,知识蒸馏系统能够实现从大模型向小模型的高效知识传递。

2、Type of knowledge

大型神经网络中的知识来源非常丰富,不仅仅局限于模型在训练过程中学习到的权重(weights)和偏置(biases),还包括其他多种形式的信息。

知识的类型可以分为四类,主要有 Response-based、Feature-based、Relation-based 三种,另外还有一种较少提及的类型,即 Architecture-based 的知识。

在这里插入图片描述

(1)response-based knowledge

基于响应的知识通常是指教师模型的输出,例如分类任务中通过 softmax 函数处理后输出的类型概率分布(软标签)。这种方法利用教师模型对输入数据的预测结果来帮助学生模型学习,从而提高其性能。

当知识蒸馏对这部分知识进行转移时,学生模型直接学习教师模型的最终输出,以使学生模型获得与教师模型一样的预测性能。

在这里插入图片描述

通俗的说法就是老师充分学习知识后,直接将结论告诉学生。

这种方法简单而高效,适用于各种学习任务,包括普通的监督学习、涉及不同领域和模态的学习任务,以及一些特殊情况下的学习场景,如多模型学习、自监督学习。另外,基于响应的知识蒸馏与其他知识蒸馏方法的组合十分灵活,并且无需额外的设计,进一步提高了其适用性和实用性。

(2)feature-based knowledge

上面一种方法学习目标非常直接,学生模型直接学习教师模型的最后预测结果,然而输出层提供的信息是有限的。在神经网络中,数据通过多个层次的神经元进行传递和处理,每一层都可以看作是对数据的一种特征提取和变换。

随着网络的深度增加,每一层提取的特征都越来越抽象和高级,可以捕捉到数据中更加复杂和抽象的模式和结构。考虑到神经网络擅长学习不同抽象级别的多层特征表示,因此模型中间层的输出,即特征图,也可以作为指导学生模型学习的知识。

在这里插入图片描述

虽然基于特征的知识转移为学生模型的学习提供了更多信息,但由于学生模型和教师模型的结构不一定相同,如何从教师模型中选择哪一层网络(提示层),从学生模型中选择哪一层(引导层)模仿教师模型的特征,是一个需要探究的问题。

另外,当提示层和引导层大小存在差异时,如何正确匹配教师与学生的特征表示也需要进一步探究。

(3)relation-based knowledge

上述两种方法都使用了教师模型中特定网络层中特征的输出,而基于关系的知识进一步探索了各网络层输出之间的关系或样本之间的关系。基于关系的知识蒸馏认为,知识的不仅仅是特征输出结果,而且还是网络层与层之间以及样本数据之间的关系。

其重点在于提供一个一致的关系映射,使得学生模型能够更好地学习教师模型中的关系知识。例如将教师模型中某两层特征图的 Gram 矩阵(网络层输出之间的关系)作为知识,或者将数据样本之间的关系表示为数据样本在教师模型中的特征表征的概率分布,将这种概率分布(数据样本间的关系)作为知识供学生模型学习。

在这里插入图片描述

基于网络层的关系蒸馏只关注每个样本在不同网络层之间的关系知识,而忽略了同样存在于教师模型的空间结构中不同样本之间的关系信息。基于样本间关系的特征知识蒸馏正是利用了这种知识,将教师模型中捕捉到的样本间关系信息传递到学生模型中。

3、Distillation method

类似于人类教师和学生之间的学习模式,神经网络的知识蒸馏在学习方式上也有多种模式,一般分为三种:离线蒸馏(offline distillation),在线蒸馏(online distillation)以及自蒸馏(self-distillation)。

在这里插入图片描述

(1)offline distillation

在离线蒸馏中, 教师模型在学生模型训练之前已经完成训练 ,并且其参数在整个蒸馏过程中保持不变。这种方法是大部分知识蒸馏算法采用的方法,主要包含三个过程:

  1. 蒸馏前教师模型预训练:首先,教师模型在大规模数据集上进行训练,达到理想的性能水平。这个过程通常耗时较长且需要大量计算资源;
  2. 知识提取:将教师模型的知识提取出来,通常以教师模型对训练数据的输出(如概率分布或特征表示)的形式表示;
  3. 学生模型的训练:在学生模型的训练过程中,使用教师模型的输出作为指导。学生模型通过一个额外的蒸馏损失函数,学习如何模拟教师模型的输出。常见的蒸馏损失函数包括交叉熵损失和均方误差损失。

该方法主要侧重于知识迁移部分,教师模型通常参数量大,一些庞大复杂模型会通过这种方式得到较小模型,比如 BERT 通过蒸馏学习得到 tinyBERT。

它的主要优点在于能灵活选择预训练好的大型模型作教师,在蒸馏过程中教师模型不需要参数更新,而只需要关注学生模型的学习,这使得训练过程的部署简单可控,大大减少了知识蒸馏的资源消耗和成本,但这种方法的缺点是学生模型非常依赖教师模型。

(2)online distillation

在线知识蒸馏中, 教师模型和学生模型在同一训练过程中共同学习。教师模型不再是预先训练好的,而是与学生模型同步更新,教师模型和学生模型相互影响,共同提升性能,相互学习和调整。这种协同学习使得教师模型和学生模型可以动态适应数据变化和任务需求。

在线知识蒸馏能够在没有预训练模型的情况下,针对不同任务实现知识学习和蒸馏,有助于多个模型在学习过程中互相调整和更新学到的知识,实现优势互补。特别是对于多任务学习等特殊场景,具有很大优势。相比于模型压缩,在线学习更适合于知识融合以及多模态、跨领域等场景。然而训练过程中,增加的模型数量可能会导致计算资源的消耗增加。

(3)self-distillation

自蒸馏是一种比较特殊的知识蒸馏模式,可以看作是的一种特例,即教师模型和学生模型采用相同的网络模型的在线蒸馏。自蒸馏过程中, 学生模型从自身的输出中进行学习,这意味着学生模型将深层的信息传递给浅层,以指导自身的训练过程,而无需依赖外部的教师模型 。用学习过程比喻,离线蒸馏是知识渊博的老师向学生传授知识;在线蒸馏是老师和学生一起学习、共同进步;自蒸馏是学生自学成才。

自蒸馏的提出主要是为了解决传统两阶段蒸馏方法的一些问题。传统方法需要预先训练大型教师模型,这会消耗大量的时间和计算资源。而且,教师模型和学生模型之间可能存在能力不匹配的问题,导致学生无法有效地学习教师模型的表征。

自蒸馏方法克服了这些问题,它不需要依赖教师模型进行指导,而是通过学生模型自身的输出来提升性能。这种方法使得学生模型能够在没有外部指导的情况下自我提升,并且可以更加高效地进行模型训练。

4、Hard-target & Soft-target

传统的神经网络训练方法是定义一个损失函数,目标是使预测值尽可能接近于真实值(Hard- target),损失函数就是使神经网络的损失值和尽可能小。这种训练过程是对ground truth求极大似然。在知识蒸馏中,是使用大模型的类别概率作为Soft-target的训练过程。

在这里插入图片描述

如在MNIST数据集中做手写体数字识别任务,假设某个输入的“2”更加形似"3",softmax的输出值中"3"对应的概率会比其他负标签类别高;而另一个"2"更加形似"7",则这个样本分配给"7"对应的概率会比其他负标签类别高。这两个"2"对应的Hard-target的值是相同的,但是它们的Soft-target却是不同的,由此我们可见Soft-target蕴含着比Hard-target更多的信息。

在这里插入图片描述

使用软标签就是修改了softmax函数,增加温度系数T;

q i = e x p ( z i / T ) ∑ j e x p ( z j / T ) q_i = {\frac {exp(z_i/T)} { {\textstyle \sum_{j}^{}} exp(z_j/T)}} qi=jexp(zj/T)exp(zi/T)

其中 $q_i $ 是每个类别输出的概率, z i z_i zi 是每个类别输出的 logits,T 就是温度。当温度 T=1 时,这就是标准的 Softmax 公式。 T越高,softmax 的output probability distribution越趋于平滑,其分布的熵越大,负标签携带的信息会被相对地放大,模型训练将更加关注负标签。

关于温度T的影响:

在这里插入图片描述

温度的高低改变的是Student模型训练过程中对负标签的关注程度。当温度较低时,对负标签的关注,尤其是那些显著低于平均值的负标签的关注较少;而温度较高时,负标签相关的值会相对增大,Student模型会相对更多地关注到负标签。

实际上,负标签中包含一定的信息,尤其是那些负标签概率值显著高于平均值的负标签。但由于Teacher模型的训练过程决定了负标签部分概率值都比较小,并且负标签的值越低,其信息就越不可靠。因此温度的选取需要进行实际实验的比较,本质上就是在下面两种情况之中取舍:

  • 当想从负标签中学到一些信息量的时候,温度T应调高一些;
  • 当想减少负标签的干扰的时候,温度T应调低一些;

总的来说,T的选择和Student模型的大小有关,Student模型参数量比较小的时候,相对比较低的温度就可以了。因为参数量小的模型不能学到所有Teacher模型的知识,所以可以适当忽略掉一些负标签的信息。

5、Conclusion

除了知识蒸馏技术外,还有一些类似的技术可以用于实现模型的压缩和加速,例如:

  • 权重剪枝:通过删除神经网络中冗余的权重来减少模型的复杂度和计算量。具体来说,可以通过设定一个阈值来判断权重的重要性,然后将不重要的权重设置为零或删除。
  • 模型量化:将神经网络中的权重和激活值从浮点数转换为低精度的整数表示,从而减少模型的存储空间和计算量。
  • 知识蒸馏(Knowledge Distillation):这是一种特殊的模型蒸馏技术,其中教师模型和学生模型具有相同的架构,但参数不同。通过让学生模型学习教师模型的输出,可以实现模型的压缩和加速。
  • 知识提炼(Knowledge Carving):选择性地从教师模型中抽取部分子结构用于构建学生模型。
  • 网络剪枝(Network Pruning):通过删除神经网络中冗余的神经元或连接来减少模型的复杂度和计算量。具体来说,可以通过设定一个阈值来判断神经元或连接的重要性,然后将不重要的神经元或连接删除。
  • 低秩分解(Low-Rank Factorization):将神经网络中的权重矩阵分解为两个低秩矩阵的乘积,从而减少模型的存储空间和计算量。这种方法可以应用于卷积层和全连接层等不同类型的神经网络层。
  • 结构搜索(Neural Architecture Search):通过自动搜索最优的神经网络结构来实现模型的压缩和加速。这种方法可以根据特定任务的需求来定制适合的神经网络结构

[REFERENCE]
小白学深度学习:知识蒸馏研究综述
深度学习方法(十五):知识蒸馏(Distilling the Knowledge in a Neural Network),在线蒸馏
一分钟带你认识深度学习中的知识蒸馏
深度学习中的知识蒸馏(Knowledge Distillation)
深度学习知识蒸馏的研究综述
深度学习中的模型蒸馏技术:实现流程、作用及实践案例
深度学习中知识蒸馏研究综
全网最细图解知识蒸馏(涉及知识点:知识蒸馏实现代码,知识蒸馏训练过程,推理过程,蒸馏温度,蒸馏损失函数)
深度学习知识蒸馏的研究综述
【精读AI论文】知识蒸馏
知识蒸馏原理介绍!知识从哪里来怎么蒸馏?【推理引擎】模型压缩系列第06篇(上)
DeiT:注意力也能蒸馏

[COPY]
模型压缩(上)—— 知识蒸馏(Distilling Knowledge)
知识蒸馏原理

相关文章:

知识蒸馏(Knowledge Distillation)

Distilling the Knowledge in a Neural Network 知识蒸馏原理 1、Summarize 知识蒸馏技术 通过从大型的教师模型向小型的学生模型转移知识来实现模型压缩和优化。 知识蒸馏的核心思想是 利用教师模型在大量数据上积累的丰富知识,通过特定的蒸馏算法,使…...

【zsh】Linux离线安装zsh

首先从GitHub下载源码&#xff0c;然后编译源码后安装。以下是具体的步骤&#xff1a; 1. 下载并解压源码 首先&#xff0c;从GitHub下载了zsh源码的压缩包并解压到某个目录&#xff1a; tar -xvf zsh-<version>.tar.gz cd zsh-<version>2. 安装编译所需的依赖&…...

一款好用的电子样本册转换器

在数字化时代&#xff0c;电子样本册已成为各行各业必备的工具。一款好用的电子样本册转换器&#xff0c;可以让你在繁杂的资料管理中轻松解脱。今天&#xff0c;就为大家推荐一款实用的电子样本册转换神器&#xff0c;让你的工作效率翻倍&#xff01; 工具推荐&#xff1a;FLB…...

TDesign:腾讯的开源企业级前端框架,能和ant-design一战吗?

TDesign 是一套拥有完整的 设计价值观 和 视觉风格指南 的企业级设计体系&#xff0c;同时提供了丰富的 设计资源。TDesign 在设计体系基础上产出基于 Vue、React、小程序等业界主流技术栈的组件库解决方案。是不是有点晚了&#xff1f; 请大家各抒己见。...

大语言模型LLM权重4bit向量量化(Vector Quantization)/查找表量化基本原理

参考 https://apple.github.io/coremltools/docs-guides/source/opt-palettization-overview.html https://apple.github.io/coremltools/docs-guides/source/opt-palettization-algos.html Apple Intelligence Foundation Language Models 苹果向量量化&#xff1a; DKM:…...

学习threejs,创建立方体,并执行旋转动画

文章目录 一、前言二、代码示例三、总结 一、前言 本文基于threejs&#xff0c;实现立方体的创建&#xff0c;并加入立方体旋转动画 二、代码示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>l…...

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民&#xff0c;网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席20…...

Unity Qframework 加载UI的方式

如图所示 : // Resources 加载 UIKit.OpenPanel("Resources/UIPrefab/UIMenuPanel"); // Resources 加载并传递数据 UIKit.OpenPanel<UIMenuPanel>(new UIMenuPanelData() { m_Modle this.m_Modle }, prefabName: "UIPrefab/UIMenuPanel"); …...

使用 Python 创建自动抽奖程序

介绍 自动抽奖程序在各种场景中非常有用&#xff0c;比如社交媒体活动、公司抽奖、在线课程奖励等。在这篇博文中&#xff0c;我们将学习如何使用 Python 创建一个自动抽奖程序。我们将涵盖以下内容&#xff1a; 需求分析环境设置基本抽奖逻辑图形用户界面&#xff08;GUI&am…...

推荐10款功能强大的电脑监控软

随着工作环境和信息安全要求的不断提高&#xff0c;越来越多的企业和个人开始关注电脑监控软件。电脑监控软件能够帮助管理者监控员工工作效率、保护敏感信息、防止数据泄露等。下面&#xff0c;我们将为大家推荐10款功能强大的电脑监控软件&#xff0c;涵盖国内外的知名产品&a…...

‘“node“‘ �����ڲ����ⲿ���Ҳ���ǿ����еij��� ���������ļ���

错误信息 使用vscode提交前端代码到git时&#xff0c;报下面的错&#xff0c;一直不知道啥原因&#xff0c;后来找到了个临时解决方案。。。 vscode解决方案 package.json文件中&#xff0c;去掉hooks的配置。 Idea解决方案 网上有说idea的解决方案的&#xff1a;就是提…...

MQ-135空气质量传感器(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 mq135.h文件 mq135.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 MQ-135空气质量传感器属于MQ系列气体传感器&#xff0c;广泛用于检测有害气体、新鲜空气中的烟…...

动手学深度学习(pytorch)学习记录27-深度卷积神经网络(AlexNet)[学习记录]

目录 创建模型读取数据集训练AlexNet AlexNet 是由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在 2012 年提出的深度卷积神经网络&#xff0c;它在当年的 ImageNet 大规模视觉识别挑战赛&#xff08;ILSVRC&#xff09;中取得了显著的成绩&#xff0c;从而引起了深度…...

zookeeper是啥?在kafka中有什么作用

一、Zookeeper是啥 问AI&#xff0c;它是这么说&#xff1a; ZooKeeper是一个开源的分布式协调服务。 ZooKeeper最初由雅虎研究院开发&#xff0c;用于解决大型分布式系统中的协调问题&#xff0c;特别是为了避免分布式单点故障。它被设计成一个简单易用的接口集&#xff0c;封…...

华为手机集大成之作?带你看全球首款三折叠手机 Mate XT 非凡大师

北京时间9月10日14:30分&#xff0c;华为终端在深圳召开了华为见证非凡品牌盛典及鸿蒙智行新品发布会。这次发布会最受瞩目的莫过于非凡大师系列的新品、全球首款三折叠手机Mate XT 非凡大师。 三折叠形态&#xff0c;内外铰链存于一体 尽管三折叠的概念被提出来的时间并不算…...

构建安全畅通的道路网络:EasyCVR视频汇聚平台在道路监控中的创新应用

随着城市化进程的加速和交通流量的不断增加&#xff0c;道路监控已成为确保交通安全、维护社会秩序的重要手段。道路上的监控摄像头多种多样&#xff0c;大致可以分为这几类&#xff1a;交通道路监控、治安监控、路口违章监控&#xff0c;以及车辆测速监控等。基于智慧交通的需…...

Mac M1安装Hive

一、下载解压Hive 1.官网地址 https://dlcdn.apache.org/hive/ 2.选择对应版本进行下载&#xff0c;这里我以3.1.3为例&#xff1b; 3.下载好后&#xff0c;进行解压&#xff0c;并重命名为hive-3.1.3&#xff0c;放到资源库目录下&#xff1b; 二、配置系统环境 1.打开~/…...

shader 案例学习笔记之绘制圆

环境搭建&#xff1a;参考glsl vscode环境搭建 先上代码 #ifdef GL_ES precision mediump float; #endifuniform vec2 u_resolution;void main(){vec2 st gl_FragCoord.xy/u_resolution.xy;st - 0.5;st.x * u_resolution.x/u_resolution.y;float r length(st);float d ste…...

c++的模板编程技术及其发展历程

C模板编程技术及其发展历程 一、早期阶段&#xff08;C98及之前&#xff09; 在C98标准中&#xff0c;模板是首次被引入的关键特性之一。模板允许开发人员编写参数化的类型或函数&#xff0c;从而创建通用的算法和数据结构。这种通用性不仅提高了代码的复用性&#xff0c;还确…...

Unity 一个比较适合学习的FSM状态机(汉化和功能简述)

该轮子由网络资源而来&#xff0c;遵从作者开源意愿&#xff0c;仅作免费学习和分享&#xff0c;不作任何商业行为 &#xff0c;本文不支持任何交易行为&#xff0c;侵权删&#xff01;&#xff01;&#xff01; 至于我为什么不将此文章设置为转载&#xff0c;是因为该代码所在…...

25、Wpf之App资源应用

开发平台&#xff1a;Win10 64位 开发环境&#xff1a;VS2022(64位) Preview .NET Framework&#xff1a;.NET 6 文章目录 一 Resources1.1 Application中定义资源1.2 样式&#xff08;Styles&#xff09;1.3 模板&#xff08;Templates&#xff09;1.4 数据转换器&#xff08;…...

【深度好文】反模式:10种滥用设计模式案例分析

Hello&#xff0c;大家好&#xff0c;我是V哥。很多文章都在介绍设计模式怎么用&#xff0c;讲解设计模式的原理等等&#xff0c;设计模式的思想是编程中的精髓&#xff0c;用好了可以让代码结构利于维护和扩展&#xff0c;同时代码风格也更加优雅&#xff0c;V 哥也写过这样一…...

OkHttp Interceptor日志上报

最近为了做一些网络上的优化&#xff0c;所以就得提前埋点&#xff0c;为后续网络优化提供数据支持。 主要是对发起请求埋点&#xff0c;请求错误埋点&#xff0c;客户端请求耗时埋点。 事件上报到阿里云&#xff0c;接入的是阿里的应用实时监控服务。 网络请求使用的是OhHttp…...

高性能反向代理--HAProxy

文章目录 Web架构负载均衡介绍为什么使用负载均衡负载均衡类型 HAProxy简介应用场景HAProxy是什么HAProxy功能 脚本安装HAProxy基础配置global多进程和线程HAProxy日志配置项 Proxies配置-listen-frontend-backendserver配置 frontendbackend配置实例子配置文件 HAProxy调度算法…...

数据结构应用实例(四)——最小生成树

Content&#xff1a; 一、问题描述二、算法思想三、代码实现四、两种算法的比较五、小结 一、问题描述 利用 prim 算法和 kruskal 算法实现最小生成树问题&#xff1b; 二、算法思想 首先判断图是否连通&#xff0c;只有在连通的情况下才进行最小树的生成&#xff1b; 三、代…...

为OneAPI配置MySQL数据库及设置开机启动

OneAPI启动时&#xff0c;如果发现没有数据库他会在项目根目录自动创建SqlLit&#xff0c;为提高OneAPI的性能及管理&#xff0c;这里给出一个使用MySQL数据库的案例&#xff0c;同时本文介绍如何在源码部署的情况下&#xff0c;设置OneAPI的开机自动启动。 OneAPI的源代码安装…...

完整的k8s搭建服务器流程

一、准备 1、禁用selinux #临时禁用 setenforce 0 #永久禁用 sed -i s/enforcing/disabled/ /etc/selinux/config #检查selinux是否已禁用 sestatus 2、禁用交换分区 #命令行临时禁用 swapoff -a #永久禁用 vim /etc/fstab 注释掉有swap字样的那行&#xff0c;重启 3、允许…...

【Petri网导论学习笔记】Petri网导论入门学习(一)

Petri 网导论 如需学习转载请注明原作者并附本帖链接&#xff01;&#xff01;&#xff01; 如需学习转载请注明原作者并附本帖链接&#xff01;&#xff01;&#xff01; 如需学习转载请注明原作者并附本帖链接&#xff01;&#xff01;&#xff01; 发现网上关于Petri网的学习…...

Zabbix监控自动化

监控在运维工作中所占的比例为 30%左右&#xff0c;监控做得好&#xff0c;会省很多事&#xff0c;让工作能有序地进行。理想的监控应该是自动化的&#xff0c;只需要配置规则&#xff0c;即可自动完成所有的事情&#xff0c;比如主机的自动添加和注册、模板的自动添加、分组的…...

pytorch pyro 贝叶斯神经网络 bnn beyesean neure network svi ​定制SVI目标和培训循环,变更推理

定制SVI目标和培训循环 Pyro支持各种基于优化的贝叶斯推理方法&#xff0c;包括Trace_ELBO作为SVI(随机变分推理)的基本实现。参见文件&#xff08;documents的简写&#xff09;有关各种SVI实现和SVI教程的更多信息I, 二&#xff0c;以及罗马数字3了解SVI的背景。 在本教程中…...