词嵌入(Word Embedding)

目录

 

为什么需要词向量嵌入?

表征的对象是什么?

如何表征?

词向量嵌入矩阵

Skip-Gram

CBoW 

负采样

结语

Reference


为什么需要词向量嵌入?

        在自然语言相关的任务中,我们将句子作为特征输入,然后得到相应的预测输出。相比于其他的任务,自然语言相关任务的特点就是,其输入的特征是句子,不是已经量化好的特征。但是计算机,或者说模型,本质上只能识别数字,只能对数字进行运算和处理,因此,对于符号型的文字,我们需要先进行数字化,这样才能将其作为特征输入。词向量嵌入就是将文字符号进行数字化的一种方式,词向量嵌入就是将单词映射为一个数字向量,即用一个向量去表征一个单词。

表征的对象是什么?

        自然语言任务和其他任务没有什么不同,本质上就是输入一组特征,然后通过模型,再进行样本外的预测。我们既然认为输入的特征可以用来预测输出,那么我们自然是认为输入的特征和输出的预测目标之间是存在稳定的函数关系的,所以我们希望模型可以拟合出这种关系,尽管我们自己并不一定清楚这个具体的关系到底是什么,其可能很复杂,很fancy,以至于我们难以用简单的逻辑去描述,但是可以用万物皆可拟的神经网络去拟合出来。

        因此,我们要表征什么?要表征的就是特征,而特征是具有明确含义的对象,对于一组输入的句子,特征就是句子中的单词,而不是单个的文字,因为单个的文字本身不具有明确的含义,比如我们不会去表征苹字,而是去表征苹果这个具有明确的含义的词语。所以,我们真正需要表征的对象,是作为模型输入的features,也就是具有明确含义的单词或词语。

如何表征?

        我们已经知道为什么要对文字符号进行数字化表征,以及要表征的对象到底是什么。接下来的问题就是,如何去表征这些词语对象。

        首先,不管怎么样,第一步自然是要让计算机可区分不同的单词,所以最简单直接的思路就是,比如有10000个词汇,我们可以直接用1到10000的数字来代表不同的单词,这是对单词最朴素直接的表征。这种朴素的表征方式仅仅是用数字符号代替了文字符号,从而让计算机和模型可识别和处理,数字本身值的大小并不具有任何的含义,仅仅是不同的值代表不同的单词而已。当然,这种表征方式和one-hot独热编码方式本质是一样的,前者用不同的值来表示不同的单词,后者用不同的正交向量来表示不同的单词,如果我们把输入时,作为表征的数值本身的意义作为无用的先验知识,那么两种表征方式没有本质区别。

        当然,上述的朴素的表征方式还不够好,因为我们可以很直观的感受到,不同的单词之间,其不仅仅是不同的单词而已,其还存在着某种联系,比如,苹果和梨应该比苹果和花岗岩之间的关系更加靠近。因此,一种好的表征方式,还应该可以表征出不同单词之间的这种相似性。当然,这种单词之间的联系应该是通用的,不依赖于某个具体的任务而存在,事实上,我们也确实可以较容易的理解,不管是在什么语境下,单词之间就是存在着某种联系,这种联系是通用的。基于此,一种更好的表征方式应该要能够表征出这种联系。

        进一步地,我们可以想到,一个对象是多种属性的集合,当这些不同的属性越靠近,那么两个对象就越相似,这是对相似概念朴素且合理的理解。因此,我们可以用一个多维向量去表征一个单词,不同的维度代表着不同的属性,比如性别、颜色、是不是可食用等,这样,两个向量越靠近,我们就可以认为两个对象越相似,从而,单词对象之间的相似性就可以得到较好的表征。这里向量的相似性可以用余弦相似性来衡量。

        这里需要注意和独热编码的向量方式进行区分。独热编码的向量,不同的向量之间都是正交的,因此不能表达任何的相似性;独热编码中,一个维度只代表一个单词,而不是具体的属性。本质上,独热编码的向量就是一群用来代表不同单词的正交向量而已,和用1-10000的数字来编码没有本质区别。

词向量嵌入矩阵

        至此,我们已经知道需要将不同的单词映射到一个多维向量上,且向量之间的相似性可以表示单词之间的相似性。接下来的问题在于,我们如何获得这个映射。

        词向量嵌入矩阵就是这样的一种映射,使用单词的独热编码乘以这个矩阵,就可以得到该词对应的向量表征。而这个矩阵就是通过神经网络训练得到的权重参数组成的矩阵。具体地,假设我们的词汇量共有10000个,最后得到的向量维度有300维(这里的维度是经验性的,一般在200-600左右,具体的值没有一个标准,是经验性的),那么该矩阵的大小就是1000*300,这样只要我们使用独热编码向量左乘该矩阵,就可以得到表征向量。

        对于嵌入矩阵的训练,需要先确定任务。经过上述分析,该嵌入矩阵是具有通用性的,因此,实际上一般的自然语言相关的任务都可以训练得到该矩阵,当然不同的任务得到的矩阵会有差异。

        现行主流的任务设置是对相邻词的判断。具体地,一组样本的输入是一个单词,对应的target为输入单词在语料库中对应的相邻的单词。当然,最原始的输入单词和target单词都是各自的独热编码向量。这样的任务设置可能并没有直接的现实应用意义,但是其可以很好的学习到单词的表征,即很好的刻画不同单词之间的相似性。可以这样理解这种任务之所以有效:当某两个单词和另外一个单词经常相邻出现,说明这两个单词在很多的句子表达以及语境下,都是可以相互替换的,因此这恰好说明这两个单词具有较高的相似性。

        对于相邻词的任务,采样的方式一般可分为两种:对于语料库中的某个句子,给定句子中的单个中心词作为输入,将多个相邻的单词(context word)作为输出;以及给定句子中的多个context word作为输入,这些连续的context word中心的词作为target word作为输出。这里基于前者的采样方式训练的模型称为Skip-Gram模型,基于后者的称为CBoW(连续词袋)模型。

Skip-Gram

        这里中心词称为center word,跟中心词相邻的单词称为context word。具体有多少个context word,取决于窗口大小,窗口越大,自然context word就越多。具体模型结构如下图所示。其中原始的独热编码向量输入经过嵌入矩阵转换后,就得到了隐层的表征向量,然后表征向量再经过输出层的矩阵映射以及softmax层便准化后,得到输出单词的对应概率值,借此来构造交叉熵损失函数。其中的输入层矩阵就是我们需要的嵌入矩阵,隐层向量就是对于输入单词的表征向量,输出层的矩阵不重要,其表示表征向量和输出单词之间的映射关系,因不同的任务会得到不太一样的输出层映射矩阵。

     图1 

CBoW 

        CBoW模型和Skip-Gram模型差不多,区别在于对于一个句子中可得到的多组样本,是不同的输入对应相同的输出,还是相同的输入对应不同的输出,前者是CBoW,后者是Skip-Gram。CBoW的具体模型结构如下所示,同理,输出层的嵌入矩阵是我们所需要的,隐层向量就是输入单词的表征向量,输出层矩阵不重要,因不同的任务而异。

                                                                            图2 

负采样

        上述已经基本说清了词向量的整个过程。接下来,我们再讲一下负采样。负采样是一种针对上述模型中训练效率低的问题而提出的一种解决方式。首先我们看下,上述模型的训练方式为什么是低效的。

        训练采用的是小批量随机梯度下降算法,一个样本的迭代,在输出的softmax层,需要计算每个单词对应的概率,实际的词汇量可能会很大,所以在softmax层对每个单词计算一次,会产生很大的计算量,问题在于,这些计算量中,除了跟输出单词相连的那些权重会更新之外,其他单词对应的权重实际上几乎不变,这就使得大部分的计算其实都是浪费的,没有必要的。所以,大量的没有必要的计算会使得训练效率变得很低。

        所以,我们的目的是避免这些没必要的计算。对此,负采样的方式下,其先修改了一下任务的定义。起先我们任务的定义是通过给定的输入,预测最可能相邻的单词;负采样将其修改为:给定一组单词,判断其是否属于相邻单词(在语料库中出现过相邻的情形)。对此,负采样将原先找到最可能的相邻单词,转变为是否属于相邻单词,从模型上看,将多分类转为了二分类。

       负采样中,对于给定的一组单词,其中一个单词为中心词,另一个依然单词为target word,当这个target word属于context words时,那么二分类的标签就是1,当这个target word不是context words,而是随机从词汇库中选取的单词时(这就是所谓的负采样,即抽取负例样本),那么二分类的标签就是0.

        这里需要注意负采样中对于输入的处理。负采样是给定一组单词,看起来像是将这组单词都作为普通的输入输给模型,然后模型输出一个是否相邻单词的概率值,对于该任务当然可以这样实现,但是别忘了,我们的最终目的是为了训练得到嵌入矩阵,不是为了将这个任务的准确率提高到很高;因此,我们不能改变模型的输入层,即隐层中的向量只能是对某个单词的表征向量,而不能是某两个或者几个单词的表征的组合,不然会改变嵌入矩阵的含义。这里target word既然不能和中心词一样作为普通输入输给到模型,那么这里的target word该如何使用呢?实际上,这里的target word的作用就是在输出预测时,指明是采用哪个分类器参数。

        在给定一个中心词后,会通过负采样得到非相邻样本,不同的样本具有不同的target word,不同的target word对应不同的输出分类器。相当于在原先的多分类模型结构上,把输出层的N分类换成了N个二分类器,输出层的参数量并没有变化,依然是一个词汇库中的每个单词都和隐层向量进行全连接。这样做的好处是单个样本的更新,不需要计算词汇库中每个单词对应的概率值,而只计算该中心词下那几个样本(context words样本以及负采样得到的样本,一个中心词可以对应1个正例和3-6个反例,共4-7个样本,所以只需要计算4-7个单词对应的输出层权重计算,而不是N个),故计算量会减少很多,避免了不必要的计算。所以,负采样下一个样本中target word的作用就是指明该计算和更新哪个分类器下的参数。

结语

        上述就是关于自然语言处理中最基础的一环——词向量嵌入的概述,讲了我们为什么需要词向量的嵌入,词向量嵌入的对象是什么,一种好的词向量嵌入方式应该具备什么样的特点,以及该特点的直观理解;接下来还讲了应该如何得到嵌入矩阵,以及该如何高效的训练模型得到该嵌入矩阵。

        最后再说明两点。第一点,嵌入矩阵是一种从单词到数字向量之间的映射,该映射使得数字向量可以对不同单词之间的相似性做出较好的表征;嵌入矩阵在自然语言处理任务中的通用性的原因在于单词之间的相似性是因语境带来的差异是很小的,即有某种general的东西存在,使得嵌入矩阵的通用性有所保证。当然,当我们面临某个具体的自然语言任务,在没有嵌入矩阵的情况下,我们依然可以利用独热编码对模型进行训练,相当于让嵌入矩阵在该任务中同时训练生成。如果我们直接利用嵌入矩阵权重作为初始化权重,好处是嵌入矩阵的权重是经过相当多的语料库中的样本专门训练得到的,因此可以更好的表征单词,从而利用嵌入矩阵作为预训练的模型加入某个具体的任务中,可以让模型更加的健壮,性能也会更好。这实际上是一种迁移学习的思想,即利用某个任务训练得到嵌入矩阵,将学习到的一些通用的关系,再作为预训练的模型使用到其他的任务上面,进一步的针对性训练,从而既可以提高具体任务的训练效率,也可以解决具体任务下因为样本不足或者质量较低的问题,即将其他任务学习到的通用知识迁移应用的别的任务上面。

        第二点,就是对嵌入矩阵的训练是需要先对单词进行独热编码的,以让模型识别区分不同单词,因此,嵌入矩阵实际上是和原先对单词的独热编码方式相关的,所以后续将嵌入矩阵应用到其他地方的时候,数字化单词的时候,需要对单词采用跟训练该嵌入矩阵相同的独热编码方式,即假如在训练得到嵌入矩阵的时候,将苹果编码成(1,0,0,...,0),那么后续在应用嵌入矩阵的时候,也应该将苹果编码成(1,0,0,...,0),不能编码成别的独热向量。

Reference

图1来源:https://www.google.com.hk/url?sa=i&url=https%3A%2F%2Fwww.researchgate.net%2Ffigure%2FThe-illustration-of-the-Skip-Gram-architecture-of-the-Word2Vec-algorithm-For-a_fig1_339013257&psig=AOvVaw1uejWOvWFzmE7JEmMsojMN&ust=1637565354840000&source=images&cd=vfe&ved=0CAgQjRxqFwoTCMjksPzzqPQCFQAAAAAdAAAAABAS图2来源: https://www.google.com.hk/url?sa=i&url=https%3A%2F%2Fwww.researchgate.net%2Ffigure%2FArchitecture-of-Word2Vec-with-CBOW-technique_fig1_322709818&psig=AOvVaw1uejWOvWFzmE7JEmMsojMN&ust=1637565354840000&source=images&cd=vfe&ved=0CAgQjRxqFwoTCMjksPzzqPQCFQAAAAAdAAAAABAY

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值