从语料库中直接学习单词含义,这个领域也被称为 分布语义学(Distributional Semantics)
一个文档由其所包含的单词表示,一个单词由其出现过的文档表示
单元格中的数字表示该单词在对应文档中出现的频率。如果我们观察每一行,我们可以将其视为每个文档的词袋模型表示;如果我们观察每一列,我们可以将其视为每个单词的词向量表示。
比单纯的词频更好的加权方法:
TF-IDF (Term Frequency-Inverse Document Frequency):通过TF(term-frequency)矩阵,计算该单词对应的 IDF(inverse document frequency)值。
。 |D|是文档总数,df_w是该单词在共多少文档中出现的次数。
TF矩阵。 df 表示每个单词 的文档频率,即该单词在所有文档(即语料库)中出现的总次数分别计算每个单词的 IDF 值,并将其和对应单元格的 TF 值相乘,我们可以得到下面的 TF-IDF 矩阵:
TF-IDF 的核心思想在于:对于在大部分文档中都频繁出现的单词(例如:“the”),我们给予更低的权重,因为它们包含的信息量很少。
我们也可以单词作为上下文:
原始频率存在一个明显的问题:整个矩阵被常见单词所主导。但是这里,我们无法采用 TF-IDF,因为这里我们没有涉及到文档。相应地,这里我们可以采用点互信息(PMI)的方法来处理这个问题。
点互信息(Pointwise Mutual Information,PMI):衡量两个事物之间的相关性
我们已经学习了将文档作为上下文的 TF-IDF 矩阵,以及将单词作为上下文的 PMI/PPMI 矩阵。很重要的一点是,无论我们采用文档还是单词作为上下文信息,我们都可以利用 SVD 来创建密集向量。但是,通过不同的上下文信息所捕获到的关系是不一样的,如果我们采用 TF-IDF,我们捕获到的语义学信息会更加宽泛,通常和某种主题关联;如果我们采用 PMI/PPMI,我们捕获到的词向量更多是关于局部单词上下文的语义学信息。
Word2Vec:学习一个分类器,给定词向量预测上下文向量(skip-gram),或者相反(CBOW)
使用负采样来减少运算量。
根据给定的中心单词,生成相应的上下文单词。
对每一项用逻辑回归模型预测:, 其中c和v都是对应单词的词嵌入。
这里实际上有两个嵌入矩阵:目标单词的嵌入矩阵和上下文单词的嵌入矩阵。
V是词汇表大小。两个矩阵的维度实际上是一样的,但是两个矩阵本身是不同的。当我们需要对目标单词计算嵌入时,我们使用矩阵 W;当我们需要对上下文单词计算嵌入时,我们使用矩阵 C。
第一步lookup table取出词嵌入,之后和上下文矩阵乘的时候需要将词汇表中所有单词对应的上下文词嵌入的点积进行累加,这个过程非常缓慢。
实践中,我们的词汇表可能包含 10,000 甚至 100,000 个单词,这样会使得词汇表的维度变得非常大。
因此,Skip-gram 模型的核心是将问题简化为二分类:相比直接进行 softmax 的相关计算,这里我们只是将真实上下文单词和非上下文单词,又称为 “负样本(negative samples)”,区分开来。
这些负样本单词是从词汇表 V 中随机抽取得到的。
因为词汇表通常非常大,所以从词汇表中随机抽样得到真实上下文单词的概率是非常低的。因此,我们可以假设随机抽样得到的单词都是负样本。
我们可以利用 logistic 函数分别计算正样本和负样本的概率:
其中,t 和 c 表示目标单词和上下文单词(或者负样本)的词嵌入。对于负样本,我们计算时用 1 减去 logistic 函数,目的是 最小化 目标单词和非上下文单词之间的相似度。
因此,我们可以通过简单地将正负样本的 log 概率相加来得到 Skip-gram 模型的总的损失函数:
但是,在实践中,相比仅仅采用一个负样本,我们通常会采用 k 个负样本: