【AI理论学习】理解词向量、CBOW与Skip-Gram模型

词向量与word2vec详解:CBOW与Skip-Gram模型对比
本文深入解析词向量的One-hot和Distributed表示,重点介绍word2vec中的CBOW和Skip-gram模型,包括霍夫曼树的应用、HierarchicalSoftmax和NegativeSampling优化方法,以及如何通过负采样改进模型效率。


由于计算机不能直接对各种字符进行运算,为此需要将词的表示进行一些转换。因此,在自然语言处理中,通常需要对输入的语料进行一些预处理:

对输入的预料进行预处理过程
其中,如何对词汇进行表示是很关键的问题,糟糕的表示方法容易导致所谓的 “Garbage in, garbage out”。

词向量基础知识

对词汇的表示,常见的有One-hot represention 和 Distributed Representation 两种形式。

One-hot表示

One-hot represention 将词汇用二进制向量表示,这个向量表示的词汇,仅仅在词汇表中的索引位置处为1,其他地方都为0。例子如下图所示:
one-hot表征
这样的方式表示词汇虽然简单,但是也有如下缺点:

  • 单词的上下文丢失了。
  • 没有考虑频率信息。
  • 词汇量大的情况下,向量维度高且稀疏,占用内存。

Distributed表示

Distributed Representation 也可以理解为Word Embedding,具体形式为:
Word Embedding
注意到,使用Word Embedding得到的向量维度远小于词汇表的个数。如果将上面的向量在空间中表示,可以得到:
词向量可视化
上图告诉我们,通过词向量之间的距离可以度量他们之间的关系,意思相近的词在空间中的距离比较近。出现这种现象的原因是最后得到的词向量在训练过程中学习到了词的上下文

那么,Distributed Representation 要如何得到?

  1. 使用神经网络语言模型可以得到;
  2. 使用word2vec。

word2vec基础知识

word2vec是google在2013年推出的一个NLP工具,它的特点是将所有的词向量化,这样词与词之间就可以定量的去度量他们之间的关系,挖掘词之间的联系。在正式讲解 word2vec 前,还需要对一些基本概念有所了解。

CBOW和Skip-gram

CBOW模型(Continuous Bag-of-Words Model)和Skip-gram模型(Continuous Skip-gram Model)。如下图所示:
CBOW模型和Skip-gram模型
由图可见,两个模型都包含三层:输入层、投影层和输出层。前者是在已知当前词 w t w_t wt的上下文 w t − 2 , w t − 1 , w t + 1 , w t + 2 w_{t-2},w_{t-1},w_{t+1},w_{t+2} wt2,wt1,wt+1,wt+2的前提下预测当前词 w t w_t wt(CBOW模型);而Skip-gram模型则恰恰相反,是在已知当前词 w t w_t wt的前提下,预测其上下文 w t − 2 , w t − 1 , w t + 1 , w t + 2 w_{t-2},w_{t-1},w_{t+1},w_{t+2} wt2,wt1,wt+1,wt+2

霍夫曼树

一般情况下,词汇表中词汇的数量是非常多的,如果用传统的DNN+Softmax的方式来训练词向量,计算量太大了。于是,word2vec 使用的数据结构是用霍夫曼树来代替隐藏层和输出层的神经元。霍夫曼树的叶子节点起到输出层神经元的作用,叶子节点的个数即为词汇表的小大, 而内部节点则起到隐藏层神经元的作用。这里首先需要了解下霍夫曼树。
从实际的例子出发,看看如何构造霍夫曼树:
假设有(a,b,c,d,e,f)共6个词汇,词汇的权值用词频表示: w a = 16 , w b = 4 , w c = 8 , w d = 6 , w e = 20 , w f = 3 w_a=16,w_b=4,w_c=8,w_d=6,w_e=20,w_f=3 wa=16,wb=4,wc=8,wd=6,we=20,wf=3,假设这6个词汇是6棵只要根节点的森林集合。于是构造步骤如下:
首先是权值最小的b和f合并,得到的新树,根节点权重是7。将b于f这两个树从列表中删除,并且添加刚刚得到的合并的树。此时森林里共有5棵树,根节点权重分别是16,8,6,20,7。此时根节点权重最小的6,7对应的树合并,得到新子树,依次类推,最终得到下面的霍夫曼树:
霍夫曼树
如何编码呢?一般对于一个霍夫曼树的节点(根节点除外),可以约定左子树编码为0,右子树编码为1。如上图,则可以得到c的编码是00。
注意,在word2vec中,约定编码方式和上面的例子相反,即约定左子树编码为1,右子树编码为0,同时约定左子树的权重不小于右子树的权重。
那么霍夫曼树有什么好处呢?一般得到霍夫曼树后我们会对叶子节点进行霍夫曼编码,由于权重高的叶子节点越靠近根节点,而权重低的叶子节点会远离根节点。这样我们的高权重节点编码值较短,而低权重值编码值较长。这保证的树的带权路径最短,即我们希望越常用的词拥有更短的编码

有了上面的基础知识,就可以对word2vec进行讲解了。相比于用传统的神经网络的方法来训练词向量,于word2vec提出了有两种改进方法:一种是基于 Hierarchical Softmax 算法的,另一种是基于 Negative Sampling 算法的

基于Hierarchical Softmax的 CBOW 模型和 Skip-gram 模型

CBOW 模型

基本结构

CBOW 模型是在已知当前词 w t w_t wt的上下文 w t − 2 , w t − 1 , w t + 1 , w t + 2 w_{t-2},w_{t-1},w_{t+1},w_{t+2} wt2,wt1,wt+1,wt+2的前提下预测当前词 w t w_t wt。后面我们用 c o n t e x t ( w ) context(w) context(w)来表示词w的上下文中的词,通常,我们取词w前后2c个单词来组成 c o n t e x t ( w ) context(w) context(w)。下图给出了CBOW模型的网络结构:
cbow
它包括三层:输入层、投影层、输出层。

  • 输入层:包含 c o n t e x t ( w ) context(w) context(w)中的 2 c 2c 2c个词向量 v ( c o n t e x t ( w ) 1 ) , v ( c o n t e x t ( w ) 2 ) , … , v ( c o n t e x t ( w ) 2 c ) ∈ R m \mathbf v(context(w)_1),\mathbf v(context(w)_2),\ldots,\mathbf v(context(w)_{2c}) \in \mathbf R^m v(context(w)1),v(context(w)2),,v(context(w)2c)Rm,每个词向量的长度是 m m m
  • 投影层:将输入层的2c个词向量累加求和,即 x w = ∑ i = 1 2 c v ( c o n t e x t ( w ) i ) \mathbf x_w = \sum_{i=1}^{2c}\mathbf v(context(w)_i) xw=i=12cv(context(w)i)
  • 输出层:输出层是用哈夫曼算法以各词在语料中出现的次数作为权值生成的一颗二叉树,其叶子结点是语料库中的所有词,叶子个数N=|D|,分别对应词典D中的词。

神经网络语言模型(NNLM)中大部分计算集中在隐藏层和输出层之间的矩阵向量运算,以及输出层上的softmax归一化运算,CBOW模型对此进行了改进。与传统的神经网络语言模型相比:

  • NNLM是简单的讲输入的向量进行拼接,而CBOW模型将上下文的词累加求和作为输入;
  • NNLM是线性结构,而CBOW是树形结构
  • NNLM具有隐藏层,而CBOW没有隐藏层

目标函数

假设对于给定的文本,“我”、“喜欢”、“观看”、“巴西”、“足球”、“世界杯”这六个词出现的次数分别为15, 8, 6, 5, 3, 1。于是可以用这些语料构建霍夫曼树,并将其作为CBOW模型的输出层。如下图所示:
CBOW示例
注意:与常规的霍夫曼树不同,左子树用1编码,右子树用0编码。

接下来,用 p w p^w pw表示从根结点出发到达 w w w对应叶子结点的路径, l w l^w lw表示这个路径中包含结点的个数, p l w p_{l}^w plw表示路径 p w p^w pw中的第 l l l个结点, d j w d_j^w djw表示路径 p w p^w pw中第 j j j个结点对应的编码(0或1), θ j w \theta^w_j θjw表示路径 p w p^w pw中第 j j j个非叶子结点对应向量。

我们的目标是利用输入向量 X w X_w Xw 和霍夫曼树来定义函数 p ( w ∣ c o n t e x t ( w ) ) p(w|context(w)) p(wcontext(w))

以图中的词 w = " 足球 " w="足球" w="足球"为例,从霍夫曼树的根结点出发到“足球”,中间经历了4个分支,每一次分支,都可以看成进行了一次二分类。那么从二分类的角度来看,对于每个非叶子结点,就需要为其左右孩子指定类别。我们规定:编码为1的结点定义为负类,编码为0的结点定义为正类。也就是说,将一个结点进行二分类,分到左边是负类,分到右边是正类。所以有:
L a b e l ( p i w ) = 1 − d i w , i = 1 , 2 , … , l w Label(p_i^w) = 1- d_i^w, \quad i=1,2,\ldots,l^w Label(piw)=1diw,i=1,2,,lw
我们用逻辑斯蒂回归进行二分类,一个结点被分为正类的概率是:
σ ( x w T θ ) = 1 1 + e − x w T θ \sigma(\mathbf x_w^T\theta) = \frac{1}{1+e^{-\mathbf x_w^T\theta}} σ(xwTθ)=1+exwTθ1
被分成负类的概率为:
1 − σ ( x w T θ ) 1-\sigma(\mathbf x_w^T\theta) 1σ(xwTθ)
这里的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镰刀韭菜

看在我不断努力的份上,支持我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值