Word2vec初探

Hits: 514

2018年1月13号更新:
1.可以结合阅读本人的另一篇文章:自然语言处理入门来理解本文。
2.Xin Rong童鞋在去年的一场飞机失事中不幸去世,非常可惜。

以下为正文:


这两天比较受挫,因为看了几篇paper都没怎么懂。昨天看了一篇论文里面提到了word2vec,于是就想简单了解下什么是word2vec(感觉好像挺出名的)?再加上自己本身对NLP技术也比较感兴趣,想了解下NLP到底是如何处理文本从而理解文本的。于是就找了几篇论文看起来,word2vec最初是由当时还在Google工作的Tomas Mikolov率先提出的:Efficient Estimation of Word Representations in Vector Space,然而我并没有看懂这篇论文,写的实在是太high-level,看不到细节。感觉侧重点在和之前的几个模型比较性能:模型的计算复杂度和最终的效果,并没有详细解释这两个模型是如何工作的。刚开始以为是自己background太差了,理解不了。后来在网上搜了搜发现有人专门写了一篇论文来解释这篇论文:word2vec Parameter Learning Explained-Xin Rong,看来不是我的问题。然后又顺便去youtube上看了Xin Rong做的一个关于Word2vec的talk,发现此人口语甚是流利,本科是清华的,现在是UMichgan的PhD,哎,牛人真是多啊。好了,废话不说了,下面切入正题。

一切从Word Representation说起

什么是Word Representation?

对人来说一个单词就是一个单词,但是对计算机来说却不是这样,那么计算机是如何处理单词或者文本的呢?最简单最直观的做法就是把单词(word)按照某种规则表达成一个向量(vector),这就是Word Representation。

什么是one-hot encoding?

比如:假设我们有这样的两个文本:

  • D1: I like green
  • D2: I like red

那么针对这两个文本所组成的语料库而言,我们会得到如下所示的字典:[green, I, like, red],那么单词"I"的one-hot encoding就是[0100],单词"like"则是[0010]

什么是Word Embedding?

要理解这个概念,先理解什么是Emdedding?Embedding在数学上表示一个maping, f: X -> Y, 也就是一个function,其中该函数是injective(就是我们所说的单射函数,每个Y只有唯一的X对应,反之亦然)和structure-preserving (结构保存,比如在X所属的空间上X1 < X2,那么映射后在Y所属空间上同理 Y1 < Y2)。 那么对于word embedding,就是将单词word映射到另外一个空间,其中这个映射具有injective和structure-preserving的特点。 通俗的翻译可以认为是单词嵌入,就是把X所属空间的单词映射为到Y空间的多维向量,那么该多维向量相当于嵌入到Y所属空间中,一个萝卜一个坑。word embedding,就是找到一个映射或者函数,生成在一个新的空间上的表达,该表达就是word representation。以上关于词嵌入的解释转载自:寒蝉鸣泣的回答

有哪些类型的Word Embeddings?

目前主要分为两类:

  • Frequency based Embedding
  • Prediction based Embedding

Frequency based Embedding就是基于词频统计的映射方式,主要有以下三种:

  • Count Vector
    这种就是最简单,最基本的词频统计算法:比如我们有N个文本(document),我们统计出所有文本中不同单词的数量,结果组成一个矩阵。那么每一列就是一个向量,表示这个单词在不同的文档中出现的次数。

  • TF-IDF Vector
    TF-IDF方法基于前者的算法进行了一些改进,它的计算公式如下:
    $$
    {\mathrm {tf{}idf_{{i,j}}}}={\mathrm {tf_{{i,j}}}}\times {\mathrm {idf_{{i}}}}
    $$
    其中,\(tf_{i,j}\)(term-frequence)指的是第\(i\)个单词在第\(j\)个文档中出现的频次;而\(idf_{i}\)(inverse document frequency)的计算公式如下:
    $$
    {\mathrm idf_{i} = \log(N/n)}
    $$
    其中,\(N\)表示文档的总个数,\(n\)表示包含该单词的文档的数量。这个公式是什么意思呢?其实就是一个权重,设想一下如果一个单词在各个文档里都出现过,那么\(N/n=1\),所以\({\mathrm idf_{i}=0}\)。这就意味着这个单词并不重要。这个东西其实很简单,就是在term-frequency的基础上加了一个权重,从而显著降低一些不重要/无意义的单词的frequency,比如a,an,the等。

  • Co-Occurrence Vector
    这个比较有意思,中文直译过来就是协同出现向量。在解释这个概念之前,我们先定义两个变量:

    • Co-occurrence
      协同出现指的是两个单词\(w_1\)和\(w_2\)在一个Context Window范围内共同出现的次数
    • Context Window
      指的是某个单词\(w\)的上下文范围的大小,也就是前后多少个单词以内的才算是上下文?比如一个Context Window Size = 2的示意图如下:
      image

    比如我们有如下的语料库:

    He is not lazy. He is intelligent. He is smart.

    我们假设Context Window=2,那么我们就可以得到如下的co-occurrence matrix:
    co-occurrence-matrix
    这个方法比之前两个都要进步一点,为什么呢? 因为它不再认为单词是独立的,而考虑了这个单词所在附近的上下文,这是一个很大的突破。 如果两个单词经常出现在同一个上下文中,那么很可能他们有相同的含义。比如vodka和brandy可能经常出现在wine的上下文里,那么在这两个单词相对于wine的co-occurrence就应该是相近的,于是我们就可以认为这两个单词的含义是相近的。

Word2vec

OK,上面介绍的三种Word Embedding方法都是确定性(deterministic)的方法,而接下来介绍一种非确定性的基于神经网络的预测模型-word2vec。它是只有一个隐含层的神经网络,且激活函数(active function)是线性的,最后一层output采用softmax来计算概率。它包含两种模型:

  • COBW(Continuous Bag of words)
    根据上下文来预测一个单词

  • Skip-gram
    根据一个单词来预测上下文

理解COBW

接下来我们以CBOW模型为例介绍下word2vec是如何实现词嵌入和语言模型的。首先看下CBOW的模型结构,单个单词的CBOW模型结构如下:
Imgur
多个单词的CBOW模型结构如下:
Imgur
其中,

\(V\)表示词库的大小;输入向量\(x_1,x_2,...,x_V\)的大小为\(1 \times V\),它是这个word的one-hot encoding;神经元\(h_1,h_2,...,h_N\)表示Hidden Layer,大小为\(1 \times N\);输出向量\(y_1,y_2,...,y_V\)表示的是一个概率分布向量,大小和输入向量一致。

这个结构是如何实现词嵌入和语言模型的呢?
要解答这个问题,首先要充分理解输出层的概率分布向量到底是什么?怎么理解?我们以多个单词的CBOW模型为例,CBOW的任务就是给定了一个长度为\(C\)个单词的上下文(单词的顺序无关)去预测最有可能的空缺单词。我们通过神经网络训练之后得到的预测结果是一个\(V\)维的向量,而这个向量代表的是词库里的每一个单词是空缺单词的概率。这样也就实现了语言模型。而神经网络中的Hidden Layer就是我们想要的词嵌入,它不仅得到了单词的语义特性,还把单词从\(V\)维空间映射到了\(N\)维,因为词库的大小\(V\)往往很大,所以这样做也实现了降维处理。因此,我们也可以说词嵌入是word2vec训练语言模型的副产物。

如何理解CBOW的词嵌入?
对于Hidden Layer的直观解释就是这个单词本身被解释成大小为\(N\)的向量/特征(features),也就说单词本身也有了属性,而这些属性就是隐藏层的权重,假想图(因为没人知道究竟被解释成了那些特征)如下:
image

COBW可视化

下面我们借助一个在线的visualization工具wevi: word embedding visual inspector来进一步理解,我们首先看一下它的training data:

drink,juice|apple;eat,apple|orange;drink,juice|rice;...

其中,竖线之前的表示input,每个input的单词用逗号分隔,之后是output。比如对于如下这组训练数据而言:

drink,juice|apple

它在神经网络中的表现就是这样的:
Imgur
看完一个training data就觉得这个东西很简单了,本质上就是一个简单的神经网络嘛,其实完全可以不用理解hidden layer所包含的特殊意义,直接把它理解成一个端对端(end-to-end)的系统更好理解,创新的地方就是训练单词时结合了它的上下文。

Skip-gram模型

Skip-gram模型的计算过程跟COBW类似,只不过是一个相反的过程,它的结构如下:
Imgur

Skip-gram可视化

sample training data:

apple|drink,juice;orange|eat,apple;rice|drink,juice;...

比如对于如下这组数据而言:

apple|drink,juice

它在神经网络中的表现就是这样的:
image

总结

其实word2vec和Co-Occurrence Vector的思想是很相似的,都是基于一个统计学上的假设:经常在同一个上下文出现的单词是相似的。只是他们的实现方式是不一样的,前者是采用词频统计,降维,矩阵分解等确定性技术;而后者则采用了神经网络进行不确定预测,它的提出主要是采用神经网络之后计算复杂度和最终效果都比之前的模型要好。所以那篇文章的标题才叫:Efficient Estimation of Word Representations in Vector Space。 这项技术可以用来估算两个单词之间的相似度,它在自然语言处理(NLP),搜索以及机器翻译(machine translation)等领域有着广泛的应用。比如你在用Google搜索“hotel”时,它不仅仅会返回给你包含hotel的网页,也会返回一些包含“motel,airbnb”之类的网页。还有一个是在搜索框输入一个单词之后,会自动预测后面可能出现的单词。

好了,这部分内容就理解到这儿吧,不再深入了,data mining后天就要考试了,复习去了。


发表评论

电子邮件地址不会被公开。 必填项已用*标注