CS224n: Natural Language Processing with Deep Learning 笔记、文献及知识点整理 (一)词向量(一)

2021/11/25 23:15:32

本文主要是介绍CS224n: Natural Language Processing with Deep Learning 笔记、文献及知识点整理 (一)词向量(一),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

词向量:引言、SVDWord2Vec

关键词:NLP(自然语言处理)、词向量、SVD(奇异值分解)、Skip-gram、CBOW(连续词袋)、负采样、层级Softmax、Word2Vec

自然语言是一个离散的、符号化的范畴体系。

1. NLP概述

1.1 NLP有什么特别之处?

人类(自然)语言有什么特别之处? 人类语言是一种专门为传达意义而构建的系统,它不是由任何形式的物理表现产生的。 它与视觉或任何其他机器学习任务非常不同。

绝大多数单词只是语言外实体实体的符号,单词是一个映射到被指代的想法或者物品的表达形式。

例如,“rocket”这个词指的是火箭的概念,引申开来可以指代火箭的一个实例。 当我们使用单词和字母来表达信号时,但有一些例外,比如“Whooompaa”。

最重要的是,语言符号可以用多种方式进行编码:如语音、手势、文字等。

它们通过连续信号传输到大脑,大脑本身似乎以连续的方式对事物进行编码。 (在语言哲学和语言学中,人们已经做了大量工作来对人类语言进行概念化,并将单词与其参考、意义等区分开来。参见Wittgenstein, Frege, Rus- sell 和 Mill的著作。)

1.2 任务示例

NLP 中有不同级别的任务,从语音处理到语义解释和话语处理。 NLP 的目标是能够设计算法,让计算机“理解”自然语言以执行某些任务。 示例任务具有不同的难度:

简单

• 拼写检查

• 关键词搜索

• 寻找同义词

中等

• 解析来自网站、文档等的信息。

困难

• 机器翻译(例如将中文文本翻译成英文)

• 语义分析(查询语句的含义是什么?)

• 共指(例如,“他”或“它”指的是给定的文档吗?)

• 问答(例如,回答危险问题)

1.3 如何表示单词?

所有 NLP 任务的首个也是最重要的共同点是如何将单词表示为任一模型的输入。 我们不去讨论大部分早期 NLP 工作将单词视为原子符号。 为了解决大多数 NLP 任务,我们要对单词之间的相似性和差异有点儿概念。 使用词向量,我们可以很容易地在向量本身中编码这种能力(比如使用距离度量,例如 Jaccard、Cosine、Euclidean 等)。

2. 词向量(Word Vectors)

英语估计有 1300 万个单词之多,这么多单词之间并非是完全无关的,例如:feline 和 cat, hotel 和 motel。因此,如果我们创造一个表示单词的空间,并且把每个单词编码成某个向量,该向量代表这个“单词”空间中的一个点。 这一点至关重要,原因有很多,最直观的原因是,也许实际上存在一些足以对我们语言的所有语义进行编码的 N 维空间(N ≪ 1300 万)。 每个维度都会编码一些我们使用语言传递的含义。例如,语义维度可能表示时态(过去与现在与未来)、计数(单数与复数)和性别(男性与女性)。

我们先看一个最简单的词向量,one-hot向量。先将所有1300万英文单词表排个序,one-hot将每个词表示为一个的向量,几乎所有部分都是0,但在排序后的词表中这个单词的索引位置是1。这种表示方法,|V| 是词汇量的大小,词向量在这种方案中是这个样子: 

 每个单词被表示为了一个完全独立的实体。前面讨论过,这个词表示方式并没有直接给我们任何相似性的概念。 例如:

 因此,也许我们可以尝试将这个空间的大小从R | V |减小到更小,从而找到一个子空间,其可以编码单词之间关系。

(One-hot一词来自于数字电路设计)

3. 基于SVD的方法

对于这类寻找词嵌入(也称为词向量)的方法,我们首先循环遍历大量数据集并以某种形式的矩阵 X 累积词共现计数,然后对 X 执行奇异值分解以获得分解。 然后我们使用矩阵U 的行作为我们字典中所有单词的词嵌入。 我们看一下 X 的几种选择:

3.1 词-文档矩阵 Word-Document Matrix

作为第一次尝试,我们先大胆的猜测相关的词将经常出现在同一文档中。 例如,"banks", "bonds", "stocks", "money" 等很可能会一起出现。 但是“banks”、“octopus”、“banana”和“hockey”可能不会一直一起出现。 我们使用这个事实以如下方式构建一个词-文档矩阵 X:循环数十亿个文档,每当词 i 在文档 j 中出现时,我们就在条目 Xij 中添加一条。 这显然是一个非常大的矩阵(),它随着文档的数量 (M) 而变化。 所以也许我们可以尝试更好的方法。

 (分布语义:根据单词通常出现的上下文来表示单词含义的概念。 它是密集的,可以更好地捕捉相似性。)

3.2 基于窗口的共现矩阵(Window based Co-occurrence Matrix

同样的逻辑,矩阵 X 存储单词的共现,从而成为一个亲和矩阵。 用这种方法,我们计算每个单词出现在特定单词周围特定大小的窗口内的次数。 我们为语料库中的所有单词计算这个次数。 举个栗子:

假设语料库只有三个句子,窗口大小为 1:

1. I enjoy flying.
2. IlikeNLP.
3. I like deep learning.

计数矩阵结果:

 

3.3 在共现矩阵中使用奇异值分解(Applying SVD to the cooccurrence matrix

对 X 执行 SVD,观察奇异值(结果 S 矩阵中的对角线项),并根据捕获的所需百分比方差在某个索引 k 处将它们截断:

然后我们将的子矩阵作为我们的词嵌入矩阵。 这将提供词汇表中每个单词的 k 维表示。

对矩阵X使用SVD:

 通过选择前 k 个奇异向量来降低维度:

 

(注:

使用词词共现矩阵:

• 生成 |V| × |V| 共生矩阵,X。

• 在X上使用SVD,得到X=

• 选择U的前k列得到一个k维的词向量。

• 表示前 k 维捕获的方差量。

这些方法都为我们提供了足以编码语义和句法(词性)信息的词向量,但仍然有许多其他问题:

• 矩阵的维度变化非常频繁(新词添加非常频繁,语料库大小发生变化)。

• 矩阵非常稀疏,因为大多数词不会同时出现。

• 矩阵通常具有很高的维度(≈ 106 × 106)

• 训练的二次成本(如执行 SVD)

• 需要在 X 上做些特别处理以解决词频的严重失衡

(基于 SVD 的方法不适用于大矩阵,并且很难合并新单词或文档。 m × n 矩阵的计算成本为 O(mn^2))

不过,还是有方案来解决上面的问题的:

(基于计数的方法有效地利用了统计信息)

• 忽略虚词,如“the”、“he”、“has”等。

• 应用变化窗口——如根据文档中单词之间的距离对共现计数进行加权。

• 使用 Pearson 相关性并将负计数设置为 0,而不是仅使用原始计数。

我们下一节中将看到,基于迭代的方法以一种更加优雅的方式解决了上述许多问题。

(未完待续)



这篇关于CS224n: Natural Language Processing with Deep Learning 笔记、文献及知识点整理 (一)词向量(一)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程