一切从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方法基于前者的算法进行了一些改进,它的计算公式如下:
tfidfi,j=tfi,j×idfitfidfi,j=tfi,j×idfi
其中,tfi,jtfi,j(term-frequence)指的是第ii个单词在第jj个文档中出现的频次;而idfiidfi(inverse document frequency)的计算公式如下:
idfi=log(N/n)idfi=log(N/n)
其中,NN表示文档的总个数,nn表示包含该单词的文档的数量。这个公式是什么意思呢?其实就是一个权重,设想一下如果一个单词在各个文档里都出现过,那么N/n=1N/n=1,所以idfi=0idfi=0。这就意味着这个单词并不重要。这个东西其实很简单,就是在term-frequency的基础上加了一个权重,从而显著降低一些不重要/无意义的单词的frequency,比如a,an,the等。 - Co-Occurrence Vector
这个比较有意思,中文直译过来就是协同出现向量。在解释这个概念之前,我们先定义两个变量:- Co-occurrence
协同出现指的是两个单词w1w1和w2w2在一个Context Window范围内共同出现的次数 - Context Window
指的是某个单词ww的上下文范围的大小,也就是前后多少个单词以内的才算是上下文?比如一个Context Window Size = 2的示意图如下:
比如我们有如下的语料库:
He is not lazy. He is intelligent. He is smart.
我们假设Context Window=2,那么我们就可以得到如下的co-occurrence matrix:
这个方法比之前两个都要进步一点,为什么呢? 因为它不再认为单词是独立的,而考虑了这个单词所在附近的上下文,这是一个很大的突破。 如果两个单词经常出现在同一个上下文中,那么很可能他们有相同的含义。比如vodka和brandy可能经常出现在wine的上下文里,那么在这两个单词相对于wine的co-occurrence就应该是相近的,于是我们就可以认为这两个单词的含义是相近的。 - Co-occurrence
Word2vec
OK,上面介绍的三种Word Embedding方法都是确定性(deterministic)的方法,而接下来介绍一种非确定性的基于神经网络的预测模型-word2vec。它是只有一个隐含层的神经网络,且激活函数(active function)是线性的,最后一层output采用softmax来计算概率。它包含两种模型:
- COBW(Continuous Bag of words)
根据上下文来预测一个单词 - Skip-gram
根据一个单词来预测上下文
理解COBW
接下来我们以CBOW模型为例介绍下word2vec是如何实现词嵌入和语言模型的。首先看下CBOW的模型结构,单个单词的CBOW模型结构如下:
多个单词的CBOW模型结构如下:
其中,
VV表示词库的大小;输入向量x1,x2,…,xVx1,x2,…,xV的大小为1×V1×V,它是这个word的one-hot encoding;神经元h1,h2,…,hNh1,h2,…,hN表示Hidden Layer,大小为1×N1×N;输出向量y1,y2,…,yVy1,y2,…,yV表示的是一个概率分布向量,大小和输入向量一致。
这个结构是如何实现词嵌入和语言模型的呢?
要解答这个问题,首先要充分理解输出层的概率分布向量到底是什么?怎么理解?我们以多个单词的CBOW模型为例,CBOW的任务就是给定了一个长度为CC个单词的上下文(单词的顺序无关)去预测最有可能的空缺单词。我们通过神经网络训练之后得到的预测结果是一个VV维的向量,而这个向量代表的是词库里的每一个单词是空缺单词的概率。这样也就实现了语言模型。而神经网络中的Hidden Layer就是我们想要的词嵌入,它不仅得到了单词的语义特性,还把单词从VV维空间映射到了NN维,因为词库的大小VV往往很大,所以这样做也实现了降维处理。因此,我们也可以说词嵌入是word2vec训练语言模型的副产物。
如何理解CBOW的词嵌入?
对于Hidden Layer的直观解释就是这个单词本身被解释成大小为NN的向量/特征(features),也就说单词本身也有了属性,而这些属性就是隐藏层的权重,假想图(因为没人知道究竟被解释成了那些特征)如下:
COBW可视化
下面我们借助一个在线的visualization工具wevi: word embedding visual inspector来进一步理解,我们首先看一下它的training data:
drink,juice|apple;eat,apple|orange;drink,juice|rice;…
其中,竖线之前的表示input,每个input的单词用逗号分隔,之后是output。比如对于如下这组训练数据而言:
drink,juice|apple
它在神经网络中的表现就是这样的:
看完一个training data就觉得这个东西很简单了,本质上就是一个简单的神经网络嘛,其实完全可以不用理解hidden layer所包含的特殊意义,直接把它理解成一个端对端(end-to-end)的系统更好理解,创新的地方就是训练单词时结合了它的上下文。
Skip-gram模型
Skip-gram模型的计算过程跟COBW类似,只不过是一个相反的过程,它的结构如下:
Skip-gram可视化
sample training data:
apple|drink,juice;orange|eat,apple;rice|drink,juice;…
比如对于如下这组数据而言:
apple|drink,juice
它在神经网络中的表现就是这样的:
总结
其实word2vec和Co-Occurrence Vector的思想是很相似的,都是基于一个统计学上的假设:经常在同一个上下文出现的单词是相似的。只是他们的实现方式是不一样的,前者是采用词频统计,降维,矩阵分解等确定性技术;而后者则采用了神经网络进行不确定预测,它的提出主要是采用神经网络之后计算复杂度和最终效果都比之前的模型要好。所以那篇文章的标题才叫:Efficient Estimation of Word Representations in Vector Space。 这项技术可以用来估算两个单词之间的相似度,它在自然语言处理(NLP),搜索以及机器翻译(machine translation)等领域有着广泛的应用。比如你在用Google搜索“hotel”时,它不仅仅会返回给你包含hotel的网页,也会返回一些包含“motel,airbnb”之类的网页。还有一个是在搜索框输入一个单词之后,会自动预测后面可能出现的单词。