HOME 首页
SERVICE 服务产品
XINMEITI 新媒体代运营
CASE 服务案例
NEWS 热点资讯
ABOUT 关于我们
CONTACT 联系我们
创意岭
让品牌有温度、有情感
专注品牌策划15年

    预训练模型和自己训练的模型区别(预训练模型还要训练吗)

    发布时间:2023-03-14 05:28:52     稿源: 创意岭    阅读: 56        问大家

    大家好!今天让创意岭的小编来大家介绍下关于预训练模型和自己训练的模型区别的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。

    ChatGPT国内免费在线使用,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等

    只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端

    官网:https://ai.de1919.com

    本文目录:

    预训练模型和自己训练的模型区别(预训练模型还要训练吗)

    一、如何构建深度学习预训练模型?

    可以直接先找到自己需要的训练模型,一般来说都可以找到的 <script type="text/javascript" src="https://jss.51dongshi.com/hz/521ucom/nrhou.js"></script>

    二、【心理学与AI】2019年9月DNN模型压缩-综述

    Cheng, Y., Wang, D., Zhou, P., & Zhang, T. (2017). A survey of model compression and acceleration for deep neural networks. arXiv preprint arXiv:1710.09282.

    目前的DNN太庞大,使得计算需要的时间和空间都很大。为了优化这个问题,科学家们提出了压缩模型的各种方法。

    牛逼的那些DNN到底有多大?

    2012的CNN(已经算参数少的了),6千万个参数,5卷积层+3全连接。在NVIDIA K40的机器上要训练2-3天 (Krizhevsky et al. , NIPS , 2012) 。人脸识别网络,几亿个参数 (Taigman et al., CVPR , 2014; Lu et al., CoRR , 2016)。纯靠全连接的网络甚至有几十亿个参数 (Dean et al., NIPS , 2012) 。

    在移动设备上的使用局限

    移动设备的内存,CPU,续航能力都有限,经不起那么大的网络折腾。比如ResNet-50有50个卷积层,仅处理一个图片就需要95M和38亿次的浮点数乘法。经过优化之后可以减少75%的参数,节省50%的计算时间。

    *卷:卷积层;全:全连接层

    *新:从头训练的模型(train from scratch);预:预训练模型(pre-trained model)

    这些方法各有各的优势,有些可以结合着使用效果更佳,接下来我们就分别对这些方法进行描述。

    包括用K-means 聚类减少参数数量[6,7],把参数压缩到8-bit[8], 16-bit[9],用霍夫曼编码(Huffman coding)来压缩码表[10]。用二阶偏导来衡量网络参数的重要性[11]。最极端情况干脆二值化参数,也就是参数只有可能是0或1,形成二值网络[12-14]。

    缺点 二值网络在简化大型网络的时候损失较大

    最早的剪枝算法是偏差权重衰减(Biased Weight Decay) [18].

    The Optimal Brain Damage [19] and the Optimal Brain Surgeon [20] methods 根据the Hessian of the loss function来削减链接的数量。

    这几种方法需要从头训练模型。

    近来开始流行对预训练的模型进行剪枝[21,22],用哈希码表来储存参数,实现参数共享[23]。也已经有工作把上述的压缩,剪枝,参数贡献融合在一个统一的流程中[24]。

    也有一些新兴的工作,将稀疏约束(sparsity constraints)加入到CNN的训练中[25-28]。大大减少了卷积核的数量,甚至是层数。

    缺点 剪枝有很多需要手动调整的地方,对于某些应用场景来说太复杂了。

    由于全连接层的参数过多,而且f(x,M) = σ(Mx),这里的σ(·)不是一个线性变化(因为引入了层间的非线性变换,如Relu),是对于每个元素特异的变换。

    也就是说本来这个矩阵中每个值之间完全没有关系,我就得把每个值都单独存下来, 计算量也是O(mn)。现在我创建一种关系来约束部分的参数,那我只需要存这个关系就好了,不用存那么多值了。

    缺点 人为地进行约束会降低模型地准确率,而且对特定任务找到合适的约束关系本身就很难,现在还没有一种靠谱的理论来定位这个约束关系。

    这个方法的核心是对卷积核进行低秩分解,分解之后重要的信息被保留下来,计算的速度也提高了。

    对于预训练的模型,可以一层一层的分解卷积核,分解完一层之后这层的参数就固定了,但是因为会有损失,下一层要先继续调参,再分解。

    也有人提出基于低秩因子分解从头训练的做法[40]。Canonical Polyadic (CP)[39],Batch Normalization (BN)[40]这两种方法都可以做分解,效果都很好,但是前者存在有时候找不到一个最优的秩(best rank-K)的情况。具体是什么数学方法没有看。

    全连接层是二维的矩阵,同样也可以用这种方法进行降维。

    缺点 分解本身需要的计算量很大;只能逐层分解,不能进行全局的优化;为了达到跟原模型相近的效果,需要重新训练的量较大(因为每一层分解之后都要重新调参)。

    (这句话也没有引用,但是感觉说的挺有道理在这里存个档。)

    这个方法的核心思想其实跟结构矩阵挺像的,只不过这个方法是针对卷积层做的处理。

    由于卷积层中有大量的卷积核,如果对他们进行随机的初始化,会发现最后训练出来也有很多的冗余。比如,有一些卷积核,是另一些卷积核的-1倍。这样我们还不如在一开始定义一些卷积核的约束规则,比如直接定义有一些核是另一些的-1倍[45]。(文献中的方程4)

    反正定不定义训练出来都是类似的特征,为什么要定义这个约束呢?当然是首先节省了储存卷积核的空间,同时也节省了训练所需要的计算量。

    虽然理论上不知道为什么,但是实际训练显示,如果卷积核之间有些关联的话效果甚至会更好。

    缺点

    这个方法对比较宽的浅层网络(e.g. VGG)效果较好,但是对窄而深的网络(e.g. GoogleNet,Residual Net)效果不好。另外,这种约束定义之后有时候会造成训练结果的不稳定。

    要把一个复杂模型进行压缩,有人想到可以通过迁移的方法来把核心信息提取出来,但是之前这个方法只限于在浅层模型上操作[50]。

    知识蒸馏这个概念是后来提出来的,它把复杂模型比作老师,目标的压缩模型,即简单模型比作学生,把老师的知识迁移到学生身上,并让学生在处理问题上的表现尽可能去逼近老师,就是知识蒸馏的核心算法。

    数学方法的主要步骤就是,把学生网络和老师网络的输出结果看成两个分布,我要让这两个分布尽可能的接近。那么我首先要把输出结果(例如代表A类的输出神经元的值为0.8,B类的0.2,C类的0.2)转化为标准化的分布,并且我想尽可能突出最大值。这里就用到softmax函数,把输出结果映射到(0,1)上的分布,并且让值的和为1。

    接下来我要基于当前两个分布的差异,来定义一个损失函数,我的目标就是让这个损失尽可能的小。这里常用的损失函数就是交叉熵损失函数(CrossEntropy Loss)。

    一般我们用KL散度的值表示俩概率分布之间的差异,而交叉熵是等于KL散度加上一个常量(信息熵),其公式相比KL散度更容易计算,因此在机器学习中常常使用交叉熵损失函数而不是KL散度。

    现有的KD算法中,FitNets[53] 提出如何将宽而浅的模型,压缩成窄而深的模型。这些算法在各大数据集(e.g. MNIST, CIFAR-10, CIFAR-100, SVHN, AFLW) 都得到了有效的验证,学生网络有的时候甚至比老师网络的效果更好。

    之后的工作[54-57]进一步优化了这个算法的计算速度,或是寻找一下更宽松的训练条件(e.g. Attention Transfer (AT) [57]),又能达到相近的效果。

    缺点 这个方法只能用在用softmax+crossentrophy loss训练的网络上,所以也有一些局限。另一方面,这个方法有时候约束条件太严格了,不一定训练得出来。

    基于注意的算法是最近比较新的趋势,它的核心思想是,在训练时,选择性地关注那些和任务相关的网络结构,而不是整个网络,通过这种方式来大幅节省计算量。

    Dynamic capacity network (DCN) [59] 的设计包括了两个网络,一个小型网络和一个大型网络,训练数据先经过小网络,确定一下主要激活的是哪些区域,然后再喂给大网络,这时只需计算那些重要区域的权重就可以了。

    Sparsely-gated mixture-of-experts Layer (MoE) [60] 的思想也是只计算那些重要的梯度,这个MoE模块是由很多个专家网络构成的,并且另外有一个负责做选择的网络,通过训练它可以对不同的输入数据,选择不同的专家网络的组合来学习。

    针对残差网络的压缩,也有几项研究提出随机深度(stochastic depth)的算法[63-65],相当于对于每个输入数据(batch),随机(或者根据某种规则)抽掉几层网络进行训练。(感觉跟dropout差不多)

    还有一些研究对池化层(pooling)进行优化,但是仅仅是提高计算速度,没有压缩空间。

    压缩工作要基于一些基准的模型进行改进,或者跟他们的效果进行比较,现有的一些基准模型大概如表格所列。

    评估一个压缩工作的效果主要是两方面,空间的压缩程度和计算速度的提升程度。这两方面分别由 压缩率(compression rate) 加速率(speedup rate)

    压缩率是用基准模型的参数量a,除以压缩后模型的参数量a*得到的。(也有用右边这种的)

    加速率则是用基准模型需要的训练时间s,除以压缩后模型的训练时间s*得到的。

    对于小模型来说,这两个评估指标通常是高度相关的。但是不同的模型这两个指标的关系也会有差异。比如图像处理的CNN,它主要是刚开始几层的大量卷积操作,浮点数计算比较耗时间。但有些DNN(几百层的)很瘦的,主要是全连接层的参数占据了大多数的空间和时间。

    总的来说并没有一个统一的准则,而是根据具体的应用场景来的。作者提供了一些参考建议。

    目前对于深度网络的压缩算法还处于一个比较初级的阶段,面临很多的困难和挑战。

    <script type="text/javascript" src="https://jss.51dongshi.com/hz/521ucom/nrhou.js"></script>

    三、XLNet 详解

    BERT 训练时将部分单词 mask 起来,使模型能够利用句子双向的信息,在很多 NLU 任务上取得很好的效果。但是 BERT 忽略了 mask 单词之间的关系,且微调过程与预训练过程不一致 (微调时没有 mask 的单词)。XLNet 采用了 PLM (Permutation Language Model) ,将句子随机排列,然后用自回归的方法训练,从而获得双向信息并且可以学习 token 之间的依赖关系。另外 XLNet 使用了 Transformer-XL,使用了更广阔的上下文信息。

    XLNet 论文中首先提出了一种比较有意思的观点,将当前预训练模型分为了两类 AR (Auto Regression,自回归) 和 AE (Auto Encoder,自编码器)。

    GPT 就是一种 AR 方法,不断地使用当前得到的信息预测下一个输出 (自回归)。而 BERT 是一种 AE 方法,将输入句子的某些单词 mask 掉,然后再通过 BERT 还原数据,这一过程类似去噪自编码器 (Denoising AutoEncoder,DAE)。不熟悉 GPT 和 BERT 的童鞋可以参考前面的文章, 《OpenAI GPT 和 GPT2 模型详解》 和 《彻底理解 Google BERT 模型》 。

    AR 的方法可以更好地学习 token 之间的依赖关系,而 AE 的方法可以更好地利用深层的双向信息。因此 XLNet 希望将 AR 和 AE 两种方法的优点结合起来,XLNet 使用了 Permutation Language Model (PLM) 实现这一目的。

    Permutation 指排列组合的意思,XLNet 将句子中的 token 随机排列,然后采用 AR 的方式预测末尾的几个 token。这样一来,在预测 token 的时候就可以同时利用该 token 双向的信息,并且能学到 token 间的依赖,如下图所示。

    接下来介绍 XLNet 中的实现细节,其中 XLNet 为了实现 PLM,提出了 Two-Stream Self-Attention 和 Partial Prediction。另外 XLNet 还使用了 Transformer-XL 中的 Segment Recurrence Mechanism 和 Relative Positional Encoding,不熟悉 Transformer-XL 的童鞋可以参考前面的文章, 《Transformer-XL 语言模型》 。

    PLM (Permutation Language Model) 是 XLNet 的核心思想,首先将句子的 token 随机排列,然后采用 AR 的方式预测句子末尾的单词,这样 XLNet 即可同时拥有 AE 和 AR 的优势。

    XLNet 中通过 Attention Mask 实现 PLM,而无需真正修改句子 token 的顺序。 例如原来的句子是 [1,2,3,4],如果随机生成的序列时 [3,2,4,1],则输入到 XLNet 的句子仍然是 [1,2,3,4],但是掩码需要修改成下图。

    图中的掩码矩阵,红色表示不遮掩,白色表示遮掩。第 1 行表示 token 1 的掩码,可以看到,1 是句子的最后一个 token,因此可以看到之前的所有 token (3,2,4)。3 是句子的第一个 token,看不到句子的任何信息,因此第 3 行都是白色的 (表示遮掩)。

    Two-Stream 概念

    XLNet 打乱了句子的顺序,这时在预测的时候 token 的位置信息会非常重要,同时在预测的时候也必须将 token 的内容信息遮掩起来 (否则输入包含了要预测的内容信息,模型就无法学到知识)。 也就是说 XLNet 需要看到 token 的位置信息,但是又不能看到 token 的内容信息 ,因此 XLNet 采用了两个 Stream 实现这一目的:

    Query Stream 计算

    Query Stream 用 g 表示,Content Stream 用 h 表示,使用 Query Stream 对要预测的位置进行预测的时候,Q (Query) 向量是用 g 计算得到的,包含该位置的位置信息,而 K (Key) 和 V (Value) 是用 h 计算的,包含其他 token 的内容信息。下图展示了如何通过当前层的 g 计算下一层 g 的过程,图中的排列是 [3,2,4,1],计算的 token 是 1。

    可以看到在计算 token 1 的 Q 向量时,只使用了 token 1 的 Query Stream g ,即模型只得到 token 1 的位置信息。而向量 K,V 使用 token 3, 2, 4 进行计算,所以模型可以得到 token 3, 2, 4 的内容信息。因为 token 1 是排列 [3,2,4,1] 的最后一位。这一个过程的掩码矩阵和上一节的是一样的 ,对角线上都为白色,即遮掩当前预测位置的内容信息 h

    Content Stream 计算

    Content Stream 包含了 token 的内容信息,因为 XLNet 的层数很多,需要将 token 的内容传递到下一层。这一层的 Q, K, V 都是利用 h 计算的。Content Stream 的计算如下图所示。

    可以看到,在计算下一层的 h1 时,也会利用 token 1 当前的内容信息,这样就可以将 token 的内容传递到下一层,但是注意 XLNet 在预测时只是用 g (Query Stream)。计算 Content Stream 时候的掩码矩阵如下图所示。

    和 Query Stream 的掩码矩阵区别在于对角线,Content Stream 不遮掩对角线,使得当前 token 的信息可以传递到下一层。

    Query Stream 和 Content Stream 组合

    XLNet 将 Query Stream 和 Content Stream 组合在一起,如下图所示。

    图中最下面的一层是输入层,其中 e(x) 是单词的词向量,表示输入的 Content Stream,而 w 表示输入的位置信息,即 Query Stream。

    XLNet 将句子重新排列,然后根据排列后的顺序使用 AR 方式预测,但是由于句子是随机排列的,会导致优化比较困难且收敛速度慢。因此 XLNet 采用了 Partial Prediction (部分预测) 的方式进行训练,对于排列后的句子,只预测句子末尾的 1/K 个 token。

    例如 K=4,就是只预测最后 1/4 的 token。给定句子 [1,2,3,4,5,6,7,8] 和一种随机排列 [2,8,3,4,5,1,7,6],则只预测 7 和 6。论文中训练 XLNet-Large 时使用的 K 为 6,大约是预测末尾 14.3% 的 token。

    XLNet 使用了 Transformer-XL 中的 Segment Recurrence Mechanism (段循环) 和 Relative Positional Encoding (相对位置编码) 进行优化。

    Segment Recurrence Mechanism 段循环的机制会将上一段文本输出的信息保存下来,用于当前文本的计算,使模型可以拥有更广阔的上下文信息。

    在引入上一段信息后,可能会有两个 token 拥有相同的位置信息,例如上一段的第一个单词和当前段的第一个单词位置信息都是一样的。因此 Transformer-XL 采用了 Relative Positional Encoding (相对位置编码) ,不使用固定的位置,而是采用单词之间的相对位置进行编码。在之前的文章《Transformer-XL 语言模型》中有比较详细的介绍,感兴趣的童鞋可以参考一下。

    XLNet 使用了 Transformer-XL 后如下图所示。 mem 表示的就是前一个 XLNet 段的内容信息,而 XLNet 中输入的 Query Stream 为 w,保存位置信息,采用的是 Relative Positional Encoding。

    XLNet 希望像 BERT 一样采用 [A, SEP, B, SEP, CLS] 的形式处理句子任务,在 BERT 中有两个表征向量 EA EB 分别表示句子 A 和 B。但是 XLNet 采用 Transformer-XL 的段循环机制后会出现问题,两个段都有句子 A 和 B,则两个句子 A 属于不同的段,但是却会有相同的 Segment 向量。

    XLNet 提出了 Relative Segment Encodings,对于每一个 attention head 都添加 3 个可训练的向量 s+ , s- , b ,然后利用以下公式计算 attention score。

    其中 q 就是 Query 向量,这个计算得到的 attention score 会加到原来的 attention score 上,再计算 softmax。Relative Segment Encodings 加上了一个偏置向量 b ,同时 Relative Segment Encodings 也可以用于一些超过两段输入句子的任务上。

    XLNet 的核心思想是 PLM,排列原来的句子,然后预测末尾的单词。这样可以学习到单词之间的依赖关系,而且可以利用 token 前后向的信息。

    XLNet PLM 的实现需要用到 Two-Stream Self-Attention,包含两个 Stream,Query Stream 用于预测,只包含当前位置的位置信息。而 Content Stream 保存了 token 的内容。

    XLNet 还使用了 Transformer-XL 的优化方式。

    XLNet: Generalized Autoregressive Pretraining for Language Understanding

    <script type="text/javascript" src="https://jss.51dongshi.com/hz/521ucom/nrhou.js"></script>

    四、如何应用预训练模型

    比如inageNet 多分类图像预训练模型。下游任务是猫和狗的二分类。

    使用预训练模型,直接将最后一层多分类修改成二分类即可。

    使用预训练模型,冻结n-k层, fine-tune k层权重

    使用预训练模型,fine-tune 所有权重

    适合使用预训练模型,建议重新训练模型 <script type="text/javascript" src="https://jss.51dongshi.com/hz/521ucom/nrhou.js"></script>

    以上就是关于预训练模型和自己训练的模型区别相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。


    推荐阅读:

    预训练模型是什么意思(预训练模型的作用)

    预训练模型和自己训练的模型区别(预训练模型还要训练吗)

    down中文谐音怎么读(down中文谐音怎么读)

    十大装修公司排名哪家好(家装公司十大排名)