一文全面了解word2vec(CBOW、Skip-Gram、层序softmax、负采样)
引言
在自然语言处理任务中,文本向量化往往是任务中必不可少的基础工作,因此如何更好地将文本向量化就显得尤为重要。词是自然语言文本中最小的语义单元,自然语言文本是由词序列构成的,因此如果能够完成对词的向量化,那么文本向量化的任务也就迎刃而解了。
词袋模型
词袋模型(bag of words)是最早的以词为基本处理单元的文本向量化方法,词袋模型通过先构建一个包含语料库中所有词的词典,然后根据词典完成对每个词的向量化,进而完成文本向量化。例1给出了词袋模型的词项量化和文本向量化的流程。
例1 给定一个包含两个文本的语料库,文本内容分别如下:
1)John likes to watch movies, Mary likes too.
2)John also likes to watch football games.
通过这两个文本构建如表1的词典:
通过表1的词典,就可以将所有的词向量化了,每个词的向量长度都是词典的大小,然后向量中元素全是0, 除了一个位置的元素是1,这个位置是词在词典中的index。以watch为例,watch在词典中的index是4,那么watch的向量中第四个位置是1,其余都是0,这种表示方法称为one-hot向量表示,如下:
watch = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
完成对所有词的向量化之后,就可以得出两个文本的向量化结果,每个文本的向量长度都是词典的大小,向量中的每个位置的元素代表词典中该位置的词在文本中出现的次数。以文本1为例,John出现了1次,likes出现了2次,football出现了0次等等,结果如下:
文本1 = [1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
词袋模型的几个问题:
维度灾难:如果词典中有很多个词,那么每个词都是一个维度很高的向量;
未保留词序:只将文本看成是一袋子词;
语义鸿沟:通过向量表示无法体现两个词是否为同义词。
word2vec
前面说到词袋模型有三个很明显的缺点,为了解决词袋模型的不足,于是就有了word2vec。
最简单的理解,其实word2vec是只有一个隐层的全连接神经网络, 用来预测给定单词的关联度大的单词。或者说就是一个语言模型。
下面看图说下整体步骤是怎么样的:
1、在输入层,一个词被转化为One-Hot向量。
2、然后在第一个隐层,输入的是一个 W*x+b( x就是输入的词向量, W , b是参数),做一个线性模型,注意已这里只是简单的映射,并没有非线性**函数,当然一个神经元可以是线性的,这时就相当于一个线性回归函数。
3、第三层可以简单看成一个分类器,用的是Softmax回归,最后输出的是每个词对应的概率。
Word2vec是一种可以进行高效率词嵌套学习的预测模型。其有两种变体是现在比较常用的,分别为:连续词袋模型(CBOW)及Skip-Gram模型。从算法角度看,这两种方法非常相似,其区别为CBOW根据源词上下文词汇(’the cat sits on the’)来预测目标词汇(例如,‘mat’),而Skip-Gram模型做法相反,它通过目标词汇来预测源词汇。
Skip-Gram模型采取CBOW的逆过程的动机在于:CBOW算法对于很多分布式信息进行了平滑处理(例如将一整段上下文信息视为一个单一观察量)。很多情况下,对于小型的数据集,这一处理是有帮助的。相比之下,Skip-Gram模型将每个“上下文-目标词汇”的组合视为一个新观察量,这种做法在大型数据集中会更为有效。
下面详细说说两种模型:
CBOW(Continuous Bag-of-Words)
普通的CBOW模型通过上下文来预测中心词,抛弃了词序信息,注意不同的论文有不同的描述,但本质都是一样的。
从图中可以看出,CBOW模型预测的是 ,
由于图中目标词
w
t
\ w_t
wt 前后只取了各两个词,所以窗口的总大小是2。假设目标词
w
t
\ w_t
wt 前后各取k个词,即窗口的大小是k,那么CBOW模型预测的将是
输入层到隐藏层:
以图2为例,输入层是四个词的one-hot向量表示,分别为
w
t
−
2
\ w_{t-2}
wt−2、
w
t
−
1
\ w_{t-1}
wt−1、
w
t
+
2
\ w_{t+2}
wt+2、
w
t
+
1
\ w_{t+1}
wt+1(维度都为V x 1,V是模型的训练本文中所有词的个数),记输入层到隐藏层的权重矩阵为 W(维度为V x d,d是认为给定的词向量维度),隐藏层的向量为 h(维度为d x 1),那么
其实这里就是一个简单地求和平均。
隐藏层到输出层:
记隐藏层到输出层的权重矩阵为 U (维度为d x V),输出层的向量为 y (维度为V x 1),那么
注意,输出层的向量y与输入层的向量为 x虽然维度是一样的,但是 y并不是one-hot向量,并且向量 [公式] 中的每个元素都是有意义的。
Skip-Gram
Skip-Gram的模型图与CBOW恰好相反,如下图所示。
从图中可以看出,Skip-Gram模型预测的是
由于图中词
w
t
\ w_t
wt 前后只取了各两个词,所以窗口的总大小是2。假设词
w
t
\ w_t
wt 前后各取k个词,即窗口的大小是k,那么Skip-Gram模型预测的将是
输入层到隐藏层:
输入层是词的one-hot向量表示,记为
x
t
\ x_t
xt (维度都为V x 1,V是模型的训练本文中所有词的个数),记输入层到隐藏层的权重矩阵为 W (维度为V x d,d是认为给定的词向量维度),隐藏层的向量为 h(维度为d x 1),那么
隐藏层到输出层:
记隐藏层到输出层的权重矩阵为U(维度为d x V),输出层的向量为 y(维度为V x 1),那么
这点和CBOW是相同的。
训练优化策略
对于原始的模型来说,由于使用的是softmax()函数,时间复杂度为 O(|V|)(|V|表示词典的总词数) ,因此计算代价很大,对大规模的训练语料来说,非常不现实。因此Mikolov 提出2个技巧,其中一个是Hierarchical Softmax(层序softmax),另一个是Negative Sampling(负采样)。
Hierarchical Softmax(层序softmax)
简单来说,Hierarchical Softmax是一种对输出层进行优化的策略,输出层从原始模型的利用softmax计算概率值改为了利用Huffman树计算概率值。
Huffman树是二叉树,在叶子节点及叶子节点的权给定的情况下,该树的带权路径长度最短(一个节点的带权路径长度指根节点到该节点的路径长度乘以该节点的权,树的带权路径长度指全部叶子节点的带权路径长度之和)。直观上可以看出,叶子节点的权越大,则该叶子节点就应该离根节点越近。因此对于模型来说就是,词频越高的词,距离根节点就越近。
而一开始我们可以用以词表中的全部词作为叶子节点,词频作为节点的权,构建Huffman树,作为输出。从根节点出发,到达指定叶子节点的路径是唯一的。Hierarchical Softmax正是利用这条路径来计算指定词的概率,而非用softmax来计算。应用Hierarchical Softmax就是把 N 分类问题变成 log(N)次二分类。
Negative Sampling(负采样)
这是Noise-Contrastive Estimation(简写NCE,噪声对比估计)的简化版本:把语料中的一个词串的中心词替换为别的词,构造语料 D 中不存在的词串作为负样本。本质上就是一个预测全部分类的变成预测总体类别的子集的方法。在这种策略下,优化目标变为了:最大化正样本的概率,同时最小化负样本的概率。对于一个词串
(
w
,
c
)
(w,c)
(w,c)( c 表示 w 的上下文),用二项Logistic回归模型对其是正样本的概率建模:
所以全部正样本的似然函数为
同理,全部负样本的似然函数为
需要最大化前者同时最小化后者,也就是最大化下式:
取对数得到对数似然:
由于使用SGD,所以只需要知道对一个正样本
(
w
,
c
)
(w,c)
(w,c)的目标函数。式中
N
E
G
(
w
)
NEG(w)
NEG(w) 指
(
w
,
c
)
(w,c)
(w,c) 的负样本的中心词集合: