2025年预训练和自训练(预训练模型有哪些)

预训练和自训练(预训练模型有哪些)作者 何文嘉 校对 李仲深 一 研究背景 目前无论在 CV 领域还是 NLP 领域 预训练都是一个很普遍和普适的方法 我们都知道深度学习的模型越庞大 模型参数越多 为了避免过拟合就需要相应大规模的数据集 但对于很多任务而言 样本标注的成本昂贵 相反 大规模无标签数据库相对容易建立 为了充分利用这些无标记数据 我们可以先使用它们在其他一些任务上学习一个好的特征表示 再用于训练目标任务 二 简介 随着机器学习和深度学习的发展 各种预训练模型 Pre Training Model PTM



作者 | 何文嘉 校对 | 李仲深

一、研究背景

目前无论在CV领域还是NLP领域,预训练都是一个很普遍和普适的方法。我们都知道深度学习的模型越庞大,模型参数越多,为了避免过拟合就需要相应大规模的数据集,但对于很多任务而言,样本标注的成本昂贵。相反,大规模无标签数据库相对容易建立,为了充分利用这些无标记数据,我们可以先使用它们在其他一些任务上学习一个好的特征表示,再用于训练目标任务。

二、简介

随着机器学习和深度学习的发展,各种预训练模型 (Pre-Training Model, PTM) 相继问世,目前已经证明在大型无标签数据库中学习的PTMs可以学习到通用普适的特征表示从而对下游任务有所帮助。PTMs能够提供一个更好的模型初始化,通常会产生一个更好的模型表现和加快在目标任务中的收敛速度。出于PTMs的强大和其普适性,本篇为大家介绍7大经典的PTMs,从原理上理解各个PTMs的特点。最后附上了7大模型的对比表格和学习路线。

2.1 NNLM

论文:https://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf 博客:https://zhuanlan.zhihu.com/p/84338492

一个句子由n个词

组成,根据全概率公式/贝叶斯公式有

标准的LM主要存在两个问题:

的概率参数空间太大(组合爆炸),可能性过多

非常稀疏。加上是多个条件概率相乘,容易导致

形象表达(假如Vocabulary只有5个tokens):

LM实际操作的流程就是每次生成词(token)后,将其添加到输入序列。新的序列就会作为模型下一步的输入内容。该理念称为“自回归(auto-regression)”。

n元语法 (n-gram)

为了简化LM,引入马尔科夫假设:

在给定当前知识或信息的情况下,过去(即当前以前的历史状态)对于预测将来(即当前以后的未来状态)是无关的。

因此,n-gram的核心思想是:

个词仅与其前面

个词有关

时,一元语法 (unigram),各个词之间相互独立,LM中一个句子出现的概率简化为

同理当

时,为二元语法 (bigram),有

依次类推, n = 3, 4 .... 但是一般用的都是二元, 三元模型。

传统n-gram的问题:

神经网络语言模型 (Neural Network Language Model, NNLM)

2003年第一次提出了词向量的概念, 核心思想是将文本用稠密, 低维, 连续的向量表达.

NNLM的主要任务是利用前n-1个词汇,预测第n个词汇。

NNLM的框架图:

模型解释

输入层

根据n-gram,每一次的输入都是某个句子中的

个词,也就是一组词,每个词汇将由one-hot vector的形式编码。记词汇表总大小记为

,对于输入的每以个词

,都会与

的矩阵

相乘, 得到一个

。则一个输入总共得到

原理

上述操作其实从侧面也达到了降维的目的。参数矩阵

其实相当于一本字典 (Look-up Table),因为每一行都储存的向量都与某个one-hot-vector唯一对应。每当有词汇输入的时候,根据词汇的one-hot-vector的特性,通过

能提取出

中相应行的向量,如下图所示,而该行向量即可作为词汇的词向量。而

一开始是随机初始化,之后在训练阶段由模型通过反向传播 (Back Propagation, BP) 不断优化得到的。

隐含层

将输入层得到的

拼接 (concat) 在一起并转置,得到一个

的向量

隐含层为一个简单的tanh激活层,将

通过非线性得到隐含层的输出

其中

输出层

将隐含层的输出

与原始合并的向量

组合在一起得

其中

如果不想利用原始合并词向量的信息的话,可以将

设为零矩阵。

最后通过对

进行归一化,作为关于单词

的条件概率的估计值

损失函数

其中

组输入,具体意义是将一个句子划分成

个词组,每个词组都是包含

个词的一个模型输入,

为正则化项。

模型更新

整个模型的参数为

只有矩阵

是训练词向量的目标。

2.2 Word2Vec

论文:http://export.arxiv.org/pdf/1301.3781 博客:https://blog.csdn.net/itplus/article/details/37998797

一个token输入,预测一个token的情况:

会发现和NNLM非常相似,而且比NNLM简单,连非线性的激活函数都没有。

Word2Vec仅仅是通过一个全连接把输入向量映射到隐藏层,然后再通过一个全连接把隐藏层向量映射到输出层。

根据上图,输入输出层的维度都是

即词汇表的大小,输入层每个token都是用一个one-hot vertor来表示,而输出层向量通过Softmax得出预测单词的概率分布,即由词汇表中每个词的预测概率组成的向量。隐藏层维度为

是词向量的维度,是自定义的超参数。

输出层根据概率分布,选择预测概率最大的词作为预测词。

Word2Vec的两种实现方式

简略图:

细节图(CBOW为左图,Skip-Gram为右图):

CBOW
Skip-Gram

分层Softmax (Hierarchical Softmax)

核心思想

分类拆分成

个二分类

具体说明

负采样 (Negative Sampling)

核心思想

个词汇作为预测词,模型只考虑预测集合

中的词的正确概率即可。原本需要预测

个词是不是正确答案,而负采样后,只需要预测

个词是不是正确答案即可,大大减少了运算量。

具体说明

2.3 Glove(Global Vectors)

论文:http://nlp.stanford.edu/pubs/glove.pdf 博客:https://zhuanlan.zhihu.com/p/42073620

核心思想

通过词

与词

的关系和词

与词

的关系预测词

与词

的关系(Ratio关系)。直观理解,同学A与同学B是好朋友,同学A与同学C好朋友,那么同学A与同学C也有很大可能是好朋友。

总结概括

无论用了什么奇技淫巧,最根本的思想其实很简单,就是寻找词的embedding,使得任意三个不同的词

满足Ratio关系:

2.4 FastText

论文:https://arxiv.org/pdf/1607.01759.pdf 博客:https://mp.weixin.qq.com/s/Tz8eCmLVboMq3eIMrW2KKA

FastText有两个任务和损失,一个是文本分类的损失,另一个是语言建模(广义)的损失。

其实这种多个损失的学习方式本质上也是一种广义的多任务学习。

字符级嵌入

FastText词嵌入的可视化指南

Word2Vec把语料库中的每个单词当成原子,它会为每个单词生成一个向量,这忽略了单词内部的形态特征,如“apple”与“apples”,两个单词都有较多的公共字符,即它们的内部形态类似,但是在传统的word2vec中,这种单词内部形态信息因为它们被转换成不同的id丢失了。为了克服这个问题,fastText使用了字符级别的n-grams来表示一个单词,对于“apple”,假设n的取值为3,则它的trigram有:

"<ap","app","ppl","ple","le>"

其中“<”表示前缀,“>”表示后缀,可以使用这5个trigram的向量叠加来表示“apple”的词向量

模型结构图:

Sub-word生成

不同长度的字符n-grams的例子如下:

由于存在大量的唯一的n-grams(组合爆炸),我们应用哈希来限制内存需求。我们不是学习每个唯一的n-grams的嵌入,而是学习一个总的B嵌入,其中B表示存储桶的大小。文章中用的桶的大小为200万。同一个桶里的token共用一个嵌入向量。

每个字符n-gram被散列到1到b之间的整数,尽管这可能会导致冲突,但它有助于控制词汇表的大小。原论文使用Fowler-Noll-Vo散列函数的FNV-1a变体将字符序列散列为整数值。****

训练流程

1、首先,中心词的嵌入是通过取字符n-grams的向量和整个词本身来计算的。后面是针对中心词进行优化的,要使得中心词与上下文单词在某个语言特征空间中尽可能相近。

2、对于实际的上下文单词,我们直接从嵌入表示中获取它们的单词向量,不需要加上n-grams。

3、现在,我们随机采集负样本,使用与unigram频率的平方根成正比的概率。对于一个实际的上下文词,抽样2个随机的负样本单词。

4、我们在中心词和实际上下文词之间取点积,并应用sigmoid函数来得到0到1之间的匹配分数,其实就是逻辑回归

5、基于这种损失,我们使用SGD优化器更新嵌入向量,目标是使实际上下文词更接近中心词,同时增加了与负样本的距离

这一部分是总损失函数的一部分,总损失函数的另一部分是文本分类的损失。

论文中的直觉

对于形态丰富的语言(如捷克语和德语),FastText显著提高了句法词类比任务的性能。

但与Word2Vec相比,FastText降低了语义类比任务的性能。

2.5 CoVe (Contextualized Word Vectors/Context Vector)

论文:http://arxiv.org/pdf/1708.00107 博客:https://zhuanlan.zhihu.com/p/110705137

用一个 Encoder-Decoder 框架在机器翻译的训练语料上进行预训练(如上图a),而后用训练好的模型,只取其中的 Embedding 层和 Encoder 层,同时在一个新的任务上设计一个 task-specific 模型,再将原先预训练好的 Embedding 层和 Encoder 层的输出作为这个 task-specific 模型的输入,最终在新的任务场景下进行训练(如上图b)。

所谓的上下文相关向量CoVe实际上就是通过机器翻译模型直接得到的:其中GloVe(w)表示将单词w通过GloVe的词表映射层对应的向量表示,然后将这个向量表示作为机器翻译模型中Ecoder的输入,得到的Encoder的输出就是上下文向量CoVe。

这个是典型的Seq2Seq结构,所以Encoder和Decoder可以(或通常)是LSTM/GRU。

对于目标任务的训练,一个新的/在预训练中没见过的序列通过embedding层得到各个词的word vectors,然后输入到预训练好的Encoder,得到的输出就是上下文的向量,这也是CoVe属于Contextual的PTM的原因。

输入的Word Vectors可以是one-hot,也可以是Word2Vec,GloVe等方法产生的词向量,也可以是随机初始化。

CoVe 更侧重于如何将现有数据上预训练得到的表征迁移到新任务场景中,这个预训练得到的encoder的信息其实就是一种语境化或者上下文相关的信息。CoVe 是在监督数据上进行的预训练,是监督学习预训练的典型代表,目前流行的预训练任务都是自监督的,如BERT。

结果分析

作者将随机初始化的词向量、使用GloVe初始化的向量、GloVe+CoVe词向量在各个数据集上对模型性能的影响进行了对比:

可以看到单独使用GloVe向量比使用随机初始化的向量要好,使用GloVe+CoVe词向量的结果又要比GloVe向量要好。

Char是指字符级的嵌入,如CharCNN。

2.6 ELMo (Embedding from Language Model)

论文:https://arxiv.org/pdf/1802.05365.pdf 博客: https://zhuanlan.zhihu.com/p/52483135 https://zhuanlan.zhihu.com/p/88993965 https://zhuanlan.zhihu.com/p/63115885

可能需要BiLM的例子:“我之所以今天没有去上课,是因为我生病了。”

这里和传统的LM不同了,是用深度学习模型LSTM来进行LM学习。理论上是对标准的LM进行建模,而不是采用简化的unigram或bigram等简化版本。这是由LSTM的架构特点决定的,但这也是LSTM能够自己“窥视”自己的原因。因此,ELMo要用两个独立的单向LSTM。

ELMo使用了字符级嵌入:

模型结构示意图:

ELMo原理解析及简单上手使用

词嵌入:ELMo原理

“偷窥”问题

为什么双向LSTM会导致看见答案:

如图所示的正向LSTM,"克"是根据“扑”这个字和隐藏向量 h2 来预测出来的。h2 包含了和打 这两个字的信息,所以预测“克”这个字时,是根据前面所有的字来预测的。反向的话,“克”就是根据 “扑”和 h1 来预测的,但是 h1 包含了“克”的信息,所以反向的话会导致模型看到答案。

数学描述

前向的LM表达式:

后向的LM表达式:

两个LSTM的输出分别是:

前向LSTM隐藏层的输出

通过Softmax预测

,得到前向的条件概率,后向LSTM同理。即两个单向的LSTM分别进行预测单词的条件概率的计算和,分别取对数并进行求和,以保证前向和后向的信息独立,防止模型自己“窥视”答案。

损失函数:

一个

层的双向语言模型可以得到一个token的一组

个的表示:

对于下游模型,ELMo可以将所有层的表示合并为一个向量作为token的表示,也可以简单地只选择第L层的隐藏层输出作为表示。但是通常我们会计算不同任务下Bi-LM各层的权重

其中,

是Softmax规范化的权重,常量参数

允许模型缩放整个ELMo产生的表征向量。

对于帮助优化非常重要,考虑到各个BiLM层分布不同,某些情况下对各个BiLM层使用Layer Normalization会有帮助。

ELMO解决了大部分问题,其中最重要的一个是:它解决了一词多义的问题。

2.7 Transformer

论文:http://arxiv.org/abs/1706.03762 博客:https://zhuanlan.zhihu.com/p/48508221

关键是搞清楚哪些是参数,是需要学习的,哪些是输入输出。

下面逐层拆解,又高层逐步往底层拆解:

都是参数,需要模型通过训练学习的,关键是理解其提供的机制:

注意力机制的直观理解:

一个token对其他token进行“注意”:

维度变换用线性代数的知识理解即可。

的两行,

的2列,代表这个序列有2个单词,

的3列,

的3行,代表这个嵌入维度是3。

注意力的直观表示(训练完成后通过各个词的

的内积得出的 Score进行可视化,线段越深,得分越高,相关度越高):

残余连接+规范化:

Multi-head Attention(其实就是多组Self-Attention结果的拼接):

详细的整体架构如下(只是一组Encoder和Decoder):

位置编码:

Transformer的Decoder随着下面的GPT-1/2来讲解,因为GPT-1/2的结构就是基于Transformer的Decoder。

2.8 GPT-1/2

论文: https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf 博客: https://zhuanlan.zhihu.com/p/59286975 https://baijiahao.baidu.com/s?id=1652093322137148754&wfr=spider&for=pc https://zhuanlan.zhihu.com/p/95496557

GPT-1

不同任务的输入形式要做出相应的改动:

GPT-2

数据流向

大力出奇迹:

img

Masked Self-Attention:

Masked Self-Attention和Self-Attention的对比:

Position Encoding:

混合编码:

对输入序列的9个已知token进行attention:

attention得分表格:

映射回

维,得出每个token的概率分布:

注意力细节

Self-Attention:

Multi-head Self-Attention:

GPT2 Self-Attention:

和Transformer一样的,只是分析得更细节更形象而已。

参数计算:

2.9 BERT

论文:https://arxiv.org/pdf/1810.04805.pdf 博客:https://zhuanlan.zhihu.com/p/46652512

模型对比图:

由于时间序列的关系,RNN模型预测当前词只依赖前面出现过的词,对于后面的信息无从得知。Maked Language Model (MLM) 是为了解决单向信息问题,现有的语言模型的问题在于,没有同时利用双向信息,如

BERT有两个任务:

BERT的区域部分几乎和GPT一毛一样,都是基于Attention模块的堆叠。

Bert的Embedding层:

Token Embeddings

Segment Embedding

Position Embedding

任务1:Masked Language Model

Bert 预训练过程就是模仿我们学习语言的过程,要准确的理解一个句子或一段文本的语义,就要学习上下文关系,从上下文语义来推测空缺单词的含义。而 Bert 的做法模拟了英语中的完形填空,随机将一些单词遮住,让 Bert 模型去预测这个单词,以此达到学习整个文本语义的目的。

随机 mask 预料中 15% 的 Token,然后预测 [MASK] Token,与 masked token 对应的最终隐藏向量被输入到词汇表上的 Softmax 层中。这虽然确实能训练一个双向预训练模型,但这种方法有个缺点,因为在预训练过程中随机 [MASK] Token 由于每次都是全部 mask,预训练期间会记住这些 MASK 信息,但是在fine-tune期间从未看到过 [MASK] Token,导致预训练和 fine-tune 信息不匹配。

任务2:Next Sentence Prediction

Fine-tune

fine-tune 就是指在已经训练好的语言模型基础上,使用有标签的数据对参数进行调整,使其更好的适用于下游任务。如对于分类问题在语言模型基础上加一层 Softmax 网络,然后再新的预料上重新训练进行 fine-tune。

具体使用

效果

三、总结对比

2020 年 3月 新番 李宏毅 人类语言处理 独家笔记 预训练语言模型们 (上) - 19

四、思考

编程小号
上一篇 2025-03-18 08:33
下一篇 2025-03-12 18:17

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/38573.html