word2vec词嵌入方法

word2vec模型与应用由Mikolov等人在自然语言领域具有很高的影响,它在语言模型进行学习前先找寻到一种合适的编码方式,这种编码方式叫作词嵌入(Word Embedding); 本片笔记属于原理介绍,没有实现细节的代码讲解

One-hot编码

嵌入前通常会使用 one-hot编码方式,这种编码方式每个词都会单独的占一位,该位为1则表示这个词出现,例如但前语料中一共有5个词,那么它们就分别表示为1000001000001000001000001

显然,这是一种极不高效的编码方式,既需要极大的空间用于存储,也不能从词向量中获得有用的词之间的语义关系,这也就是为什么需要词嵌入技术的原因。

Why word2vec?

为什么Word2Vec方法受到如此多的注意,以至于对现在的自然语言处理产生了极大的影响?

总结了一下Word2Vec的几个特点:

  • 快,以往的词嵌入得到的词向量仅仅只是一个副产物,而w2v则针对词嵌入提出了各种模型以及相应的优化算法(后面会提到的)

  • 语义上相近的词向量相似度上也比较接近

  • 这点是最神奇的,虽然不知道为什么,w2v得到的词向量竟然满足语义上的加减法!!!比如Madrid-Spain+France=Paris; king-man+women=queen; (⊙ω⊙)!

    paris

此外w2v还拥有两种模式Skip-gramCBOW,而每种模式下都有两种优化的实现方法Hierarchical Softmax, Negative Sampling

Skip-gram

第一种模式是Skip-gram模式,根据一个词推测出其最有可能的上下文(Context),其结构图如下:

skip-gram

步骤

  • 输入One-hot编码,每个词向量现在都是V维的,V就是语料中词汇的总数
  • 乘上字典矩阵WV*N,变成一个N维向量。N就是嵌入后的词向量维数
  • 乘上字典矩阵W’N*V,相当于求距离,然后再求一个Softmax,变成一个V维向量。每一位其实都代表改为one-hot编码的词出现的概率

CBOW

CBOW(Continuous Bag-of-Words),是另外一种Word2Vec的模式,用于根据上下文推测出空缺的词的方法,其结构示意图如下:

cbow

步骤

  • 输入上下文C个词的One-hot编码

  • 乘上字典矩阵WV*N,得到各自的N维编码

  • 取它们的平均值

  • 乘上字典矩阵W’N*V,相当于求与其他词之间的距离,然后取Softmax,变成一个V维向量,每位代表的还是这个位上one-hot编码的那个词的概率,选最大的那个

Hierarchical Sotfmax

上面说的就是Word2Vec的基本思想了,但是呢,当语料非常庞大的时候,求Softmax

softmax

开销就会变得异常的大,其中一种解决方法就是使用层次Softmax(Hierarchical Sotfmax)来将Softmax的概率转化为一个多次二分类问题。

层级Softmax函数使用的数据结构是以词频作为权重构造的霍夫曼树(Huffman Tree),这样做的好处是词频大的词只需要更少的遍历就可以找到

Huffman_Tree

叶子节点为V个语料中的词,而非叶子节点也有一个向量v,代表一次选择,即每走一步都需要确定下一步是要走到左孩子节点还是右孩子节点,原来的Softmax概率就被写成

hierarchical_softmax

σ(*)是Sigmoid函数,双竖线中括号表示若选择左孩子则为1,右孩子则为-1,在sigmoid中正好正负样例两者 相加等1。最后就是非叶子节点向量与词向量的内积。训练时同时考虑词的嵌入向量训练和霍夫曼树上非叶子节点的参数。

  • 与CBOW配合,将叠加以后的嵌入向量作为霍夫曼树的输入,去寻找原中心词,并以此过程优化霍夫曼树与词向量;
  • 与Skip-Gram配合,将目标词汇一个个作为霍夫曼树的输入 ,去寻找原中心词,并以此过程优化霍夫曼树与词向量;

Negative Sampling

在此前的LargeVis–LINE在高维数据降维与可视化上的运用中已经提到了Negative Sampling,实际上,在Word2Vec后,负采样技术在运用上比层级Softmax更加的广泛。

做法也与LargeVis相似,即使得正样本出现的概率最大,负样本出现的概率减小,那么如何取负样本呢?

将所有的词按照词频的3/4次方为正比进行采样作为负样本,即满足概率:

negative_sampling

按照这个概率取得负样本(若取到中心词本身则重新进行采样)用于替换中心词,与原中心词的Context组成一组负样本,只要取几个词就可已完成负采样。按照原文的话说,当数据集比较小的时候,5-20个负样本; 当数据集比较大的时候,只需要2-5个就可以了。

负采样的目标函数为:

negative_object

高频词子采样

语料中总是有很多类似于”a” “the” “in”这样的词,这些词被认为不会提供太多有用的信息,因为它们几乎会出现在所有的词的context中。所以对于这些词我们进行子采样(Subsampling)来进行过滤。Mikolov的原文中采用的下采样公式是

subsampling

P是每个词被删除的概率,t是一个认为定的阈值,大约在10-5左右,f是词频。这样一来,稀有的词就能得到保留,而频繁出现的词却会被大面积的删除,但总体词频的顺序不变,达成下采样的目的。

Tensorflow实现

负采样Skip-gram word2vec Tensorflow封装实现

作者源码

参考

Distributed Representations of Words and Phrases and their Compositionality

word2vec Parameter Learning Explained

Word2Vec中的数学原理

Word2Vec原理

深度学习word2vec笔记之算法篇