在自然语言处理中常常使用词嵌入。先来看看词嵌入是什么,以及为什么使用词嵌入。

为什么要使用词嵌入

以中文为例,词库中至少包括几千个字,几万个词,将其代入模型时,如果使用onehot编码,则变量有成千上万个维度,参数数量和计算量都非常庞大;且无法计算词间的近似性,无法使用“类比”方法将学到的规则泛化到近义词上,也不利于进一步的迁移学习。

词嵌入可将词的特征映射到较低的维度,比如用200维特征描述词库中所有的词,使用模型参数更少,训练更快。

词嵌入可视为给每个组一个n维的编码,能某一维度可能描述词性,另一维度描述感情色彩;用特征描述取代符号描述,类似于机器视觉中使用深度网络提取图片的基本特征。也便于对比、泛化、以及知识迁移。比如使用大量自然语言数据训练了足够好的词表征,在具体任务中使用少量实例fine-tune和pretrain训练好的词嵌入数据训练模型。模型对于fine-tune训练集中从未出现,但在词嵌入中出现的词也能有很好效果,从而实现知识迁移。

除了作为特征提取器,还可通过词嵌入实现运算,比如:男-女=国王-王后,因此可通过国王-男+女的运算得出王后,从而实现一些类比相关的逻辑推理功能,以及性质变换。

将onehot编码转换成词嵌入

通过矩阵乘法可完成onehot编码到词嵌入的转换,假设词库中包含10000个词,词嵌入200维,onehot变量乘矩阵E可得到词嵌入,E的大小为10000x200,onehot编码型如[0,0,…1,…0],因此乘法相当于过滤出E矩阵中的某一列,作为该词的词向量表示。矩阵中的权重通过训练得到。可以视为用每一列描述一个具体词的特征。

训练Embedding层

训练深度学习模型是一种有监督学习,为了利用互联网上庞大的文本数据。一般使用前N个词预测第N+1个词,比如使用“白日依山”作为x,通过词嵌入编码为200x4=800维的输入特征,预测下一个字为y’,y’是词库中每个词是第N+1字的概率。通过上述算法,即可使用未人工标注的数据训练模型。像BERT,GPT-2等目前流行的模型都使用这种方法训练,它们不仅训练了词向量,还使用深度网络学习了语法语义等其它关系。

Word2Vec的skip-gram模型

skip-gram的原理是根据相关词同时出现的情况估计词义。它在句中随机选定一个词作为上下文context,然后从其附近n个词的范围内随机选择一词作为目标target,构建有监督学习的训练集,用上下文训练目标。模型包含词嵌入矩阵,并在最后一层加入Softmax,以便输出概率。它只有一个词输入和一个词输出,比上面介绍的模型更加简单。训练出的模型并不用于解决具体问题,只用于训练词嵌入。上述只是基本原理,具体使用时,还涉及采样时对停用词以及低频词的处理,优化Softmax速度等方法。

腾讯词向量使用了skip-gram的改进版本,其中包括800多万中文词和短语,将每个词展开成200维向量。

Word2Vec的CBOW模型

CBOW是连续词袋模型Continuous Bag-of-Word Model的简称,它用上下文词来预测中间词。

如图所示,使用前两个和后两个词(共C=4个)预测中间的词w,其中每个词被映射成V维的词向量;每个词向量乘以参数矩阵A(VN维矩阵),转换成N维数据,然后将所有词对应的N维的数据相加取均值,计算出N维的隐藏层Hidden;再用隐藏层乘参数矩阵B(NV维),计算待预测的词w对应的V维词向量;最终用预测出的w与真实的w作比较计算误差函数,然后用梯度下降调整A,B两个参数矩阵。由此,使用简单的神经网络就完成了预测任务。

GloVe词向量

GloVe方法比较简单,全称是Global vectors of word representation。它计算目标target有多少次出现在上下文context中。对于每一个句子,其中的词a出现时词b出现与b出现时a也出现的次数是一致的,因此二者具有对称性。

比如k是单词orange,那么它juice(设为单词i)同时与它出现的概率肯定比它与book(设为单词j)同时出现的概率高。相比单词同时出现的概率,单词同时出现的概率的比率能够更好地区分单词。经过推导,最终得到公式:

其中V为词库中的所有词,X为词汇共现矩阵,​Xik表示词k出现在词汇i上下文中的次数总和,wi,wk分别为词i和k对应的词向量,f是权重函数,如果ik未同时出现过,则f(Xik)=0,不将其计入目标函数,f还用于均衡高频词于低频词的影响。通过统计词库中各个词组合同时出现的概率训练模型。

posted on 2020-06-28 21:11  xieyan0811  阅读(113)  评论(0编辑  收藏  举报