【大模型系列篇】词向量 - 从Word2Vec到ELMo
🔥🔥🔥首先安利一个比较不错的忍不住就想一键三连的大模型科普: 大模型科普专栏 - AI老兵文哲(哔哩哔哩)
词向量(又叫词嵌入)已经成为NLP领域各种任务的必备一步,而且随着BERT、GPT等预训练模型的发展,词向量演变为知识表示方法,但其本质思想不变。 生成词向量的方法有很多种,本文重点回顾Word2Vec到ELMo。
常见的词嵌入方法:
Word2Vec:由Google提出的模型,包括CBOW(Continuous Bag of Words)和Skip-Gram两种变体。Skip-Gram模型试图通过给定一个词来预测其上下文,而CBOW模型则通过上下文来预测中心词。
GloVe(Global Vectors for Word Representation):由斯坦福大学提出的方法,基于词语的全局共现矩阵,通过矩阵分解技术将词语嵌入到向量空间中。
FastText:由Facebook提出的改进版Word2Vec模型,考虑了词的子词信息,从而可以更好地处理未登录词(OOV,Out-of-Vocabulary)。
BERT(Bidirectional Encoder Representations from Transformers):由Google提出的基于Transformer架构的模型,能够生成上下文相关的词嵌入,即同一个词在不同的句子中会有不同的向量表示。
词嵌入技术的优点包括:
-
降低维度:将高维的词语表示转换为低维的向量表示,便于计算和存储。
-
捕捉语义相似性:在向量空间中,语义相似的词语之间的距离较近。
-
改进下游任务性能:词嵌入可以作为各种自然语言处理任务(如文本分类、情感分析、机器翻译等)的基础表示,显著提升模型性能。
总之,词嵌入技术通过将词语表示为向量,使得计算机能够更好地理解和处理自然语言,从而在各种自然语言处理任务中发挥重要作用。
词向量
让计算机理解人类的语言是一件很 Cool 的事情,而首先要做的就是将单词表示成一个数值向量(称为词向量),以方便计算机处理。比较直观的做法有one-hot 编码和共现矩阵等。
one-hot 编码
one-hot 编码,首先构造一个容量为 N 的词汇表,每个单词可以用一个 N 维的词向量表示,词向量中只有单词在词汇表的索引处取值为 1,其余为 0。
one-hot 编码主要的缺点是:当词汇表的容量变大时,词向量的特征空间会变得很大;另外 one-hot 编码不能区分单词之间的相似度,同时具有强稀疏性。
共现矩阵(Co-Occurrence Matrix)
通过统计一个事先指定大小的窗口内的单词共同出现的次数,此时将词划分为两种,中心词和其他词。假设现在语料库中只有三个句子 “I have a cat”、“cat eat fish”、“I have a apple”,则可以构造出单词间的共现矩阵 A。例如 “I” 和 “have” 在两个句子中共同出现过,因此在 A中的权重为 2;而 “I” 和 “cat“ 只在一个句子中共现, A 中权重为 1 。
矩阵 A 的每一行就代表了一个单词的词向量,与 one-hot 编码类似,使用共现矩阵的词向量的维度也非常大。也可以使用 SVD (奇异值分解) 对 A进行分解,从而得到更低维度的词向量,但是 SVD 算法的时间复杂度较高,对 n×n 的矩阵进行 SVD 分解的复杂度为 。
Word2Vec
《Efficient Estimation of Word Representation in Vector Space》- Word2Vec
(2013)
Word2Vec词向量模型,可以用数值向量表示单词,且在向量空间中可以很好地衡量两个单词的相似性,它的核心思想是通过词的上下文得到词的向量化表示。
Word2Vec是轻量级的神经网络,其模型仅仅包括输入层、隐藏层和输出层,模型框架根据输入输出的不同,主要包括CBOW和Skip-gram模型。
两种模型的区别在于 CBOW 使用上下文词预测中心词,而 Skip-Gram 使用中心词预测其上下文单词。CBOW适合于数据集较小的情况,而Skip-Gram在大型语料中表现更好。
图为 Word2Vec 论文中的 CBOW 和 Skip-Gram 模型图,接下来介绍 Skip-Gram 和 CBOW。
CBOW
Simple CBOW Model
为了更好的了解模型深处的原理,我们先从Simple CBOW model(仅输入一个词,输出一个词)框架说起。
如上图所示:
-
input layer输入的X是单词的one-hot representation(考虑一个词表,里面的每一个词 都有一个编号,那么词 的one-hot表示就是一个维度为的向量,其中第i个元素值非零,其余元素全为0,例如: );
-
输入层到隐藏层之间有一个权重矩阵W,隐藏层得到的值是由输入X乘上权重矩阵得到的(细心的人会发现,0-1向量乘上一个矩阵,就相当于选择了权重矩阵的某一行,如图:输入的向量X是[0,0,1,0,0,0],W的转置乘上X就相当于从矩阵中选择第3行[2,1,3]作为隐藏层的值);
-
隐藏层到输出层也有一个权重矩阵W',因此,输出层向量y的每一个值,其实就是隐藏层的向量点乘权重向量W'的每一列,比如输出层的第一个数7,就是向量[2,1,3]和列向量[1,2,1]点乘之后的结果;
-
最终的输出需要经过softmax函数,将输出向量中的每一个元素归一化到0-1之间的概率,概率最大的,就是预测的词。
了解了Simple CBOW model的模型框架之后,我们来学习一下其目标函数。
输出层通过softmax归一化,u代表的是输出层的原始结果。通过下面公式,我们的目标函数可以转化为现在这个形式
CBOW Multi-Word Context Model
了解了Simple CBOW model之后,扩展到CBOW就很容易了,只是把单个输入换成多个输入罢了(划红线部分)。
对比可以发现,和simple CBOW不同之处在于,输入由1个词变成了C个词,每个输入到达隐藏层都会经过相同的权重矩阵W,隐藏层h的值变成了多个词乘上权重矩阵之后加和求平均值。
Skip-gram
有了CBOW的介绍,对于Skip-gram model 的理解应该会更快一些。
如上图所示,Skip-gram model是通过输入一个词去预测多个词的概率。输入层到隐藏层的原理和simple CBOW一样,不同的是隐藏层到输出层,损失函数变成了C个词损失函数的总和,权重矩阵W'还是共享的。
一般神经网络语言模型在预测的时候,输出的是预测目标词的概率,也就是说我每一次预测都要基于全部的数据集进行计算,这无疑会带来很大的时间开销。不同于其他神经网络,Word2Vec提出两种加快训练速度的方式,一种是
Hierarchical softmax(多层softmax)
,另一种是Negative Sampling(负采样优化)
。
Word2Vec 的优点:模型简单;训练速度快;训练中会考虑单词的上下文,比之前的 Embedding方法维度更少,所以速度更快。
Word2Vec 的缺点:上下文窗口较小,也没有使用全局的单词共现信息;每个单词的词向量是固定的,无法解决一词多义的问题。
词嵌入算法 Word2Vec。与传统的 one-hot 编码、共现矩阵相比,词嵌入算法得到的词向量维度更低、也可以更好地支持一些下游的任务,例如文档分类,问答系统等。
GloVe
《GloVe : Global Vectors forWord Representation》
全局向量的词嵌入,通常简称为GloVe
,是一种用于将词语映射到连续向量空间的词嵌入方法。它旨在捕捉词语之间的语义关系和语法关系,以便在自然语言处理任务中能够更好地表示词语的语义信息。
常见的词嵌入算法有基于矩阵分解的方法和基于浅层窗口的方法,Glove 结合了这两类方法的优点生成词向量。基于矩阵分解的方法可以有效地利用全局信息,但是在大数据集上速度慢;而基于浅层窗口的方法对于词汇类比任务效果较好,训练速度快,但是不能有效利用全局信息。
词嵌入算法 Glove,结合两类词嵌入算法的优点。
第一类是 Matrix Factorization (矩阵分解) 方法,例如 LSA;
第二类是 Shallow Window-Based (基于浅层窗口) 方法,也称为基于预测的方法,例如 Word2Vec。
GloVe模型将 LSA 和 Word2Vec 的优点结合在一起,既利用了语料库的全局统计信息,也利用了局部的上下文特征 (滑动窗口)。Glove 首先需要构造单词共现矩阵,并提出了共现概率矩阵 (Co-occurrence Probabilities Matrix)的概念,共现概率矩阵可以通过单词共现矩阵计算。
ELMo
ELMo来自于论文《Deep contextualized word representations》(2018)
word2vec和glove这两种算法都是静态词向量算法,它们都存在一个问题,词在不同的语境下其实有不同的含义,而这两个模型词在不同语境下的向量表示是相同的;
ELMo是一种动态词向量算法,就是针对这一点进行了优化,来自于语言模型的词向量表示,也是利用了深度上下文单词表征,该模型的优势: (1)能够处理单词用法中的复杂特性(比如句法和语义) (2)这些用法在不同的语言上下文中如何变化(比如为词的多义性建模)
针对点1,作者是通过多层的stack LSTM去学习词的复杂用法,论文中的实验验证了作者的想法,不同层的output可以获得不同层次的词法特征。对于词义消歧有需求的任务,第2层会有较大的权重,对于词性、句法有需求的任务,对第1层会有比较大的权重。
针对点2,作者通过pre-train+fine tuning的方式实现,先在大语料库上进行pre-train,再在下游任务的语料库上进行fine tuning。
ELMo模型有三个优点:
-
ELMo具有处理一词多义的能力。因为ELMo中每个单词的嵌入并不是固定的,在将这个单词的词嵌入输入双向LSTM之后,它的值会随着上下文内容的不同而改变,从而学到了和上下文相关的词嵌入。
-
ELMo具有不同层次的表征能力。我们知道,对于一个多层的网络来说,不同的深度具有不同的表征能力,越接近输入层的网络层学到的特征越接近输入的原始特征,而越接近网络输出层的网络层学到的特征则具有很好的语义表征能力。ELMo使用了对多层LSTM的输出进行自适应加权的结构(attention),使用其可以根据下游任务自适应调整ELMo的输出,让其与下游任务相适应。
-
ELMo具有非常强大的灵活性:除了ELMo本身的输入可以根据调整外,ELMo还可以以各种形式和下游任务进行结合。通过ELMo得到的仅是当前时间片的输入的编码结果,因此可以加入到输入层,隐层,输出层中。
ELMo是最早的一批将深度学习应用到词向量学习的任务中,它的思想对后续的BERT等产生了巨大的影响。