目录
概述
本节首先提出一个问题如何用vector来表示一个word呢?给了两种方法1-of-N Encoding和Word Class,但都有局限性,1-of-N Encoding无法体现词义之间的联系而word class也无法体现全面的信息。
因此引出word embedding,word embedding就是用向量表示词,输入一个词,输出一个向量。word embedding的基本思路就是:通过上下文找到这个词的意义,基于降维思想提供了count-based和prediction-based两种方法,并介绍了该思想在机器问答、机器翻译、图像分类、文档嵌入等方面的应用。
Introduction
词嵌入(word embedding)是降维算法(Dimension Reduction)的典型应用
那如何用vector来表示一个word呢?
1-of-N Encoding
最传统的做法是1-of-N Encoding,假设这个vector的维数就等于世界上所有单词的数目,那么对每一个单词来说,
只需要某一维为1,其余都是0即可;但这会导致任意两个vector都是不一样的,你无法建立起同类word之间的联系。
Word Class
还可以把有同样性质的word进行聚类(clustering),划分成多个class,然后用word所属的class来表示这个word,
但光做clustering是不够的,不同class之间关联依旧无法被有效地表达出来。
Word Embedding
词嵌入(Word Embedding)把每一个word都投影到高维空间上,当然这个空间的维度要远比1-of-N Encoding的维度低,
假如后者有10w维,那前者只需要50~100维就够了,这实际上也是Dimension Reduction的过程。
类似语义(semantic)的词汇,在这个word embedding的投影空间上是比较接近的,而且该空间里的每一维都可能有特殊的含义
假设词嵌入的投影空间如下图所示,则横轴代表了生物与其它东西之间的区别,而纵轴则代表了会动的东西与静止的东西之间的差别
word embedding是一个无监督的方法(unsupervised approach),只要让机器阅读大量的文章,
它就可以知道每一个词汇embedding之后的特征向量应该长什么样子。
我们的任务就是训练一个neural network,input是词汇,output则是它所对应的word embedding vector,实际训练的时候我们只有data的input,该如何解这类问题呢?
Word Embedding
basic idea
基本精神就是,每一个词汇的含义都可以根据它的上下文来得到
比如机器在两个不同的地方阅读到了“bxx520宣誓就职”、“axx520宣誓就职”,它就会发现“bxx”和“axx”前后都有类似的文字内容,
于是机器就可以推测“马xx”和“蔡xx”这两个词汇代表了可能有同样地位的东西,即使它并不知道这两个词汇是人名。
怎么用这个思想来找出word embedding的vector呢?有两种做法:
- Count based
- Prediction based
Count based
假如wi和wj这两个词汇常常在同一篇文章中出现,它们的word vector分别用V(wi)和V(wj)来表示,则V(wi)和V(wj)会比较接近
假设 Ni,j 是wi和wj这两个词汇在相同文章里同时出现的次数,我们希望它与V(wi). V(wj)的内积越接近越好。
Prediction based
how to do predition
给定一个sentence,我们要训练一个神经网络,它要做的就是根据当前的word wi-1 ,来预测下一个可能出现的word wi是什么
假设我们使用1-of-N encoding把wi-1表示成feature vector,它作为neural network的input,output的维数和input相等,只不过每一维都是小数,
代表在1-of-N编码中该维为1其余维为0所对应的word会是下一个word wi 的概率。
把第一个hidden layer的input z1,z2.... 拿出来,它们所组成的Z就是word的另一种表示方式,当我们input不同的词汇,向量Z就会发生变化,
也就是说,第一层hidden layer的维数可以由我们决定,而它的input又唯一确定了一个word,因此提取出第一层hidden layer的input,
实际上就得到了一组可以自定义维数的Word Embedding的向量。
Why prediction works
prediction-based方法是如何体现根据词汇的上下文来了解该词汇的含义这件事呢?
假设在两篇文章中,“aaa”和“bbb”代表wi-1,“宣誓就职”代表wi,我们希望对神经网络输入“axx”或“bxx”这两个词汇,
输出的vector中对应“宣誓就职”词汇的那个维度的概率值是高的。
为了使这两个不同的input通过NN能得到相同的output,就必须在进入hidden layer之前,就通过weight的转换将这两个input vector投影到位置相近的低维空间上,
也就是说,尽管两个input vector作为1-of-N编码看起来完全不同,但经过参数的转换,将两者都降维到某一个空间中,在这个空间里,
经过转换后的new vector 1和vector 2是非常接近的,因此它们同时进入一系列的hidden layer,最终输出时得到的output是相同的。
因此,词汇上下文的联系就自动被考虑在这个prediction model里面
总结一下,对1-of-N编码进行Word Embedding降维的结果就是神经网络模型第一层hidden layer的输入向量[z1,z2,z3....]T,
该向量同时也考虑了上下文词汇的关联,我们可以通过控制第一层hidden layer的大小从而控制目标降维空间的维数。
Sharing Parameters
你可能会觉得通过当前词汇预测下一个词汇这个约束太弱了,由于不同词汇的搭配千千万万,即便是人也无法准确地给出下一个词汇具体是什么,
你可以扩展这个问题,使用10个及以上的词汇去预测下一个词汇,可以帮助得到较好的结果,
这里用2个词汇举例,如果是一般是神经网络,我们直接把wi-2和wi-1这两个vector拼接成一个更长的vector作为input即可
但实际上,我们希望和wi-2相连的weight与和wi-1相连的weight是tight在一起的,简单来说就是与的相同dimension对应到第一层hidden layer相同neuron之间的连线拥有相同的weight,
在下图中,用同样的颜色标注相同的weight:
如果我们不这么做,那把同一个word放在wi-2的位置和放在wi-1的位置,得到的Embedding结果是会不一样的,把两组weight设置成相同,可以使wi-2与wi-1的相对位置不会对结果产生影响,
除此之外,这么做还可以通过共享参数的方式有效地减少参数量,不会由于input的word数量增加而导致参数量剧增。
Formulation
假设wi-2的1-of-N编码为xi-2,wi-1的1-of-N编码为xi-1,维数均为|V|,表示数据中的words总数
hidden layer的input为向量z,长度为|Z|,表示降维后的维数, z = W1xi-2 + W2xi-1
其中W1和W2都是|Z|*|V|维的weight matrix,它由|Z|组|V|维的向量构成,第一组|V|维向量与|V|维的xi-2相乘得到z1,第二组|V|维向量与|V|维的xi-2相乘得到z2,...,依次类推
我们强迫让W1=W2=W,此时z=W(xi-2 + xi-1)
因此,只要我们得到了这组参数W,就可以与1-of-N编码x相乘得到word embedding的结果
In Practice
那在实际操作上,我们如何保证W1和W2一样呢?
以下图中的wi和wj为例,我们希望它们的weight是一样的:
-
首先在训练的时候就要给它们一样的初始值
-
然后分别计算loss function 对和的偏微分,并对其进行更新
这个时候你就会发现,C对wi和wj的偏微分是不一样的,这意味着即使给了wi和wj相同的初始值,
更新过一次之后它们的值也会变得不一样,因此我们必须保证两者的更新过程是一致的,即:
这个时候,我们就保证了wi和wj始终相等:
- wi和wj的初始值相同
- wi和wj的更新过程相同
如何去训练这个神经网络呢?注意到这个NN完全是unsupervised,你只需要上网爬一下文章数据直接喂给它即可
比如喂给NN的input是“潮水”和“退了”,希望它的output是“就”,之前提到这个NN的输出是一个由概率组成的vector,而目标“就”是只有某一维为1的1-of-N编码,
我们希望minimize它们之间的cross entropy,也就是使得输出的那个vector在“就”所对应的那一维上概率最高。
Various Architectures
除了上面的基本形态,Prediction-based方法还可以有多种变形
-
CBOW(Continuous bag of word model)
拿前后的词汇去预测中间的词汇
-
Skip-gram
拿中间的词汇去预测前后的词
Application
机器问答
从得到的word vector里,我们可以发现一些原本并不知道的word与word之间的关系
把word vector两两相减,再投影到下图中的二维平面上,如果某两个word之间有类似包含于的相同关系,它们就会被投影到同一块区域
机器翻译
此外,word vector还可以建立起不同语言之间的联系
如果你要用上述方法分别训练一个英文的语料库(corpus)和中文的语料库,你会发现两者的word vector之间是没有任何关系的,因为Word Embedding只体现了上下文的关系,如果你的文章没有把中英文混合在一起使用,机器就没有办法判断中英文词汇之间的关系
但是,如果你知道某些中文词汇和英文词汇的对应关系,你可以先分别获取它们的word vector,然后再去训练一个模型,把具有相同含义的中英文词汇投影到新空间上的同一个点
接下来遇到未知的新词汇,无论是中文还是英文,你都可以采用同样的方式将其投影到新空间,就可以自动做到类似翻译的效果
总结和展望
本节学习了Word Embedding(词嵌入)的知识,其基本思路就是:通过上下文找到这个词的意义,它是无监督学习的(输入一个词,输出一个向量),其基本思路有 Count based(基于统计) 与 Prediction based(基于预测)两种方法。
基于统计的主要思想是:两词向量共同出现的频率比较高的话,那么这两个词向量也应该比较相似。
而基于预测的方法是,我们要训练一个神经网络,它要做的就是根据当前的word wi-1 ,来预测下一个可能出现的word wi是什么。