CS224n 自然语言处理与深度学习笔记1
CS224n 笔记1-自然语言处理与深度学习简介
1 如何表示单词
在所有NLP任务中,第一个也是可能最重要的共同点是我们如何将单词表示为任何模块的输入。 我们将不介绍的许多早期NLP工作都将单词视为原子符号。 为了在大多数NLP任务上表现出色,我们首先需要了解单词之间的相似性和差异性。 使用单词向量,我们可以很容易地在向量本身中编码这种能力(使用距离度量,例如Jaccard,Cosine,Eucleidean等)。
1.1 Word Vectors(词向量)
我们希望将每个单词标记编码为某种矢量,该矢量表示某种“单词”空间中的一个点。 出于多种原因,这是最重要的,但最直观的原因是,实际上可能存在一些N维空间(这样,N≪ 1300万)足以编码我们语言的所有语义。 每个维度都会编码一些我们使用语音传递的含义。 例如,语义维度可能表示时态(过去,现在和未来),计数(单数或复数)和性别(男性与女性)。
1.2 one-hot vector(独热向量)
将每个单词表示成 R|V|x1向量,这个词向量就是有很多0和一个1组成(1的位置就是该单词在排序英文出现的索引位置)。在上面的标记中,|V|是词汇的大小。以这种形式编码的词向量看起来如下:
我们可以将每个单词表示成相互独立的实体。就如我们前面所讨论的,单词表示不会直观地给出单词之间的相似性。例如:
所以也许我们可以尝试将这个空间的大小从 R|V| 减小到更小的东西,从而找到一个编码词之间关系的子空间。
2 生成词向量的方法
基于SVD(奇异值分解)的方法
对于这一类寻找词嵌入(也称作词向量)的方法,首先在一个大型数据集进行循环,并且从某种形式的矩阵X中积累单词共现的次数,然后对矩阵X执行奇异值分解来获得一个USVT.我们然后将U作为我们词典中所有单词的词嵌入(或词向量)。下面讨论下X的一些形式。
2.1 基于统计的方法
2.1.1 Word-Document Matrix(词-文档矩阵)
作为刚开始的尝试,我们大胆地推测:相关的单词经常出现在同一个文档中。例如,“银行”、“债券”、“股票”、“钱”等等,可能出现在一起。但是“银行”、“章鱼”、“香蕉”和“曲棍球”可能不会一起同时出现在一篇文章中。我们依据这个事实来创建一个词-文档矩阵X,其形成方式如下:遍历几十亿个文档,并且对于每一个单词i只要出现在文档j中,我们就将X自增1。很明显的是,Xij将会是一个巨大的矩阵(IR|V|xM)同时与文档数量(M)相关。因此我们或许还有改善的地方。
2.1.2 Window based Co-occurnece Matrix( 基于窗口的词共现矩阵)
在这使用同样的逻辑,矩阵X存储了单词的共现次数,这样将会变成一个附属矩阵。在这个方法中,我们计算每个单词在一个特定大小的窗口内出现的次数,进而计算语料库中所有的单词的技术。下面将展示一个实例,我们语料中包含三个句子,窗口大小为1:
I enjoy flying.
I like NLP.
I like deep learning.
由此产生的计数矩阵将会是:
可以看出,上述矩阵是个对称阵。矩阵X中的每个元素xij代表单词i前后出现单词j的次数。
2.1.3 Applying SVD to the cooccurrence matrix(对共现矩阵使用奇异值分解)
现在,我们在X上执行SVD,观察奇异值(所得S矩阵中的对角项),并根据捕获的所需百分比方差在某个索引k处将其截断:
然后我们把U1:|V|,1:k的子矩阵变成我们的单词嵌入矩阵。因此,这将为我们提供词汇表中每个单词的k维表示。
将SVD应用于X
通过选择前k个奇异矢量来降低维数:
这两种方法能够提供给我们编码足够语义和语法信息的词向量,但是也伴随着很多其他问题:
·矩阵的维度变化非常频繁(新词添加和语料大小变化非常频繁)
·大多数单词没有共现,矩阵会非常稀疏
·通常矩阵维度非常高(约为106x106)
·训练成本比较高
·为了形成词频的严重不平衡,需要进行对矩阵X进行“打乱”。
目前已经存在了一些方法来解决上面提到的问题:
·忽略一些功能词汇,例如“the”,“he”,“has”,etc。
·使用一个不规则窗口-根据文档中单词之间的距离来计算共现次数
·使用Pearson相关系数和将原始计数设置为负数。
正如我们在下一节中看到的那样,基于迭代的方法以一种更为优雅的方式解决了许多此类问题。