不只认出一个词,还要知道它怎样使用 Lec 6 · PDF 第 40–41 页
词向量希望用相近的数字表示意思相近的词。最简单的编码方法却做不到这一点:给词表中的每个词安排一个位置,轮到哪个词,就只把那个位置写成 1,其余位置全写 0。这叫独热编码(one-hot vector)。
这两个向量没有重合的非零位置,所以点积和余弦相似度都是 0。事实上,任意两个不同词的独热向量都互相垂直,即使它们是同义词。我们需要换一个思路:统计一个词出现在哪些文档里、周围经常有哪些词。这样,用法相近的词才有机会在同样的位置上出现非零数值。
用两种表格记录词的使用情况 Lec 6 · PDF 第 42–51 页
把次数排成行和列,就得到一张共现矩阵。先记住三个集合:\(V\) 是词表,\(D\) 是文档集合,\(C\) 是我们选择观察的上下文。文档可以是一部戏剧、一篇文章,也可以只是一个段落。读表前,最重要的是弄清楚行、列分别代表什么。
| 表格名称 | 一个格子记录什么 | 行数 × 列数 | 怎样取出一个向量 |
|---|---|---|---|
| 词—文档矩阵(term-document matrix) | 词 \(w\) 在文档 \(d\) 中出现多少次 | \(|V|\times|D|\) | 取一行,就是一个词在各篇文档中的次数,共 \(|D|\) 个数。取一列,就是一篇文档中各个词的次数,共 \(|V|\) 个数。 |
| 词—上下文矩阵(word-context matrix) | 上下文 \(c\) 在目标词 \(w\) 附近出现多少次 | \(|V|\times|C|\) | 取一行,就是一个词周围各种上下文的次数,共 \(|C|\) 个数。如果词表里每个词都算一种上下文,那么 \(|C|=|V|\)。 |
莎士比亚作品的例子中,battle 和 fool 在不同戏剧里的出现次数很不一样。反过来,两部戏剧如果用词分布相近,它们的文档向量也可能接近。第二种表格把范围缩小了:不再看整篇作品,而是看一个词附近的那一小段文字。
附近,到底是多近?
PDF 第 47 页采用“距离不超过四个词”的规则。若使用左右两侧、半径为 4 的窗口,就数目标词前面最多 4 个词、后面最多 4 个词,不数目标词自己;到了文本边界,能数到的邻词就少一些。让窗口沿着文字移动,就能不断累积词与上下文的配对次数。
PDF 第 49 页的小表只展示了 4 个词和 3 种上下文。它是完整 \(|V|\times|V|\) 表格的一部分,所以图里每行只有 3 个数,完整的每行却有 \(|V|\) 个数。上下文的定义一旦改变,每个坐标代表的东西也会改变。
次数多,未必说明关系特别密切 Lec 6 · PDF 第 52–53 页
Sugar 常出现在 apricot 附近,确实能提供词义线索。但 the、it、they 本来就到处出现,在许多互不相关的词旁边也能数到很多次。只比较原始次数,容易把“本来就常见”误当成“特别有关”。
因此,我们要给次数重新分配权重。下面两种方法分别回答一个问题:
- TF-IDF:一个词虽然在这篇文档里常见,但在别的文档里是否也到处都是?这适合给词—文档矩阵加权。
- PMI 和 PPMI:两个词一起出现的次数,是否超过了它们各自常见程度所能解释的水平?这适合给词—上下文矩阵加权。
TF-IDF:在这篇里常见,还要有区分度 Lec 6 · PDF 第 54–56 页
TF-IDF 把两件事相乘:这个词在当前文档里出现了多少次,以及它在整个文档集合里有多特别。令 \(\operatorname{count}(t,d)\) 表示词 \(t\) 在文档 \(d\) 中的次数。词频(term frequency,TF)先对次数取对数,让反复出现的影响增长得慢一些:
这里的文档频率(document frequency,DF)数的是文档篇数,不是词的总次数。逆文档频率(inverse document frequency,IDF)据此衡量区分度:出现过这个词的文档越多,它就越不特别。
PDF 第 55 页给出的 Romeo 和 action 都一共出现了 113 次,但前者集中在 1 篇文档里,后者分布在 31 篇里。在 \(N=37\) 篇文档中,Romeo 的 \(\operatorname{idf}\approx1.57\);如果一个词在全部 37 篇中都出现,它的 IDF 就是 0。
这个例子中,TF 和 IDF 都用以 10 为底的对数。battle 出现在 37 部戏剧中的 21 部,即 \(\operatorname{df}=21\),所以 \(\operatorname{idf}=\log_{10}(37/21)\approx0.246\)。若它在某篇中出现 7 次,权重就是 \((1+\log_{10}7)\times0.246\approx0.454\);若一次也没出现,权重就是 0。
PDF 第 54 页对正次数写的是 \(1+\log c\),但第 56 页的数值表对应另一种写法 \(\log_{10}(1+c)\)。例如,表中 battle 出现 1 次时的权重是 0.074,约等于 \(\log_{10}2\times0.246\);如果照第 54 页公式计算,应为 0.246。上面的手算例子采用第 54 页公式,并明确使用以 10 为底的对数。
这种权重可以帮助检索文档、比较文档是否相似、进行文本分类,以及提取关键词。它改变的是表格里的数值,不是行列数量,所以加权之后,向量并没有变短。
PMI:一起出现,是否比预期更频繁? Lec 6 · PDF 第 57 页
如果词 \(w\) 和上下文 \(c\) 互不影响,它们一起出现的概率应当是各自概率相乘,也就是 \(P(w)P(c)\)。点互信息(pointwise mutual information,PMI)把实际一起出现的概率与这个基准相比,再取对数:
第二行是正点互信息(positive PMI,PPMI):只保留正的 PMI,把负值都改成 0。
| PMI 的结果 | 说明什么 | 改成 PPMI 后 |
|---|---|---|
| 正数 | 一起出现的次数,比假设两者独立时预期的更多。 | 保留原来的正值。 |
| 零 | 与独立时的预期一致。 | 仍然是 0。 |
| 负数 | 一起出现的次数,比预期的更少。 | 改为 0。 |
为什么舍弃负值?对于很少见的词,很难确定“比预期更少”究竟是不是可靠规律。课件的例子是:两个词各自出现的概率都只有 \(10^{-6}\),独立时一起出现的概率就只有 \(10^{-12}\)。数据不足时,很难对这么小的概率作出准确判断。PPMI 选择只保留正关联,但要记住:一个结果被改成 0,并不证明这两个词真的独立。
怎样从计数表一步步算出 PPMI? Lec 6 · PDF 第 58–59 页
先把表中每格的次数记为 \(f_{ij}\):它表示目标词和上下文组成的配对 \((w_i,c_j)\) 出现了几次。接着算三个总数:整张表的总和 \(T\)、第 \(i\) 行的总和 \(r_i\)、第 \(j\) 列的总和 \(s_j\)。所有概率都要用同一张表、同一种计数规则。
一个格子的次数除以 \(T\),就是两个词一起出现的联合概率;一行或一列的总和除以 \(T\),则是只看其中一边的边缘概率。
注意,\(T\) 数的是目标词与上下文的配对次数,不一定等于整份文字的词数。一个目标词出现一次,周围可能有好几个词,因此会贡献多个配对。若 \(f_{ij}=0\),但两边的边缘概率都大于零,那么不做平滑时 PMI 为 \(-\infty\),PPMI 定义为 0。若整行或整列的总和为零,相应概率就无法用于这个计算,应把它排除。
用课件中的这张表来计算
| 目标词 / 上下文 | computer | data | result | pie | sugar | 行总和 |
|---|---|---|---|---|---|---|
| cherry | 2 | 8 | 9 | 442 | 25 | 486 |
| strawberry | 0 | 0 | 1 | 60 | 19 | 80 |
| digital | 1670 | 1683 | 85 | 5 | 4 | 3447 |
| information | 3325 | 3982 | 378 | 5 | 13 | 7703 |
| 列总和 | 4997 | 5673 | 473 | 512 | 61 | 11716 |
下面使用以 2 为底的对数,结果的单位是比特。先看 information 和 data:\(P(w,c)=3982/11716\approx0.3399\),\(P(w)=7703/11716\approx0.6575\),\(P(c)=5673/11716\approx0.4842\)。代入后得到:
\[ \operatorname{PPMI}(\text{information},\text{data})=\log_2\frac{3982\times11716}{7703\times5673}\approx0.094 \]虽然一起出现了很多次,但它们各自本来就很常见,所以超出预期的程度不大。再看另外两组:
\[ \operatorname{PPMI}(\text{cherry},\text{pie})=\log_2\frac{442\times11716}{486\times512}\approx4.379 \] \[ \operatorname{PMI}(\text{cherry},\text{computer})=\log_2\frac{2\times11716}{486\times4997}\approx-6.695 \]Cherry/pie 有很强的正关联;cherry/computer 的 PMI 为负,因此 PPMI 改为 0。换一种对数底数,只会缩放数值,不会改变正负号;比较时应统一底数。
课件中的一处笔误:PDF 第 59 页第一个概率计算式的分母多写了一个 1。表格总和与它旁边的小数结果都要求分母为 \(11716\),这里统一使用这个数。
为什么还希望把向量变短? Lec 6 · PDF 第 60–62 页
计数和 PPMI 都能提供有用的信息,但词表一大,每个向量就可能很长,而且大部分位置是 0。这样的向量叫稀疏向量(sparse vector)。另一条路线是用少得多的数字表示一个词,并让多数位置都包含信息,这叫稠密向量(dense vector)。
| 稀疏的计数或 PPMI 向量 | 稠密词向量 |
|---|---|
| 通常词表中的每种上下文占一个坐标;课件举出的长度为 20,000–50,000。 | 用更少的坐标表示一个词;课件举出的典型长度为 50–1000。 |
| 大部分坐标是零,每个坐标都有明确的上下文含义。 | 大部分坐标非零,相似的上下文有机会共享信息。 |
| car 和 automobile 分别占据两个不同坐标。 | 即使周围出现的词不完全相同,也有机会反映它们的相似性。 |
更短的向量意味着后续模型要调整的特征权重更少,也可能更容易把经验用到新例子上。它还有机会更好地处理同义词:一个词常出现在 car 附近,另一个常出现在 automobile 附近,我们希望能看出两者用法相似,而不是因为坐标不同就错过这条线索。
后面可以沿哪些方向继续学?
- Word2vec 和 GloVe:本讲把它们列为获得稠密词向量的方法,并提到了 Word2vec 的 skip-gram 与 CBOW 两个名称。
- 奇异值分解(SVD):这是从矩阵出发的另一条路线,课件同时列出了潜在语义分析(LSA)。
- 根据当前句子重新表示一个词:静态词向量给每种词固定一组数字;上下文词向量则针对每一次出现计算表示,因此同一个词在不同句子里可以有不同向量。
Word2vec 和 GloVe 虽然出现在大纲里,但第 6 讲 PDF 到这份概览就结束了,没有给出它们的训练目标或优化算法。第 7 讲补上了这一段:word2vec 一页从分类器一直讲到梯度更新,GloVe 一页解释矩阵分解的视角。
词向量与余弦相似度解释怎样让数字反映词义;多分类逻辑回归解释怎样把输入特征变成各类得分,再变成总和为 1 的概率。它们分别处理“怎样表示输入”和“怎样作出分类”这两个步骤。
- 独热编码只说明是哪个词;统计使用场景,才有机会比较词义。
- 读表先看行和列。词—文档矩阵中的词向量有 \(|D|\) 个数,完整的词—词矩阵中则有 \(|V|\) 个数。
- TF-IDF 同时考虑一个词在本篇里多常见、在其他文档里多普遍。PMI 比较共现是否超过预期,PPMI 则把负值改成 0。
- 联合概率和边缘概率必须来自同一张表;表中总数是词与上下文的配对次数。
- 加权只改数值,不改维度。更短的稠密向量,以及随语境变化的词向量,是接下来的学习方向。