向量语义与静态词嵌入——从tf-idf到GloVe
目录
- Chapter6 向量语义与嵌入 (Vector Semantics and Embeddings)
- 6.1 词汇语义学 (Lexical Semantics)
- 6.2 向量的语义 (Vector Semantics)
- 6.3 词语与向量 (Words and Vectors)
- 6.3.1 向量与文档
- 6.3.2 词语作为向量:文档维度 (Words as vectors: document dimensions)
- 6.3.3 词语作为向量:词语维度 (Words as vectors: word dimensions)
- 6.4 余弦计算相似度
- 6.5 TF-IDF:对向量中的项进行加权 (TF-IDF: Weighing terms in the vectors)
- 6.6 逐点互信息 (Pointwise Mutual Information)
- 6.7 TF-IDF 及 PPMI 向量模型的应用 (Applications of the tf-idf or PPMI vector models)
- 6.8 Word2vec
- 6.8.1 分类器
- 6.8.2 学习 skip-gram 嵌入
- 6.8.3 连续词袋模型 CBOW (Continuous Bag-of-Word Model)
- 6.8.4 FastText
- 6.8.5 GloVe
- 6.9 可视化嵌入 (Visualizing Embeddings)
- 6.10 词嵌入的语义特性
- 6.10.1 词嵌入与历史语义 (Embeddings and Historical Semantics)
- 6.11 偏见与嵌入 (Bias and Embeddings)
- 6.12 评价向量模型 (Evaluating Vector Models)
- 6.13 总结 (Summary)
本文基于《Speech and Language Processing (3rd)》-- Chapter6 - Vector Semantics and Embeddings,并结合多篇论文和优秀的博客整理得到。
如有侵权,请联系删除。如需转载,请私信本人或在文章下方评论。
文章的6.8.3-6.8.5节为译者根据原书的6.8.3节进行的改编与原创,添加了原书未详述的CBOW, FastText与GloVe三个算法。
水平有限,如有疏漏,烦请告知,万分感谢!
Chapter6 向量语义与嵌入 (Vector Semantics and Embeddings)
分布假说(distributional hypothesis):在相似的语境中出现的单词往往有相似的意思。单词如何分布的相似性和单词含义的相似性之间的联系被称为分布假说。
在这一章中,我们将介绍向量语义学(vector semantics),它通过学习词汇的意义表征,即嵌入(embeddings),直接从词汇在文本中的分布来实例化这一语言假设。这些表示在每一个利用意义的自然语言处理应用程序中都被使用,我们这里介绍的静态嵌入(static embeddings)是我们将在第十章看到的更强大的动态(dynamic)或像BERT一样的上下文嵌入(contextualized embeddings)的基础。
(译者注:截止本文发布时,原书的第十章仍未更新)
这些词表示也是本书表示学习的第一个例子,自动学习输入文本的有用表示。寻找这种自我监督的方法来学习输入的表示,而不是通过特征工程手工创建表示,是自然语言处理研究的一个重要焦点。
6.1 词汇语义学 (Lexical Semantics)
在本节中,我们将根据语言学对词汇意义的研究成果,即词汇语义学,进行总结;我们将在第18章和第10章继续讨论这个内容。
Lemmas and Senses
举例来说,对于一个单词 mouse,它在词典中有如下语义:
- any of numerous small rodents…
- a hand-operated device that controls a cursor…
这里,couse 这个形式被称为 Lemma,也叫 citation form。mouse 这个形式也是 mice 这个词的lemma;字典对像mice这样的词形变化没有单独的定义。特定的形式 sung 或 carpets 或 sing 或 duermes 被称为 wordforms (词形)。
Synonymy 同义
当一个单词的意思与另一个单词的意思完全相同,或者几乎完全相同时,我们就说这两个词的意思是同义词。
同义词更正式的定义是,如果两个词在任何一个句子中可以相互替换,而不改变句子的真值条件,也就是这个句子为真的情况,那么这两个词就是同义词。在这种情况下,我们经常说这两个词具有相同的 propositional meaning (命题含义)。
可能没有两个词的意思完全相同,例如 water / H2O。语义学的一个基本原则,被称为 principle of contrast 对比原则,指出语言形式的差异总是与意义上的差异相联系的。
Word Similarity 词相似性
Cat 不是 dog 的同义词,但 Cat 和 dog 肯定是相似的词。在从同义词(Synonymy)转换到相似度(Similarity)的过程中,从讨论单词词义之间的关系(Synonymy)转换到单词之间的关系(Similarity)将会很有用。
Word Relatedness 词缘关系
两个词的意思除了相似之外还可以以其他方式联系起来。其中一种联系被称为 Word Relatedness,在心理学中传统上也称为 word association。例如:coffee & cup。
词汇之间的一种常见的词缘关系是它们是否属于同一 semantic field(语义场)。例如:词语会同属于hospital语义场(surgeon, scalpel, nurse, anesthetic, hospital)。
语义场经常与 topic models 相联系,例如 Latent Dirichlet Allocation, LDA,该方法将无监督学习应用于大量文本集,从文本中归纳出相关的单词集。语义场和主题模型是发现文档主题结构的非常有用的工具。(译者注:有关LDA的相关内容,将会在整理李航的《统计学习方法(第二版)》的时候进行详细介绍)
Semantic Frames and Roles 语义框架与角色
与语义场密切相关的是语义框架的概念。语义框架是一组表示特定类型事件的视角或参与者的词。例如,商业交易是一个实体与另一个实体进行货币交易以换取某种商品或服务的事件,在此之后,商品易手或服务得以执行。这个事件可以通过使用诸如 buy (从买方角度看的事件)、sell (从卖方角度看的事件)、pay (侧重于货币方面)等动词或 buyer 之类的名词来进行词汇编码。框架具有语义角色(如买方、卖方、商品、货币),句子中的单词可以扮演这些角色。
Connotation 隐含意义
最后,词语有 affective meanings 情感意义或 Connotation 隐含意义。词语的隐含意义在不同的领域有不同的含义,但在这里我们用它来表示一个词的含义与作者或读者的情绪、情绪、观点或评价有关的方面。例如,有些词有积极的内涵(happy),而另一些词有消极的内涵(sad)。积极或消极的评价语言称为 Sentiment 情感。
6.2 向量的语义 (Vector Semantics)
向量语义是在NLP中表示单词含义的标准方法,它帮助我们对上一节中看到的单词含义的许多方面进行建模建模。
向量语义的思想是将一个词表示为多维语义空间中的一个点,这个多维语义空间是(我们将看到的方式)从词的邻域分布(distributions of word neighbors)派生出来的。表示单词的向量称为嵌入向量(embeddings)(尽管这个术语有时更严格地只适用于密集向量,如 word2vec (第6.8节),而不是稀疏的 tf-idf 或 PPMI 向量(第6.3节-第6.6节))。“嵌入”一词来源于它的数学意义,即从一个空间或结构到另一个空间或结构的映射,尽管含义已经发生了变化。
在本章中,我们将介绍两种最常用的模型。在tf-idf模型(一个重要的基准)中,一个词的含义是由邻近词的计数的一个简单函数定义的。我们将看到,这种方法会产生非常长的稀疏向量,即大部分为零(因为大多数单词都不会在其他单词的上下文中出现)。我们将引入word2vec模型家族来构造短而密集的向量,这些向量具有有用的语义属性。我们也将介绍余弦,使用嵌入计算语义相似度的标准方法。
6.3 词语与向量 (Words and Vectors)
意义的向量或分布模型通常基于共现矩阵,这是一种表示单词共现频率的方法。我们将讨论两种流行的矩阵:term-document 矩阵和 term-term 矩阵。
6.3.1 向量与文档
在 Term-document 矩阵中,每一行表示词汇表中的一个单词,每一列表示某个文档集合中的一个文档。具体如下图所示:
下图展示了两个维度的可视化,我们选取 fool 和 battle 作为两个维度。
Term-document 矩阵最初被定义为为文档信息检索 (Information retrieval) 任务而查找相似文档的一种方法。
6.3.2 词语作为向量:文档维度 (Words as vectors: document dimensions)
在上图中,每个单词可以表示为一个四维向量:
- battle: [1, 0, 7, 13]
- good: [114, 80, 62, 89]
- gool: [36, 58, 1, 4]
- wit: [20, 15, 2, 3]
6.3.3 词语作为向量:词语维度 (Words as vectors: word dimensions)
word-word matrix,或者叫 term-context matrix,其列是单词而非文档。因此整个矩阵的维度是∣V∣×∣V∣|V| \times|V|∣V∣×∣V∣。每个单元格记录行(目标)词和列(上下文)词在某些训练语料库中的某些上下文中共出现的次数。如下图:
6.4 余弦计算相似度
Inner product 内积
dot product(v,w)=v⋅w=∑i=1Nviwi=v1w1+v2w2+…+vNwN\text { dot } \operatorname{product}(\mathbf{v}, \mathbf{w})=\mathbf{v} \cdot \mathbf{w}=\sum_{i=1}^{N} v_{i} w_{i}=v_{1} w_{1}+v_{2} w_{2}+\ldots+v_{N} w_{N} dotproduct(v,w)=v⋅w=i=1∑Nviwi=v1w1+v2w2+…+vNwN
Vector length 向量长度
∣v∣=∑i=1Nvi2|\mathbf{v}|=\sqrt{\sum_{i=1}^{N} v_{i}^{2}} ∣v∣=i=1∑Nvi2
Normalized dot product 标准化内积
a⋅b=∣a∣∣b∣cosθa⋅b∣a∣∣b∣=cosθ\begin{aligned} \mathbf{a} \cdot \mathbf{b}&=|\mathbf{a}||\mathbf{b}| \cos \theta \\ \frac{\mathbf{a} \cdot \mathbf{b}}{|\mathbf{a}||\mathbf{b}|}&=\cos \theta \end{aligned} a⋅b∣a∣∣b∣a⋅b=∣a∣∣b∣cosθ=cosθ
Cosine Similarity 余弦相似度
cosine(v,w)=v⋅w∣v∣∣w∣=∑i=1Nviwi∑i=1Nvi2∑i=1Nwi2\operatorname{cosine}(\mathbf{v}, \mathbf{w})=\frac{\mathbf{v} \cdot \mathbf{w}}{|\mathbf{v}||\mathbf{w}|}=\frac{\sum_{i=1}^{N} v_{i} w_{i}}{\sqrt{\sum_{i=1}^{N} v_{i}^{2}} \sqrt{\sum_{i=1}^{N} w_{i}^{2}}} cosine(v,w)=∣v∣∣w∣v⋅w=∑i=1Nvi2
6.5 TF-IDF:对向量中的项进行加权 (TF-IDF: Weighing terms in the vectors)
Term Frequency 词频率
tft,d=count(t,d)\mathrm{tf}_{t, d}=\operatorname{count}(t, d) tft,d=count(t,d)
其中,ttt 为单词,ddd 为文档。我们通常会是用取对数的方式进行缩放,注意对数中需要加1,因为我们不能对0取对数:
tft,d=log10(count(t,d)+1)\mathrm{tf}_{t, d}=\log _{10}(\operatorname{count}(t, d)+1) tft,d=log10(count(t,d)+1)
Document Frequency 文档频率
dft\mathrm{df}_tdft 表示单词 ttt 在多少个文档中出现过,其表示的是文档个数。
Inverse Document Frequency 逆文档频率
idft=log10(Ndft)\mathrm{idf}_{t}=\log _{10}\left(\frac{N}{\mathrm{df}_{t}}\right) idft=log10(dftN)
其中,NNN 是文档总数。
TF-IDF
wt,d=tft,d×idftw_{t, d}=\mathrm{tf}_{t, d} \times \mathrm{idf}_{t} wt,d=tft,d×idft
因此,上图中的向量经过TF-IDF变化后变为:
6.6 逐点互信息 (Pointwise Mutual Information)
Pointwise Mutual Information
PMI(w,c)=log2P(w,c)P(w)P(c)\operatorname{PMI}(w, c)=\log _{2} \frac{P(w, c)}{P(w) P(c)} PMI(w,c)=log2P(w)P(c)P(w,c)
其中,www 为目标词,ccc 为语境中的其它词。
PMI值的范围从负到正无穷。但是,负的PMI值往往是不可靠的,除非我们的语料库非常庞大。因此我们通常使用 Positive PMI:
PPMI(w,c)=max(log2P(w,c)P(w)P(c),0)\operatorname{PPMI}(w, c)=\max \left(\log _{2} \frac{P(w, c)}{P(w) P(c)}, 0\right) PPMI(w,c)=max(log2P(w)P(c)P(w,c),0)
假设共现矩阵 FFF 有 WWW 行(单词)和 CCC 列(语境词),其中 fijf_{ij}fij 表示词 wiw_iwi 出现在语境 cjc_jcj 中 的次数。那么PPMI矩阵可以表示为如下:
pij=fij∑i=1W∑j=1Cfijpi∗=∑j=1Cfij∑i=1W∑j=1Cfijp∗j=∑i=1Wfij∑i=1W∑j=1Cfijp_{i j}=\frac{f_{i j}}{\sum_{i=1}^{W} \sum_{j=1}^{C} f_{i j}} \hspace{1em}p_{i *}=\frac{\sum_{j=1}^{C} f_{i j}}{\sum_{i=1}^{W} \sum_{j=1}^{C} f_{i j}}\hspace{1em}p_{* j}=\frac{\sum_{i=1}^{W} f_{i j}}{\sum_{i=1}^{W} \sum_{j=1}^{C} f_{i j}} pij=∑i=1W∑j=1Cfijfijpi∗=∑i=1W∑j=1Cfij∑j=1Cfijp∗j=∑i=1W∑j=1Cfij∑i=1Wfij
PPMIij=max(log2pijpi∗p∗j,0)\mathrm{PPMI}_{i j}=\max \left(\log _{2} \frac{p_{i j}}{p_{i *} p_{* j}}, 0\right) PPMIij=max(log2pi∗p∗jpij,0)
其中,ppmiijppmi_{ij}ppmiij 表示词 wiw_iwi 在语境 cjc_jcj 中的 PPMI 值。
PMI存在偏重低频事件的问题;非常罕见的词往往有很高的PMI值。减少这种对低频事件的偏差的一种方法是,使用不同的函数 Pα(c)P_{\alpha}(c)Pα(c) 来略微改变 P(c)P(c)P(c) 的计算,从而提高上下文单词出现的概率的 α\alphaα 次方:
PPMIα(w,c)=max(log2P(w,c)P(w)Pα(c),0)\operatorname{PPMI}_{\alpha}(w, c)=\max \left(\log _{2} \frac{P(w, c)}{P(w) P_{\alpha}(c)}, 0\right) PPMIα(w,c)=max(log2P(w)Pα(c)P(w,c),0)
有研究发现,α\alphaα设置为0.75时,模型表现最好。
Pα(c)=count(c)α∑ccount(c)αP_{\alpha}(c)=\frac{\operatorname{count}(c)^{\alpha}}{\sum_{c} \operatorname{count}(c)^{\alpha}} Pα(c)=∑ccount(c)αcount(c)α
另一种可能的解决方案是拉普拉斯平滑:在计算PMI之前,在每个计数中添加一个小的常数k(常用 0.1-3),收缩所有非零值。k越大,考虑的非零计数越多。
6.7 TF-IDF 及 PPMI 向量模型的应用 (Applications of the tf-idf or PPMI vector models)
tf-idf模型经常用于文档函数,比如确定两个文档是否相似。我们通过取文档中所有单词的向量,并计算所有这些向量的质心(centroid)来表示文档。给定了 kkk 个词向量:w1,w2,…,wkw_{1}, w_{2}, \ldots, w_{k}w1,w2,…,wk,文档的centroid表示为:
d=w1+w2+…+wkkd=\frac{w_{1}+w_{2}+\ldots+w_{k}}{k} d=kw1+w2+…+wk
然后我们计算不同文档的余弦相似度来判断两个文档的相似性。
PPMI模型或tf-idf模型都可以用于计算词的相似度,用于查找词的释义、跟踪词的意义变化或自动发现不同语料库中的词的意义等任务。
6.8 Word2vec
在本节中,我们将介绍一个更加有效的词汇表示方法:嵌入(Embeddings),其为一种更短更稠密的向量。它的维度一般在50-1000之间,而不像我们之前介绍的那些向量拥有与词库一样长 ∣V∣|V|∣V∣ 或者与文档数量一样长 DDD 的维度。这种向量中的每一项的范围是实数,可以为负。
本节我们介绍一种计算Embeddings的方法:skip-gram with negative sampling,也叫 SGNS 方法。Skip-gram算法是一个叫做 word2vec 包中所用到的两种算法之一,也因此,该方法也可以粗略地被认为是 word2vec。word2vec方法训练快速且有效,并且很容易通过代码和预先训练的嵌入在线获得。Word2vec嵌入是静态嵌入,这意味着该方法为词汇表中的每个单词学习一个固定的嵌入。在第10章中,我们将介绍学习动态上下文语境的方法,如流行的BERT或ELMO表示,其中每个单词的向量在不同的语境中是不同的。
直接上对 word2vec 的认识是:我们去训练一个二元预测任务的分类器,询问“单词 www 是否有可能出现在目标词汇(如 apricot 附近“,而并不是计算 www 在apricot附近出现的频率。我们并不真正的关心预测任务,而是将训练好的分类器的权重 weights 作为我们的词嵌入。
这个方法的创新之处在于它使得文本本身就是一个监督学习数据,标签即为”是否在 apricot 这个词附近出现了“。这样的方式叫做自监督学习 self-supervision,其避免了手工添加监督信号必要。
我们将在第七章介绍神经网络,但是word2vec就是一个更为简单的神经网络语言模型。原因有两点,其一,word2vec将任务简化了,使其变为一个二元分类器而不是做词汇预测;其二,word2vec将结构简化了,使其只需要训练一个逻辑回归分类器而不是一个具有多个隐藏层的需要更复杂的训练算法的多层神经网络。
Skip-gram的基本思想如下:
- 将目标词和相邻的上下文词作为正例子。
- 随机抽取词典中的其他单词以获得负样本。
- 使用逻辑回归训练分类器来区分这两种情况。
- 使用学习到的权值作为嵌入。
6.8.1 分类器
考虑如下分类任务。我们使用 ±2\pm 2±2 宽度的滑窗,并以下面的句子举例:
我们的目标是预测,给定了一个目标词(target word)www 和候选语境词(context word)ccc 的词语对之后,词语 ccc 在真实语境中出现的概率:
P(+∣w,c)P(+\mid w, c) P(+∣w,c)
词语 ccc 在真实语境中不出现的概率:
P(−∣w,c)=1−P(+∣w,c)P(-\mid w, c)=1-P(+\mid w, c) P(−∣w,c)=1−P(+∣w,c)
我们使用逻辑斯谛 logistic 或者叫做 sigmoid函数 σ(x)\sigma(x)σ(x) 来进行概率预测:
P(+∣w,c)=σ(c⋅w)=11+exp(−c⋅w)P(+\mid w, c)=\sigma(c \cdot w)=\frac{1}{1+\exp (-c \cdot w)} P(+∣w,c)=σ(c⋅w)=1+exp(−c⋅w)1
P(−∣w,c)=1−P(+∣w,c)=σ(−c⋅w)=11+exp(c⋅w)\begin{aligned} P(-\mid w, c) &=1-P(+\mid w, c) \\ &=\sigma(-c \cdot w)=\frac{1}{1+\exp (c \cdot w)} \end{aligned} P(−∣w,c)=1−P(+∣w,c)=σ(−c⋅w)=1+exp(c⋅w)1
上式只是判断一个词 ccc 出现的概率,当我们计算一系列词语出现的概率时,我们假设各个单词的出现是相互独立的,这就有了如下公式:
P(+∣w,c1:L)=∏i=1Lσ(−ci⋅w)P\left(+\mid w, c_{1: L}\right)=\prod_{i=1}^{L} \sigma\left(-c_{i} \cdot w\right) P(+∣w,c1:L)=i=1∏Lσ(−ci⋅w)
logP(+∣w,c1:L)=∑i=1Llogσ(−ci⋅w)\log P\left(+\mid w, c_{1: L}\right)=\sum_{i=1}^{L} \log \sigma\left(-c_{i} \cdot w\right) logP(+∣w,c1:L)=i=1∑Llogσ(−ci⋅w)
综上所述,skip-gram训练了一个概率分类器,给定一个测试目标词 www 以及一个长度为 LLL 的上下文窗口 c1:Lc_{1:L}c1:L,根据上下文窗口与目标词的相似程度来计算概率。概率是基于将sigmoid函数应用于目标词与每个上下文词的嵌入点积。为了计算这个概率,我们只需要在词汇表中为每个目标词和上下文词嵌入。
下图是skip-gram学习的词向量:
6.8.2 学习 skip-gram 嵌入
Skip-gram通过从随机的嵌入向量开始学习嵌入,然后迭代地移动每个单词 www 的嵌入,使其更像文本中出现在附近的单词的嵌入,而不出现在附近的单词的嵌入。
要进行训练,必须进行负采样(negative sampling),我们使用的负样本比正样本要多,这通常由一个两者的比率参数 kkk 来确定。例如,如果 k=2k=2k=2,那么对一个正样本,就会选取两个负样本。
选取负样本根据加权均匀频率 pα(w)p_{\alpha}(w)pα(w) 得到,其中α\alphaα 为权值,一般设为0.75:
Pα(w)=count(w)α∑w′count(w′)αP_{\alpha}(w)=\frac{\operatorname{count}(w)^{\alpha}}{\sum_{w^{\prime}} \operatorname{count}\left(w^{\prime}\right)^{\alpha}} Pα(w)=∑w′count(w′)αcount(w)α
设置权值的作用是能够给较少出现的词更高的被选中的可能。
给定了正负训练样本和一个初始化嵌入之后,我们学习算法的目标是调整这些嵌入,使得:
- 最大化正样本中目标词和语境词(w,cpos )\left(w, c_{\text {pos }}\right)(w,cpos)的相似度
- 最小化负样本中(w,cpos )\left(w, c_{\text {pos }}\right)(w,cpos)的相似度
假设每个词的出现是相互独立的,我们有如下损失函数:
LCE=−log[P(+∣w,cpos)∏i=1kP(−∣w,cnegi)]=−[logP(+∣w,cpos)+∑i=1klogP(−∣w,cnegi)]=−[logP(+∣w,cpos)+∑i=1klog(1−P(+∣w,cnegi))]=−[logσ(cpos⋅w)+∑i=1klogσ(−cnegi⋅w)]\begin{aligned} L_{\mathrm{CE}} &=-\log \left[P\left(+\mid w, c_{p o s}\right) \prod_{i=1}^{k} P\left(-\mid w, c_{n e g_{i}}\right)\right] \\ &=-\left[\log P\left(+\mid w, c_{p o s}\right)+\sum_{i=1}^{k} \log P\left(-\mid w, c_{n e g_{i}}\right)\right] \\ &=-\left[\log P\left(+\mid w, c_{p o s}\right)+\sum_{i=1}^{k} \log \left(1-P\left(+\mid w, c_{n e g_{i}}\right)\right)\right] \\ &=-\left[\log \sigma\left(c_{p o s} \cdot w\right)+\sum_{i=1}^{k} \log \sigma\left(-c_{n e g_{i}} \cdot w\right)\right] \end{aligned} LCE=−log[P(+∣w,cpos)i=1∏kP(−∣w,cnegi)]=−[logP(+∣w,cpos)+i=1∑klogP(−∣w,cnegi)]=−[logP(+∣w,cpos)+i=1∑klog(1−P(+∣w,cnegi))]=−[logσ(cpos⋅w)+i=1∑klogσ(−cnegi⋅w)]
注意,上述公式的计算复杂度为 O(K)O(K)O(K),其为负采样的个数。负采样的具体解释将在6.8.3节中给出。
为了让损失函数最小,我们需要最大化正样本的点积和最小化负样本的点积,这与我们上文的描述一致。
下图展示了训练过程的直观描述:
我们使用梯度下降法来训练参数。每一个梯度如下:
∂LCE∂cpos =[σ(cpos ⋅w)−1]w∂LCE∂cneg=[σ(cneg⋅w)]w∂LCE∂w=[σ(cpos ⋅w)−1]cpos +∑i=1k[σ(cneg i⋅w)]cnegi\begin{aligned} \frac{\partial L_{C E}}{\partial c_{\text {pos }}}&=\left[\sigma\left(c_{\text {pos }} \cdot w\right)-1\right] w \\ \frac{\partial L_{C E}}{\partial c_{n e g}}&=\left[\sigma\left(c_{n e g} \cdot w\right)\right] w \\ \frac{\partial L_{C E}}{\partial w}&=\left[\sigma\left(c_{\text {pos }} \cdot w\right)-1\right] c_{\text {pos }}+\sum_{i=1}^{k}\left[\sigma\left(c_{\text {neg }_{i}} \cdot w\right)\right] c_{n e g_{i}} \end{aligned} ∂cpos∂LCE∂cneg∂LCE∂w∂LCE=[σ(cpos⋅w)−1]w=[σ(cneg⋅w)]w=[σ(cpos⋅w)−1]cpos+i=1∑k[σ(cnegi⋅w)]cnegi
参数更新的步骤如下:
cpost+1=cpost−η[σ(cpost⋅w)−1]wcnegt+1=cnegt−η[σ(cnegt⋅w)]wwt+1=wt−η[σ(cpos⋅wt)−1]cpos+∑i=1k[σ(cnegi⋅wt)]cnegi\begin{aligned} c_{p o s}^{t+1} &=c_{p o s}^{t}-\eta\left[\sigma\left(c_{p o s}^{t} \cdot w\right)-1\right] w \\ c_{n e g}^{t+1} &=c_{n e g}^{t}-\eta\left[\sigma\left(c_{n e g}^{t} \cdot w\right)\right] w \\ w^{t+1} &=w^{t}-\eta\left[\sigma\left(c_{p o s} \cdot w^{t}\right)-1\right] c_{p o s}+\sum_{i=1}^{k}\left[\sigma\left(c_{\mathrm{n} e g_{i}} \cdot w^{t}\right)\right] c_{n e g_{i}} \end{aligned} cpost+1cnegt+1wt+1=cpost−η[σ(cpost⋅w)−1]w=cnegt−η[σ(cnegt⋅w)]w=wt−η[σ(cpos⋅wt)−1]cpos+i=1∑k[σ(cnegi⋅wt)]cnegi
回顾skip-gram模型,我们对每一个词语 iii 学习了两个嵌入:目标嵌入(target embeddings)wiw_iwi 和语境嵌入(context embedding)cic_ici,其分别存储在目标矩阵 WWW 和语境矩阵 CCC中。通常我们会把他们加在一起,wi+ciw_i + c_iwi+ci 去表示一个词 iii 的嵌入。
译者注:下方 6.8.3-6.8.5 节为作者原创章节,为了补充原书中未详细讲的CBOW,fasttext和glove词嵌入模型。其中 6.8.4节 fasttext 和6.8.5节GloVe均参考了原书的6.8.3节——Other kinds of static embeddings,以及原始论文和多个优秀博客。
6.8.3 连续词袋模型 CBOW (Continuous Bag-of-Word Model)
CBOW和skip-gram模型均是在论文《Efficient estimation of word representations in vector space》中被提出,两者非常类似,具备同样的训练思想。唯一不同的是,skip-gram如上文所说,给定一个目标词 wiw_iwi 之后,预测上下文词 cic_ici 出现的概率;而CBOW与之相反,其给定了上下文词之后,去预测目标词出现的概率。
下面两个图很好地说明了两者的区别[1]:
CBOW的训练逻辑与Skip-gram几乎完全一致。如果我们将上文的skip-gram模型中需要学习的目标函数记为:
∑w∈Clogp(w∣Context(w))\sum_{w \in C} \log p(w \mid \operatorname{Context}(w)) w∈C∑logp(w∣Context(w))
那么CBOW模型需要学习的目标函数就是:
∑w∈Clogp(Context(w)∣w)\sum_{w \in C} \log p(\operatorname{Context}(w) \mid w) w∈C∑logp(Context(w)∣w)
Word2vec原始论文中有两个比较重要的创新点:负采样和层次Softmax,这两者都用于减轻计算量。其中,负采样减少了计算概率时的计算量,层次Softmax减少了从根据概率进行Softmax时的计算量。
负采样
我们可以看到,上面两个由各个词的条件概率计算的目标函数的计算复杂度是 O(∣C∣)O(|C|)O(∣C∣),CCC 为预料库的总量。实践中,如果预料库总量非常大,这样的计算量是非常大的。因此,作者就提出了负采样。
负采样要求我们采 KKK 个负样本,因此,以skip-gram为例,我们总共的计算量就从 O(C)O(C)O(C) 变为了 O(1+K)O(1+K)O(1+K),其中包括K个负样本和1个正样本,即我们需要预测的词。负采样确保了每次训练只更新部分权重,其它权重固定,以此减少计算量。
层次Softmax
层次Softmax的提出同样是为了解决计算量大的问题。在训练过程中,从隐藏层到输出层的Softmax计算量非常大,CBOW模型会对每个词进行计算,复杂度为 O(∣V∣)O(|V|)O(∣V∣);而skip-gram的计算量更大,因为它要对窗口中的每个词进行计算,复杂度为 O(∣WV∣)O(|WV|)O(∣WV∣),其中 WWW 是窗口大小。
层次Softmax将语料库中所有的词表示成了一个二叉霍夫曼(Huffman)树,因此这个树的叶子节点有 VVV 个。结构如下图:
在霍夫曼树中,计算softmax不是一下子完成的,而是沿着霍夫曼树一步步完成的。在word2vec中,使用sigmoid函数判别是向左走还是向右走:沿左侧向树的下层走,那么就是负类(霍夫曼树编码为1);右侧则为正类(编码为0)。由此,我们发现,当计算了 w1w_1w1 的输出值之后,我们同时得到了 w2w_2w2,因为它们在一个父节点的两侧。通过这种方式,计算量变为了 O(log2V)O(\log_2V)O(log2V)。并且,由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想[2]。
《word2vec Parameter Learning Explained》[1] 论文中会对word2vec的两种算法进行详细的解释,对该论文的解读会发布在其它博文中。
[1] https://arxiv.org/abs/1411.2738
[2] https://www.cnblogs.com/pinard/p/7243513.html
6.8.4 FastText
Fasttext模型利用子词模型处理词法丰富的语言中的未知词和稀疏性。在fasttext模型框架中,每一个词用n-gram向量表示,并以 < 和 > 作为边界。举例来说,当n=3时,单词 where 会被表示为序列 <where> 以及特征的n-grams:
<wh,whe,her,ere,re>\text{<wh}, \text{whe}, \text{her}, \text{ere}, \text{re>}<wh,whe,her,ere,re>
然后,单词 where 就被表示为上述所有的n-grams的加和。
FastText的训练速度和测试速度相比于神经网络分类算法非常迅速,其也会自己训练词向量。同时,FastText也使用了层次Softmax方法。突破性的进展在于其使用了N-gram作为特征来表示一个单词,这样的好处在于,对于一些罕见的词,其也可以生成比较好的词向量。也如前文所述哦,即使出现未知词,也可以通过特征来表示它。
FastText模型是对Skip-gram模型的进一步拓展。Skip-gram模型希望最大化如下对数似然函数:
∑t=1T[∑c∈Ctℓ(s(wt,wc))+∑n∈Nt,cℓ(−s(wt,n))]\sum_{t=1}^{T}\left[\sum_{c \in \mathcal{C}_{t}} \ell\left(s\left(w_{t}, w_{c}\right)\right)+\sum_{n \in \mathcal{N}_{t, c}} \ell\left(-s\left(w_{t}, n\right)\right)\right] t=1∑T⎣⎡c∈Ct∑ℓ(s(wt,wc))+n∈Nt,c∑ℓ(−s(wt,n))⎦⎤
其中,ℓ:x↦log(1+e−x)\ell: x \mapsto \log \left(1+e^{-x}\right)ℓ:x↦log(1+e−x)。其中,第一个求和内部的式子,与我们在6.8.2节中看到的loss function基本一致,但是这里我们不只预测一个target words,而是预测在上下文 Ct\mathcal{C}_{t}Ct(由滑窗控制)的所有词,因此在第一项中多了一个求和。上下文 Ct\mathcal{C}_{t}Ct 是一系列周围词 wtw_twt 的集合。
上式中的 s(wt,wc)s\left(w_{t}, w_{c}\right)s(wt,wc) 可以表示的就是词语的n-gram特征:
s(w,c)=∑g∈Gwzg⊤vcs(w, c)=\sum_{g \in \mathcal{G}_{w}} \mathbf{z}_{g}^{\top} \mathbf{v}_{c} s(w,c)=g∈Gw∑zg⊤vc
其中,Gw⊂{1,…,G}\mathcal{G}_{w} \subset\{1, \ldots, G\}Gw⊂{1,…,G} 是 www 中n-gram的集合,我们用 zg\mathbf{z}_{g}zg 表示每一个n-gram向量 ggg,而 vc\mathbf{v}_{c}vc 表示在上下文中的词 ccc 的词向量。[3]
[3] https://arxiv.org/abs/1607.04606
6.8.5 GloVe
GloVe是另外一个除了word2vec外最常用的静态嵌入模型,全称为全局向量(Global Vectors),因为这个模型是是以语料全局统计量为基础的模型。GloVe基于词-词共现矩阵的概率比率来实现,同时结合了像PPMI的基于计数的模型,也使用了类似于word2vec一样的线性模型结构。
GloVe是一个全局对数二元线性回归模型(global log-bilinear regression model),其有效地利用了统计信息,只训练词-词共现矩阵中的非零元素,而不是整个稀疏矩阵或大型语料库中的单个上下文窗口。
下面根据论文原文的内容,对GloVe模型进行详尽的梳理,去理解其实如何得到的:
首先我们做一些标记。令 XXX 为词-词共现计数矩阵,XijX_{ij}Xij 为词 jjj 出现在词 iii 的上下文中的次数,显然,Xi=∑kXikX_i = \sum_{k} X_{i k}Xi=∑kXik 为单词 iii 出现的总次数。最后,令Pij=P(j∣i)=Xij/XiP_{i j}=P(j \mid i)=X_{i j} / X_{i}Pij=P(j∣i)=Xij/Xi 表示单词 jjj 在单词 iii 上下文中出现的比率。
让我们从最简单的情况开始,假设有两个词 iii 和 jjj,那么词 kkk 对于词 iii 和 jjj 的共现概率比率即为:
F(wi,wj,w~k)=PikPjk(1)F\left(w_{i}, w_{j}, \tilde{w}_{k}\right)=\frac{P_{i k}}{P_{j k}} \tag 1 F(wi,wj,w~k)=PjkPik(1)
其中,w∈Rdw \in \mathbb{R}^{d}w∈Rd 是词向量,w~∈Rd\tilde{w} \in \mathbb{R}^{d}w~∈Rd 是上下文中的词。FFF 是某种形式的函数,其输入为各个词向量,结果是一个比值,我们将在下面的讨论中试图找到 FFF 的形式。
因为词向量本身具有线性属性,上式可以表示为向量之差的形式:
F(wi−wj,w~k)=PikPjk(2)F\left(w_{i}-w_{j}, \tilde{w}_{k}\right)=\frac{P_{i k}}{P_{j k}} \tag 2 F(wi−wj,w~k)=PjkPik(2)
我们注意到,上式右侧是一个标量,因此我们可以将 FFF 的输入表示为向量的点积:
F((wi−wj)Tw~k)=PikPjk(3)F\left(\left(w_{i}-w_{j}\right)^{T} \tilde{w}_{k}\right)=\frac{P_{i k}}{P_{j k}} \tag 3 F((wi−wj)Tw~k)=PjkPik(3)
我们注意到,词-词共现矩阵中的两个词的距离(一个词与其上下文语境词)的距离是不会受到词的身份所影响的,即 wiw_iwi 与 w~j\tilde{w}_{j}w~j 的距离和 wjw_jwj w~i\tilde{w}_{i}w~i 的距离相同,这意味着 w↔w~w \leftrightarrow \tilde{w}w↔w~,也意味着X↔XTX \leftrightarrow X^{T}X↔XT。但是上式(3)并不满足这样的性质。为了能让对称性提现到 FFF 中,我们进行如下两步操作。
首先,我们要求 FFF 在 (R,+)(\mathbb{R},+)(R,+) 和 (R>0,×)\left(\mathbb{R}_{>0}, \times\right)(R>0,×) 中是同态的(homomorphism),即:
F((wi−wj)Tw~k)=F(wiTw~k)F(wjTw~k)(4)F\left(\left(w_{i}-w_{j}\right)^{T} \tilde{w}_{k}\right)=\frac{F\left(w_{i}^{T} \tilde{w}_{k}\right)}{F\left(w_{j}^{T} \tilde{w}_{k}\right)} \tag 4 F((wi−wj)Tw~k)=F(wjTw~k)F(wiTw~k)(4)
由式(3)和式(4)可以得到:
F(wiTw~k)=Pik=XikXi(5)F\left(w_{i}^{T} \tilde{w}_{k}\right)=P_{i k}=\frac{X_{i k}}{X_{i}} \tag 5 F(wiTw~k)=Pik=XiXik(5)
我们观察到式(4),两数之差的 FFF,等于两个数分别的 FFF 之比,这令我们想到了 expexpexp 函数。因此,式(4)的解为 F=expF=\expF=exp,或者:
wiTw~k=log(Pik)=log(Xik)−log(Xi)(6)w_{i}^{T} \tilde{w}_{k}=\log \left(P_{i k}\right)=\log \left(X_{i k}\right)-\log \left(X_{i}\right) \tag 6 wiTw~k=log(Pik)=log(Xik)−log(Xi)(6)
我们注意到,上式的左侧是对称的,但是上式右侧是不对称的,这在数学上出了问题。那么我们就通过引入对于词 w~k\tilde{w}_{k}w~k 和词 wiw_iwi的两个偏置项 b~k\tilde{b}_{k}b~k 和 bib_ibi 来使得上式右侧对称
wiTw~k+bi+b~k=log(Xik)(7)w_{i}^{T} \tilde{w}_{k}+b_{i}+\tilde{b}_{k}=\log \left(X_{i k}\right) \tag 7 wiTw~k+bi+b~k=log(Xik)(7)
如此,式(7) 就成为了式(1)的一个简化。于是,为了使得出现频率高的词携带更多的信息,出现频率少的词携带更少的信息,我们需要一个权重函数。该函数必须是非递减的,且权重不应该过分增大,于是我们找到了一个 f(x)f(x)f(x):
f(x)={(x/xmax)αif x<xmax1otherwise (8)f(x)=\left\{\begin{array}{cc} \left(x / x_{\max }\right)^{\alpha} & \text { if } x<x_{\max } \\ 1 & \text { otherwise } \end{array}\right. \tag 8 f(x)={(x/xmax)α1ifx<xmaxotherwise(8)
我们将最终的损失函数写为如下形式:
J=∑i,j=1Vf(Xij)(wiTw~j+bi+b~j−logXij)2(9)J=\sum_{i, j=1}^{V} f\left(X_{i j}\right)\left(w_{i}^{T} \tilde{w}_{j}+b_{i}+\tilde{b}_{j}-\log X_{i j}\right)^{2} \tag 9 J=i,j=1∑Vf(Xij)(wiTw~j+bi+b~j−logXij)2(9)
其中,原论文设定:xmax=100x_{\max }=100xmax=100 且 α=3/4\alpha=3 / 4α=3/4,因为这样设定可以得到一个相对好的模型表现。
GloVe相比于LDA的优点是其计算复杂度较低,因为LDA使用了奇异值分解的技术进行降维,这样是计算量非常大的。GloVe相比于word2vec的优点在于其考虑了全局统计属性,而word2vec只考虑了再目标词的滑窗范围内的情况。
6.9 可视化嵌入 (Visualizing Embeddings)
下图是其中一种可视化词嵌入的方式:
当然还有很多其他的可视化方式,这里不再详述。
6.10 词嵌入的语义特性
不同类型的相似与相关 Different types of similarity or association
- 一阶共现(first-order co-occurrence):有时候也叫横组合相关(syntagmatic association),指两个词彼此相邻。比如 wrote 与词 book 或者 poem 是一阶共现的。
- 二阶共现(second-order co-occurrence):有时候也叫纵组合相关(paradigmatic association),指两个词拥有相同的临近词。比如 wrote 与词 said 或者 remarked 是二阶共现的。
类比 / 关系性近似 Analogy/Relational Similarity
这类近似可以表示为下图:
如果用公式表达,则为:
b^∗=argmaxxdistance(x,a∗−a+b)\hat{b}^{*}=\underset{x}{\operatorname{argmax}} \operatorname{distance}\left(x, a^{*}-a+b\right) b^∗=xargmaxdistance(x,a∗−a+b)
下图展示了GloVe中的关系性质:
6.10.1 词嵌入与历史语义 (Embeddings and Historical Semantics)
嵌入可以通过计算多个嵌入空间(每个嵌入空间来自特定时期的文本),来研究意义如何随时间变化:
6.11 偏见与嵌入 (Bias and Embeddings)
很多研究都指出,嵌入可以反映出社会的一些偏见。在这里也不过多详述,感兴趣的可以参考原文。
6.12 评价向量模型 (Evaluating Vector Models)
向量模型最重要的评价指标是任务的外在评价,即在一个自然语言处理任务中使用向量,并看看这是否比其他模型提高性能。
尽管如此,有内在的评价也是有用的。最常见的度量标准是测试他们在相似度上的表现,计算算法的单词相似度分数和人类赋予的单词相似度评级之间的相关性,如数据集WordSim-353,SimLex-999 和 TOEFL dataset。
更具有现实意义的是包含上下文的内在相似性任务,如Stanford Contextual Word Similarity (SCWS) dataset 和 Word-in-Context (WiC) dataset。
另一个用于评估的任务是类比任务,如 SemEval-2012。
还有一些其它的任务,这里不再详述。
6.13 总结 (Summary)
- 在向量语义中,一个词被建模为向量——高维空间中的一个点,也称为嵌入(embedding)。在这一章中,我们关注静态嵌入(static embeddings),在每个词映射到一个固定的嵌入。
- 向量语义模型分为两类:稀疏的(sparse) 和 稠密的(dense)。在稀疏模型中,每个维度对应于词汇表 VVV 中的一个单词,每一项是 共现的计数(co-occurrence counts) 的函数。 术语文档矩阵(term-document) 中的一行表示词汇表中的一个单词 (术语 Term) ,一列表示一个文档。 单词-上下文(word-context) 或 术语-术语(term-term) 矩阵的一行用于词汇表中的一个(目标)单词,一列用于词汇表中的每个上下文术语。下面两种稀疏加权是常见的: tf-idf 加权,它根据每个单元格的 词频(term frequency) 和 逆文档频率(inverse document frequency) 来加权,以及 PPMI (逐点正互信息)最常见的词上下文矩阵。
- 稠密向量模型的维数为50-1000。像skip-gram这样的Word2vec算法是计算密集嵌入的一种流行方法。Skip-gram训练逻辑回归分类器来计算两个单词“可能在文本附近发生”的概率。这个概率是从两个单词的嵌入之间的点积计算出来的。
- Skip-gram通过学习与发生在附近的单词的嵌入有高点积和噪声单词的低点积的嵌入,使用随机梯度下降来训练分类器,。
- 其他重要的嵌入算法包括:CBOW,与skip-gram类似的训练方法;FastText,引入了词语的更加细化的n-gram特征来训练;GloVe,一种基于词同现概率比率的方法。(译者注:本条译者进行了修改)
- 无论是使用稀疏向量还是稠密向量,词语和文档的相似性都是通过向量之间 点积(dot product) 函数来计算的。两个向量的余弦——一种标准化的点积——是这种度量中最流行的。
向量语义与静态词嵌入——从tf-idf到GloVe相关推荐
- 文本表示模型(2):静态词表示Word2Vec、FastText、GloVe
目录 文本表示模型 静态词嵌入 Word2Vec FastText GloVe 文本表示模型 文本表示模型可分为以下几种: 基于one-hot, tf-idf, textrank等的bag-of-wo ...
- 02_词向量与有趣的词嵌入
文章目录 文本向量化 OneHot编码 文本向量化 预留问题 有趣的词向量 word2vec案例分析 n-Gram 实现词向量 keras的Embedding实现 博文配套视频课程:自然语言处理与知识 ...
- 论文分享|【词向量专题】中文词嵌入最新进展
分布式的词嵌入(word embedding)将一个词表征成一个连续空间中的向量,并且有效地挖掘了词的语义和句法上的信息,从而被作为输入特征广泛得应用于下游的NLP任务(比如:命名实体识别,文本分类, ...
- [Embeding-3]综述:词嵌入以及与分布式语义模型的关联
1. 前言 近年来,在许多NLP任务中,无监督学习单词嵌入已经取得了巨大的成功.他们的效果如此之好,以至于在许多NLP体系结构中,几乎完全取代了更传统的分布式表示,如LSA特征和Brown聚类. 可以 ...
- NLP基础知识(语法语义、LDA、N-gram、词嵌入)
文章目录 本节课大纲 Hyper-simplified linguistics Term spotting + handling negation, uncertainty ML to expand ...
- 文本表示:静态词向量模型
1. 词向量模型的核心思想 文本的词向量表示又叫文本的分布式表示,它源自于语言学家的语境理论.语言学家Firth认为:"语言是人类的生活方式,词语的含义根植于人类赖以生存的社会活动中&quo ...
- python词嵌入_【自然语言处理】收藏!使用Python的4种句嵌入技术
人类理解语言细微差别的能力是非常强大的--我们敏锐的大脑可以在一句话里轻易地感受到幽默.讽刺.负面情绪等,但发挥这个"超能力"的前提是,我们必须知道话语所使用的语言. 例如,如果有 ...
- 关于词嵌入(Word Embedding)的一些总结
看了课程半天没搞懂词嵌入是啥,梳理一下相关知识.参考: https://www.jianshu.com/p/2fbd0dde8804 https://blog.csdn.net/m0_37565948 ...
- 深入理解深度学习——语境词嵌入(Contextual Word Embedding)
分类目录:<深入理解深度学习>总目录 前文介绍了因word2vec而流行的Word Embedding,这种表示方法比离散的独热编码要好很多,因为它不仅降低了维度,还可以反映出语义空间中的 ...
最新文章
- 借助深度卷积神经网络对图片 GIF 视频进行超分辨率放大(即放大与降噪) 以及 对视频进行 插帧(即补帧).
- Angular http跨域
- centos --- phpunit 安装过程
- Altium Designer原理图和PCB中对元件垂直、水平镜像翻转
- python为什么没有点击就触发_Ai中没有触发的触发器
- 解决 jquery.form.js和springMVC上传 MultipartFile取不到信息
- elementui表格宽度适应内容_elementui表格中的列怎么实现自适应列宽
- [转载] 菜鸟举例理解字节流和字符流区别
- android 知识点大全,Android基础知识总结(一)
- django连接自定义mysql,Django中使用自定义Manager管理多个Mysql数据库
- [ASP.NET]动态页面调用JS错误。保存为HTML文件就不报错了。
- selenium 控制ie_Python爬虫---Selenium的简单介绍
- EasyDataTransform for mac (表格数据转换)
- 微信小程序之扫一扫功能
- jquery gotop插件
- 【记录】凯酷84说明书
- 重构手法46:Parameterize Method (令函数携带参数)
- 凡走过必留下痕迹|2019年个人总结
- Redis源码阅读,从入门到放弃
- 最新百家姓-你排老几
热门文章
- 流式数据架构理论 ◆ 基本概念
- WINRAR的破解方法
- 打开网站报数据库错误 is marked as crashed and should be repaired (搞定)
- 主攻文推荐攻守都有系统_第五十五章 攻守转换
- 阻容感基础10:电感器分类(2)-功率电感器
- 安卓工作室 android studio 的 汉化 美化 定制 Android studio's Chinesization beautification customization
- 通过python smtplib库添加右抄送和密送人
- 信用卡如何使用?广发卡自动分期教你这样养卡技巧
- 移动100m宽带慢的要死_wifi慢到快崩溃明明100m宽带却像2m的网速教你1招快速解决...
- 阿里云智能身份证OCR文字识别