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模型的架构以下,
图片转自[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$越大,训练样本越多,模型的准确度越高,但同时训练的时间成本也会增长。
基础形式的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
近似full softmax
。Hierarchical Softmax
是由Morin和Bengio在《Hierarchical probabilistic neural network language model》中提出。spa
假设词汇表中有$W$个不一样的单词,单词$w_i$在语料库中出现的频率为$c_i$,能够构造出一个有$W$个叶子节点的二叉哈夫曼树(binary Huffman tree
),每个叶子节点对应一个单词。构造方式以下:3d
例如,语料库中只有一句话:“get busy living or get busy dying”。则对应的词汇表为,{"get":2, "busy":2, "living":1, "or":1, "dying":1},构成以下图的二叉哈夫曼树,
对于每个单词$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)$)。code
相较于原始形式的skip-gram模型在计算$p(w_O|w_I)$时,须要考虑$W$个输出节点,使用hierarchical softmax的模型只须要考虑$\log(W)$个内部节点。blog
$$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的状况。ip
cbow模型的架构以下,
图片转自[NLP] 秒懂词向量Word2vec的本质
cbow在输入层,根据context words获得context embedding,而后对全部的输入embedding进行加和获得$h_i$,最后使用$h_i$来预测target word。实现方法与skop-gram模型相似。get