目录
一、Meaning and Lexical Semantics(词汇语义)
三、Count-based Distributed Representations(基于计数的分布式表示)
3、TF-IDF(Term Frequency-Inverse Document Frequency-词频-逆文档频率)
4、PMI(点互信息-Pointwise Mutual Information)
四、Sparse vs. Dense Representation(稀疏与密集表示)
2、SVD(奇异值分解-Singular Value Decomposition)
3、LSA( 截断:潜在语义分析-Latent Semantic Analysis)
3.2 CBOW(参考Week 6 Learning Representation: Word Embedding (symbolic →numeric)_金州饿霸的博客-CSDN博客)
七、Contextualized Word Embeddings(上下文词嵌入)
1、ELMo(语言模型的嵌入-Embeddings from Language Models)
2、BERT(Bidirectional Encoder Representation from Transforme)
根据其用法来学习一个未知单词。
例如:现在我们有一个单词 tezgüino,我们并不知道其含义,我们试图通过从该单词的一些用法中学习到其含义。
下面是该单词出现过的一些例句:

作为人类,通过结合常识,我们可以大概猜测到 tezgüino 可能是某种含酒精饮品。
我们再查看一下在相同(或者类似)上下文中的其他单词的情况。

可以看到,单词 wine 出现过的类似场景最多。因此,尽管我们并不知道 tezgüino 的具体含义,我们还是可以认为 tezgüino 和 wine 在单词含义方面非常相近。
在前面的例子中,我们可以将这些由 0 和 1 组成的行视为词向量,因为它们能够很好地代表这些用例。例如:给定 100 个非常好的例句,我们可以基于这些单词是否出现在这些例句中,将其转换为 100 维的向量。


这里,我们学习的第一个模型是 向量空间模型(Vector Space Model,VSM)。

这里,每一行都表示语料库中的一个文档,每一列表示语料库的词汇表中的一个单词,单元格中的数字表示该单词在对应文档中出现的频率。例如:单词 state 没有在文档 425 中出现过,所以对应的值为 0,但是它在文档 426 中出现过 3 次,所以对应值为 3。
当我们构建完成这样一个矩阵后,我们可以从两种视角来看待它:如果我们观察每一行,我们可以将其视为每个文档的词袋模型(BOW)表示;如果我们观察每一列,我们可以将其视为每个单词的词向量表示。
一旦我们构建了一个向量空间模型,我们可以对其进行一些操作:
首先,我们学习一种比单纯的词频更好的加权方法:TF-IDF (Term Frequency-Inverse Document Frequency)。它是 信息检索(information retrieval)领域的一种标准加权方案。

TF 矩阵
我们首先可以得到一个 TF(term-frequency)矩阵,和之前一样,单元格中的数字表示该单词在对应文档中出现的频率。
然后,我们将计算该单词对应的 IDF(inverse document frequency)值:

TF-IDF值:
其中,|D| 表示文档总数。dfw 表示单词 w 的文档频率,即该单词在所有文档(即语料库)中出现的总次数(TF 矩阵中最后一行)。这里,log 的底数为 2。
例如:假设一共有 500 个文档,单词 “the” 的 df 值为 500,那么这里单词 “the” 的 IDF 值为:

分别计算每个单词的 IDF 值,并将其和对应单元格的 TF 值相乘,我们可以得到下面的 TF-IDF 矩阵:

TF-IDF 矩阵
可以看到,单词 “the” 对应的列的值都为 0,这是因为其 IDF 值为 0,所以无论对应单元格的 TF 值为多少,相乘后得到的结果都是 0。
TF-IDF 的核心思想在于:对于在大部分文档中都频繁出现的单词(例如:“the”),我们给予更低的权重,因为它们包含的信息量很少。
点互信息(Pointwise Mutual Information,PMI)的思想非常简单,对于两个事件 x 和 y(即两个单词),PMI 计算二者的差异:


假设 x=state,y=country,我们可以得到:
我们可以按照前面的方法计算所有单元格的 PMI,从而得到 PMI 矩阵。

对于从来没有共同出现过的单词对,其对应的 PMI 矩阵中的值为 −inf,因为在这种情况下,计算时分子 p(x,y) 的值为 0,而 log20=−∞。
们可以采取一些技巧来避免 PMI 的一些问题:
我们已经学习了将文档作为上下文,我们还可以将单词作为上下文。
在某些预定义的上下文中(通常是一个窗口)。
相比将文档作为上下文,我们可以选择目标单词附近固定范围内的某些单词作为上下文。
例如:我们可以选择窗口大小为 5,即目标单词前后长度为 5 的范围内的单词作为上下文单词。

可以看到,在上面的矩阵中,每一行都表示一个单词,每一列也表示一个单词。单元格中的数字表示目标单词和上下文单词在整个语料库中所有大小为 5 的窗口内(即从语料库中提取所有的 five-grams)共同出现的频率。

我们已经学习了将文档作为上下文的 TF-IDF 矩阵,以及将单词作为上下文的 PMI/PPMI 矩阵。很重要的一点是,无论我们采用文档还是单词作为上下文信息,我们都可以利用 SVD 来创建密集向量。但是,通过不同的上下文信息所捕获到的关系是不一样的,如果我们采用 TF-IDF,我们捕获到的语义学信息会更加宽泛,通常和某种主题关联;如果我们采用 PMI/PPMI,我们捕获到的词向量更多是关于局部单词上下文的语义学信息。
奇异值分解(Singular Value Decomposition,SVD)是一种流行的降维方法。
SVD 的核心思想很简单:给定一个矩阵 A,我们可以将其分解为 3 个相乘的矩阵:U、Σ 和
。
A = U Σ
(有点类似于相似对角化)

可以看到:
是新的 document 矩阵,由A的特征向量组成,行数为 m,列数为文档总数 |D|。显然,经过 SVD,我们得到的新的 term 矩阵要比之前的 A 矩阵维度更小,并且更密集。
我们还可以在 SVD 的基础上更进一步,采用 截断(truncating)方法,也被称为 潜在语义分析 (Latent Semantic Analysis, LSA)。
截断为 k 个维度,从而生成原始矩阵的最佳 k 阶近似。
(或者
)是对应单词的一个新的低维表示。
可以看到,矩阵
在矩阵 U 的基础上进一步压缩了,通常 k 取 100 或者 200 时已经足够很好地表示单词含义了。现在,矩阵
中的每一行都可以视为一个词向量。

Word2Vec 的框架是学习一个分类器,有以下 2 种算法:

两种算法的学习过程基本上是一样的,但是前提条件略有差别,二者之间互为逆过程。
(1) 模型
据给定的中心单词,生成相应的上下文单词。

全概率被定义为:

其中,
是目标单词(中心单词),
是上下文单词,下标表示运行文本中的位置。
使用一个 Logistic 回归模型来计算上面每一个乘积项(例如,
=he,
=rests):

其中,
和
分别表示单词
和
的词嵌入。
(2)模型的表示

输入层是目标单词
的 one-hot 向量,其维度为 1×|V|,所以其中只会有一个值被激活,即目标单词对应的位置索引(例如:
)。然后,经过目标单词嵌入矩阵
将其投影为一个 1×d 的嵌入向量。之后,我们将该嵌入向量和上下文单词嵌入矩阵
相乘,从而得到上下文单词
的一个 1×|V| 的概率向量,其中每个元素代表词汇表中相应位置的单词在这里出现的概率。我们可以对上下文单词
进行相同的操作。然后,我们可以通过计算交叉熵来得到模型的损失。
(3)训练 Skip-gram 模型
实践中非常缓慢,因为我们需要在整个词汇表 |V| 上进行 归一化(normalisation)。

当我们在给定目标单词的情况下,计算一个上下文单词的概率时,我们需要将词汇表中所有单词对应的词嵌入的点积进行累加,这个过程非常缓慢,因为在实践中,我们的词汇表可能包含 10,000 甚至 100,000 个单词,这样会使得词汇表的维度变得非常大。
(4)负采样
这里我们来看一个 负采样(Negative Sampling)的具体例子:

假设我们有以上例句,并且上下文窗口为目标单词前后各 2 个相邻单词。这里,我们的目标单词为 “apricot”,上下文单词为 “tablespoon”、“of”、“jam” 和 “a”。
正样本非常简单,就是由窗口中的目标单词和上下文单词构成的单词对。负样本的获取也非常简单,我们只是通过简单地将目标单词与从词汇表中随机抽取得到的单词进行配对,例如,这里我们进行 8 次随机抽样,从而得到 8 个负样本。这里我们的目标单词是 “apricot”,我们也可以对其他目标单词进行相同的操作。
之后,我们可以利用 logistic 函数分别计算正样本和负样本的概率:


其中,t 和 c 表示目标单词和上下文单词(或者负样本)的词嵌入。
这里,我们将词嵌入 t 和 c 的点积 t⋅c 作为 logistic 函数的输入(即 x)。如果二者的点积 t⋅c 非常大(例如:“apricot” 和 “jam”),从上面的函数图像可以看到,我们得到的概率将非常接近 1,因为我们希望 最大化 目标单词和真实上下文单词之间的相似度。对于负样本,我们计算时用 1 减去 logistic 函数,目的是最小化 目标单词和非上下文单词之间的相似度。
(4)模型的损失函数
因此,我们可以通过简单地将正负样本的 log 概率相加来得到 Skip-gram 模型的总的损失函数:

但是,在实践中,相比仅仅采用一个负样本,我们通常会采用 k 个负样本:

(5)理想模型
(1)基本思想
Glove是一个典型的基于统计的获取词向量的方法,基本思想是:用一个词语周边其他词语出现的次数(或者说两个词共同出现的次数)来表示每一个词语,此时每个词向量的维度等于词库容量,每一维存储着词库对应序号的词语出现在当前词语周围的次数,所有这些词向量组成的矩阵就是共现矩阵。
我们也可以换一个角度来理解共现矩阵,共现矩阵就是两个词同时出现的次数,共现矩阵的i行j列的数值表示词库中第i个词和第j个词同时出现的次数,同时共现矩阵是对角线为零的斜对称矩阵
大家可以通过下边这个例子来更直观的理解共生矩阵:

(3)优点
(4)存在的问题
fastText 设计之初是为了解决文本分类问题的,只不过在解决分类问题的同时 fastText 也能产生词向量,因此后来也被用来生成词向量。
fastText 和 word2vec 类似,也是通过训练一个神经网络,然后提取神经网络中的参数作为词语的词向量,只不过 fastText 训练网络的方法是对文本进行分类;此外 word2vec 的输入是多个词语的 noe-hot 编码,fastText的输入是多个单词及其n-gram特征;同时fastText为了解决类别过多导致的softmax函数计算量过大的问题,使用了层次softmax代替标准的softmax
fastText 和 word2vec 最主要的区别如下:
例如:根据单词 “dog” 出现的地方,我们会得到不同的词向量。从句子 1 得到的单词 “dog” 的词嵌入和从句子 2 得到的单词 “dog” 的词嵌入可能差别很大,因为二者的上下文不同。BERT 在捕获这种上下文词向量上做得非常好。
similarity 相关性度量
使用向量空间中的余弦相似度测试单词对的兼容性。

我们可以计算得到的词向量之间的余弦相似度,然后将其和人类评分的结果进行对比,例如:计算 Pearson 相关度。如果我们的计算的余弦相似度和人类评分二者的 Pearson 相关系数很高,则说明我们的词嵌入至少和人类从直觉上对单词相似度的判断接近。
假设给了一对单词 (a , b) 和一个单独的单词c,task会找到一个单词d,使得c与d之间的关系相似于a与b之间的关系,举个简单的例子:(中国,北京)和 日本,应该找到的单词应该是东京,因为北京是中国的首都,而东京也是日本的首都。 在给定word embedding的前提下,task一般是通过在词向量空间寻找离(b-a+c)最近的词向量来找到d。
(1) 优点
缺点
(2) 模型
首先给定N个单词的序列, (t1,t2,...,tN)
1)前向语言模型,已知前k-1个单词 (t1,t2,...,tk−1) ,预测第k个单词 tk 的概率:

2)后向语言模型,已知下文 (tk+1,tk+2,...,tN) ,预测第k个单词 tk :

双向语言模型(biLM)即将前向和后向语言模型联合起来,并最大化前后向语言模型的联合似然函数:

其中,公式中有两个LSTM 单元, θx 为输入的初始词向量参数, θs 为输出的softmax层参数(即,在LSTM的每一个步长输出的隐藏层h,再作为softmax的输入)。
在第一点中输入的初始词向量通过 char-level(CNN)获得(即,对单词内的字符通过CNN卷积操作得到词向量),如下图:

ELMo为多个双向语言模型biLM的多层表示
对于某一个单词tk,一个L层的双向语言模型biLM由2L+1个向量表示:

xkLM 为char-level初始词向量,前后向 hk,jLM 分别为前后向lstm的输出,ELMo将多层的biLM的输出R整合成一个向量:

再将 Rk 向量正则化后,输入softmax层,作为学到的一组权重

结构如下图所示

(3) ELMo词向量在NLP任务中的使用



BERT 来自 Google 的论文Pre-training of Deep Bidirectional Transformers for Language Understanding,BERT 是“Bidirectional Encoder Representations from Transformers”的首字母缩写,整体是一个自编码语言模型(Autoencoder LM),并且其设计了两个任务来预训练该模型。
BERT 相较于原来的 RNN、LSTM 可以做到并发执行,同时提取词在句子中的关系特征,并且能在多个不同层次提取关系特征,进而更全面反映句子语义。相较于 word2vec,其又能根据句子上下文获取词义,从而避免歧义出现。同时缺点也是显而易见的,模型参数太多,而且模型太大,少量数据训练时,容易过拟合。