深入浅出词嵌入技术
本文概览:
本文又名《Distributed Representation: From Static Embedding to Contextualized Embedding》
1. Classical Representation: One-hot Encoding
独热编码是NLP领域最简单的一种单词表示法。One-hot Encoding就是一个单词用长度为的向量表示,其中只有一个位置为,其余位置为,为语料中词库的大小。
One-hot Encoding有什么问题呢?假如我想用余弦相似度计算上图中“机器学习”与“深度学习”的相似度,或者计算“贪心科技”与“深度学习”的相似度,我们会发现相似度的值都是相同的。也就是说,单词通过独热编码的方式是不能表示单词间语义的相似度。 由于这是独热编码最大的问题,因此科学家们开始研究如何对独热编码做改进,改进成一个向量可以表示单词的语义。如果我们能用一个向量表示单词的语义,那么两个向量的相似度应该可以表示两个单词语义的相似度。下图是我们对独热编码的一个总结。
2. From One-hot to Distributed Representation
由于独热编码非常的稀疏、不能表示单词间语义的相似度等缺点,我们希望学习下图中右边所示的单词表示方法。这种方法是由稠密向量表示单词,且向量维度更低,我们把这种方法叫做词向量。
词向量需要通过词向量模型学习来得到。我们需要一批语料当作模型的输入,然后词向量模型可以选择SkipGram模型、Bert模型或者其它模型,最后就可以得到词的分布式表示向量。
学习词向量有一个非常重要的理论:分布式假设,即一个单词的出现,跟它的上下文有关,我们可以根据上下文来预测某个单词。举个例子,我们可以根据上文“贪心科技作为国内”和下文“的高端AI教育品牌”,猜测出横线处应该是“领先”这个词。后边两个横线,分别从它们的上下文中,可以猜出应填词为“推出”、“案例”。
3. Static Word Embedding
3.1 Word2Vec
比较经典的词向量模型是Word2Vec,主要包含两个模型:CBOW和SkipGram模型。CBOW是根据上下文来预测中心单词;SkipGram通过中心词来预测上下文的单词。
3.2 SkipGram in Detail
在SkipGram预测的时候,输出的是预测目标词的概率,也就是说我每一次预测都要基于全部的数据集进行计算,这无疑会带来很大的时间开销。因此,Word2Vec提出两种加快训练速度的方式,一种是Hierarchical softmax,另一种是Negative Sampling。
3.3 CBOW与SkipGram的比较
- 数据比较少的时候,SkipGram效果比较好。 因为通过SkipGram的训练方式,我们能从较少的数据集中构造出更多的训练样本,CBOW是对中心词构造一条样本,SkipGram是对中心词可以构造多条训练样本。
- 出现次数较少的单词在语料库中较多的时候,SkipGram效果比较好。 因为CBOW的映射层起到Smoothing的作用,模型会预测更经常出现的单词。
3.4 Word Embedding by Matrix Factorization
矩阵分解也是可以学习词向量的。假如我们有三个句子组成的语料库:I enjoy flying. I like NLP. I like deep learning. 我们可以统计出单词的共现矩阵(Co-occurrence Matrix),将共现矩阵行(列)作为词向量。例如:假设统计窗口大小为,“I like”出现在第,句话中,一共出现次,所以“I like”=。对称的窗口指的是,“like I”也是次。将共现矩阵行(列)作为词向量表示后,可以知道“like”、“enjoy”都是在“I”附近且统计数目大约相等,因此它们意思相近。
共现矩阵X的维度为: ,我们可以通过SVD的方法将大矩阵X分解,因为矩阵X比较稀疏,从矩阵论的角度来看,希望学到更低秩的表示方法。因此可以将矩阵分解为三个小矩阵、 、,可以用矩阵的每一行表示单词的词向量。
因为矩阵分解中的共现矩阵中的统计信息是来自于所有的语料库,因此矩阵分解得到的词向量是全局的方法(Global Method)。由于CBOW、SkipGram模型每次考虑的是中心词和它周围的单词,因此CBOW、SkipGram模型得到的词向量是局部的方法(Local Method)。
- 共现矩阵不足:面临稀疏性问题、向量维数随着词典大小线性增长。
- 解决办法:SVD、PCA降维,但是计算量大。
3.5 Glove
局部的方法和全局的方法都有自己的优缺点。全局的方法可以从整个语料的角度更宏观的审视词的特点;局部的方法是基于局部语料库训练的,其特征提取是基于滑窗的,因此局部的方法可以进行在线学习。基于局部方法论和全局方法论的优缺点,科学家提出了Glove算法。
Glove算法很好地把MF这种全局的方法和SkipGram这种局部的方法整合在了一起。Glove的计算效率很高、效果也很好。
3.6 Glove和Word2Vec、 LSA对比有什么区别?(Word2Vec vs Glove vs LSA)
(1)Glove vs LSA
- LSA(Latent Semantic Analysis)可以基于co-occurance matrix构建词向量,实质上是基于全局语料采用SVD进行矩阵分解,然而SVD计算复杂度高;
- Glove可看作是对LSA一种优化的高效矩阵分解算法,采用Adagrad对最小平方损失进行优化;
(2)Word2Vec vs Glove
- Word2Vec是局部语料库训练的,其特征提取是基于滑窗的;而Glove的滑窗是为了构建co-occurance matrix,是基于全局语料的,可见Glove需要事先统计共现概率;因此,Word2Vec可以进行在线学习,Glove则需要统计固定语料信息。
- Word2Vec是无监督学习,同样由于不需要人工标注;Glove通常被认为是无监督学习,但实际上Glove还是有label的,即共现次数。
- Word2Vec损失函数实质上是带权重的交叉熵,权重固定;Glove的损失函数是最小平方损失函数,权重可以做映射变换。
- 总体来看,Glove可以被看作是更换了目标函数和权重函数的全局Word2Vec。
3.7 Gaussian Embedding
下图中例子里,“AI”在语料库中出现的次数较多,那上面提到的几个模型学出的准确率越高。模型对于出现次数较多的词学出的词向量更加自信,模型对于出现次数较少的词学习的词向量把握不太大。
我们希望找到一种方式来评估模型学到的词向量的自信度(Confidence)。我们可以想到把每个单词的词向量表示成一个分布,比如:
其中, 是模型学出的单词“AI”的词向量, 是词向量服从的分布。 表示了AI这个词向量, 表示了对结果的不确定性。
每个单词都用高斯分布表示,那怎么衡量两个单词之间的相似度呢?我们可以用KL散度、Wasserstein距离(也叫Earth-Mover(EM)距离,在GAN中非常重要)来度量两个分布之间的相似度。
3.8 Pointcare Embedding
上面提到的模型是在欧式空间中进行的词嵌入,但是也存在一些非欧式空间的一些场景,比如计算地球仪中两个点之间距离。尤其是在物理学和天文学中,有很多非欧式空间的场景,比如一些非欧式空间的数据有层级结构或树型结构。
3.9 Neural Network Language Model
Neural Network Language Model根据之前的单词预测最新的一个单词,这里没有中心词的概念,只通过之前两三个单词来预测后面的一个单词。
4. Contextualized(Dynamic) Word Embedding
上面讲了一些静态的词向量,就是一个单词只能学出一个词向量。在很多的NLP工作里面,一个单词可以表示成很多种意思(即一词多义),如何处理一词多义、考虑单词在上下文中的意思,这个问题是近四年来NLP领域最火热的一个研究方向。就拿Bert模型来说,它是一个很明显的分水岭,想把它得到的上下文词嵌入运用到工业界里。年起学者都在研究静态的词向量,大概从年起大家慢慢的开始重点研究上下的词向量。
4.1 Contextualized Word Embedding简述
第一个例子中的第一个“apple”指苹果公司,第二个“apple”指水果苹果。假如我们用静态的词向量,那在整个语料中“apple”只能表示一个意思,不能表示单词在上下文中的一个区别。
第二个例子中的第一个“back”指后背,第二个“back”指倒车。第三个例子中的第一个“学习”是动词,第二个“学习”是名词。单词的词性和词义在上下文中不同,我们希望学到的词向量也是不一样的。
4.2 LSTM-based Model
4.2.1 CoVe
下图a)是一个经典的Seq2Seq模型,我们以机器翻译任务训练模型的Encoder和Decoder部分。我们可以通过这种方式学习出带有上下文的词向量。那么我们为什么可以通过这种方式学习到带有上下文的词向量呢?
从下图b)中我们可以知道,由于Encoder和Decoder都是BI-LSTM模型,模型本身含有语句上下文的信息。因此,用静态词向量输入Encoder编码器就可以得到含有上下文的词向量。我们把含有上下文的词向量和静态的词向量拼接在一起,就可以解决某些特定的任务。
4.2.2 ELMo
CoVe使用了机器翻译任务的Loss训练模型,而ELMo训练目标就是语言模型,根据上下文预测下一个单词。通过语言模型从左到右训练的方式,我们也叫做Autoregressive Model。
要从ELMo得到一个单词的词向量,我们可以把静态词向量,拼接第一层隐层向量,再拼接第二层隐层向量,最后再拼接第三层隐层向量,就得到了这个单词的完整的含有上下文的单词向量。比如,单词“今天”的词向量为:
4.3 Transformer-based Model
4.3.1 From LSTM-based Model to Transformer-based Model
LSTM的缺点:
- 梯度消失、梯度爆炸问题,导致模型不能很好的捕获长期依赖问题。
- LSTM是序列模型,不能并行处理数据。
基于以上问题,所以我们用Transformer来作为模型处理序列数据的基础组件。
(1)Transformer
Transformer由两部分组成:Encoder、Decoder。Encoder部分有许多个Encoder Block组成。每个Encoder Block由五部分组成:
- Self-Attention
- Layer Norm
- Skip Connection
- Forward Network
- Positional Encoding
(2)Self-Attention
Transformer的核心是Self-Attention,而在Transformer的每个Encoder Block中都是由个Self-Attention组成的Multi-Headed Attention。关于Self-Attention和Multi-Headed Attention的内容,可以看我之前的文章:《Self-Attention与Transformer》。
4.3.2 GPT
ELMo用LSTM作为基本组件,GPT用Transformer的Decoder作为基本组件。GPT用语言模型训练。GPT的优点是使用了Transformer结构,解决了LSTM的缺点问题。
GPT存在的问题:由于GPT是从左到右单向训练语言模型,没有考虑当前预测单词右边的信息,是一种单向的训练方式。
4.3.3 BERT
BERT使用Transformer的Encoder结构作为自己的组件。BERT训练的时候,随机把语料库中15%的单词做Mask操作。对于15%的单词做Mask操作分为三种情况:80%的单词直接用[Mask]替换、10%的单词直接替换成另一个新的单词、10%的单词保持不变,用这种方式训练的语言模型叫做MLM(Masked Language Model)。其实BERT的目标函数的核心思想来自于图像领域的DAE。
4.3.4 RoBERTa
基于BERT有很多的改进,比较直接的改进是RoBERTa。这个模型针对BERT来讲没有太大的区别,更多的还是在训练的过程中做了一些改进,所以总结起来有四点改进:
- 训练的时间更长,训练的Batch更大,训练的数据更多。
- NSP任务被移除,因为很多研究者表明NSP任务在BERT中起到的作用不大,ALBERT中也指出NSP任务在BERT中作用不大。
- RoBERTa训练在更长的序列中。
- 在BERT里面,Mask Token是在数据预处理过程中进行的,所以不管数据循环训练多少次,Mask Token是不变的。在训练RoBERTa时,针对每个训练数据是重新随机的选取Mask Token。
4.3.5 MASS
MASS模型既使用了Transformer的Encoder部分,也使用了Transformer的Decoder部分。MASS的训练过程更像是Translation Machine的过程,它有点类似于上面提到的CoVe模型。MASS主要工作原理是:在Encoder的输入部分随机Mask掉一些单词,然后在Decoder部分预测输出被Mask掉的单词。
4.3.6 XLNet
(1)What are the problems of BERT?
- Training and Testing discrepancy。BERT模型在训练的时候,训练数据是随机Mask掉一些单词,但是在测试或预测的时候输入的数据是没有Mask操作,这会导致训练数据和测试数据不一致的问题。
- Independent assumption of predicted tokens。比如,BERT模型需要预测句子“今天是[MASK]讲[MASK]”中被Mask的单词。BERT首先根据上下文“今天、是、讲”来预测出“周日”,再根据上下文“今天、是、讲”预测出“CV”,但是“周日”和“CV”是有一定关系的,BERT模型并没有考虑预测单词之间的关系。
(2)Two Objectives: Autoregressive vs Autoencoding
- AR:Autoregressive Language Modeling
- AE:Autoencoding Language Modeling
AR语言模型:指的是依据前面(或后面)出现的tokens来预测当前时刻的token,代表有 ELMo, GPT等。
forward:
backward:
AE语言模型:通过上下文信息来预测被mask的token,代表有 BERT , Word2Vec(CBOW) 。
二者有着它们各自的优缺点:
AR 语言模型:
- 缺点: 它只能利用单向语义而不能同时利用上下文信息。ELMo 通过双向都做AR模型,然后进行拼接,但从结果来看,效果并不是太好。
- 优点: 对生成模型友好,天然符合生成式任务的生成过程。这也是为什么GPT能够编故事的原因。
AE 语言模型:
- 缺点: 由于训练中采用了 [MASK] 标记,导致预训练与微调阶段不一致的问题。BERT独立性假设问题,即没有对被遮掩(Mask)的 token 之间的关系进行学习。此外对于生成式问题, AE 模型也显得捉襟见肘。
- 优点: 能够很好的编码上下文语义信息(即考虑句子的双向信息), 在自然语言理解相关的下游任务上表现突出。
所以,AR方式所带来的自回归性学习了预测 token 之间的依赖,这是 BERT 所没有的;而 BERT的AE方式带来的对深层次双向信息的学习,却又是像ELMo还有GPT单向语言模型所没有的,不管是有没有替换 “[MASK]”。于是,自然就会想,如何将两者的优点统一起来? 这时就到了XLNet登场的时间。
(3)XLNet原理
XLNet模型为了获得上下文信息,对一个句子排列组合出所有可能的顺序,这样就有点类似于双向语言模型的感觉。
5. Model Compression
上面讲了许多词嵌入的模型,但是有许多模型参数巨大,不能在有限的机器上训练出来,在工业界落地那就更难了。因此,有一部分学者就在模型压缩方面做了一些工作,我认为在未来一段时间很多工作都会围绕模型压缩来做。模型压缩有以下几种方式:
- Sparse Priors。这个压缩方法是从贝叶斯想法过来的。如果你之前了解过在逻辑回归上使用正则来得到稀疏参数,跟L1正则相对应的是Laplace Priors,就是我把先验放到参数上面,使得模型在训练过程中自动的学到一些稀疏参数。比较经典的论文是《Bayesian Compression for Deep Learning》。
- Sparse Matrix Factorization。如下图所示,假如模型里有两层、,这两层之间的参数矩阵是,维度很高且非常稀疏,维度为。我们可以用矩阵分解的方法分解为两个低纬度矩阵,基于这种方法论的一个模型是ALBERT。
- Knowledge Distillation。有两个Model:Student Model和Teacher Model。Student Model层数更少、参数更少、模型更小,输入、输出和Teacher Model一样,用来模拟Teacher Model。
5.1 ALBERT(Sparse Matrix Factorization)
ALBERT发现Transformer的第、、层参数可视化后,学到的东西很类似,用一个参数矩阵来表示、、层参数,做到多层参数共享,节省内存空间。
5.2 TinyBERT(Knowledge Distillation)
TinyBERT有两个模型如下图所示,左边的Teacher(BERT)有层,右边的Student(TinyBERT)有层,知识蒸馏就是把左边的模型迁移到右边的模型,且。
6. Summary
7. Reference
本文是Microstrong在观看李文哲在B站上讲解的直播课程《Distributed Representation: From Static Embedding to Contextualized Embedding》的笔记。视频地址:https://www.bilibili.com/video/BV1EK411p7Nd?p=1 。
【1】【NLP系列直播2】From Static Embedding to Contextualized Embedding,贪心学院,地址:https://www.bilibili.com/video/BV1EK411p7Nd?p=1
【2】李文哲老师直播课深入浅出词嵌入技术,地址:https://www.bilibili.com/video/BV1tt4y1C7Cm?from=search&seid=17022969140118519703
【3】nlp中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert - JayLou娄杰的文章 - 知乎 https://zhuanlan.zhihu.com/p/56382372
【4】XLNet详解 - Microstrong的文章 - 知乎 https://zhuanlan.zhihu.com/p/110204573
【5】The Illustrated Transformer,地址:https://jalammar.github.io/illustrated-transformer/