当前位置:   article > 正文

【NLP基础理论】 09 分布语义学(Distributional Semantics))

distributional semantics

注:

Unimelb Comp90042 NLP笔记

相关tutorial代码链接

分布语义学


上一篇讲了 词汇数据库(Lexical Database),但它存在以下几点 问题

  • 需要人工搭建,不仅昂贵,且认为的标注会产生偏差和噪音。
  • 语言是动态的,总会有一些新的单词(俚语或者术语)出现,单词也会有新的词义出现。
  • 互联网为我们提供了大量的文本,我们可以利用它们获得单词含义吗?

1 分布语义学

1.1 分布假设

  • You shall know a word by the company it keeps(你可以通过其周围的上下文单词来了解一个目标单词)” —— (Firth, 1957)
  • 共现(co-occurrence)文档通常表明了主题(此处文档作为上下文来参考)
    • 比如说 voting(投票)politics(政治)
      如果我们观察多个文档,会发现这两个单词经常出现在同一文档中。因此,不同单词的共现文档在一定程度上反映了这些单词在某种主题方面的关联
  • 本地上下文能反映单词词义(此处单词窗口作为上下文来参考)
    • 比如说 eat a pizzaeat a burger

1.2 根据上下文猜意思

  • 通过一个单词的使用,来学习这个未知单词。比如说 tezgüino ,和它一起出现的上下文有四条:
    在这里插入图片描述
    通过这四句话,我们也可以指到这多半是一种
  • 也可以通过查看这个单词和其他单词是否共享相似的上下文。
    比如说 wine 的上下文和 (14.1),(14.2),(14.3)相类似,因此我们可以初步判断 winetezgüino 的意思较为相同。
    在这里插入图片描述

1.3 词向量

在这里插入图片描述

  • 上图按行来看,其实就可以当作词向量来看。
  • 它描述了一个词的分布属性
    即编码其上下文词的信息,把单词们的各种上下文作为特征。
  • 捕捉各种语义关系 (同义词、类比等)

我们之前也见过词向量,那就是 word embedding。不过接下来我们会通过其他方式来生成词向量:

  • 基于数量统计方法
  • 专门用来生成词向量的神经网络
    在这里插入图片描述

2 构建词向量的方法

2.1 基于数量统计方法

主要分为两类:

  • 用文档作为上下文
  • 用邻近的单词作为上下文

2.1.1 向量空间模型(Vector Space Model)

  • 核心思想: 将单词的意思表示为向量
  • 把文档作为上下文。
  • 一个矩阵,两种视角:
    • 文档会通过单词的形式被表现
    • 单词会通过文档的形式被表现
      在这里插入图片描述
      文档 425 中 出现了 0 次state,1次fun,0次heaven;也可以说是,state 在文档425出现了0次,426出现了3次…

操作VSM

  • 可以对数值增减权重(不只是单进行数字统计)
  • 变成低维度的稠密向量

2.1.2 TF-IDF

TF-IDF (Term Frequency-Inverse Document Frequency),信息检索(information retrieval领域的一种标准加权方案。
首先得到一个TF矩阵,就是前文说到的单纯基于统计的矩阵:
在这里插入图片描述
然后计算该单词对应的 IDF(inverse document frequency值: i d f w = l o g ∣ D ∣ d f w idf_w=log\frac{|D|}{df_w} idfw=logdfwD
其中, ∣ D ∣ |D| D表示文档总数。 d f w df_w dfw表示单词 w w w 的文档频率,即该单词在所有文档(即语料库)中出现的总次数(TF 矩阵中最后一行)。这里,log 的底数为 2。
IDF的意思是为了惩罚那些经常出现在大多数文档中的单词,所以当 d f w df_w dfw越大时, i d f w idf_w idfw越来越小。

最后将每个单词的IDF值和其对应单元格的TF相乘,得到TF-IDF矩阵。
在这里插入图片描述
降维
TF矩阵很稀疏,然而所谓 降维 就是创建更短、稠密的向量,让特征更少,从而消除一些噪声(当噪声过多,我们会出现过度拟合噪声)

降维方法

  1. 奇异值分解(SVD)
    Sigular Value Decomposition,流行的降维方法。
    核心思想就是将一个给定的矩阵 A A A,分解成3个矩阵相乘: A = U Σ V T A=U\Sigma V^T A=UΣVT在这里插入图片描述
    • 原始矩阵 A A A是 TF 矩阵,其行数为词汇表大小 ∣ V ∣ |V| V,列数为文档总数 ∣ D ∣ |D| D
    • U U U是新的 term 矩阵,行数为词汇表大小 ∣ V ∣ |V| V,列数为 m m m。其中, m m m为矩阵 ∣ A ∣ |A| A 的秩,即 m = R a n k ( A ) m=Rank(A) m=Rank(A)。(秩:其行向量或列向量的极大无关组中包含向量的个数。消除那些能通过矩阵中其他向量表示的向量。)
    • Σ \Sigma Σ 是大小为 m × m m\times m m×m 的奇异值矩阵,它是一个对角矩阵。
    • V T V^T VT是新的 document 矩阵,行数为 m m m,列数为文档总数 ∣ D ∣ |D| D
    • 后文给出SVD的求解例子。
  2. 截取:潜在语义分析(LSA,Latent Semantic Analysis)
    • 基于SVD,将 U , Σ , V U,\Sigma, V U,Σ,V 截取到 k 维,从而生成原始矩阵的最佳 k 阶近似
    • 因此,截断后的 U k U_k Uk(或者 V k T V_k^T VkT)是对应单词的一个新的低维表示。
    • 通常 k 的取值为 100-5000。
      在这里插入图片描述

题外话——求解SVD:

U U U 正交矩阵(左奇异向量), Σ \Sigma Σ 对角矩阵(奇异矩阵), V T V^T VT 正交矩阵(右奇异向量)。也可以理解为三个矩阵做了旋转、拉伸、旋转。
其中正交矩阵 A A A简单说就是 A − 1 = A T , A A T = E A^{-1}=A^T,AA^T=E A1=AT,AAT=E
如果我们想求解 A = U Σ V T A=U\Sigma V^T A=UΣVT,我们现需要计算以下两个公式:

  • A T A = V Σ T U T U Σ V T = V Σ T E Σ V T = V Σ T Σ V T A^TA=V\Sigma ^TU^TU\Sigma V^T=V\Sigma ^TE\Sigma V^T = V\Sigma ^T\Sigma V^T ATA=VΣTUTUΣVT=VΣTEΣVT=VΣTΣVT
  • A V = U Σ AV=U\Sigma AV=UΣ
  • 例: 矩阵 C = ( 5 5 − 1 7 ) C=
    (5517)
    C=(5157)
    的SVD
    代入上述两项公式得
    C T C = ( 5 − 1 5 7 ) ( 5 5 − 1 7 ) = ( 26 18 18 74 ) C^TC=
    (5157)
    (5517)
    =
    (26181874)
    CTC=(5517)(5157)=(26181874)

    现在需要找到 C T C C^TC CTC的特征值和特征向量
    d e t ( C T C − λ I ) = d e t ( 26 − λ 18 18 74 − λ ) = λ 2 − 100 λ + 1600 = ( λ − 20 ) ( λ − 80 ) = 0 det(C^TC-\lambda I)=det
    (26λ181874λ)
    \\ =\lambda^2-100\lambda+1600=(\lambda-20)(\lambda-80)=0
    det(CTCλI)=det(26λ181874λ)=λ2100λ+1600=(λ20)(λ80)=0

    det(x)表示矩阵x的行列式, I表示单位矩阵.
    所以特征值是 2080,然后通过 ( C T C − λ I ) X = 0 (C^TC-\lambda I)X=0 (CTCλI)X=0,求特征向量 X X X
    代入20:
    ( C T C − 20 I ) X = ( 6 18 18 54 ) X = 0 (C^TC-20I)X=
    (6181854)
    X=0
    (CTC20I)X=(6181854)X=0
    通过矩阵变换,可以求得 V 1 = ( − 3 10 1 10 ) V_1=
    (310110)
    V1=(10 310 1)

    代入80:可求得 V 2 = ( 1 10 3 10 ) V_2=
    (110310)
    V2=(10 110 3)

    所以 将两个特征向量合并得到 V = ( − 3 10 1 10 1 10 3 10 ) V=
    (310110110310)
    V=(10 310 110 110 3)

    将特征值开根号代入 Σ = ( 2 5 0 0 4 5 ) \Sigma =
    (250045)
    Σ=(25 0045 )
    .
    然后开始根据上面第二个公式求出 U U U
    C V = ( − 10 2 10 10 2 10 ) CV=
    (1021010210)
    CV=(10 10 210 210 )
    ,然后把它变成单位长度 ( − 1 2 1 2 1 2 1 2 ) = U Σ = U ( 2 5 0 0 4 5 )
    (12121212)
    =U\Sigma=U
    (250045)
    (2 12 12 12 1)=UΣ=U(25 0045 )
    ,简单反推一下 Σ = ( 1 2 1 2 − 1 2 1 2 ) \Sigma=
    (12121212)
    Σ=(12 12 12 12 )
    .
    DONE!

TODO:后期可以看看如何证明SVD

2.1.3 单词作为上下文

  • 列举词与其他词一起出现的频率
    • 在一些预定义的语境中(如一个N个词的窗口)。
  • 原始频率的明显问题:被常用词所支配(比如the
    • 但我们不能使用tf-idf,因为我们不存在多个文档。
      在这里插入图片描述
      在上面的矩阵中,每一行每一列都表示一个单词。单元格中的数字表示目标单词和上下文单词在整个语料库中所有大小为 5 的窗口内(即从语料库中提取所有的 five-grams)共同出现的频率。
2.1.3.1 逐点互信息(Point Mutual Information,PMI)
  • 对于两个事件 xy(即两个单词),PMI计算两者相关性,越相关数值越大。
    • 计算联合分布 = P ( x , y ) P(x,y) P(x,y)
    • 计算他们的单独分布(假设是独立的) = P ( x ) P ( y ) P(x)P(y) P(x)P(y)
    • P M I ( x , y ) = l o g 2 P ( x , y ) P ( x ) P ( y ) PMI(x,y) = log_2\frac{P(x,y)}{P(x)P(y)} PMI(x,y)=log2P(x)P(y)P(x,y)

例:
现在求state和country的PMI
在这里插入图片描述
在这里插入图片描述

2.1.3.2 PMI 矩阵
  • PMI确实能不错地提取到语义,比如 heavenhell
  • 但是对于很少出现的单词对,结果就会存在一些偏差。
  • 对于从来没出现的单词对,就会出现 -inf
    在这里插入图片描述
    技巧
  • 把所有负数的PMI都变成0(变成一个全部positive的PMI,即PPMI),这样可以避免 -inf 以及不可靠的负值出现。
  • 通过normalise PMI ( P M I ( x , y ) − l o g P ( x , y ) ) (\frac{PMI(x,y)}{-logP(x,y)}) (logP(x,y)PMI(x,y)),来减少罕见单词对

不管用的是 tf-idf 还是 PPMI ,SVD都可以帮助产生稠密向量。

2.2 基于神经网络方法

2.2.1 Word Embedding

  • 在之前章节中,我们已经见过神经网络(前馈或循环)使用的 词嵌入 (word embeddings)。
  • 但是这些模型是为其他任务设计的:
    • 分类
    • 语言模型
  • 词嵌入只是这些模型的一部分(副产品)。

专门为Embedding的神经模型

2.2.2 Word2Vec

TODO:可以看看中文论文翻译(参考
大体讲的不错的视频
有时间再弄透这个,优先把LSTM和Transformer搞好。

核心思想:目标单词的嵌入应与其 相邻单词 的嵌入 相似;并且和不会出现在其附近的其他单词的嵌入 不相似

  • Word2Vec的框架是学习一个分类器,有以下2种算法
    在这里插入图片描述
  • Skip-gram: 给定目标单词,预测该单词周围的局部上下文单词。
  • CBOW:给定目标单词周围的局部上下文单词,预测位于中心的目标单词。
  • 周围的单词位置为 L L L,上面的例子中, L = 2 L=2 L=2
2.2.2.1 Skip-gram模型
  • 通过给定的目标单词来预测每个相邻的单词
    在这里插入图片描述
  • 所有的概率被定义为: ∏ l ∈ − L , . . . , − 1 , 1 , . . . , L P ( w t + l ∣ w t ) \prod_{l\in-L,...,-1,1,...,L}P(w_{t+l|w_t}) lL,...,1,1,...,LP(wt+lwt)
  • 使用逻辑回归模型求 P ( w t + l ∣ w t ) P(w_{t+l}|w_t) P(wt+lwt)
    P ( l i f e ∣ r e s t s ) = e x p ( W r e s t s ⋅ C l i f e ) ∑ u ∈ V e x p ( W r e s t s ⋅ C u ) P(life|rests)=\frac{exp(W_{rests}\cdot C_{life})}{\sum_{u\in V exp(W_{rests\cdot C_u})}} P(liferests)=uVexp(WrestsCu)exp(WrestsClife),其中 W r e s t s W_{rests} Wrestsrests 的 word embedding, C l i f e C_{life} Clifelife 的 word embedding。
  • 上述公式里面有两个 word embedding W , C W,C W,C
    在这里插入图片描述
    每一行是一个单词的embedding,并且被标了序号。这两个大矩阵 W , C W,C W,C 包含了所有的目标单词和上下文单词。

下图是最简单的 Skip-gram 模型的可视化图,当输出只有一个单词的时候。

  • Input layer:输入的是目标单词 w t w_t wt的one-hot向量。
    比如说目标单词总共有 ∣ V ∣ |V| V个,当前目标单词比如是 love ,在所有目标单词中位置在第一个,那么模型的输入就是 [ 1 , 0 , ⋯   , 0 ] [1, 0,\cdots, 0] [1,0,,0]
  • Hidden layer:这里的激活函数都是线性的(Word2Vec特有),指定大小为 N N N。(2014年Rong, X的文章中定义叫隐藏层,2013年Mikolov的原始论文其实定义叫投影层,但两者本质是一样的。参考本文2.4)。
  • Output layer:输出的大小仍然是 1 ∗ ∣ V ∣ 1*|V| 1V,为了训练中间的参数,我们需要将实际上下文的单词向量和输入层的向量做对比,从而实现反向传播。。(从隐藏层到输出层的权重矩阵W′的计算量巨大,因为中间每个元素不为0,所以相比输入层和隐藏层中间的参数,这里需要 VN个参数,所以和2013年Mikolov的工作一样,也是去掉了权重W′,这里用的是Hierarchical SoftMax 的方法。后文专门写一个Word2Vec)

“当模型训练完后,最后得到的其实是神经网络的权重,比如现在输入一个 x 的 one-hot encoder: [ 1 , 0 , ⋯   , 0 ] [1, 0,\cdots, 0] [1,0,,0],对应刚说的词语 love,则在输入层到隐含层的权重里,只有对应 1 这个位置的权重被激活,这些权重的个数,跟隐含层节点数是一致的,从而这些权重组成一个向量 vx 来表示x,而因为每个词语的 one-hot encoder 里面 1 的位置是不同的,所以,这个向量 vx 就可以用来唯一表示 x。”(参考
除此之外,向量vx的大小是根据隐藏层神经元的个数决定的,所以一定程度上实现了 降维。


下图是当输出有两个单词时,skip-gram的图像。
输入层仍然是一个目标单词,中间会产生 ∣ V ∣ ∗ d |V| * d Vd 个参数,d 就是隐藏层神经元的个数,然后通过不同的参数(上下文单词的词嵌入 C C C)得到不同的输出结果(第一次参数没有迭代时,大家的结果是一样的)。
在这里插入图片描述

训练 skip-gram 模型

  • 训练的目的就是让结果与原文本相似,也就是概率更高
  • 但实际上,会使得训练很慢,原因是需要在计算概率的时候对所有的上下文单词的词嵌入点乘一遍,也就是归一化(normalization)
    在这里插入图片描述
  • 为了解决这个问题,我们可以简单地把多分类问题(给一个目标单词,得到 ∣ V ∣ |V| V个多分类问题)变成二分类问题
    • 比如 (life, rests) 是真是存在的上下文,我们给它打上标签 1
    • (aardvark, rests) 不存在这样的上下文关系,就打上标签 0
    • 因为所有通过滑动窗口出来地单词组合都是 1,所以我们就有正向的数据集
    • 负向的数据集(负采样),我们简单的拿目标单词配上随机从词表中抽取的单词即可,因为大部分单词还是很少同时出现的,所以随机就可以生成标签为 0 的数据。

负采样(Negative Sampling)
一句话中,t 是目标单词,前后两个都是上下文单词。那么正采样就是这个窗口中的搭配,负采样就是目标单词和任意单词的搭配。
在这里插入图片描述
用逻辑回归做二元分类问题,我们希望正采样结果是两个单词有最大的相似度,负采样的结果两词最不相似。
在这里插入图片描述

Skip-gram 损失函数
判断一个目标单词的损失函数,就是将正向采样中预测与结果之间的差值和负向采样中预测与结果之间的差值各自求和再两者求和:
在这里插入图片描述
但实践中,我们会对每一个目标单词给 k 个负采样,负采样的数量一般一个目标单词配上 5 个是最好的(参考gensim库)。
在这里插入图片描述

理想模型

  • 无监督:不需要有标签过的语料库
  • 高效:负采样(不需要用softmax在整个词典里分析);可以扩展到非常大的语料库上。

词向量或词嵌入的问题

  • 难以对词向量的质量进行量化。因为都是数字,不好直接判断好坏。
  • 不能捕捉多义词。一个单词一个向量,但是词义不同没法解决。

2.3 评估

2.3.1 词相似

  • 用余弦法测量两个词的相似度
  • 将预测的相似性与人类的直觉进行比较
  • 数据集
    • WordSim-353 是一个由带有相关性评分的名词对组成的数据集。
    • SimLex-999 还包含了动词和形容词。

2.3.2 词类比

  • Man 如果对应 King,那么 Woman 对应什么?
  • 可以通过向量相减来判断: v(???) = v(Woman) - v(Man) + v(King) ,然后找到与 ??? 最相近的单词

2.3.3 Embedding空间

如果我们将词嵌入绘制在二维空间中(例如:使用 PCA 降维),我们会发现一些非常有趣的几何关系。这两张图就较为直观地展示了为什么我们可以实现词类比。
在这里插入图片描述

2.3.4 下游任务

“对于词向量,最佳评估方式是基于其他下游任务中的表现进行评估。

  • 使用词袋嵌入作为分类器中的特征表示。
  • 大部分深度学习模型中的第一层是对输入文本进行嵌入表示;相比随机初始化所有权重系数,我们可以仅对部分参数进行随机初始化,而对于词嵌入层的初始权重,我们可以使用预训练的词向量作为嵌入的初始化,因为这样我们可以在少量数据上训练出相对准确的词嵌入。

最近的 上下文词向量(contextual word vectors) 显示在神经网络上具有更好的效果。

  • ELMO 和 BERT

例如:根据单词 “dog” 出现的地方,我们会得到不同的词向量。从句子 1 得到的单词 “dog” 的词嵌入和从句子 2 得到的单词 “dog” 的词嵌入可能差别很大,因为二者的上下文不同。BERT 在捕获这种上下文词向量上做得非常好。”(参考3.14

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/595104
推荐阅读
相关标签
  

闽ICP备14008679号