Word2Vec深入浅出

   日期:2020-07-09     浏览:104    评论:0    
核心提示:Word2Vec深入浅出word2vec简介one-hot编码skip-gram模型CBOW模型Hierarchical SoftMaxNegative Samplingskip-gram在神经网络上的训练流程模型细节以上是个人经过多方查阅资料和咨询,通过自己的理解写了一些对Word2Vec词向量的理解,不对的地方还请指出。如何你觉得对你有帮助,请给我一个在看、点赞、关注+赞赏。转载请注明出处。word2vec简介word2vec是2013年Google开源了一款用于词向量计算的工具——word2vec

Word2Vec深入浅出

  • word2vec简介
    • one-hot编码
    • skip-gram模型
    • CBOW模型
    • Hierarchical SoftMax
    • Negative Sampling
    • skip-gram在神经网络上的训练流程
      • 模型细节
      • 以上是个人经过多方查阅资料和咨询,通过自己的理解写了一些对Word2Vec词向量的理解,不对的地方还请指出。如何你觉得对你有帮助,请给我一个在看、点赞、关注+赞赏。转载请注明出处。

word2vec简介

word2vec是2013年Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注。在这之前词都是通过数值型编码,不能很好的表示词和词之间的关系。word2vec提出的词向量的概念,解决了这一问题。word2vec工具包含两种模型,ship-gram(跳字模型)和CBOW(词袋模型),前者的思想是通过中心词target预测周围词context,后者的思想是周围context预测中心词target。词向量的本质是通过上下文描述对该词赋予新的向量表示,该词本身或在文本词向量空间上不具备上下文语义。只不过词向量表示的词在空间上更容易计算词之间的关系。

one-hot编码

独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。通俗来讲,就是在一个词典里(大小为N),给所有的词按序号进行整数编码,然后用N维向量,对应位置为1其余位置全为0表示。
举个栗子
考虑一下的三个特征:

[“male”, “female”]

[“from Europe”, “from US”, “from Asia”]

[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”]

将它换成独热编码后,应该是:

feature1=[01,10]

feature2=[001,010,100]

feature3=[0001,0010,0100,1000]

  1. 优点 ,一是解决了分类器不好处理离散数据的问题,二是在一定程度上也起到了扩充特征的作用。
  2. 缺点,首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);其次,它假设词与词相互独立(在大多数情况下,词与词是相互影响的),任何一对词的one-hot 向量的余弦相似度都为0;最后,它得到的特征是离散稀疏的,只有一位为1,其余位为0,极大浪费存储空间。

skip-gram模型

从直观上理解,Skip-Gram是给定input word来预测上下文。

在神经网络模型中,输入层输入一个词,经过隐藏层,再到输出层输出context词,输出层是一个softmax回归分类器,它的每个结点将会输出一个0-1之间的值(概率),这些所有输出层神经元结点的概率之和为1。
原理介绍:跳字模型需要在给定一个中心词最大化的生成周围词的概率。
其本质是计算输入word的input vector与目标word的output vector之间的余弦相似度,并进行softmax归一化。我们要学习的模型参数正是这两类词向量Vc,Uc。(一个词在文中可作为中心词Vc也可以作为背景词Uc)

CBOW模型


同理,CBOW也是计算在给出周围词最大化生成中心词的概率,不同的是用周围词的词向量的平均值作为周围词的主体向量。

Vc和Uc为模型参数,通过不断迭代更新,当损失函数最小时输出的参数即文本词对应的词向量。
该模型由于时间复杂度和文本大小有关,当文本过大时,计算量太大。于是提出两种优化方法,层序softmax负采样

Hierarchical SoftMax

层次Softmax的方法最早由Bengio在05年引入到语言模型中。它的基本思想是将复杂的归一化概率分解为一系列条件概率乘积的形式:

其中,每一层条件概率对应一个二分类问题,可以通过一个简单的逻辑回归函数去拟合。这样,我们将对V个词的概率归一化问题,转化成了对logV个词的概率拟合问题。我们可以通过构造一颗分类二叉树来直观地理解这个过程。首先,我们将原始字典D划分为两个子集D1、D2,并假设在给定context下,target word属于子集D1的概率p(wt∈D1|context)p(wt∈D1|context)服从logistical function的形式:

其中,UDroot和Vwt是模型参数
接下来,我们可以对子集D1和D2进一步划分。重复这一过程,直到集合里只剩下一个word。这样,我们就将原始大小为V的字典D转换成了一颗深度为logV的二叉树。树的叶子节点与原始字典里的word一一对应;非叶节点则对应着某一类word的集合。显然,从根节点出发到任意一个叶子节点都只有一条唯一路径——这条路径也编码了这个叶子节点所属的类别。同时,从根节点出发到叶子节点也是一个随机游走的过程。因此,我们可以基于这颗二叉树对叶子节点出现的似然概率进行计算。例如,对于训练样本里的一个target word Wt,假设其对应的二叉树编码为{1,0,1,…,1}{1,0,1,…,1},则我们构造的似然函数为:

乘积中的每一项都是一个逻辑回归的函数。我们可以通过最大化这个似然函数来求解二叉树上的参数——非叶节点上的向量,用来计算游走到某一个子节点的概率。
层次Softmax是一个很巧妙的模型。它通过构造一颗二叉树,将目标概率的计算复杂度从最初的V降低到了logV 的量级。不过付出的代价是人为增强了词与词之间的耦合性。例如,一个word出现的条件概率的变化,会影响到其路径上所有非叶节点的概率变化,间接地对其他word出现的条件概率带来不同程度的影响。因此,构造一颗有意义的二叉树就显得十分重要。实践证明,在实际的应用中,基于Huffman编码的二叉树可以满足大部分应用场景的需求。

Negative Sampling

负采样的思想最初来源于一种叫做Noise-Contrastive Estimation的算法[6],原本是为了解决那些无法归一化的概率模型的参数预估问题。与改造模型输出概率的Hierarchical Softmax算法不同,NCE算法改造的是模型的似然函数。
以Skip-gram模型为例,其原始的似然函数对应着一个Multinomial的分布。在用最大似然法求解这个似然函数时,我们得到一个cross-entropy的损失函数:

式中的p(wt+j|wt)p(wt+j|wt)是一个在整个字典上归一化了的概率。
而在NCE算法中,我们构造了这样一个问题:对于一组训练样本,我们想知道,target word的出现,是来自于context的驱动,还是一个事先假定的背景噪声的驱动?显然,我们可以用一个逻辑回归的函数来回答这个问题:

这个式子给出了一个target word w来自于context驱动的概率。其中,k是一个先验参数,表明噪声的采样频率。p(w|context)p(w|context)是一个非归一化的概率分布,这里采用softmax归一化函数中的分子部分。Pn(w)Pn(w)则是背景噪声的词分布。通常采用word的unigram分布
而Mikolov在2013年的论文里提出的负采样算法, 是NCE的一个简化版本。在这个算法里,Mikolov抛弃了NCE似然函数中对噪声分布的依赖,直接用原始softmax函数里的分子定义了逻辑回归的函数,进一步简化了计算:


图中Wk为噪声词,即不在同一个窗口内的词,Wk根据噪声词分布Pw(k)–预先设定,随机生成。

skip-gram在神经网络上的训练流程

神经网络中embedding层的作用——本质就是word2vec,数据降维,同时可以很方便计算同义词(各个word之间的距离),底层实现是2-gram(词频)+神经网络。

如何将一段文章的单词通过词向量来表示呢?

  • 提取文章中所有的单词,把其按照出现的次数降序(这里取50000个不同的单词),比如单词“xx”出现次数最多,就编号ID为0,以此类推…
  • 每个编号ID都可以使用50000维的二进制(onehot)表示。
  • 最后会产生一个矩阵M,行大小为词的个数50000,列大小为词向量的维度(通常取128或300),比如矩阵第一行就是编号ID=0,“xx”对应的词向量。

在Skip-Gram模型中,会随机初始化它,然后使用神经网络来训练这个权重矩阵
输入数据和标签是什么呢?输入数据是中间蓝色的词所对应的one-hot编码,标签是它附近词的one-hot编码(windown_size=2,左右各取2个)

就上述的Word2Vec中的demo而言,它的单词表大小为1000,词向量维度为300,所以embedding的参数input_dim=10000,output_dim=300。

假如单词表的大小为1000,词向量维度为2,经单词频数统计后,tom对应的id=4,而Jerry对应的id=20,经过转换,可以得到一个矩阵,tom对应矩阵第4行,取出该行的数据就是词向量。嵌入层就是将正整数(下标)转换为具有固定大小的向量,比如[[4],[20]]->[[0.25,0.1],[0.6,-0.2]]

模型细节

神经网络只能接受数值输入,我们不可能把一个单词字符串作为输入。最常用的办法就是基于训练文档来构建我们自己的词汇表(vocabulary)再对单词进行one-hot编码。

“The dog barked at the mailman”,那么我们基于这个句子,可以构建一个大小为5的词汇表(忽略大小写和标点符号):(“the”, “dog”, “barked”, “at”, “mailman”),我们对这个词汇表的单词进行编号0-4。那么”dog“就可以被表示为一个5维向量[0, 1, 0, 0, 0]。
模型的输入如果是10000维的向量(词汇表有10000个单词),输出也是一个10000维的向量,包含了10000个概率,每一个概率代表着当前词是输入样本中output word的概率大小。

隐层没有使用任何激活函数,但是输出层使用了sotfmax。

我们基于成对的单词来对神经网络进行训练,训练样本是 ( input word, output word ) 这样的单词对,input word和output word都是one-hot编码的向量。最终模型的输出是一个概率分布。input word和output word都会被我们进行one-hot编码。输入被one-hot编码后大多数维度上都是0(实际上仅有一个位置为1),所以向量稀疏,如果我们将一个1 x 10000的向量和10000 x 300的矩阵相乘,它会消耗相当大的计算资源,为了高效计算,隐层权重矩阵看成了一个”查找表“(lookup table),进行矩阵计算时,直接去查输入向量中取值为1的维度下对应的那些权重值。隐层的输出就是每个输入单词的“嵌入词向量”(Embedding Vector)。

经过神经网络隐层的计算,词从一个1 x 10000的向量变成1 x 300的向量,再被输入到输出层。输出层是一个softmax回归分类器,它的每个结点将会输出一个0-1之间的值(概率),这些所有输出层神经元结点的概率之和为1。

训练样本为 (input word: “ants”, output word: “car”) 的计算示意图

以上是个人经过多方查阅资料和咨询,通过自己的理解写了一些对Word2Vec词向量的理解,不对的地方还请指出。如何你觉得对你有帮助,请给我一个在看、点赞、关注+赞赏。转载请注明出处。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服