word2vec由Tomas Mikolov等人在《Distributed Representations of Words and Phrases and their Compositionality》中提出。word2vec根据语料库中单词的“共现关系”求出每个单词的embedding。word2vec模型有两种形式,skip-gram和cbow。skip-gram根据中心词(target)预测上下文(context),而cbow根据上下文(context)预测中心词(target)。

skip-gram模型

skip-gram模型的架构如下,
skip-gram.jpg
图片转自[NLP] 秒懂词向量Word2vec的本质
模型的目标是最大化下式,
$$\frac{1}{T}\sum_{t=1}^{T}\sum_{-c \leq j \leq c, j \neq 0}\log p(w_{t+j}|w_t)$$
其中,$c$表示context的大小,如下图,当center word为"or"时,如果c=1,则context word为"living"和"get";如果c=2,则context word为"busy"、"living"、"get"和"busy"。$c$越大,训练样本越多,模型的准确度越高,但同时训练的时间成本也会增加。
context.png
基础形式的skip-gram使用softmax函数定义$p(w_{t+j}|w_t)$,
$$p(w_O|w_I)=\frac{exp({v^{'}}_{w_O}^\top v_{w_I})}{\sum_{w=1}^{W}exp({v^{'}}_{w}^\top v_{w_I})}$$
然而这种形式的skip-gram不具备可实现性,因为计算$\nabla\log p(w_O|w_I)$的代价是与单词总数W的大小成正比的,而W的数量级一般是$10^5-10^7$。

Hierarchical Softmax

以中国有效减小计算复杂度的方法是,使用Hierarchical Softmax近似full softmaxHierarchical Softmax是由Morin和Bengio在《Hierarchical probabilistic neural network language model》中提出。

二叉哈夫曼树

假设词汇表中有$W$个不同的单词,单词$w_i$在语料库中出现的频率为$c_i$,可以构造出一个有$W$个叶子节点的二叉哈夫曼树(binary Huffman tree),每一个叶子节点对应一个单词。构造方式如下:

  1. 将$\{(w_1, c_1), \cdots,(w_W,c_W)\}$当做$W$棵树(每棵树1个结点)组成的森林;
  2. 从森林中选择根结点权值最小的两棵树进行合并,权值大的作为左孩子结点,权值小的作为右孩子结点,得到一棵新树,新树的根结点权值为其左、右子树根结点权值之和。从森林中删除被选中的两棵子树,保留新树;
  3. 重复第2步和第3步,直至森林中只剩下一棵树为止。

例如,语料库中只有一句话:“get busy living or get busy dying”。则对应的词汇表为,{"get":2, "busy":2, "living":1, "or":1, "dying":1},构成如下图的二叉哈夫曼树,
huffman.png
对于每一个单词$w_i$,都存在一条从根节点root到该单词对应叶子节点的路径,定义$L(w_i)$为单词$w_i$对应的路径,$n(w_i,j)$为路径上的第j的节点,显然有$n(w_i,1)=root,n(w_i,L(w_i))=w_i$,定义$ch(n)$表示节点$n$的左孩子节点(也可以定义为右孩子)。使用hierarchical softmax定义$p(w|w_I)$,
$$p(w|w_I) = \prod_{j=1}^{L(w)-1}\sigma(\mathbb{I}(n(w,j+1)==ch(n(w,j)))\cdot {v^{'}}_{n(w,j)}^\top v_{w_I})$$
其中,$\sigma$为sigmoid函数$\frac{1}{1+e^{-x}}$,$\mathbb{I}(\cdot)$为Indicator function。
使用二叉哈夫曼树的好处是,it assigns short codes to the frequent words which results in fast training。从图中可以看出,单词出现的频率越高,则对应该单词的叶子节点越靠近根节点(例如,$L("get")=3,L("living"=4)$)。

相较于原始形式的skip-gram模型在计算$p(w_O|w_I)$时,需要考虑$W$个输出节点,使用hierarchical softmax的模型只需要考虑$\log(W)$个内部节点。

Negative Sampling

$$p(w_O|w_I)=\log\sigma({v^{'}}_{w_O}^\top v_{w_I})+\sum_{i=1}^k \mathbb{E}_{w_i\sim P_n(w)}[\log \sigma(-{v^{'}}_{w_i}^\top v_{w_I})]$$
相较于原始的skip-gram模型需要考虑所有的类别($w_1,\cdots,w_W$),使用negative sampling的模型只是预测总体类别的一个子集w_isim P_n(w)。

注意到,对于使用Hierarchical softmax的skip-gram模型,每一个单词$w$只有一个对应的表示$v_w$,此外二叉哈夫曼树中的每个内部节点$n$,也对应一个相应的表示$v_n$;而对于使用negtive sampling的skip-gram模型,每一个单词$w$对应着两个向量表示,$v_w$和${v^{'}}_w$,其中$v_w$为target embedding,对应单词$w$为target的情况,${v^{'}}_w$context embedding,对应单词$w$为context的情况。

cbow模型

cbow模型的架构如下,
cbow.jpg
图片转自[NLP] 秒懂词向量Word2vec的本质
cbow在输入层,根据context words得到context embedding,然后对所有的输入embedding进行加和得到$h_i$,最后使用$h_i$来预测target word。实现方法与skop-gram模型类似。

参考

  1. Distributed Representations of Words and Phrases and their Compositionality,https://arxiv.org/abs/1310.4546
  2. https://zhuanlan.zhihu.com/p/...

AGUILLER
10 声望2 粉丝