0%

Word Embedding(词嵌入)模型介绍

词嵌入可以算是无监督机器学习最成功的应用之一。它不要求对数据标注,就可以从未标注预料里产生标注。单词嵌入可以从输入的字符产生量更小的向量标签,可以使得被使用到后续的其他学习任务中。

词嵌入的概念

简言之,词嵌入是指将文本转化为数字表示的方法。为什么需要词嵌入呢?

众所周知,许多机器学习算法,甚至几乎所有的深度学习算法,是无法直接处理字符串或者纯文本形式的输入。相反,他们需要数字作为各种任务的输入(例如分类、回归等)。不过,通常任务(例,网站评论中的情感分析)中大量的数据字段都是文本格式的,因此在需要学习前必须从这些文本输入中提取出数字表示的信息。因此,我们可以给词嵌入一个正式的定义:

词嵌入方法,是将字典中的单词转化为向量的方法。

例如,我们对如下句子做词嵌入:

Word Embeddings are Word converted into numbers

“词”指的是类似句子中的“Embedding”、“numbers”等

“字典”指的是句子中所有不重复单词的列表。所以,上述句子的词典是[‘Word’,’Embeddings’,’are’,’Converted’,’into’,’numbers’]

词嵌入的不同方法

我们当然可以使用本博客<机器学习为什么使用独热(ONE-HOT ENCODING)编码>介绍的独热编码进行词嵌入,这是一种较为简单的处理方式。除此之外,还有许多不同的词嵌入方法。这些词嵌入方法可以大概分为如下两类:

  • 基于频率的嵌入(简称“词频嵌入”)
  • 基于预测的嵌入

我们本节会深入介绍这两类方法。

词频嵌入

现行流行的词频嵌入方法包括如下几类的嵌入向量:

  • Count Vector
  • TF_IDF Vector
  • Co-Occurence Vector

Count Vector

考虑包括如下D个文档$${d_1,d_2,…..,d_D}$$的语料库及从C中提取的N个唯一单词。这N个唯一单词组成我们的字典,对应Count Vector矩阵M的大小为$$D*N$$。矩阵M的每一行为$$d_i$$文档中的单词频率。

举个简单的例子:

  • $$d_1$$: He is a lazy boy. She is also lazy
  • $$d_2$$: Neeraj is a lazy person

这两个文档形成字典:[‘He’,’She’,’lazy’,’boy’,’Neeraj’,’person’],这里D=2,N=6,则该2*6矩阵M可作如下表示:

He

She

lazy

boy

Neeraj

person

$$d_1$$

1

1

2

1

0

0

$$d_2$$

0

0

1

0

1

1

这里,每一行代表的是文档集合中的一个文档,每一列代表的是单词。这样,矩阵中的一列就代表对应单词的词向量。例如,“lazy”的词向量为[2,1]。

很简单不是吗。不过这里有很多不同的形成矩阵M的变种方法。主要有两大类:

  • 字典的形成方式。以上为一个理想的例子,但一个现实问题往往有成千上万个文本作为语料。所以向量往往是成千上万列。而一种替代的表示方法是取其中10000个单词作为字典。
  • 每个单词数量的表示方式。我们可以用单词出现的数量或者是单词是否出现来表示(一般是采用前者)。

下图帮忙理解矩阵M的形式:

TF-IDF Vector

TF-IDF是另外一种基于词频的方法,但是计算词频时不仅仅考虑单个文档而是整个预料。这其中的原理是什么呢?

常用词‘is’、‘the’、‘a’等词在英文文档中通常出现的频率超过文档的主要词汇。例如,描述梅西的文档中会比其他文档更常出现‘Messi’一词。但是诸如‘the’一词在所有文档(当然是英文文档)都以很高频率出现。

理想状态下,我们更希望降低这些在所有文档中都会出现的词,相反提升其他文档相关性更高单词的频率。TF-IDF的工作原理,便是给这些常现词一些惩罚,赋予更低的权重。我们以如下两个文档范例看TF-IDF的工作方式:

与TF-IDF相关的定义有如下:

$$f()=TF =\frac{t单词出现在文档的次数}{文档中单词的总数量}$$

因此 TF(This, Document1) = 1/8, TF(This, Document2) = 1/5

TF代表了单词对文档的“贡献”。即,与文档相关的单词应该出现频率更高。例,关于梅西的文档里,“梅西”单词出现的频率一定很高。

$$IDF=log(N/n)$$

其中N代表文档的数量,n代表t单词有出现的文档的数量。因此IDF(This)=log(2/2)=0

因此如何解释IDF背后的原理?一般情况下,如果一个单词在所有的单词中都出现,那么很有可能这个单词与某一个特定的文档关联不大。如果单词只在一部分文档中出现,那么该单词与其所出现的文档关联的可能性就较大。我们可以计算上例中“Messi”一词的IDF为:

$$IDF(Messi)=log(2/1)=0.301$$

现在,让我们来对比“This”和“Messi”对Document1的关联性。

TF-IDF(This, Document1) = (1/8)*(0)=0

TF-IDF(This, Document2)=(1/5)*(0)=0

TF-IDF(Messi, Document1) = (4/8)*0.301 = 0.15

因此我们可以看到,对Document1,TF-IDF方法对“This”赋予较小的权重,远小于单词“Messi”。因此在整个语料库里,“Messi”对Document1是非常重要的单词。

固定上下文窗口的Co-Occurence矩阵

该方法主要思想为:类似的单词有一起出现的倾向,也有相同的上下文。例,苹果是一种水果,芒果也是一种水果。苹果和芒果倾向于有相同的上下文。即,水果。

我们先理解一下Co-Occurence和上下文窗口的含义,再具体介绍该方法。

Co-Occurence:给定语料,一对单词W1和W2的Co-Occurence指的是他们在一个上下文窗口一起出现的次数。

Context Window: 上下文窗口由一个数字和方向指定。让我们看如下例子:

Quick

Brown

Fox

Jump

Over

The

Lazy

Dog

紫色框字体是“Fox”的大小为2的上下文窗口,当计算co-occurence时,只有这些单词会算在内。同理,对单词“Over”的上下文窗口为:

Quick

Brown

Fox

Jump

Over

The

Lazy

Dog

因此,让我们使用一个范例语料来描述Co-Occurence矩阵。语料为: He is not lazy. He is intelligent. He is smart。则语料矩阵为:

He

is

not

lazy

intelligent

smart

He

0

4

2

1

2

1

is

4

0

1

2

2

1

not

2

1

0

1

0

0

lazy

1

2

1

0

0

0

intelligent

2

2

0

0

0

0

smart

1

1

0

0

0

0

上图中红色的单元表示”He”和”is”在2长度的上下文窗口的值为4,而“lazy”和“intelligent”的上下文窗口值为0。

但是真实的语料库往往有很多单词,如果构建像上表一样的N*N矩阵,对计算机处理起来复杂度过高。因此这个矩阵往往是N*M大小的矩阵,其中M为N的子集。即选择字典中的最重要的一些单词作为矩阵的其一维度。选择的方法有SVD,PCA分析等方法。

Co-Occurence矩阵的优势:

  • 保留了单词间的语义关系。例如“男人”和“女人”的距离近过“男人”和“苹果”
  • 使用SVD作为其核心,比现有其他方法来输出更为精确的单词向量。
  • 只需要做一次计算,之后可直接使用。

Co-Occurence矩阵的缺点:

  • 使用大量的内存来存储Co-Occurence矩阵。当然,有一些现有的方法可以减轻该问题。

基于预测的嵌入

上述基于词频的计算单词嵌入方法的应用范围有限。直到word2vec这种基于预测的嵌入方法被提出并广泛应用到现有的各种场景中。而Wordvec并不是一个单独的算法,而是两种算法模型:CBOW(Continuous bag of words)和Skip-gram的组合。这两种方法均是浅神经网络,可以接受单词作为输入,同样使用单词作为输出,并映射为向量。下面分别进行介绍。

CBOW(Continuous Bag of words)

CBOW模型工作的原理是根据输入的上下文来预测输出单词的概率。上下文可能为一个单词,或者是一组单词。为了描述方便,我们以一个单词作为输入来预测一个单词输出。

假设我们的语料为 C = “Hey, this is sample corpus using only one context word.”同时定义上下文窗口为1。输入语料可以以如下独热编码方式呈现:

上述矩阵被送到一个三层神经网络来训练:包含输入层,隐层和输出层。其中输出层是一个softmax层,用来呈现输出层为某个单词的可能性。

下图呈现了CBOW的网络模型:

上面架构的矩阵表示如下图:

计算方法如下:

  • 输入层和输出均为[1*V]的独热向量,V表示上述语料的字典大小
  • 输入层和隐层,以及隐层和输出层分别有节点间权重矩阵大小为[V*N],以及[N*V]。N为隐层神经元的数量,这里N=4
  • 层与层之间没有激活函数
  • 用“隐层激活(Hidden Activation)”表示输入数据乘以输入层-隐层间权重(矩阵乘法)
  • 隐藏输出乘以隐层-输出层权重得到输出
  • 根据输出使用逆传播算法来调整权重
  • 隐藏-输出层权重被用作最后的词向量

以上为一个输入的例子,假如是多个输入呢?

上述为多个输入的神经网络架构,而下图为其矩阵表示:

输入三个上下文单词预测一个目标单词。输入可以用三个独热向量表示。上述输入层有3个[1*V]向量作为输入,以及一个[1*V]向量作为输出。

以上计算方法与单输入的CBOW模型类似。只不过最终的输出为多个权重矩阵的算术平均值

上述算法与一般神经网络类似,主要差异在于:

  • 不同于计算算术平方误差作为损失,CBOW是计算最小化选中单词的负对数似然
  • CBOW每层神经元未使用激活函数做非线性化激活

Skip – Gram模型

Skip-gram模型与CBOW架构类似。不过其核心思想与CBOW正好相反,是给定单词预测期上下文。架构如图:

其矩阵形式架构如图:

输入层大小为[1*V],输入-隐层权重矩阵大小[V*N],输出-权重矩阵[N*V],输出层大小[1*V]

计算方法如下:

  • 上图红色输入为独热编码
  • 中间桔黄色矩阵为隐层-输出层权重矩阵。
  • 用“隐层激活(Hidden Activation)”表示输入数据乘以输入层-隐层间权重(矩阵乘法), 桔黄色矩阵乘以 “隐层激活(Hidden Activation)” 得到蓝色矩阵
  • 图右蓝色矩阵的每行使用Softmax进行计算得到图右绿色矩阵。
  • 图右灰色矩阵为输入单词上下文的2两个单词的独热编码。使用绿色矩阵逐行减去灰色矩阵,得到误差向量
  • 对所有的输入计算误差向量后求和得到损失,并进行逆传播优化。

总结

本文介绍了基于词频和基于预测的两种嵌入方式,并对其中的常用模型进行了介绍。其中基于预测的嵌入方式是现行较为常用且有效的方式。其模型CBOW和Skip-Gram分别为使用上下文预测单词和使用单词预测上下文的两种不同模型,均为广泛使用。