文章目录

  • Unsupervised Learning: Word Embedding
  • Introduction
  • 句子的表示
  • 1-of-N Encoding
  • Bag of Words (BOW)
  • Word Class
  • Word Embedding
  • Word Embedding
  • basic idea(Count based and Prediction based)
  • Count based
  • Prediction based
  • how to do perdition
  • Why prediction works
  • Sharing Parameters
  • Formulation
  • In Practice
  • Various Architectures
  • others
  • Application
  • Subtraction
  • Multi-lingual Embedding
  • Multi-domain Embedding
  • Document Embedding


Unsupervised Learning: Word Embedding

本文介绍NLP中词嵌入(Word Embedding)相关的基本知识,基于降维思想提供了count-based和prediction-based两种方法,并介绍了该思想在机器问答、机器翻译、图像分类、文档嵌入等方面的应用
因为敏感词原因,文章中有些文字用拼音代替。。。

Introduction

词嵌入(word embedding)是降维算法(Dimension Reduction)的典型应用

人可以理解文字,但是对于机器来说,数字是更好理解的(因为数字可以进行运算),因此,我们需要把文字变成数字。

  • 中文句子以“字”为单位。一句中文句子是由一个个字组成的,每个字都分别变成词向量,用一个向量vector来表示一个字的意思。
  • 英文句子以“单词”为单位。一句英文句子是由一个个单词组成的,每个单词都分别变成词向量,用一个向量vector来表示一个单词的意思。


embed使用预览word_特征向量


句子的表示

对于一句句子的处理,先建立字典,字典内含有每一个字所对应到的索引。比如:

  • “I have a pen.” -> [1, 2, 3, 4]
  • “I have an apple.” -> [1, 2, 5, 6]

得到句子的向量有两种方法:

  1. 直接用 bag of words (BOW) 的方式获得一个代表该句的向量。
  2. 我们已经用一个向量 vector 来表示一个单词,然后我们就可以用RNN模型来得到一个表示句子向量。
1-of-N Encoding

最传统的做法是1-of-N Encoding,也叫one-hot编码,中文翻译成“独热编码”。假设这个vector的维数就等于世界上所有单词的数目,那么对每一个单词来说,只需要某一维为1,其余都是0即可;但这会导致任意两个vector都是不一样的,你无法建立起同类word之间的联系。再具体点。

一个向量,长度为N,其中有1个是1,N − 1个都是0。

one-hot在特征提取上属于词袋模型(bag of words),假设语料库中有三句话:

  • 我爱中国
  • 爸爸妈妈爱我
  • 爸爸妈妈爱中国

首先,将语料库中的每句话分成单词,并编号:

  • 1:我 2:爱 3:爸爸 4:妈妈 5:中国

然后,用one-hot对每句话提取特征向量:



embed使用预览word_embed使用预览word_02


所以最终得到的每句话的特征向量就是:

  • 我爱中国 -> 1,1,0,0,1
  • 爸爸妈妈爱我 -> 1,1,1,1,0
  • 爸爸妈妈爱中国 -> 0,1,1,1,1

那么这样做的优点和缺点都有什么?

优点:

  • 解决了分类器处理离散数据困难的问题
  • 一定程度上起到了扩展特征的作用(上例中从3扩展到了9)

缺点:

  • 占用内存大:总共有多少个字,向量就有多少维,但是其中很多都是0,只有1个是1.
    比如:embed使用预览word_sed_03
  • one-hot是一个词袋模型,不考虑词与词之间的顺序问题,而在文本中,词的顺序是一个很重要的问题
  • one-hot是基于词与词之间相互独立的情况下的,然而在多数情况中,词与词之间应该是相互影响的
  • one-hot得到的特征是离散的,稀疏的


Bag of Words (BOW)

BOW 的概念就是将句子里的文字变成一个袋子装着这些词,BOW不考虑文法以及词的顺序。

比如,有两句句子:

1. John likes to watch movies. Mary likes movies too.
2. John also likes to watch football games.

有一个字典:[ “John”, “likes”, “to”, “watch”, “movies”, “also”, “football”, “games”, “Mary”, “too” ]

在 BOW 的表示方法下,第一句句子 “John likes to watch movies. Mary likes movies too.” 在该字典中,每个单词的出现次数为:

John:1次
likes:2次
to:1次
watch:1次
movies:2次
also:0次
football:0次
games:0次
Mary:1次
too:1次

因此,“John likes to watch movies. Mary likes movies too.”的表示向量即为:[1, 2, 1, 1, 2, 0, 0, 0, 1, 1](1是表示这个单词在句子里出现了一次,2表示这个单词在句子里出现了2次,0表示未出现),第二句句子同理,最终两句句子的表示向量如下:

1. John likes to watch movies. Mary likes movies too. -> [1, 2, 1, 1, 2, 0, 0, 0, 1, 1]
2. John also likes to watch football games.           -> [1, 1, 1, 1, 0, 1, 1, 1, 0, 0]

之后,把句子的BOW输入DNN,得到预测值,与标签进行对比。



embed使用预览word_特征向量_04


具体的可以看这篇文章👉BoW(词袋)模型详细介绍



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的投影空间上是比较接近的,而且该空间里的每一维都可能有特殊的含义

假设词嵌入的投影空间如下图所示,则横轴代表了生物与其它东西之间的区别,而纵轴则代表了会动的东西与静止的东西之间的差别



embed使用预览word_embed使用预览word_05


word embedding是一个无监督的方法(unsupervised approach),只要让机器阅读大量的文章,它就可以知道每一个词汇embedding之后的特征向量应该长什么样子



embed使用预览word_embed使用预览word_06


我们的任务就是训练一个neural network,input是词汇,output则是它所对应的word embedding vector,实际训练的时候我们只有data的input,该如何解这类问题呢?

之前提到过一种基于神经网络的降维方法,Auto-encoder,就是训练一个model,让它的输入等于输出,取出中间的某个隐藏层就是降维的结果,自编码的本质就是通过自我压缩和解压的过程来寻找各个维度之间的相关信息;但word embedding这个问题是不能用Auto-encoder来解的,因为输入的向量通常是1-of-N编码,各维无关,很难通过自编码的过程提取出什么有用信息

Word Embedding

basic idea(Count based and Prediction based)

基本精神就是,每一个词汇的含义都可以根据它的上下文来得到

比如机器在两个不同的地方阅读到了“马520xuanshijiuzhi”、“蔡520xuanshijiuzhi”,它就会发现“马”和“蔡”前后都有类似的文字内容,于是机器就可以推测“马”和“蔡”这两个词汇代表了可能有同样地位的东西,即使它并不知道这两个词汇是人名



embed使用预览word_Word_07


怎么用这个思想来找出word embedding的vector呢?有两种做法:

  • Count based
  • Prediction based

Count based

假如embed使用预览word_sed_08embed使用预览word_sed_09这两个词汇常常在同一篇文章中出现(co-occur),它们的word vector分别用embed使用预览word_机器学习_10embed使用预览word_embed使用预览word_11来表示,则embed使用预览word_机器学习_10embed使用预览word_embed使用预览word_11会比较接近

假设embed使用预览word_Word_14embed使用预览word_sed_08embed使用预览word_sed_09这两个词汇在相同文章里同时出现的次数,我们希望它与embed使用预览word_sed_17的内积越接近越好,这个思想和之前的文章中提到的矩阵分解(matrix factorization)的思想其实是一样的

这种方法有一个很代表性的例子是Glove Vector



embed使用预览word_Word_18


Prediction based

how to do perdition

给定一个sentence,我们要训练一个神经网络,它要做的就是根据当前的word embed使用预览word_embed使用预览word_19,来预测下一个可能出现的word embed使用预览word_sed_08是什么

假设我们使用1-of-N encoding把embed使用预览word_embed使用预览word_19表示成feature vector,它作为neural network的input,output的维数和input相等,只不过每一维都是小数,代表在1-of-N编码中该维为1其余维为0所对应的word会是下一个word embed使用预览word_sed_08的概率

把第一个hidden layer的input embed使用预览word_Word_23拿出来,它们所组成的embed使用预览word_特征向量_24就是word的另一种表示方式,当我们input不同的词汇,向量embed使用预览word_特征向量_24就会发生变化

也就是说,第一层hidden layer的维数可以由我们决定,而它的input又唯一确定了一个word,因此提取出第一层hidden layer的input,实际上就得到了一组可以自定义维数的Word Embedding的向量



embed使用预览word_sed_26


Why prediction works

prediction-based方法是如何体现根据词汇的上下文来了解该词汇的含义这件事呢?

假设在两篇文章中,“蔡”和“马”代表embed使用预览word_embed使用预览word_19,“xuanshijiuzhi”代表embed使用预览word_sed_08,我们希望对神经网络输入“蔡”或“马”这两个词汇,输出的vector中对应“xuanshijiuzhi”词汇的那个维度的概率值是高的

为了使这两个不同的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的输入向量embed使用预览word_机器学习_29,该向量同时也考虑了上下文词汇的关联,我们可以通过控制第一层hidden layer的大小从而控制目标降维空间的维数



embed使用预览word_embed使用预览word_30


Sharing Parameters

你可能会觉得通过当前词汇预测下一个词汇这个约束太弱了,由于不同词汇的搭配千千万万,即便是人也无法准确地给出下一个词汇具体是什么

你可以扩展这个问题,使用10个及以上的词汇去预测下一个词汇,可以帮助得到较好的结果

这里用2个词汇举例,如果是一般是神经网络,我们直接把embed使用预览word_机器学习_31embed使用预览word_embed使用预览word_19这两个vector拼接成一个更长的vector作为input即可

但实际上,我们希望和embed使用预览word_机器学习_31相连的weight与和embed使用预览word_embed使用预览word_19相连的weight是tight在一起的,简单来说就是embed使用预览word_机器学习_31embed使用预览word_embed使用预览word_19的相同dimension对应到第一层hidden layer相同neuron之间的连线拥有相同的weight,在下图中,用同样的颜色标注相同的weight:



embed使用预览word_embed使用预览word_37


如果我们不这么做,那把同一个word放在embed使用预览word_机器学习_31的位置和放在embed使用预览word_embed使用预览word_19的位置,得到的Embedding结果是会不一样的,把两组weight设置成相同,可以使embed使用预览word_机器学习_31embed使用预览word_embed使用预览word_19的相对位置不会对结果产生影响

除此之外,这么做还可以通过共享参数的方式有效地减少参数量,不会由于input的word数量增加而导致参数量剧增

Formulation

假设embed使用预览word_机器学习_31的1-of-N编码为embed使用预览word_sed_43embed使用预览word_embed使用预览word_19的1-of-N编码为embed使用预览word_sed_45,维数均为embed使用预览word_sed_46,表示数据中的words总数

hidden layer的input为向量embed使用预览word_机器学习_47,长度为embed使用预览word_机器学习_48,表示降维后的维数
embed使用预览word_机器学习_49
其中embed使用预览word_sed_50embed使用预览word_特征向量_51都是embed使用预览word_sed_52维的weight matrix,它由embed使用预览word_机器学习_48embed使用预览word_sed_46维的向量构成,第一组embed使用预览word_sed_46维向量与embed使用预览word_sed_46维的embed使用预览word_sed_43相乘得到embed使用预览word_sed_58,第二组embed使用预览word_sed_46维向量与embed使用预览word_sed_46维的embed使用预览word_sed_43相乘得到embed使用预览word_sed_62,…,依次类推

我们强迫让embed使用预览word_Word_63,此时embed使用预览word_特征向量_64

因此,只要我们得到了这组参数embed使用预览word_Word_65,就可以与1-of-N编码embed使用预览word_Word_66相乘得到word embedding的结果embed使用预览word_机器学习_47



embed使用预览word_embed使用预览word_68


In Practice

那在实际操作上,我们如何保证embed使用预览word_sed_50embed使用预览word_特征向量_51一样呢?

以下图中的embed使用预览word_sed_08embed使用预览word_sed_09为例,我们希望它们的weight是一样的:

  • 首先在训练的时候就要给它们一样的初始值
  • 然后分别计算loss function embed使用预览word_embed使用预览word_73embed使用预览word_embed使用预览word_74embed使用预览word_Word_75的偏微分,并对其进行更新
    embed使用预览word_特征向量_76
    这个时候你就会发现,embed使用预览word_embed使用预览word_73embed使用预览word_embed使用预览word_74embed使用预览word_Word_75的偏微分是不一样的,这意味着即使给了embed使用预览word_embed使用预览word_74embed使用预览word_Word_75相同的初始值,更新过一次之后它们的值也会变得不一样,因此我们必须保证两者的更新过程是一致的,即:
    embed使用预览word_机器学习_82
  • 这个时候,我们就保证了embed使用预览word_embed使用预览word_74embed使用预览word_Word_75始终相等:
  • embed使用预览word_sed_85embed使用预览word_特征向量_86的初始值相同
  • embed使用预览word_sed_85embed使用预览word_特征向量_86的更新过程相同


embed使用预览word_Word_89


如何去训练这个神经网络呢?注意到这个NN完全是unsupervised,你只需要上网爬一下文章数据直接喂给它即可

比如喂给NN的input是“潮水”和“退了”,希望它的output是“就”,之前提到这个NN的输出是一个由概率组成的vector,而目标“就”是只有某一维为1的1-of-N编码,我们希望minimize它们之间的cross entropy,也就是使得输出的那个vector在“就”所对应的那一维上概率最高



embed使用预览word_sed_90


Various Architectures

除了上面的基本形态,Prediction-based方法还可以有多种变形

  • CBOW(Continuous bag of word model)
    拿前后的词汇去预测中间的词汇
  • Skip-gram
    拿中间的词汇去预测前后的词汇


embed使用预览word_特征向量_91


others

尽管word vector是deep learning的一个应用,但这个neural network其实并不是deep的,它就只有一个linear的hidden layer

我们把1-of-N编码输入给神经网络,经过weight的转换得到Word Embedding,再通过第一层hidden layer就可以直接得到输出

其实过去有很多人使用过deep model,但这个task不用deep就可以实现,这样做既可以减少运算量,跑大量的data,又可以节省下训练的时间(deep model很可能需要长达好几天的训练时间)

Application

Subtraction

机器问答

从得到的word vector里,我们可以发现一些原本并不知道的word与word之间的关系

把word vector两两相减,再投影到下图中的二维平面上,如果某两个word之间有类似包含于的相同关系,它们就会被投影到同一块区域



embed使用预览word_Word_92


利用这个概念,我们可以做一些简单的推论:

  • 在word vector的特征上,embed使用预览word_特征向量_93
  • 此时如果有人问“罗马之于意大利等于柏林之于?”,那机器就可以回答这个问题
    因为德国的vector会很接近于“柏林的vector-罗马的vector+意大利的vector”,因此机器只需要计算embed使用预览word_机器学习_94,然后选取与这个结果最接近的vector即可


embed使用预览word_特征向量_95


Multi-lingual Embedding

机器翻译

此外,word vector还可以建立起不同语言之间的联系

如果你要用上述方法分别训练一个英文的语料库(corpus)和中文的语料库,你会发现两者的word vector之间是没有任何关系的,因为Word Embedding只体现了上下文的关系,如果你的文章没有把中英文混合在一起使用,机器就没有办法判断中英文词汇之间的关系

但是,如果你知道某些中文词汇和英文词汇的对应关系,你可以先分别获取它们的word vector,然后再去训练一个模型,把具有相同含义的中英文词汇投影到新空间上的同一个点

接下来遇到未知的新词汇,无论是中文还是英文,你都可以采用同样的方式将其投影到新空间,就可以自动做到类似翻译的效果



embed使用预览word_机器学习_96


参考文献:Bilingual Word Embeddings for Phrase-Based Machine Translation, Will Zou, Richard Socher, Daniel Cer and Christopher Manning, EMNLP, 2013

Multi-domain Embedding

图像分类

这个做法不只局限于文字的应用,你也可以对文字+图像做Embedding

假设你已经得到horse、cat和dog这些词汇的vector在空间上的分布情况,你就可以去训练一个模型,把一些已知的horse、cat和dog图片去投影到和对应词汇相同的空间区域上

比如对模型输入一张图像,使之输出一个跟word vector具有相同维数的vector,使dog图像的映射向量就散布在dog词汇向量的周围,horse图像的映射向量就散布在horse词汇向量的周围…

训练好这个模型之后,输入新的未知图像,根据投影之后的位置所对应的word vector,就可以判断它所属的类别



embed使用预览word_embed使用预览word_97


我们知道在做图像分类的时候,很多情况下都是事先定好要分为哪几个具体的类别,再用这几个类别的图像去训练模型,由于我们无法在训练的时候穷尽所有类别的图像,因此在实际应用的时候一旦遇到属于未知类别的图像,这个模型就无能为力了

而使用image+word Embedding的方法,就算输入的图像类别在训练时没有被遇到过,比如上图中的cat,但如果这张图像能够投影到cat的word vector的附近,根据词汇向量与图像向量的对应关系,你自然就可以知道这张图像叫做cat

Document Embedding

文档嵌入

除了Word Embedding,我们还可以对Document做Embedding

最简单的方法是把document变成bag-of-word,然后用Auto-encoder就可以得到该文档的语义嵌入(Semantic Embedding),但光这么做是不够的



embed使用预览word_机器学习_98


词汇的顺序代表了很重要的含义,两句词汇相同但语序不同的话可能会有完全不同的含义,比如

  • 白血球消灭了传染病——正面语义
  • 传染病消灭了白血球——负面语义


embed使用预览word_Word_99


想要解决这个问题,具体可以参考下面的几种处理方法:

  • Paragraph Vector: Le, Quoc, and Tomas Mikolov. "Distributed Representations of Sentences and Documents.“ ICML, 2014
  • Seq2seq Auto-encoder: Li, Jiwei, Minh-Thang Luong, and Dan Jurafsky. “A hierarchical neural autoencoder for paragraphs and documents.” arXiv preprint, 2015
  • Skip Thought: Ryan Kiros, Yukun Zhu, Ruslan Salakhutdinov, Richard S. Zemel, Antonio Torralba, Raquel Urtasun, Sanja Fidler, “Skip-Thought Vectors” arXiv preprint, 2015.