CS224N学习笔记(二)词向量和词含义

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

前言

本文为我之前在CSDN平台上的一篇博客记录。原链接为:blog.csdn.net/u011426236/…

Lecture 2:Word Vectors and Word Senses

Finish looking at word vectors and word2vec

首先复习上节课的内容, 在这里插入图片描述 Word2vec的主要思想是:

  • 遍历整个语料库中的每个单词
  • 使用单词向量预测周围的单词
  • 更新向量以便更好地预测

在这里插入图片描述 在Word2vec的两组词向量矩阵中,每行代表一个单词的词向量,这里是6个单词,每个单词的维度为5。 v 4 v_4 代表第4行,即第四个单词。通过U与之点乘后得到的分数通过softmax映射为概率分布,其是对于该中心词而言的上下文中单词的概率分布,该分布与上下文所在的具体位置无关,所以在每个位置的预测都是一样的。

我们希望模型对上下文中(相当频繁)出现的所有单词给出一个合理的高概率估计 the, and, that, of 这样的停用词,是每个单词点乘后得到的较大概率的单词 去掉这一部分可以使词向量效果更好。

在这里插入图片描述

在使用梯度下降时,我们得到的梯度矩阵可能是非常稀疏的,对于每个窗口,我们使用mini-batch得到的梯度矩阵中不为0的值最多有 2 m + 1 2m+1 行(m为batch_size,m<<d,d为单词数),

在这里插入图片描述

解决方案如下:

  • 要么使用稀疏矩阵更新操作来只更新矩阵U和V中的特定行,要么保留单词向量的散列(即可以直接访问到每个单词的词向量)
  • 如果有数百万个单词向量,并且进行分布式计算,那么重要的是不必到处发送巨大的更新

在这里插入图片描述

Word2vec使用两组词向量是为了更好的优化,原因参考上一篇笔记。同时,存在两种不同的框架:CBOW和Skip gram模型。

CBOW模型是通过上下文词来预测中心词,Skip-gram模型是通过中心词预测上下文词,我们之前讨论的都是Skip-gram的模型。

在这里插入图片描述

Optimization basics

在Skip-gram模型中,还使用了一个额外的增加训练效率的技巧:Negative Sampling。由于直接计算Softmax时需要遍历所有的单词计算分母项,计算成本太大,效率低。所谓Negative Sampling的思想就是我们只采样一部分。

所以它的目标函数就转换为了如下形式:

在这里插入图片描述

原论文中是最大化目标函数,其实也就是最大化上下文词和中心词的点积,最小化无关词和中心词的点积。

在这里插入图片描述

然后我们将其转化为最小化代价函数形式如上。在采样时,适当进行了幂次处理以适当增大低频次的出现概率。

Can we capture this essence more effectively by counting?

以上,我们利用word2vec捕捉到了单词和周围词的关系。那么,我们为什么不直接使用计算共现次数的方式来更高效的得到这些性质呢。 在这里插入图片描述

统计共现矩阵 X有两个选项:windows 和 full document

  • Window :与word2vec类似,在每个单词周围都使用Window,包括语法(POS)和语义信息
  • Word-document 共现矩阵的基本假设是在同一篇文章中出现的单词更有可能相互关联。假设单词 i 出现在文章 j 中,则矩阵元素 Xij 加一,当我们处理完数据库中的所有文章后,就得到了矩阵 X ,其大小为 |V|×M ,其中 |V| 为词汇量,而 M 为文章数。这一构建单词-文章co-occurrence matrix的方法也是经典的Latent Semantic Analysis所采用的。潜在语义分析。

下面举个例子,设置window_size = 1,语料为三句话

在这里插入图片描述 得到共现矩阵如下:

在这里插入图片描述

使用共现次数衡量单词的相似性,但是会随着词汇量的增加而增大矩阵的大小,并且需要很多空间来存储这一高维矩阵,后续的分类模型也会由于矩阵的稀疏性而存在稀疏性问题,使得效果不佳。我们需要对这一矩阵进行降维,获得低维(25-1000)的稠密向量。

解决方法: 使用矩阵的奇异值分解(SVD)方法将共现矩阵 X 分解。为了减少尺度同时尽量保存有效信息,保留对角矩阵的最大的k个值,并将矩阵U,V 的相应的行列保留。

在这里插入图片描述

这是经典的线性代数算法,对于大型矩阵而言,计算代价昂贵(时间复杂度为O(n^3))。另外,像a、the、is这种词,与其他词共现的次数太多,也会很影响效果。

在这里插入图片描述

所以,我们需要改善这样的词向量。例如,直接把一些常见且意义不大的词忽略掉;把极度不平衡的计数压缩到一个范围;使用皮尔森相关系数,来代替共现次数。等等很多技巧。因此就有了2005年的论文《An Improved Model of Semantic Similarity Based on Lexical Co-Occurrence》提出的COALS模型。

在这里插入图片描述 在这里插入图片描述

这个模型训练得到的词向量,也表现出了很多有趣的性质,跟我们熟悉的Word2Vec十分类似。

通过以上认识,我们总结对比两种不同方式下的优缺点 在这里插入图片描述

基于计数的方法:使用整个矩阵的全局统计数据来直接估计

  • 优点
    • 训练快速
    • 统计数据高效利用
  • 缺点
    • 主要用于捕捉单词相似性
    • 对大量数据给予比例失调的重视

直接预测:定义概率分布并试图预测单词

  • 优点
    • 提高其他任务的性能
    • 能捕获除了单词相似性以外的复杂的模式
  • 缺点
    • 与语料库大小有关的量表
    • 统计数据的低效使用(采样是对统计数据的低效使用)

The GloVe model of word vectors

比较SVD这种count based模型与Word2Vec这种direct prediction模型,它们各有优缺点:Count based模型优点是训练快速,并且有效的利用了统计信息,缺点是对于高频词汇较为偏向,并且仅能概括词组的相关性,而且有的时候产生的word vector对于解释词的含义如word analogy等任务效果不好;Direct Prediction优点是可以概括比相关性更为复杂的信息,进行word analogy等任务时效果较好,缺点是对统计信息利用的不够充分。

所以Manning教授他们想采取一种方法可以结合两者的优势,并将这种算法命名为GloVe(Global Vectors的缩写),表示他们可以有效的利用全局的统计信息。

关键思想:共现概率的比值可以对meaning component进行编码。 在这里插入图片描述 在这里插入图片描述

这里举个例子,假设我们想区分热力学上两种不同状态ice冰与蒸汽steam,它们之间的关系可通过与不同的单词 x 的co-occurrence probability 的比值来描述。

例如对于solid固态,虽然 P ( s o l i d i c e ) P(solid|ice) P ( s o l i d s t e a m ) P(solid|steam) 本身很小,不能透露有效的信息,但是它们的比值 P ( s o l i d i c e ) P ( s o l i d s t e a m ) \frac{P(solid|ice)}{P(solid|steam)} 却较大,因为solid更常用来描述ice的状态而不是steam的状态,所以在ice的上下文中出现几率较大。

对于gas则恰恰相反,而对于water这种描述ice与steam均可或者fashion这种与两者都没什么联系的单词,则比值接近于1。所以相较于单纯的co-occurrence probability,实际上co-occurrence probability的相对比值更有意义。

在这里插入图片描述

基于对于以上概率比值的观察,我们假设模型的函数有如下形式:

两个词向量的点积代表了它们可能的关系密切程度

w i w j = log P ( i j ) w_{i} \cdot w_{j}=\log P(i | j)

,而两个向量的差则反映了它们相互之间对于x相互的关联程度的差异

w x ( w a w b ) = log P ( x a ) P ( x b ) w_{x} \cdot\left(w_{a}-w_{b}\right)=\log \frac{P(x | a)}{P(x | b)}

详细推导参考:link

在这里插入图片描述

如果使向量点积等于共现概率的对数,那么向量差异变成了共现概率的比率

J = i , j = 1 V f ( X i j ) ( w i T w ~ j + b i + b ~ j log X i j ) 2 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}
  • 使用平方误差促使点积尽可能得接近共现概率的对数
  • 使用f(x) 对常见单词进行限制

优点

  • 训练快速
  • 可以扩展到大型语料库
  • 即使是小语料库和小向量,性能也很好

Evaluating word vectors

与NLP的一般评估相关:内在与外在 在这里插入图片描述

内在

  • 对特定/中间子任务进行评估
  • 计算速度快
  • 有助于理解这个系统
  • 不清楚是否真的有用,除非与实际任务建立了相关性

外在

  • 对真实任务的评估
  • 计算精确度可能需要很长时间
  • 不清楚子系统是问题所在,是交互问题,还是其他子系统
  • 如果用另一个子系统替换一个子系统可以提高精确度

在这里插入图片描述

  • 单词类比:比如man : king :: woman : queen
  • 通过加法后的余弦距离是否能很好地捕捉到直观的语义和句法类比问题来评估单词向量
  • 从搜索中丢弃输入的单词
  • 问题:如果有信息但不是线性的怎么办?

一些Glove的可视化效果如下:

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

我们可以使用数据集评估语法(比如形容词的比较级和最高级、动词的过去式和过去分词)和语义(比如国家-首都)上的效果。 在这里插入图片描述

在这里插入图片描述

一些实验结论如下:

  • 300是一个很好的词向量维度
  • 不对称上下文(只使用单侧的单词)不是很好,但是这在下游任务重可能不同
  • window size 设为 8 对 Glove向量来说比较好
  • window size设为2的时候实际上有效的,并且对于句法分析是更好的,因为句法效果非常局部

在这里插入图片描述

利用矩阵摄动理论,揭示了词嵌入维数选择的基本的偏差与方法的权衡:当持续增大词向量维度的时候,词向量的效果不会一直变差并且会保持平稳

在这里插入图片描述

训练时间越长越好。

在这里插入图片描述

Wiki的语料比News的语料要好,可能是因为WIki更多的也是在记录各个词语之间的联系,而新闻则总是一些事实性的词语。

在这里插入图片描述

使用 cosine similarity 衡量词向量之间的相似程度。WordSim353是一个由人工打分的词语相似性数据集。Glove在上面取得了最好的结果。

Word senses

大多数单词都不止一个含义,特别是一些常用的单词。

在这里插入图片描述

在这里插入图片描述

比如pike就有以上多种意思。

Improving Word Representations Via Global Context And Multiple Word Prototypes (Huang et al. 2012) 在这里插入图片描述

将常用词的所有上下文进行聚类,通过该词得到一些清晰的簇,从而将这个常用词分解为多个单词,例如bank_1, bank_2, bank_3

虽然这很粗糙,并且有时sensors之间的划分也不是很明确甚至相互重叠

Linear Algebraic Structure of Word Senses, with Applications to Polysemy(Arora, …, Ma, …, TACL 2018)

单词在标准单词嵌入(如word2vec)中的不同含义以线性叠加(加权和)的形式存在,f指频率

在这里插入图片描述

v  pike  = α 1 v  pike  1 + α 2 v  pike 2 + α 3 v  pike  3 α 1 = f 1 f 1 + f 2 + f 3 v_{\text { pike }}=\alpha_{1} v_{\text { pike }_{1}}+\alpha_{2} v_{\text { pike}_{2}}+\alpha_{3} v_{\text { pike }_{3}}\\ \alpha_{1}=\frac{f_{1}}{f_{1}+f_{2}+f_{3}}

令人惊讶的结果,只是加权平均值就已经可以获得很好的效果

由于从稀疏编码中得到的概念,你实际上可以将感官分离出来(前提是它们相对比较常见) 可以理解为由于单词存在于高维的向量空间之中,不同的纬度所包含的含义是不同的,所以加权平均值并不会损害单词在不同含义所属的纬度上存储的信息

单词向量的外部评估:词向量可以应用于NLP的很多任务,通过在这些任务上的表现来衡量词向量的好坏。

参考

  1. CS224N笔记(二):GloVe, link
  2. Science is interesting.02 Word Vectors 2 and Word Senses, link

猜你喜欢

转载自juejin.im/post/7108602704812834823