矢量语义与编码之词嵌入

0x00 Abstract

上篇笔记中,我们学习了关于文本表征基于词袋模型得到稀疏向量化文本的内容,比如 One-Hot 编码,比如 TF-IDF 编码。本质上来说,词袋模型其实是一种通过统计学方法,将文档中出现的所有词语根据词频等统计指标,转为稀疏向量,从而表达一篇文章的方法。但是,这种稀疏向量的表达会存在一些缺点,比如不考虑语序等等。那么有没有办法得到文本向量化的稠密表达呢?这就是本篇笔记要讲的,Word Embedding 词嵌入。

0x01 什么是词嵌入与词向量

Word Embedding 词嵌入 是一种 考虑词语位置关系 的文本表征模型。词嵌入将文本中的词转换成稠密的低维数字向量的表达。低维且稠密的特点提高了网络的学习效率,并且有利于学习词语之间的相似性。

也就是说,通过学习文本,用词向量的方式表征词的语义信息,即将所有的词,嵌入(Embedding)一个较低维度的连续向量空间中,词嵌入的结果就生成了 Word Vector 词向量。Embedding 其实就是一个映射,将单词从原先所属的空间映射到新的多维空间中,也就是把原先词所在空间嵌入到一个新的空间中去。

之所以说是较低维度,是因为词向量与词袋模型得到的稀疏向量相比,维度是低的多的,对于词袋模型来说,每出现一个词即增加一维向量,假设字典中有 4000 个词,那么就需要 4000 维向量来表达;而词向量所在的连续空间,可以指定维度,可以是 128 维,也可以是 200 维,或者是其他自定义的维度。

在词向量的连续空间中,词嵌入使得语义上相似的单词在该空间内距离很近,语义不同的单词之间距离更远。词与词之间的相似度(关系),或者说距离,可以通过 cosine 求得。

听起来好像很复杂,其实只需要明白,区别于之前的词袋模型那种稀疏向量表达:通常都是一个高维的向量,向量里面的元素大部分都是 0,然后通过稀疏矩阵存储,去除没有意义的元素。所以造成每个文档的向量表达的长度是不一样的,也就是他们的向量表达维度是不一样的,不固定的,自然也是不连续的。

而词嵌入也是用一个向量来表示一个词,但是它是使用一个较低的维度,稠密地表示。或者说,词嵌入固定了一个维度(规定好一个连续空间),每个词的都有这么多维度,每个维度都会计算出一个数值,然后每一个词,都通过这样一个固定维度的连续向量来表征。

hello 这个词语为例。

稀疏向量表示:

稠密向量表示(嵌入表示):

0x02 词嵌入模型背景

1. 词嵌入的优势

上篇笔记讲到的文本表征方法——词袋模型有以下缺点:

  • 无法表达词语之间的关系,不考虑词语的有序性
  • 对每个词来说,自身是一个独热向量(相互正交),无法编码词之间的相似性
  • 过于稀疏的向量表达,导致计算和存储的效率都不高。可以想象,当我们的词表 Vocab 增大到十万时,每个词都需要 的向量来表达,严重浪费了内存和计算资源。

那么本篇笔记要介绍的文本表征方法——词嵌入有哪些优势呢?

  • 考虑了词语之间的(位置)关系,即考虑到词语的有序性
  • 语义相似的词在向量空间上也会比较相近,即可学习词语之间的相似性
  • 可以将文本通过一个低维稠密向量来表达,计算和储存效率相比于词袋模型要高。
  • 通用性很强,可以用在不同的任务中。

2. 两种主流的 Word Embedding 算法

目前主流的词嵌入技术有两种,一种是 Word2Vec,另一种是 GloVe。

  • Word2Vec
    • 这是一种基于统计方法来获得词向量的方法,于 2013 年由谷歌的 Mikolov 提出的一套新的词嵌入方法。
    • 这种算法有 2 种训练模式
      • CBOW 通过上下文来预测当前词
      • SKip-Gram 通过当前词来预测上下文
  • GloVe (Globel Vectors)
    • GloVe 是对 Word2Vec 的扩展,它将全局统计和 Word2vec 的基于上下文的学习结合了起来。
    • 其实就是 SVD 分解与 Word2Vec 的结合。

本篇笔记主要学习 Word2Vec。

Word2Vec 是一种可以进行高效率词嵌入学习的预测模型。其两种变体分别为:连续词袋模型(CBOW)及 Skip-Gram 模型。

从算法角度看,这两种方法非常相似,其区别为 CBOW 根据源词上下文词汇('the cat sits on the')来预测目标词汇(例如,‘mat’),而 Skip-Gram 模型做法相反,它通过目标词汇(例如,‘mat’)来预测源上下文词汇('the cat sits on the')。

Skip-Gram 模型采取 CBOW 的逆过程的动机在于:CBOW 算法对于很多分布式信息进行了平滑处理(例如将一整段上下文信息视为一个单一观察量)。很多情况下,对于小型的数据集,这一处理是有帮助的。相形之下,Skip-Gram 模型将每个“上下文-目标词汇”的组合视为一个新观察量,这种做法在大型数据集中会更为有效。

3. Word2Vec 的前身

由于 One-Hot 编码存在两个重要缺陷:维度灾难语义鸿沟。因此分布式向量横空出世,将词表示成 short dense vector,弥补了以上两个问题。而后引出了 NNLM (Neural Network Language Model)。

“You shall know a word by the company it keeps” (J. R. Firth 1957)

Neural Network Language Model

NNLM 出自 Yoshua Bengio 等人于 2003 年发表的《A Neural Probabilistic Language Model》,针对 N-gram 模型的问题进行了解决。这是第一篇提出神经网络语言模型的论文,它在得到语言模型的同时,也生成了副产品——词向量

什么是语言模型?

通俗解释:「语言模型就是判断一句话是不是人话,通常用概率来表示一句话是人话的可能性」

标准定义:对于语言序列 ,语言模型就是计算该序列出现的概率,即

和 N-gram 类似,NNLM 也假设当前词仅依赖于前 个词。

  • 神经网络语言模型(Neural Network Language Model)
    • 首次提出了 Word Embedding 的概念(虽然没有叫这个名字),从而奠定了包括 Word2Vec 在内后续研究的基础。
    • 模型结构:|700
    • NNLM 学习任务:输入某个句中单词 前面句子的 个单词,要求网络正确预测单词 。即最大化 出现的条件概率。
    • NNLM 训练过程
      • 首先是一个线性的映射层:输入层。
        • 任意单词 用 One-Hot 编码(如:001000)作为原始单词输入。
        • 输入 N 个 One-Hot 编码,通过一个共享的 的矩阵 ,映射为 N 个分布式的词向量 (Distributed Vector)。即乘以矩阵 获得词向量。
        • 矩阵 的维度为 是词典的大小,是 Embedding 向量的维度(一个先验参数)。矩阵 每一行内容对应着单词的 Word Embedding。该矩阵的内容通过学习获得。
        • 为什么矩阵 每一行内容正是每个单词的 Word Embedding 呢?因为当我们把 n 个 One-Hot 表征的词向量输入到神经网络中,单层网络进行的运算等效于查表操作,每个词的 One-Hot 编码将各自的词向量从 Embedding 层中原封不动地取出。如下图所示。
      • 其次是一个简单的前向反馈神经网络。
        • 由一个激活函数为 tanh 的隐藏层和一个 Softmax 输出(分类)层组成,因此可以计算出在输入 context 的条件下,词典中所有 word 出现的条件概率。
        • 即将上一步映射的词向量拼接,然后接隐藏层,再接 Softmax 预测后面应该接哪个词。
  • 手绘模型:|700
    • 输入的 维度为 是词典 Vocab 的大小。
    • 输入层:获得词语 Embedding,为输入词个数,为 Embedding 的维度。然后将所有 Embedding 拼接到一起。
    • 隐藏层:长度为
    • 输出层:维度为 。由 Softmax 激活得到归一化的概率。
    • 模型参数:三个转移矩阵:词语 One-Hot 向量 =》输入层 =》隐藏层 =》输出层。其中由输入层到隐藏层的转移矩阵参数量是巨大的。

0x03 Word2Vec 的两个模型

1. Word2Vec 之 CBOW (Continues Bag-of-Words Model)

思路:输入中间词前后的 个词,预测中间词。

既然 NNLM 的复杂度主要来自隐藏层,那么 Word2Vec 提出了 CBOW 与 Skip-Gram,将 NNLM 的隐藏层拿掉,输入层不再对 Embedding 拼接,而是求平均。

  • 手绘模型
    • 对原始 NNLM 做简化,将 NNLM 中的隐藏层拿掉
    • CBOW 的隐藏层:获得上下文词语的 Embedding 后做平均,直接输出到 Softmax。不需要激活。

2. Word2Vec 之 Skip-Gram

实际情况中,Skip-Gram 用的较多。CBOW 在小数据集上表现较好,Skip-Gram 在大的数据集上表现更好。

  • 手绘模型

0x04 Word2Vec 的两个提速手段

然而,每当计算一个词的概率都要对词典里的 V 个词计算相似度,然后进行归一化,这基本上时不现实的。为此,Mikolov 引入了两个提速手段:层次 Softmax(Hierarchical Softmax)和负采样(Negative Sampling)。普遍认为 Hierarchical Softmax 对低频词效果较好;Negative Sampling 对高频词效果较好,向量维度较低时效果更好。

  • Hierarchical Softmax
  • Nagative Sampling

0x05 Word2Vec 的优缺点

  • 优点
    • 考虑上下文信息,效果优于之前的 One-Hot 编码等 Embedding 方法。
    • 由稀疏长向量(基于词袋模型构建)转为稠密短向量。 较短长度的向量更有利于模型的学习,减少了需要学习的参数量。稠密的特点便于更好的捕捉相同语义。
    • 通用性强,可以用在各种 NLP 任务中。
  • 缺点
    • Word2Vec 是静态编码 (Static Embedding),意味着这种方法只能学到一种固定的 Embedding,存在 Vocab 中。也就是说 Word2Vec 不能解决多义词的问题,不能联系上下文动态解释当前词语的含义。以后会介绍学习动态上下文嵌入 (Dynamic Contextual Embedding) 的方法,比如当下流行的 BERT 表示,每个词的 Vector 会根据不同的上下文内容而改变。
    • 由于词和向量是一对一的关系,所以不能学习到词语的多层特性。一个好的语言表示除了建模一词多义现象以外,还需要能够体现词的复杂特性,包括语法 (syntax)、语义 (semantics) 等。Word2Vec 等词嵌入方法本身不具备这种优点——因为它太简单了。
    • 仅考虑了局部语料,没有考虑到全局信息。
    • 英文语料的分词简单,每个词为独立的个体。但中文语料首先需要解决分词问题,分词效果严重影响词向量的质量。因此 Word2Vec 对中文不是那么友好。

需要说明的是:Word2vec 是上一代的产物(18 年之前), 18 年之后想要得到最好的效果,已经不使用 Word2vec 这种方法。

0x06 从 Word Embedding 到 BERT

Word2Vec 和 BERT 都是语言表示中里程碑式的工作,前者是词嵌入范式的代表,后者是预训练范式的代表。

  • Word Embedding
    • 统计语言模型 N-gram
      • 解决无序性问题,用之前的 个文本来计算当前文本 的条件概率。即考虑上文,前 个词
      • 未解决文本表征问题,仍使用 One-Hot 向量来表示。由此带来一系列弊端,如维度灾难,无法描述词语语义相似度等。
      • 由于模型复杂度和预测精度的限制,我们很少会考虑 的模型。因此无法处理更长程的 context ()。
      • 复杂度
        • (需要计算每个词,和其他所有词,共同出现的次数) (该词出现的词频)
        • 如果词典大小为 ,考虑前 个单词,则模型参数量级为
    • 分布式表征 (Distribution)
      • 分布假说 (Distributional Hypothesis):上下文环境相似的两个词有着相近的语义。
      • 分布式表征是指将数 据嵌入到低维连续空间,通常称这种表征为嵌入 (Embedding) 或向量 (Vector)。
    • 基于 SVD 的词向量方法
      • 词袋假说 (Bag of Words Hypothesis):一篇文档的词频(而不是词序)代表了文档的主题。
      • 使用奇异值分解 (SVD) 的方法对词袋模型生成的矩阵降维并且分解。
    • 神经网络语言模型(Neural Network Language Model)
      • 首次提出了 Word Embedding 的概念(虽然没有叫这个名字),从而奠定了包括 Word2Vec 在内后续研究的基础。
      • 解决了 N-gram 模型的两个重要缺陷(由 One-Hot 表示造成的):维度灾难,无法描述词语语义相似度。
      • 考虑上文,前 个词。
    • Word2Vec
      • CBOW:从一个句子里面把一个词抠掉,用这个词的上文和下文去预测被抠掉的这个词。
      • Skip-Gram:输入某个单词,要求网络预测它的上下文单词
      • 与 N-gram 的不同:Word2Vec 并不关心相邻单词之前一起出现的频数,而是仅仅关心,这个单词是不是属于另一个单词的上下文。也就是说,Word2Vec 不关心根据这个词预测出的下一个词语是什么,而是只关心这两个词语之间是不是有上下文关系。
    • Glove
      • 对 Word2Vec 的补充和拓展,将全局统计融入 Word2Vec。
  • ELMO (Embedding from Language Models):基于上下文的 Embedding
    • Deep contextualized word representation. 根据当前上下文对 Word Embedding 动态调整。解决了一词多义的问题。
    • 两阶段模型
      • 预训练阶段
        • 使用双层双向的 LSTM 作为特征抽取器。
        • 预训练阶段获得三种 Embedding。
          • 最底层的词向量特征。
          • 第一层双向 LSTM 获得的句法特征。
          • 第二层双向 LSTM 获得的语义特征。
      • 下游任务应用阶段
        • 做下游应用时作为特征提取器。将三层 Embedding 根据不同的权重拼接起来用于下游任务,作为新特征补充。
        • 权重根据下游任务训练得到。
    • ELMO 的缺点
      • LSTM 抽取特征能力远弱于 Transformer。
      • 通过拼接方式获得融合特征,这种方式对特征融合的能力偏弱。
  • GPT (Generative Pre-Training):Pretrain + Finetune
    • 两阶段模型
      • 预训练阶段
        • 使用 Transformer 作为特征抽取器,其特征抽取能力强于 RNN。
        • 采用单向的语言模型,只采用单词的 Context-before 上文来进行预测,抛开了下文(现在来看是不明智的选择)。白白丢失了许多信息。
      • 微调阶段(下游任务应用阶段)
        • 将预训练模型应用到下游任务时,需保持模型结构和预训练模型一致。借此,通过预训练学到的语言学知识就被引入到当前的任务中来了。
        • 以预训练模型参数作为初始参数,用当前的任务去训练这个网络,对网络参数进行 Fine-Tuning。
    • GPT 的缺点
      • 语言模型是单向的。没有考虑下文信息。
  • BERT:新星的诞生
    • 两阶段模型
      • Pre-Training
        • Transformer 作为特征抽取器。
        • 双向的语言模型。
        • 多任务训练
          • Masked LM,基于掩码的语言模型。
            • 类似 CBOW,进行了一定改造。
            • 将 15% 字符进行 mask 操作,其中 80% 进行真正的掩码,10% 随机替换成其他字符,剩下的 10% 保留真正的字符不变。
          • Next Sentence Prediction
            • 为了使模型能够理解两个句子之间的关系。
            • 将文档中连续的语句拼接起来作为正样本,其他还会随机选择两句话进行拼接作为负样本用于训练,主要是因为一些句子序列任务会需要。
      • Fine-Tuning
    • 与 ELMO 的区别
      • ELMO 是分别看上文和下文,然后将上文得到的结果和下文得到的结果进行拼接。
      • BERT 是同时看上下文中的每个词,效果上也比 ELMO 要好。

Conclusion

Word2Vec 的基本理念是构造一个假的学习任务,我们并不关注这个任务的输出结果如何,而是关注它的中间产物。从 Word Embedding 到 BERT 其实都是预训练模型的发展与壮大。

References

语言模型:

《自然语言处理学习之路》 08 语言模型 ——这里解释了为什么 N-gram 模型计算量巨大

【语言模型】从 N-gram 模型讲起 - 知乎

【语言模型】NNLM(神经网络语言模型) - 知乎

word2vec:神经语言模型(NNLM), CBOW, skip-gram_bilibili ——手绘模型

Word2Vec:

基于深度学习的语言模型

词向量(one-hot/SVD/NNLM/Word2Vec/GloVe) - 西多士 NLP

word2vec: 理解 nnlm, cbow, skip-gram

理解 Word2Vec 之 Skip-Gram 模型 - 知乎

深度学习第 42 讲:自然语言处理之词嵌入和词向量

词袋模型和词嵌入模型

一文看懂词嵌入

词嵌入

矢量语义——从 TF-IDF 到 Word2Vec 你所需要知道的一切!

Learning Word Embedding | Lil'Log

Continuous Bag of Words (CBOW) - 自然语言处理 | 莫烦 Python

RNN 模型与 NLP 应用(2/9):文本处理与词嵌入_bilibili

word2vec 中的数学原理详解

Word2Vec拓展:

Bert 比之 Word2Vec,有哪些进步呢?

从 Word Embedding 到 Bert 模型—自然语言处理中的预训练技术发展史 ⭐⭐⭐

广告行业中那些趣事系列 3:NLP 中的巨星 BERT ⭐⭐⭐——分析了 BERT 如何吸取各种模型精华于一身,从而构造出这样一颗新星。