作者 | 何文嘉 校对 | 李仲深
一、研究背景
目前无论在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
四、思考
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/38573.html