词嵌入的那些事儿(一)

1. 词向量介绍

 

在讨论词嵌入之前,先要理解词向量的表达形式,注意,这里的词向量不是指 Word2Vec 。关于词向量的表达,现阶段采用的主要有 One hot representation 和 Distributed representation 两种表现形式。

 

1.1 One hotrepresentation

 

顾名思义,采用独热编码的方式对每个词进行表示。

 

例如,一段描述:“杭州和上海今天有雨”,通过分词工具可以把这段描述分为[‘杭州’‘和’‘上海’今天’‘有’‘雨’],因此词表的长度为6,那幺‘杭州’、‘上海’、’今天’的One hot representation分别为[1 0 0 0 0 0] [0 0 1 0 0 0] [0 0 0 1 0 0]。

 

可以看到,One hot representation编码的每个词都是一个维度,元素非0即1,且词与词之间彼此相互独立。

 

1.2 Distributedrepresentation

 

Distributedrepresentation 在 One hot representation 的基础上考虑到词间关系,例如词义、词性等信息。每一个维度元素不再是 0 或 1 ,而是连续的实数,用来表示不同词信息的程度。 Distributed representation 又包含了以下三种处理方式:

 

基于矩阵的分布表示。

 

基于聚类的分布表示。

 

基于神经网络的分布表示。

 

而现在常说的 Distributed representation 主要是基于神经网络的分布式表示的。例如 ‘ 杭州 ’ 、 ‘ 上海 ’ 的 Distributed representation 分别为 [0.3 1.2 0.8 0.7] 和 [0.5 1.2 0.6 0.8 ] 。

 

所以对于词嵌入,可以理解是对词的一种分布式表达方式,并且是从高维稀疏向量映射到了相对低维的实数向量上。

 

2. 为什幺使用词嵌入

 

词嵌入,往往和Distributed representation联系在一起。这里主要从计算效率、词间关系和样本数量这三点说明。

 

 

计算效率。采用One hotrepresentation的每个词的向量维度由词汇表大小决定,如果词汇表很大,那幺每个词的向量维度很高且非常稀疏。而由于往往和神经网络结合,所以造成存储和计算问题。

 

词间关系。和One hot representation相比,Distributed representation能够表达词间关系。

 

样本数量。对于把词语作为模型输入的任务,和One hotrepresentation相比,对于相似的词语,可以通过较少样本完成训练。

 

 

3. Language Models

 

由于词嵌入目的是为了能更好地对 NLP 的输入做预处理。所以在对词嵌入技术作进一步讨论之前,有必要对语言模型的发展做一些介绍。

 

3.1 Bag of words model

 

Bag of words model 又称为词袋模型,顾名思义,一段文本可以用一个装着这些词的袋子来表示。词袋模型通常将单词和句子表示为数字向量的形式,其中向量元素为句子中此单词在词袋表出现的次数。然后将数字向量输入分类器 ( 例如 Naive Bayes) ,进而对输出进行预测。这种表示方式不考虑文法以及词的顺序。

 

例如以下两个句子:

 

John likes to watch movies. Mary likes movies too.

 

John also likes to watch football games.

 

基于以上两个句子,可以建构词袋表: [ “John”, “likes”, “to”, “watch”, “movies”, “also”, “football”, “games”, “Mary”, “too” ]

 

由于词袋表的长度为 10 ,所以每个句子的数字向量表示长度也为 10 。下面是每个句子的向量表示形式:

 

[1, 2, 1, 1, 2, 0, 0, 0, 1, 1]

 

[1, 1, 1, 1, 0, 1, 1, 1, 0, 0]

 

Bag of words model 的优缺点很明显。 优点是基于频率统计方法,易于理解; 缺点是它的假设 ( 单词之间完全独立 ) 过于强大,无法建立准确的模型。

 

3.2 N-Gram model

 

N-gram model 的提出旨在减少传统 Bag of words model 的一些强假设。

 

语言模型试图预测在给定前 t 个单词的前提下观察第 t+ 1 个单词 w t + 1 的概率:

 

 

利用概率链式法则,可以计算出观察整个句子的概率:

 

可以发现,估计这些概率可能是困难的。因此可以用最大似然估计对每个概率进行计算 :

 

 

然而,采用最大似然估计方法也面临两点问题:

 

 

通常无法从语料库中观察到足够多的样本

 

由于需要遍历语料库每个句子,所以计算复杂度较高。

 

 

因此对其继续改进,采用了马尔可夫链的思想。

 

马尔可夫链规定:系统下一时刻的状态仅由当前状态决定,不依赖于以往的任何状态 。即第 t + 1 个单词的发生概率表示为:

 

 

因此,一个句子的概率可以表示为:

 

 

同样地,马尔可夫假设可以推广到: 系统下一时刻的状态仅由当前 0 个、 1 个、 2 个 …n 个状态决定 。 这就是 N-gram model 的 N 的意思:对下一时刻的状态设置当前状态的个数。下面分别给出了 unigram (一元模型)和 bigram (二元模 型)的第 t + 1 个单词的发生概率:

 

 

可以发现, N-Gram model 在 Bag of words model 的 基础上,通过采用马尔科夫链的思想,既减少了概率计算的复杂度,又同时考虑到了词间关系。

 

3.3 Word2Vec Model

 

Word2Vec 模型实际上分为了两个部分,第一部分为训练数据集的构造,第二部分是通过模型获取词嵌入向量,即 word embedding 。

 

Word2Vec 的整个建模过程实际上与自编码器( auto-encoder )的思想很相似,即先基于训练数据构建一个神经网络,当这个模型训练好后,并不会用这个训练好的模型处理新任务,而真正使用的是更新后的模型参数。

 

关于 word embedding 的发展,由于考虑上下文关系,所以模型的输入和输出分别是词汇表中的词组成,进而产生出了两种模型方法: Skip-Gram 和 CBOW 。同时,在隐藏层 – 输出层,也从 softmax 方法演化到了分层 softmax 和 negative sample 方法。

 

所以,要拿到每个词的词嵌入向量,首先需要理解 Skip-Gram 和 CBOW 。下图展示了 CBOW 和 Skip-Gram 的网络结构:

 

 

下面以 Skip-Gram 模型为例,来理解词嵌入, Skip-Gram 是给定 input word 来预测上下文。所以关于 Skip-Gram 的模型结构,主要分为几下四步:

 

 

从句子中定义一个中心词,即 Skip-Gram 的模型 input word

 

定义 skip_window 参数,用于表示从当前 input word 的一侧(左边及右边)选取词的数量。

 

根据中心词和 skip_window ,构建窗口列表。

 

定义 num_skips 参数,用于表示从当前窗口列表中选择多少个不同的词作为 outputword 。

 

 

假设有一句子 “The quick brown fox jumps over the lazy dog” ,设定的窗口大小为 2 ( window_size ),也就是说仅选中心词( input word )前后各两个词和中心词( input word )进行组合。如下图所示,以步长为 1 对中心词进行滑动,其中蓝色代表 input word ,方框代表位于窗口列表中的词。

 

 

这样,采用 Skip-Gram 模型构造的训练数据已经完成。

 

3.4 Skip-Gram 网络结构

 

在 3.3 小节中,对如何使用 Skip-Gram 进行训练集的构造做出了解释,本节会进一步对其网络结构进行说明。

 

需要注意的是: 无论采用 Skip-Gram 还是 CBOW 模型,构造的训练样本中输入及输出形式都应该是单词的 One hotrepresentation 。结合下图理解:

 

 

图中左侧的神经元 Input Vector 代表对输入词进行 One hot representation ,右侧 Output Layer 的神经元则代表输出词。

 

3.4.1  隐藏层

 

假设正在学习具有 300 个特征的词向量。因此,隐藏层将由一个包含 10000 行 ( 每个单词对应一行 ) 和 300 列 ( 每个隐藏神经元对应一列 ) 的权重矩阵来表示。(注:谷歌在其发布的模型中的隐藏层使用了 300 个输出(特征),这些特征是在谷歌新闻数据集中训练出来的 ( 数据集可以从 这里 下载 ) 。特征的数量 300 则是模型进行调优选择后的超参数)。

 

下面左右两张图分别从不同角度表达了输入层 – 隐层的权重矩阵 。

 

 

从左图看,每一列代表一个 One hot representation 的词和隐层单个神经元连接的权重向量。从右图看,每一行实际上代表了每个词的词向量,或者词嵌入。

 

所以我们的 目标就是学习输入层 – 隐藏层的权矩阵,而隐藏层 – 输出层的部分,则是在模型训练完毕后不需要保存的参数。这一点,与自编码器的设计思想是类似的。

 

可能会有疑惑:难道真的分别要把每一个 One hot representation 的词( 1 x 10000 )与一个 10000 x 300 的权矩阵相乘吗?

 

实际上,工程师们已经考虑到了这一点。由于 One hot representation 的词具有只有一个元素这为 1 ,其余元素值为 0 的特性,所以可以通过查找 One hot representation 中元素为 1 的位置索引,进而获得对应要乘以的 10000 x 300 的权矩阵的向量值,从而解决计算速度缓慢的问题。下图的例子,可帮助我们进一步理解。

 

 

可以看到, One hot representation 中元素为 1 的位置索引为 3 ,所以只需要乘以 10000 x 300 的权矩阵中位置索引同样为 3 的向量值即可得到相应的输出。

 

3.4.2  输出层

 

下面是计算某个单词在输出神经元的输出的例子,可以看到,采用的是适用于多分类的 softmax 函数:

 

 

4. 总结

 

本文对词嵌入技术做了介绍。并以Skip-Gram模型为例,对其内部原理进行了较为深入的讨论。

 

回顾全文,可以总结出以下结论:

 

 

词嵌入是一种把词从高维稀疏向量映射到了相对低维的实数向量上的表达方式。

 

Skip-Gram 和 CBOW 的作用是构造神经网络的训练数据。

 

对于单位矩阵的每一维 ( 行 ) 与实矩阵相乘,可以简化为查找元素 1 的位置索引从而快速完成计算。

 

词嵌入可看做是一种数据预训练过程,而最近提出的 上下文双向模型( BERT )也是一种对数据的预训练算法。

 

CTR 问题的特征构造算法也或多或少地借鉴了词嵌入技术。

 

发表评论

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