自然语言处理领域中的词嵌入方法综述
2024-01-11王子威文俊浩
曾 骏,王子威,于 扬,文俊浩,2,高 旻,2
1.重庆大学 大数据与软件学院,重庆 401331
2.信息物理社会可信服务计算教育部重点实验室(重庆大学),重庆 400044
词嵌入作为解决自然语言处理(natural language processing,NLP)任务中的核心步骤,其目的是将离散字符格式的文本数据,转换成模型能够处理且蕴涵丰富内隐语义信息的连续实值向量,即生成词向量[1](也称词的分布式表示)。对于计算机视觉领域而言,其处理的数据为图片格式,由于图片在计算机中直接以数值类型的矩阵表示,原数据自身携带了丰富的信息,通过简单的数据预处理即可直接作为模型的输入。而NLP 任务所处理的对象是字符格式的文本数据,机器学习和深度学习模型不能直接对文本字符串输入进行学习。因此如何将文本数据转换成模型可以处理的实值向量格式,并将语料库中蕴含的丰富内隐知识信息嵌入到生成的词向量中,是词嵌入方法所关注的重点和难点。
生成词向量的方法有很多,例如,独热编码(onehot encoding)能够为词汇表中的每个词生成一个唯一的one-hot 向量作为词的向量表示,该向量维度大小与词汇表中的单词数相等,词汇表中的每个词都对应一个索引编号,每个词所对应的one-hot 向量只有在索引编号位置处的维度的值为1,其余维度的值均为0。虽然使用one-hot 向量作为词的向量表示能够解决数据的格式转换问题,但是由于其0值过多而导致的稀疏性问题、词向量维度过高导致的维度灾难问题以及语义鸿沟问题(任意两个词之间相互独立,难以刻画词与词之间的相似性)限制了NLP 模型整体的性能提升[2]。
表示学习(representation learning)是一种自动从大量原始数据中学习每个词的特征表示(特征向量)的方法,其基于预定义的规则进行模型性能的提升。这一过程涉及将学习到的特征表示储存为模型的一部分,以便更有效地捕捉和表达词汇的语义信息。这样的表示学习方法旨在优化模型对输入数据的理解,使得模型能够更精确地处理各种NLP 任务[1]。Hinton[2]提出了词的分布式表示(distributed representation)这一概念,利用表示学习方法,将每个词从离散的数值空间(即one-hot向量)映射到连续且稠密的高维特征空间,使用这些具有丰富特征信息的稠密向量作为词的特征表示,即词向量。Bengio等人[3]使用神经网络(neural network)搭建神经概率语言模型(neural probabilistic language model)来学习词的特征表示。
词嵌入利用表示学习方法并结合语言模型(language model,LM)和预训练任务,能够将语料库中所蕴含的丰富内隐知识信息嵌入到低维稠密的词向量中,进而为每个字符格式的单词生成一个数值格式的词向量。使用这些经过预训练生成的词向量作为每个词的特征表示,可以直接对输入的文本序列进行建模并作为下游任务模型的输入来解决各种NLP 任务(如自然语言推理任务、情感分析任务、文本摘要任务、问答任务以及文档分类任务等),不仅能够提升模型的整体性能,还可以加速模型在训练阶段的收敛速度[4-6]。
使用LM 在语料库上进行训练,学习词与词之间的语义关联,最终生成词的特征表示,是目前词嵌入方法的主流范式[1]。词嵌入的第一个步骤是对语料库进行分词处理构建词汇表,根据构造的词汇表可以对输入的文本序列进行分词操作(Tokenization)并将每个单词映射为词向量。然而,在开放域的NLP任务中,大量未登录词(未在词汇表中出现的词)和多义词(一个字或词在不同语境下表达不同的含义)的出现限制了模型性能的进一步提升。(1)为了解决开放域中的未登录词问题,针对英文这类符号语言的子词(sub-word)分词模型[7-8],在整词(whole word)切分的基础上,进一步将整词拆解成更细粒度的子词。使用子词拼接的方式对未登录词进行重构,进而解决未登录词问题。(2)为了解决多义词问题,研究人员通过引入预训练语言模型(pre-trained language model,PLM)对输入序列进行建模,生成能够根据输入序列的上下文语境动态改变词向量语义的特征表示[6,9]。其中PLM 是指经过预训练的LM(参考2.4.5小节)。预训练属于迁移学习的范畴,即预先使用一些目标函数对模型进行初次训练,从而更好地完成模型参数的初始化。预训练阶段使用的数据规模一般较大,因此模型能够更好地学习到大规模数据中内隐的通用知识。
词嵌入方法已从基于词频的统计学习方法发展至如今由神经网络驱动的深度学习方法,神经网络的强大拟合能力使得LM 能够充分地学习并存储语料库中丰富的内隐知识,并生成高质量的词向量。词嵌入作为NLP领域的基础研究点,目前已有很多研究工作从不同角度对词嵌入方法进行综述。文献[10-11]着重分析并罗列了经典的词嵌入模型。文献[11]从生成词向量时是否融入上下文信息的角度梳理了词嵌入模型。文献[12]介绍了基于预训练语言模型BERT(bidirectional encoder representations from transformers)[13]的词嵌入模型。文献[14]分析并罗列了词嵌入方法发展历程及各阶段出现的模型,并对词嵌入方法在自然语言处理下游任务上的应用进行了综述。部分研究工作将词嵌入的发展阶段划分为基于机器学习的词频表示向量阶段、基于浅层神经网络的词的分布式表示阶段和基于双向注意力模型的上下文词向量阶段。本文以2013 年提出的word2vec[4]和2017 年提出的Transformer[9]作为划分依据,从生成的词向量是否能够通过捕获输入文本的上下文特征来动态地改变其语义这一角度,将词嵌入方法划分为静态词嵌入方法和动态词嵌入方法。静态词向量是指词向量一旦训练完毕,其维度和数值不再改变,因此只能表达固定语义,并通过模型微调的方式进行更新;而动态词向量能够通过PLM 捕获输入序列的上下文语境信息,进而动态地改变自身数值,使其所表达的语义信息与输入序列的语境相匹配。
文献[15]与本文对词向量的划分观点一致,并总结了用于生成静态词向量和动态词向量的神经网络模型。本文从词向量生成的全过程这一角度对词嵌入方法进行探讨,对词嵌入中的分词方法、训练词向量所使用LM 的演化进行综述,对词嵌入方法中的静态词嵌入方法和动态词嵌入方法展开讨论,总结词向量质量的评估方法,分析词嵌入方法的现状并对其未来发展方向进行展望。
1 词嵌入方法在自然语言处理任务中的作用
词嵌入方法通过学习语料库中的内隐知识,生成嵌入语义和语法等特征信息的连续稠密词向量。在解决自然语言处理任务时,需要根据具体任务进行模型结构设计,但无论是何种模型,都只能接受数值格式的输入数据。因此,解决自然语言处理任务的第一步就是使用词嵌入方法生成词向量,并通过词向量对输入的文本序列进行建模,将文本序列中的每个词映射到词的嵌入空间,实现自然语言文本到数值向量的转换。
当前,处理NLP 任务主要有两种范式:基于静态词嵌入的表示学习范式和基于动态词嵌入的“预训练+微调”范式,如图1所示。
图1 词嵌入方法在自然语言处理任务中的作用Fig.1 Role of word embedding methods in natural language processing tasks
在基于静态词嵌入的表示学习范式下,对输入文本进行分词处理后,通过与词汇表进行映射,直接使用经过预训练的静态词向量作为输入序列的初始化特征表示输入模型[16-17]。
对于“预训练+微调”范式,其在静态词嵌入的基础上引入了PLM,将输入序列进行分词处理后,直接输入PLM来学习每个单词的全局上下文语境信息,最终将PLM输出的特征向量作为输入序列的词向量[18-19]。
2 词嵌入方法
生成词向量的流程如下:(1)基于分词规则对语料库中的文本进行分词处理,生成词汇表;(2)参照词汇表对语料库中的自然语言文本进行切分,将切分后的每个词通过词汇表映射成数值格式的索引(索引被称作Token,该过程称作Tokenization),最后将这些索引作为LM 的输入,并根据目标函数对LM进行预训练;(3)使用PLM 的部分隐藏层参数[4](静态词向量)或输出层输出的特征向量[13](动态词向量)作为词向量。本章对词嵌入方法中使用的分词方法和语言模型进行分析,并对静态词嵌入和动态词嵌入方法展开探讨。
2.1 分词
分词作为词嵌入方法中的基础任务,其目的是根据一定的规则将语料库中非结构化的连续文本集合,分解为结构化的以字或词为最小单位的数据结构,以便于后续处理和分析,并根据拆分后的字词创建词汇表V,V=[{1:word1},{2:word2},…,{n:wordn}],其中n为词汇表大小。对同一个语料库使用不同的分词规则会产生不同的词汇表,在训练词向量时,需要参照词汇表对输入的文本序列进行切分。因此,分词操作对词向量的生成和模型的整体性能产生直接的影响。根据分词粒度的不同,分词可划分为整词切分和子词切分。
2.1.1 整词切分
整词切分是指以整个词或词组为最小单元对文本序列进行拆分。对于英文这类符号语言,单词之间以空格为边界,因此可以直接以空格为分隔标记对语料库进行分词。然而,对于中文这类象形文字语言,输入文本的表现形式为连续的字符串,词与词之间没有明显的分隔符,且象形文字自身蕴含丰富的语义信息,因此针对中文这类象形文字语言的分词一直是分词技术存在的挑战[20]。
针对中文的分词存在切分歧义和未登录词识别两大挑战[21]。切分歧义是指在切分中文字符序列时,在序列的不同位置切分会产生截然不同的语义。未登录词(out of vocabulary,OOV)是指没有在词汇表中预先定义的词汇,如网络词汇、人名、机构名称等。中文分词算法可分为基于词汇表匹配的机械分词方法[22]、基于机器学习的统计分词方法[23]和基于深度学习的统计分词方法[24-25]。
2.1.2 子词切分
在开放域的自然语言处理任务中,大量OOV 的出现导致模型无法对这些未在词汇表中记录的词汇进行表示。在遇到OOV 时,一般将其映射为词汇表中的特殊字符,如“|UNK|”。一种直接的解决方法是不断地对词汇表进行扩充,但是这种方式并不能够从本质上解决OOV 问题,且该方式也会造成模型的灵活性和鲁棒性不足[26]。
对于符号语言来说,子词是介于整词和单个字符之间的一种粒度。为了解决OOV 问题,针对英文这类符号语言的子词切分算法将整词按照一定规则,继续拆分为单个字母或连续的字母片段,在遇到未登录词时,通过词汇表中所记录的子词进行合并,来对OOV进行重建[7,27]。
BPE(byte pair encoding)子词切分算法[7]是对字节压缩算法BPE(1994)[28]进行的改进。BPE[7]首先将单词拆解成单个字母并使用贪心算法每次选择语料库中词频最高的字母对或子词对(subwords-pair),并将其进行合并,生成新的子词,通过不断的迭代,最终生成包含子词的词汇表。同时,BPE[7]也很好地平衡了词典大小和解码器的解码效率。
与BPE[7]不同,WordPiece[27]通过最大化语言模型的词共现概率来选取合适的字母进行合并。ULM(universal language model)[8]通过基于Uni-Gram 语言模型的子词拆分算法,使其生成的子词带有概率信息,从而能够更好地对OOV进行重建。
另一方面,子词还带有整词所不具备的一些信息,如词根信息和词性信息。Kudo[8]也详细分析了子词切分的优越性。在NLP 领域中,大多数高性能的模型在处理数据时均使用子词切分来获取词汇表,如ELMo(embeddings from language models)[6]使用Character CNN[29]进行分词,UniLM(unified language model)[30]、SpanBERT[31]、BERT[13]和StructBERT[32]使用WordPiece[27]进行分词,ALBERT(a lite BERT)[33]和XLNet[34]使用SentencePiece[35]进行分词。GPT(generative pre-trained transformer)[36]、GPT-2[37]、XLM(cross-lingual language model)[38]、RoBERTa(robustly optimized BERT approach)[39]以及MASS(masked sequence to sequence pre-training for language generation)[40]使用BPE[7]进行分词。
表1为部分文本预处理工具,这些预处理工具提供了文本的分词、命名实体标注、词性标注、近义词匹配、关键词提取以及文本分类等功能。
表1 文本预处理工具Table 1 Text preprocessing tools
2.2 语言模型
语言模型(LM)是一个函数或学习这种函数的算法,它通过根据先前词序列对出现概率最大的下一个词进行预测,用于捕获自然语言序列中词汇分布的统计特征[41]。语言模型作为自然语言处理领域的基石,通过对文本序列进行建模,学习语料库中词与词之间的共现关系,并生成词的分布式表示[4-5]。词向量是训练语言模型生成的附属产物,因此性能良好的LM 对生成词向量的质量起着决定性作用。语言模型可分为基于词频统计信息的概率语言模型、基于神经网络搭建的神经概率语言模型以及能够建模双向上下文信息且模块深层堆叠的深度上下文语言模型。
2.2.1 概率语言模型
概率语言模型是用于人机交互的自然语言系统的重要组成部分,其建模的目标是在一种语言的语料库中学习单词序列的联合概率函数[3],或者说是预测输入序列中的每个词汇在当前上下文中出现的条件概率[42]。自20 世纪80 年代以来,概率语言模型建模的主流方法大多为基于非参数学习的N-gram 模型[43-44],使用one-hot 向量作为每个词的向量表示,并基于观测序列的部分上下文预测下一位置出现概率最大的词[41]。
以N-gram 语言模型为例,其具体处理步骤如式(1)和式(2)所示。首先对输入的文本序列S进行建模,S=[w1,w2,…,wl],wt表示输入序列中的第t个词,l表示输入序列长度。在给定上下文St-N+1,t-1的条件下对wt进行预测。N是一个常量,其含义为假设当前词只与其前N个相邻的词有关联。需要优化的目标函数为P(wt|St-N+1,t-1),C(wiwj)表示wi和wj在语料库中共现的次数,|V|为词汇表的大小。
2.2.2 神经概率语言模型
神经概率语言模型使用神经网络的中间隐藏层参数作为词向量的权重[3]。神经概率语言模型根据搭建语言模型所使用的神经网络可分为:前馈神经网络语言模型(forward feedback neural network language model)[45-47]和循环神经网络语言模型(recurrent neural network language model)[6,48-49]。
神经概率语言模型的建模目标为P(wt|St-N+1,t-1)=f(t,E(wt-1),E(wt-2),…,E(wt-N+1),θ),其中f表示神经网络模型,θ为神经网络中可学习的参数,N表示在预测第t位置的词wt时,需要考虑t位置之前的N个词,即N-gram。E表示f中对应的词嵌入矩阵,E∈R|V|×d,d表示词向量维度,d<<|V|。wi为输入序列中第i个位置词的one-hot 向量,。模型训练完毕后,词嵌入矩阵E中的每一行即为词汇表V中对应位置的词向量。
2.2.3 深度上下文语言模型
使用语言模型对语料库进行建模能够使模型通过拟合语料库的数据分布,来学习语料库中蕴含的知识信息[4-6,9,13]。然而,随着语料库规模的增大,使用结构简单的神经网络作为特征提取器的神经概率语言模型,并不能够充分地拟合大规模语料库中的数据分布,从而导致模型欠拟合问题的出现,限制了词向量质量的进一步提升。因此,语言模型需要使用特征抽取能力更加强大的特征提取器来适应蕴含更加丰富的知识信息的大规模语料库。
使用单向循环神经网络,如LSTM(long shortterm memory network)[50],搭建语言模型来训练词向量,并不能够同时捕获中心词的双向上下文信息,因此生成的词向量缺乏建模时的双向上下文信息。另一方面,捕获输入序列的双向上下文信息能够进一步提升模型的性能[6],如在机器阅读理解任务和完形填空任务中,只考虑单向的上下文可能导致模型预测出错误的结果。ELMo[6]分别使用两个前向和后向的LSTM[50]作为特征提取器对输入序列进行自回归式的特征提取,并通过将前向特征和后向特征拼接的方式实现双向上下文特征的捕获。然而这种方式并不能够实现同时对双向上下文特征进行学习,且效果与完全由注意力机制驱动的Transformer 网络结构具有一定差距[13]。
Transformer[9]是由多层结构更为复杂的编码器模块(Transformer-encoder module,TEM)和解码器模块(Transformer-decoder module,TDM)堆叠搭建的“编码器-解码器”网络。相较于传统的RNN(recurrent neural network)网络:(1)Transformer[9]引入的自注意力机制(self-attention mechanism,SAM)使其能够同时捕捉序列中不同位置之间的双向上下文关系;(2)SAM使其能够并行处理序列中的所有位置,而不是像RNN一样必须按照时间步序列进行单向的顺序处理(step-by-step)。SAM 作为Transformer[9]模块的核心组成部分:①其完全由矩阵乘法运算驱动的计算模式实现了模型的并行计算,大大提升了Transformer[20]网络的训练速度;②在SAM 中,输入序列中的每个单词可以交互并影响所有其他单词,而不仅仅是固定数量的邻居,这使得Transformer[9]模块可以更好地捕捉长距离依赖关系;③SAM 中的多头机制(multi-head)允许模型将单词的表示分为多个不同的表示子空间,以更好地捕获输入序列中的不同信息,这一机制大大提高了Transformer[9]模块的性能表现和泛化能力;④Transformer[9]模块中还使用了残差连接和层归一化等技术,使得模块可以深层堆叠而不会出现梯度消失和性能衰退问题。Transformer[9]的提出可以被视为AI(artificial intelligence)领域的一个里程碑,直接驱动了AI大模型时代的到来。
TEM由多头自注意力层、归一化层、线性连接层,并结合残差连接搭建而成,TDM 在TEM 的基础上添加了交叉自注意力层,用于与TEM端进行注意力分布的计算。基于TEM[13,31-32,39,51-53]或TDM[36-37]或同时使用TEM 和TDM 深层堆叠搭建的语言模型[30,34,38,40,54-55]也被称为深度上下文语言模型。Transformer[9]模块的双向上下文建模能力、可深层堆叠以及高效的并行计算能力,使得深度上下文语言模型能够结合自监督学习,高效地在大规模语料库上进行预训练,进而学习并存储大规模语料库中蕴含的通用知识。
2.3 静态词嵌入
语言模型在训练完毕后,其内部的中间隐藏层参数被单独取出并存储,作为词向量映射表。隐藏层张量的维度为RV×D,其中V与词汇表中的词数相等,D为词向量的维度。词向量映射表中的每一行作为词汇表中对应位置词的词向量。由于模型参数在训练完成后不再发生改变,词向量的维度和其内部蕴含的内隐信息也随之固定,因此通过上述方式生成的词向量称为静态词向量。
本文将静态词向量的生成方法归纳为四类方法:(1)基于矩阵分解的静态词嵌入;(2)基于上下文窗口的静态词嵌入;(3)基于全局矩阵分解和局部上下文窗口静态词嵌入;(4)基于神经翻译模型的静态词嵌入。
2.3.1 基于矩阵分解的静态词嵌入
使用独热向量(one-hot)、词袋模型((bag-ofwords)和共现矩阵(co-occurrence matrix)作为词的向量表示会导致稀疏性问题(即向量中零值元素过多,模型难以捕获有效信息)、维度灾难(即向量维度随词汇表大小呈线性增长)和语义鸿沟(即无法衡量词与词之间的相似程度)问题的出现。基于矩阵分解的静态词嵌入通过使用语料库中词的出现频数作为信息,创建“词-词”或“词-文档”共现矩阵,使用矩阵分解算法,如奇异值分解(singular value decomposition,SVD),将共现矩阵分解为特征矩阵和正交矩阵,并对正交矩阵使用归一化操作生成每个词的低维稠密词向量。
HAL(hyperspace analogue to language)[56]构 建“词-词”共现矩阵C,C∈RV×2V,其中Cij表示在句子中第j个词和第i个词之间的距离,V表示词汇表大小。通过对矩阵C中的每行选择d个方差最大的值作为每个词的特征进行降维来得到每个词的词向量。
LSA(latent semantic analysis)[57]提出含义相近的词在文章中总是共同出现这一观点,并通过对整个文档集合进行统计分析,使用词在文档中出现的频数作为权值构建“词-文档”共现矩阵W,其中行向量表示词,列向量表示文档,Wij表示词i在文档j中出现的次数,之后对共现矩阵W的行向量进行归一化操作并执行奇异值分解实现降维来挖掘词的潜在语义信息,最终产生低维稠密且包含词的语义信息的词向量。
为了减少类似于“a”“an”“the”或“and”等这类词汇,虽然高频出现但并不会影响句子整体语义的影响,COALS(correlated occurrence analogue to lexical semantic)[58]将HAL[57]的共现矩阵进行归一化操作,并将矩阵中所有负相关数据置零来克服负相关的不可靠性,从而得到新的满足高维稀疏性且可使用SVD快速分解“词-词”共现矩阵。
2.3.2 基于上下文窗口的静态词嵌入
从直观上讲,和中心词距离较近的词与中心词之间的相关性更强,能够提供更多有用信息。为了学习中心词的强相关特征,基于上下文窗口的方法限制模型在学习中心词的上下文分布时,只考虑当前上下文窗口内的k个词对中心词的影响。
win(wi)=[wi-k/2,wi-k/2+1,…,wi+k/2],其中S表示原始输入序列,wi为序列中的第i个词,win(wi)表示中心词wi的局部上下文(滑动窗口),k表示窗口的长度。
文献[4]提出了CBOW(continuous bag-of-words)模型和Skip-Gram 模型用于训练词向量。CBOW 模型根据中心词的上下文来预测中心词,即P(wi|win(wi))。与之相反,Skip-Gram 模型则根据中心词来预测中心词的上下文,即P(win(wi)|wi)。
Mnih 和Kavukcuoglu[59]在CBOW 和Skip-Gram的基础上进行改进提出了vLBL 模型。与CBOW 不同的是,vLBL 只预测窗口中的一个词来提升模型推理速度,同时添加注意力权重和噪声对比评估NCE(noise contrastive estimation)来提升模型学习词的上下文分布的能力。
2.3.3 基于全局矩阵分解和局部上下文窗口的静态词嵌入
基于矩阵分解的模型虽然能够通过构建“词-词”共现矩阵或“词-文档”共现矩阵的这种方式,充分利用每个词在语料库中的出现频数来捕获词的全局信息,然而词的频数并不能够充分地反映词与词之间的相关性,即词的局部上下文信息。基于上下文窗口的模型虽然能够通过上下文窗口只关注与中心词最相关的上下文,从而捕获中心词的局部上下文信息,却丢失了词的全局性信息。
词的全局向量表示(global vectors for word representation,GloVe)[5]是一种新的全局对数双线性回归模型,通过同时引入全局矩阵分解和局部上下文窗口方法,实现对词的全局词频信息和局部上下文信息的捕获。GloVe[5]的建模过程为:基于整个语料库构建全局词频共现矩阵X,X∈RV×V,V为词汇表大小。Xij表示在词wi的局部上下文窗口中,词wj出现的次数。GloVe[5]使用建模词wi、wj、wk之间的关系,其中Pij表示词wj出现在词wi的上下文窗口内的概率。
模型训练时的损失函数如下:
其中,vi表示词wi的词向量,f(x)表示权重函数,xmax和α为超参数,bi表示偏置向量。Xij表示在词wi的局部上下文窗口中,词wj出现的次数。训练目标为最小化损失函数Loss,即根据全局词频信息来指导函数优化,使具有较强关联的词之间距离更近,弱关联词之间距离更远。
2.3.4 基于神经翻译模型的静态词嵌入
静态词向量是在特定的NLP 任务上训练语言模型而生成的附属产物。NLP 任务种类繁多,在不同任务上训练出的词向量的质量也有所差异。
机器翻译任务作为NLP 领域一个具有挑战性的任务,对模型的特征学习能力要求很高,因此通过机器翻译任务训练出来的模型具有较强的特征学习能力,生成的词向量质量相对更高[60]。机器翻译任务的主流模型为“编码器-解码器”框架,首先使用编码器将一个语种的文本序列进行建模并学习其特征表示,之后使用解码器对特征表示进行解码生成其他语种的文本序列[9,27,61]。
神经机器翻译模型的出现使得机器翻译任务得到了进一步的发展[61]。Hill 等人[62]通过实验证明,基于神经翻译模型编码器预训练获取的词向量,比通过语言模型编码器获取的词向量在语义相似性任务上的效果更好。另一方面,注意力机制的引入使模型能够为中心词的上下文分配不同权重,使中心词能够更多地关注与自身具有强相关的上下文,减小弱相关词对其的负面影响。
CoVe(contextualized word vectors)[63]基于神经机器翻译模型并结合注意力机制,在机器翻译任务上进行语言模型的训练来生成词向量。CoVe[63]的建模过程如下,首先使用预训练完成的GloVe[6]词向量将原始输入序列S={w1,w2,…,wn}中的每个词映射到对应的词嵌入空间,得到S′=GloVe(S)。之后将S′输入神经翻译模型获得S′ 的特征表示=CoVe(S′)=MT-LSTM(S′),其中MT-LSTM 是 以双向LSTM 作为特征提取器搭建的“编码器-解码器”框架,并在解码器端添加注意力机制的神经机器翻译模型,最后与GloVe[5]向量进行拼接得到具有上下文特征信息和全局词频信息且带有一定语法和语义信息的词向量=[GloVe(wi);CoVe(wi)]。
训练词向量是一个耗时耗力的工作,为了更好地推进NLP 领域的发展,不少研究人员开源了预训练完成的词向量。Qiu等人[64]开源了在数十种中文语料库(百度百科、维基百科、人民日报、知乎、微博、文学、金融等)上训练生成的中文词向量(https://github.com/Embedding/Chinese-Word-Vectors)。https://github.com/Embedding 开源了使用多种模型预训练生成的词向量。FastText[65]、Word2Vec[4]、GloVe[5]也开源了通过预训练生成的词向量(FastText 词向量下载地址:https://github.com/facebookresearch/fastText/blob/master/docs/crawl-vectors.md;Word2Vec 词向量下载地址:https://code.google.com/p/word-2vec/;GloVe 词向量下载地址:https://nlp.stanford.edu/projects/glove/)。
2.4 动态词嵌入
静态词嵌入通过对语料库中的全局词频信息和窗口内的局部上下文信息进行建模,并结合分层Softmax(hierarchical Softmax)和负采样(negative sampling)策略[66]等优化方法,能够简单高效地训练出低维稠密且蕴含语法、语义信息的词向量。然而,静态词向量训练完毕后其表示的含义也随之固定,因此静态词嵌入不能够处理多义词问题[6]。
基于预训练语言模型(pre-trained language model,PLM)生成的动态词嵌入方法,能够生成根据输入序列的全局语境信息动态地改变词向量参数分布的动态词向量,解决了多义词问题。本节对动态词向量的生成和基于深度上下文语言模型的动态词嵌入模型进行介绍,并对进一步提升动态词向量质量的一系列研究进行分析。
2.4.1 动态词向量的生成
与静态词向量的生成方式相比,动态词向量是基于PLM 生成的。由于PLM 已经在大规模语料库中完成了预训练过程,能够捕获输入序列的整体语境信息并将其嵌入输出层输出的特征向量之中[6,13]。
动态词向量的生成经过两个步骤:(1)对输入序列中的每个词,使用PLM 中的词嵌入层对其进行建模,将其映射到连续的向量空间;(2)使用PLM 对经过词嵌入层处理的输入序列进行建模并学习其全局上下文特征,并在PLM 输出层生成输入序列中每个词的动态词向量。经过PLM 处理后输出的词向量被动态地嵌入了输入序列的整体语义信息,能够根据输入序列动态地改变其语义,解决了静态词向量存在的一词多义问题。
动态词向量的生成过程如图2 所示。其中S表示原始输入序列,S=[w1,w2,…,wl-1,wl],l表示输入序列长度,V表示输入序列S经过词嵌入层映射,生V=E(S),V=[v1,v2,…,vl-1,vl],V∈Rl×d,d表示词向量维度,E表示词嵌入层,H表示经过PLM 处理后,输出层输出的动态词向量。表示动态词向量的维度,PLM表示预训练语言模型。
图2 动态词向量的生成Fig.2 Generation of dynamic word vectors
ELMo[6]作为较早提出的用于生成动态词向量的PLM,使双向LSTM作为基座来建模输入序列的双向上下文信息。然而,双向LSTM 本质上还是两个独立的单向LSTM,通过将两个方向的特征向量进行拼接这种方式,并未实现真正意义上的双向上下文信息同时建模。另一方面,RNN 的串行推理模式限制了模型的计算速度,这导致此类模型难以高效地在大规模数据中进行预训练。
基于Transformer 模块[9]搭建的深度上下文语言模型很好地解决了基于RNN搭建的语言模型所存在的上述问题。Transformer 模块[9]内部的SAM 赋予了模型双向上下文建模和并行计算能力,确保了深度上下文语言模型在大规模语料库中的高效训练;残差连接和归一化操作使得模块在多层堆叠时模型的整体不会出现衰退,令深度上下文语言模型能通过深层堆叠来拥有足够多的参数,进而存储足够多的知识信息,缓解了RNN 模型在大规模语料库下存在的欠拟合问题。
2.4.2 自编码语言模型和自回归语言模型
自编码(auto-encoder,AE)和自回归(auto-regressive,AR)是两种使用最为广泛的预训练方式,它们能够使模型在大规模无标记语料库上进行自监督式的训练。深度上下文语言模型可以根据所使用的预训练方式划分为:自编码语言模型(auto-encoder language model,AELM)和自回归语言模型(auto-regressive language model,ARLM)[34]。
(1)自编码语言模型:自编码训练方式是指将原始的输入序列按照一定规则进行破坏,如使用“|Mask|”标记符(使用“|Mask|”标记符替换的Token叫作被掩码词,Mask被称为掩码。使用“|Mask|”标记符替换输入序列中某一位置的Token 这一过程被称为Mask操作)替换部分Token(在自然语言处理领域中,无论是整词切分还是子词切分,模型的输入序列中的每个单元都被称为Token)或删除部分Tokens[51],而AELM 的训练目标就是将这些被破坏的序列进行重建还原[13]。这样就可以将原序列作为标签,实现语言模型在无标签数据上进行自监督式的训练。但AELM 可能会出现模型在预训练阶段和微调阶段的训练目标不一致问题[12-13,39],从而导致误差的产生[55]。如在预训练阶段引入的“|Mask|”标记符并不会出现在下游任务的微调阶段。
大多数AELM 使用TEM[9]模块堆叠作为语言模型的主体框架[13,31-32,34,39],并结合AE 的训练目标,使深度上下文语言模型能够在大规模无标签语料库上高效地进行预训练,提升深度上下文语言模型的自然语言理解(natural language understanding,NLU)能力,使其能够更好地处理情感分类、抽取式问答、自然语言推理、文本语义相似度检验、机器阅读理解等一系列NLU任务。
(2)自回归语言模型:AR 是统计学习上一种用于处理时间序列的方法,即根据历史上文内容预测下一时间步可能出现的单词。自回归语言模型是按照step-by-step 方式串行推进,因此是自左向右或自右向左的单向语言模型。
与基于TEM[9]的AELM 相比,ARLM 的最大优势在于,其step-by-step 的推理方式能够直接体现出文本之间的位置信息,使得ARLM 能够更加自然地适配自然语言生成式任务,如生成式文本摘要任务、生成式问答任务、机器翻译任务等。
ARLM 大多基于单向的TDM[9]进行搭建[36-37],或使用双向TEM[9]和单向TDM[9]搭建“编码器-解码器”框架,在编码器端建模输入序列的上下文特征生成隐向量,并根据隐向量在解码器端使用自回归的方式重建目标序列[38,40,54-55]。
2.4.3 对模型的参数体量和预训练语料库规模的研究
自从预训练语言模型BERT[13]利用大规模的预训练语料库、大体量的模型参数以及更多的训练步数,在一系列自然语言任务上实现性能的显著提升以来,不少研究人员围绕模型的参数体量和预训练语料库的规模展开了进一步的探索。
Liu 等人提出RoBERTa[39]深度上下文语言模型证明了这一猜想,RoBERTa[39]在BERT[13]使用的训练数据集BookCorpus[67](16 GB)的基础上,添加了更大的训练语料库CC-NEWS[68](预处理后76 GB)、Open-WebText[69](38 GB)和STORIES[68](31 GB),使用了更大的模型训练步数(500 000),以及更大的BatchSize(8 000 个序列),在多个NLP 任务上使模型性能得到了进一步的提升。You 等人[70]使用32 000 大小的BatchSize 进行BERT 模型的训练,探究了BatchSize对模型性能的影响。Megatron-LM[71]使用72 层的Transformer 模块[9]进行堆叠,模型参数量为8.3 亿。Turing-NLG[72]使用78 层的Transformer 模块[9]进行堆叠,模型参数量达到了17亿。
Qiu 等人[73]认为NLP 模型的性能可以通过增加模型的参数量和在更大规模的语料库下训练得到进一步提升。Baevski 等人[74]也证明了增加训练数据大小能够提升下游任务的性能。当前,千亿参数体量的ChatGPT、GPT4等大模型的提出,也进一步证实了当模型体量和训练数据达到一定规模时,会出现知识的涌现现象。
2.4.4 对掩码策略的研究
掩码学习策略的提出[13]使模型能够在大规模的无标签语料库上进行自监督式的训练,充分地学习语料库中蕴含的通用知识。掩码学习受到完形填空任务(Cloze Task)[75]的启发,以BERT[13]为例,掩码学习的具体做法为在输入句子中随机选择15%的Tokens作为掩码候选词集合C,在C中80%的Tokens用“|Mask|”标记符替换,10%的Tokens 保持不变,剩余10%的Tokens用随机词替换,即:
其中,S表示分词后的原始输入序列,l表示序列长度,掩码学习的目标就是根据对S进行重建还原。其中“|CLS|”和“|SEP|”标记符分别表示输入序列的起始和终止标记,语言模型的任务为学习S的上下文表征并预测被“|Mask|”标记符所替换的原始Tokens。“|Mask|”标记符的引入使得大量的非结构化无标签文本数据被充分地利用起来。
由于语言模型在进行预测时不能捕获掩码词之间的相关关系,即每个“|Mask|”标记符之间是相互独立的。另一方面,“|Mask|”标记符的引入会导致预训练和微调阶段的不一致,即“|Mask|”标记符只有在预训练阶段才会被引入,进而产生了人为误差。
为解决上述问题,XLNet[34]提出了排序语言模型(permutation language model)预训练任务,即在不引入“|Mask|”标记符的情况下,根据原始输入序列的下标S,生成length(S)! 个全排列列表,例如S=[1,2,3,4,5],List=Perm(S)=([3,5,4,1,2],[1,2,5,3,4],…),其中Perm(∙)为排序函数,之后从List里选取部分列表并生成对应的自注意力矩阵来控制上下文的关注范围。当Listk=[1,5,4,2,3],预测下标i=3,即id等于4 位置的Token 时,该位置的Token 不仅注意到了id=1 的Token还注意到了id=5的Token,这样不仅捕获了每个词的上下文信息,且没有引入“|Mask|”标记符,同时模型是以自回归的方式进行推演,因此模型还具备很好的文本生成能力。同时,为解决BERT[13]不能很好地处理长序列问题(即输入序列长度超过512个Tokens 时导致时间和空间复杂度过大和性能衰退),XLNet[34]使用Transformer-XL[76]模型进行搭建,并提出了相对位置编码。
BERT[13]提出的掩码学习使得每个输入序列在整个模型训练过程中只对应唯一的掩码列表,因此不能很好地捕获句子的多样性信息。RoBERTa[39]提出了动态掩码策略,对每个输入序列按照一定概率生成多个不同的掩码列表,在模型预训练过程中,每个输入序列在每轮迭代都会从掩码列表候选集中随机采样,因此在整个模型训练过程中,每个序列使用相同掩码列表的次数会大大降低。
由于深度上下文语言模型在分词时均在子词粒度进行切分,子词分词虽然解决了OOV问题,但输入序列中存在大量的子词,导致在执行掩码预测任务时模型难以充分地学习单词或词组的整体语义。为此,ERNIE(百度)[51]提出了三种掩码策略来缓解子词切分所产生的不完整语义问题:(1)基掩码策略(basic-level masking)[39],即原始的子词掩码;(2)词段掩码策略(phrase-level masking),使用词段分割工具识别句子中的词段(例如词组和短语);(3)实体掩码策略(entity-level masking),由于句子中的命名实体往往包含着句子的重要信息,将句子中的实体进行掩码处理。ERNIE[51]通过三种掩码策略使得模型生成的词向量能够捕获更加丰富的语义信息。
MacBERT[77]提出了Mac(mask language model as correction)掩码策略,使用整词掩码并结合N-gram机制,对多个整词使用“|Mask|”标记符替换。由于“|Mask|”标记符的引入会导致人为误差的产生,MacBERT[77]使用Synonyms 工具包[45]将“|Mask|”标记符位置的词替换为相似词来缓解人为误差对模型性能的影响。
SpanBERT[31]使用范围掩码(span masking)策略,每次使用一个“|Mask|”标记符替换多个相邻的Tokens,并对掩码范围内的所有“|Mask|”标记符进行预测来捕获整词和词组的语义。
UniLM[30]将掩码预测任务扩展至多语种场景,分别使用TEM[9]搭建单向语言模型、双向语言模型以及Seq-to-Seq 语言模型执行掩码词预测任务,以学习不同语种之间的语义关联。
2.4.5 对预训练任务改进的研究
预训练任务可以视为模型从语料库中学习知识的途径,对于NLP 中的预训练任务,研究人员一直在努力改进,目的是使得模型能够更加充分且高效地学习语料库中的内隐知识。
XLM[38]在训练多语种翻译任务时,对原始端序列和目标端序列同时添加“|Mask|”标记符来增加任务难度,迫使模型在翻译文本时从原始文本抽取更多的信息。
为了学习单词的结构语义信息和句子的结构语义信息,StructBERT[32]将执行掩码操作后序列中Tokens 的顺序打乱,通过使模型还原Tokens 的原始顺序这种训练目标来学习单词级别的结构语义信息;在预测句子对之间的顺序关系时,针对句子S1,在1/3 的训练时间步中选取S1的下一个句子S2作为S1的句子对(S1,S2),1/3 的训练时间步中选取S1的前一个句子S0作为S1的句子对(S0,S1),其余1/3 的训练时间步中从其他文档中任选一个句子Sk作为S1的句子对(S1,Sk),这三种句子之间的关系分别对应标签label={1,2,0},通过训练模型正确分类句子对的类别来学习句子级别结构语义信息。
在模型训练时除了使用标准的掩码学习策略[10]之外,BART(bidirectional and auto-regressive transformers)[54]还引入了:(1)Token 删除任务,即删除一些Token,使模型检测缺失位置;(2)文本填充任务,以往的模型如SpanBERT[31]每次Mask 掉多个连续的Token 并用等数量的“|Mask|”标记符替换,而BART[54]一次Mask 掉多个Token 但只使用一个“|Mask|”标记符代替,模型预测“|Mask|”标记符之前,首先预测被“|Mask|”标记符覆盖的范围中Token的数量;(3)句子排序任务,文档中的句子随机排序,使模型预测文档中句子的正确顺序;(4)文档翻转任务,将一个文档从中间切分,并互换顺序,使模型去识别文档开始的Token位置。
MacBERT[77]摒弃了BERT 的(next sentence prediction,NSP)任务[13]而选择难度更大的句子序列预测(sentence order prediction,SOP)任务,即预测句子之间的顺序关系。
ELECTRA[52]受到生成对抗网络(generative adversarial network,GAN)[78]的启发提出了单词替换检测任务,使用两个TEM[9]分别作为生成器和判别器,生成器用于执行原始的掩码预测任务[13],判别器在MLM 的基础上[13]进一步判别生成器预测的“|Mask|”标记是否和原始词相同。
2.4.6 对融入知识信息的研究
使用深度上下文语言模型在大规模语料库下进行预训练,虽然能够捕获语料库中丰富的内隐知识,但是在处理专业领域问题时,往往由于缺少特殊领域的专业知识信息而导致模型性能出现大幅度的衰退。对于预训练阶段使用的语料库而言,绝大多数的数据为网络爬取的非结构化数据,因此只能够为模型提供通用知识。为了解决通用知识向专业领域迁移时所存在的问题,大量研究人员针对如何引入专业领域知识展开探讨。
K-BERT[53]通过知识图谱将领域知识融入模型,使模型输出的特征表示(动态词向量)中嵌入了专业的领域知识信息,进而提升模型在领域下游任务的性能。在知识图谱中,知识是以三元组的形式进行表示,即ε={ei,rj,ek},ε∈K,其中ε表示一个知识,K表示一个专业领域的知识图谱,ei和ek分别表示两个命名实体,rj表示两个命名实体之间的关系。KBERT[53]从3 个知识图谱CN-DBpedia[79]、HowNet[80]、MedicalKG 中获取知识三元组。对于输入序列S,S=[w1,w2,…,wl],首先提取S中的所有命名实体词EKG,并在知识图谱K中检索每个实体词ek∈EKG所对应的所有关系r与实体ekr作为知识ε,最后将ε拼接到每个实体词之后得到带有领域知识信息的输入序列SKG,SKG=[w1,w2,…,ei{(ri0,ei0),(ri1,ei1),…,(rik,eik)},…,wl],使模型在捕获通用知识的同时能够学习到专业的领域知识。
与K-BERT[53]通过引入知识图谱捕获领域知识的做法不同,ERNIE[51]认为如果模型在预训练阶段能够学习到更多的先验知识,那么模型就能够输出高质量的特征表示。因此,ERNIE[54]并没有采用通过直接添加知识三元组的方式来学习先验知识,而是通过对话语言模型(dialogue language model,DLM)在对话数据集上学习对话文本中隐藏的知识信息,如实体间的关系、实体的属性和事件的类型。
人类能够不断地积累通过学习或经验获得的知识,从而有效地开发新技能。受到人类学习方式的启发,ERNIE-2.0[81]添加了针对不同粒度的预训练任务(单词级别、句子级别和语义级别)来学习语料库中不同粒度的内隐信息,并采用持续多任务学习[82]的训练方式进行模型参数的更新。持续多任务学习是指模型在不同任务上并行地进行训练,首先使用一个简单的任务训练一个初始模型,然后不断地引入新的预训练任务对模型进行参数更新。当一个新任务到来时,使用前一个任务的参数对模型进行初始化并与先前所有任务一起训练,以缓解模型对先前任务中所积累知识的遗忘。
命名实体词往往带有非常关键的语义信息,LUKE(language understanding with knowledge-based embeddings)[83]为了更加充分地利用实体知识信息,在带有实体标签的语料库上对语言模型进行预训练来学习实体知识,并在词嵌入层引入实体类型嵌入向量,通过对实体词添加额外的实体向量来增强模型对序列中实体的关注度。此外,LUKE[83]还通过引入实体掩码任务让模型预测被“|Mask|”标记符替换的实体,以最大程度地学习实体知识信息。
CoFEE(coarse-to-fine entity knowledge enhanced)[84]提出了一种Coarse-to-Fine 的预训练方式用以学习不同粒度的知识。CoFEE[84]首先利用维基百科给出的锚点来抽取出若干实体,并在二分类任务上训练模型区分实体词和非实体词;之后根据每个实体对应的实体类型,使用多分类任务训练模型学习实体所属类别;最后对于每个类别下的所有实体,模型根据其特征表示进行聚类,从而得到更加细粒度的类别标签并返回模型继续进行学习。Coarse-to-Fine 的训练方式使得模型能够通过逐步执行不同粒度的实体任务,从而学习不同粒度的实体知识信息。
2.4.7 对模型参数压缩的研究
随着各种大体量预训练语言模型的提出,各种下游任务的state-of-the-art被不断刷新,但是模型的参数体量也朝着大幅度增长的趋势发展,如RoBERTalarge[39]有3.55 亿参数,GPT2-xl[37]有15 亿参数,GPT-3[85]的参数达到了惊人的1 750 亿,高额的存储空间要求和计算资源消耗使各种大体量模型难以有效地部署在硬件条件有限的平台或终端设备。为此,不少研究人员开始研究通过对模型进行压缩来减少模型参数体量并提升模型训练和推理速度。
模型压缩的主要手段有模型剪枝、知识蒸馏、参数量化、低秩分解和参数共享。ALBERT[33]使用词嵌入矩阵分解和跨层参数共享的方式大幅度减少了模型的参数体量。(1)词嵌入矩阵分解是将高维度的词嵌入矩阵拆分为两个低维度的子矩阵,即,其中V为词汇表大小,d为隐藏层维度,m为中间维度,m远小于d。这样模型的复杂度由O(V×d)减小为O(V×m+m×d)。(2)对于参数共享,ALBERT[33]通过共享所有堆叠的Transformer 模块[10]的参数,来防止模型参数量随着模块堆叠深度的增长而增长,把单层模型变成伪多层(即参数量减少,但模型的计算量没有改变)。Lan 等人[33]还证实了这两种压缩方式不仅能够实现模型压缩,还能够作为一种正则化的方式增强训练稳定性并提升模型泛化能力。
DistilBERT[86]、BERT-PKD(patient knowledge distillation)[87]、MiniLM[88]以及TinyBERT[89]使用知识蒸馏的方法,通过构建“教师-学生”网络,使用小体量模型作为学生模型去学习大体量教师模型的参数分布,从而在实现模型参数压缩的同时,最大程度地提升模型性能。
DistilBERT[86]通过设计如下蒸馏损失函数来指导学生模型对教师模型的参数学习。
其中,ti是教师模型未经归一化操作的输出特征,si是学生模型未经归一化操作的输出特征(也称logits),并使用温度系数来控制平滑程度,使学生模型能够充分学习到教师模型的参数分布。
DistilBERT[86]通过对BERT[13]模型使用知识蒸馏的方法,使其模型参数量减少为BERT-base[13]的40%,推理速度提升了60%,但仍保持BERT-base 模型[13]97%的NLU能力。
BERT-PKD[87]提出了弱知识蒸馏,从教师模型的中间层学习知识,避免只学习大体量模型输出层时出现的过拟合问题。通常来说,“|CLS|”标记符用于表示整个句子的语义信息,BERT-PKD[87]为了避免中间层学习的计算量过大,仅指导学生模型学习“|CLS|”标记符在教师模型各中间层输出的特征分布。
MiniLM[88]针对BERT[13]的自注意力层进行蒸馏。TinyBERT[89]对BERT[13]的词嵌入层、中间层隐状态以及自注意力层进行蒸馏来全方位地学习教师模型的知识。
3 词向量的评估
嵌入方法通过训练语言模型,将字符型的文本数据映射到高维抽象的嵌入空间,生成词的数值型向量表示,即词向量。使用不同的训练方法生成的词向量,所蕴含的内隐信息也不相同。使用高质量的词向量作为模型的初始化特征表示,不仅能够提升模型的整体性能,还能加快训练时的收敛速度。然而,词向量本身并不具有很好的可解释性[17]。
词向量的评估是非常重要的一个环节,该阶段用于检验生成的词向量质量,根据任务的评价指标来直观地反映词向量的质量。词向量的评估可分为内部任务评估和外部任务评估[90]。本章对词向量的评估方法进行分析和阐述。
3.1 内部任务评估
词向量的内部评估用于度量词向量所蕴含的内隐信息,通过向量运算的方法,如余弦相似度[24,66],计算出词向量之间的一个数值得分,通过数值得分来反映词与词之间语法关系或语义关联的相似程度[91]。内部任务评估需要人工创建带标签的查询数据集[90],如(查询词:“北京”,候选词集合:[“中国”,“首都”,“故宫”,“北京大学”]),根据查询词的词向量与词汇表中的其他词向量进行得分计算,并将得分最高的词向量所对应的词与人工标注的候选词进行对比评估。
因此,在对词向量的性能进行内部任务评估时,首先要创建查询数据集。Schnabel 等人[90]提出了一种数据驱动的方法用于构造进行内部任务评估的查询数据集。Finkelstein 等人[92]创建了WordSim-353 数据集,数据集中数据为三元组{w1,w2,score}的格式,表示词w1和w2的相似性得分为score。Bruni 等人[93]基于图片数据集创建了用于词向量内部任务评估的有标签数据集MEN。Faruqui 和Dyer[94]搭建了一个基于大量查询数据进行词向量自动评估的网站。
内部任务评估主要有相关性任务评估(relatedness)、类比任务评估(analogy)、聚类任务评估(categorization)、语义优选任务评估(semantic preference)、入侵词检测任务评估(intrusion)和名词性别判断任务评估(noun gender)。
(1)相关性任务评估:使用余弦相似度进行度量。
其中,vi是词wi的词向量,通过计算两个词向量之间的距离L,根据词向量之间的距离大小来反映两个词之间的相似程度,词向量之间的距离越远说明两个词的相关性越小,词向量之间的距离越近则说明两个词越相似[24,66]。
(2)类比任务评估:该任务由Mikolov 等人[4]提出,类比任务的目标是给定单词wb、单词wc和单词wd,其中wc和wd存在某种关系r,找出和单词wb存在关系r的单词wa,使等式va-vb=vc-vd成立。如v国王-v王后=v男人-v女人,其中蕴含的关系r为性别。
其中,Voc表示词汇表所对应的词向量集合。
(3)聚类任务评估:使用词向量对数据集进行聚类,生成k个词簇Ci,i=1,2,…,k,每个词簇中的词都具有某些共同的内隐特征,通过每个词的标签计算每个词簇的纯度得分进行词向量的评估。
(4)语义优选任务评估:根据标签判断一个名词是一个动词的主语或者宾语[91]。
(5)入侵词检测任务评估:具有相干性的词之间往往具有相同的邻域,入侵词任务使用无监督聚类的方法用于评估词与词之间的相干性[90]。入侵词检测任务是指在一些具有相干性的词向量集合中添加一个不相干的入侵词wk,通过向量运算来找出入侵词wk。
(6)名词性别判断:对能够反映出性别信息的名词使用二分类的方法判断名词的性别[61]。如雄性、丈夫、国王等这些带有性别信息的名词都表示“性别=男”,而雌性、公主、王后等名词都表示“性别=女”。通过对名词性别的判断可以反映出词向量是否嵌入了性别特征信息。
除了上述内部评估任务以外,还可以根据目标词的词向量进行同义词和反义词匹配完成词向量的评估[95]。Mikolov等人[4]设计了一个“语义-语法”关系词测试集,包括五种类型的语义相似词查询方法和九种类型的语法相似词查询方法,通过词向量间的余弦相似度计算,查找与目标词具有相似语法和语义关系的相似词,通过返回结果的准确度来度量词向量的质量。WordRep(http://research.microsoft.com/enus/um/beijing/events/kpdltm2014/WordRep-1.0.zip)是微软发布的用于评估和训练词向量的基准数据集。
3.2 外部任务评估
内部任务评估可以很好地对词向量所蕴含的各种类别内隐信息进行分析和评估,但是内部任务评估大都需要人工的参与,因此具有较高的时间和人力成本。
与内部评估任务不同,外部任务评估将生成的词向量作为特征直接输入处理NLP 下游任务的模型,根据不同的下游任务评价指标来分析词向量的质量。Arora等人[96]针对静态词向量和动态词向量在多个NLP下游任务上进行了实验,并对两种词向量的优势和劣势展开了深入的分析与探讨。不同的下游任务对词向量所蕴含内隐信息的关注点并不相同[90],如偏向于抽取词向量语法信息的命名实体识别任务[97]。外部任务评估可以通过下游任务的评价指标,直观地对比使用不同方法生成的词向量的质量。然而,仅依靠外部任务评估并不能够对词向量内部蕴含的语法、语义等信息进行全面且深度的分析[90]。
除了内部评估和外部评估,还可以通过对词向量进行可视化这种方式,直观地分析词向量所表达的含义。常见做法是将训练好的词向量映射到一维、二维或者三维空间并利用绘图工具将每个词向量在这些低维空间进行绘制[97-98]。通过观察那些具有语义和语法相关性或无关性的词或词簇在低维空间上的距离和分布规律,从而判别词向量的质量。词向量的维度是词向量的重要参数,将单词映射到高维的特征空间能够使词向量从更多的角度进行语义信息的存储,但是当维度过高时反而会对模型的性能产生负面作用[17,99]。表2为NLP领域具有代表性的深度上下文语言模型及其模型结构、使用的分词方法和预训练阶段使用的语料库。
表2 深度上下文语言模型Table 2 Deep contextual language models
4 词嵌入方法的未来发展趋势展望
通过子词切分方法解决开放域任务下的OOV问题,再利用性能强大的预训练语言模型生成能够拟合输入序列整体语境的动态词向量,这一流程已成为目前词嵌入方法的范式。本章对词嵌入方法的未来发展趋势进行分析和展望。
4.1 特征提取器
语言模型通过特征提取器对语料库中的文本序列进行建模和特征提取,结合预训练任务能够将语料库中的内隐知识嵌入到词向量中,使词向量蕴含丰富的语义信息。因此,特征提取器能否高效地抽取出大规模语料库中所蕴含的通用知识,对词向量的质量起重要作用。
特征提取器从结构简单的小体量神经网络[4-6,46,63]发展到如今能够捕获双向上下文且具有并行计算能力的Transformer模块[9,13,31,34,38-39],特征提取器的特征提取能力和计算效率在不断提升,基于此搭建的语言模型的性能和生成的词向量质量也在不断提升。然而,Transformer 模块[9]在处理每个输入单元时都需要对整个句子中的所有单元进行并行计算,这将导致其计算复杂度与输入序列长度呈现线性相关。因此在输入序列过长时,对硬件设备的性能要求很高,这样的高计算成本影响了模型的实际应用。因此,设计更加高效的且具有较低计算成本的特征提取器是词嵌入方法未来发展的一个重要方向。
4.2 模型的推理效率
截至目前,使用动态词向量作为词的特征表示已成为NLP 任务的一个范式。动态词向量本质上是预训练语言模型输出的特征向量,然而高性能的预训练语言模型参数量非常庞大,如有着3.4×108参数量的BERT-large[13]、8.3×109参数量的Megatron-LM[71]、1.7×1010参数量的Turing-NLG[72]甚至是5.3×1011参数量的Megatron-Turing。参数量更大的预训练语言模型其性能也更加优异[73],但是这将导致动态词向量的生成极为缓慢,因而使用动态词向量作为输入的下游任务模型的推理速度也受到了很大程度的限制。与此同时,存储容量和算力有限的计算机或小型移动终端设备并不能够支持大体量模型的部署。Louizos等人[100]通过使用模型剪枝的方式来减少模型的参数量,进而提升模型的推理速度。Shen 等人[101]通过量化的方式实现模型压缩。因此,减少模型参数量并提升模型的推理效率,同时最大程度地确保模型性能,将会是词嵌入方法未来的一个重要发展趋势。
4.3 词向量评估机制
当前词向量的质量评估主要关注于外部任务评估,通过将序列的词向量作为模型的输入,根据具体下游任务评价指标来反映词向量的质量。通过下游任务进行词向量评估虽然可以较为直观地对比不同模型生成词向量的质量,但是这种由具体任务驱动的评价方法很难从多个角度更加全面地对词向量的质量进行评判。内部任务评估法虽然能够从多个角度,如词向量所蕴含的语法信息、语义信息、词相关关系信息等方面,对词向量进行评估[4,90,95],但是当前的内部任务评估方法缺少具有说服力的统一评价指标和统一测试数据集。因此,制作高质量的词向量评估数据集以及制定更多角度的词向量评价指标对词嵌入方法的发展起关键作用。
4.4 词向量的可解释性
通过词嵌入方法能够生成低维稠密且蕴含丰富内隐信息的词向量,将生成的词向量作为词的特征表示输入模型,解决不同的自然语言处理任务的表示学习方式能够提升模型的性能[4-5,24,63]。但对于蕴含丰富知识信息的词向量很难清晰地对其进行分析,即词向量的性能虽然良好,但是可解释性很差。
可解释性对于人工智能领域和词嵌入方法都十分重要,可解释性工作有助于判断模型输出误差并进行修正[102],能够帮助研究人员了解词向量中包含和未包含的各种内隐信息。
之前的研究多从以下两个角度进行词向量的可解释性分析:一是对通过语料库训练生成的词向量进行知识注入,这种方法虽然关注到了知识库对词向量可解释性的重要性,但由于没有采用特征注入的方法,只是简单利用了知识库,无法表明词向量在维度取值和语言特征上的具体关联;二是对词向量生成算法及其生成的词向量进行理论分析,尝试从算法上对词向量做出解释,但由于神经网络自身的不可解释性使得该方式只能结合部分任务对词向量进行解释分析。
使用可视化工具对词向量进行可视化[98]也只能够反映出词向量的部分低维信息。目前已有研究人员对神经网络的可解释性进行了研究[103],但对词向量可解释性的研究仍处于初步阶段。因此,词向量的可解释性也是词嵌入方法需要关注的一个重要研究方向。
4.5 多模态词向量
人类在学习语言的过程中,能够通过自身不同的感官与世界进行交互来获取丰富的外部知识信息,比如图像和声音。因此,除了文本数据以外,其他模态的数据中也蕴含着丰富的知识信息。在一些特殊的任务上,基于纯文本的模型可能会因为缺乏语言的外部模式而削弱表征能力[104]。
学习多模态数据内隐的知识并将其嵌入到词的向量表示中能够使词向量所蕴含的知识更加丰富。Feng 等人[105]首次将多模态思想应用于图像标注等任务。Kiros 等人[106]将视觉特征引入语言模型,提出多模态神经语言模型。Kiela等人[107]研究了听觉感知信息中的语义表示,利用听觉词袋模型(bag of audio words model)来获得音频的特征表示,并尝试多种融合策略将音频与文本进行组合,形成多模态特征表示。Collell 等人[108]提出了一种方法用于学习语言特征到视觉特征的映射,并以此构建词的多模态特征表示。Mao 等人[109]对多模态词向量的训练和评价问题进行了深入的探讨。因此,多模态词向量的研究对NLP领域的发展有着重要作用。
5 总结
通过对语料库进行分词获取词汇表,根据分词粒度大小可将分词算法分为粗粒度的整词切分和细粒度的子词切分,在开放域任务中常使用子词切分算法解决OOV 问题。在获取词汇表后,使用词嵌入方法生成词的分布式表示,即词向量,将词汇表中的每个词或字符映射到一个固定维度的连续稠密特征向量空间,该特征空间中蕴含了丰富的内隐信息。在处理具体的自然语言处理下游任务时,可以直接使用预训练好的词向量作为词的初始化特征表示输入模型,不仅可以提升模型性能,还可以加快模型训练阶段的收敛速度。词嵌入方法的发展经历了从生成只能表达固定语义信息的静态词向量,到如今基于预训练语言模型生成拟合输入序列语境信息的动态词向量。从基于如LSTM 这类小体量神经网络的神经概率语言模型到如今基于Transformer 模块的深度上下文语言模型,用于训练词向量的语言模型的性能也在不断提升,词嵌入方法正在朝着使用更大规模的语料库和更复杂的大体量语言模型的方向发展。