这里把公式的用途和符号放在一起。想先找一个词的含义,可以直接跳到术语解释;需要完整推导时,点击公式标题回到对应笔记。
公式怎么用
每一项都是“知道前面这些词后,下一个词出现的概率”。把它们连乘,就得到整串词一起出现的概率。
\[ P(w_1 \ldots w_n) = \prod_{k=1}^{n} P(w_k \mid w_1 \ldots w_{k-1}) \]右边只保留最近 k 个词作为条件。这里 k 数的是前面的词数,所以 n-gram 模型对应 k=n−1。
\[ P(w_i \mid w_1 \ldots w_{i-1}) \approx P(w_i \mid w_{i-k} \ldots w_{i-1}) \]分子是这对词一起出现的次数,分母是前一个词作为上下文出现的次数。分母要大于零,前后也要使用一致的计数方式。
\[ P(w_i \mid w_{i-1}) = \frac{c(w_{i-1} w_i)}{c(w_{i-1})} \]W 是测试序列,N 是参与预测的文本单元数。中间一项用了二元模型的假设;最后一项用自然对数和指数计算。比较分数时,测试数据和分词等条件要一致。
\[ \mathrm{PP}(W) = P(w_1 \ldots w_N)^{-1/N} = \sqrt[N]{\prod_{i=1}^{N} \frac{1}{P(w_i \mid w_{i-1})}} = \exp\Big(-\tfrac{1}{N}\sum_i \log P(w_i \mid w_{i-1})\Big) \]r 表示词频排名,s 控制频率下降的速度。这解释了为什么文本再多,也会有很多罕见词。
\[ \text{freq}(r) \propto r^{-s} \]每个候选词的计数都加 k。词表有 V 个候选,因此总次数也要增加 kV。k=1 时,就是加一平滑。
\[ P_{\text{Add-1}}(w_i \mid w_{i-1}) = \frac{c(w_{i-1}w_i) + 1}{c(w_{i-1}) + V} \qquad P_{\text{Add-}k}(w_i \mid w_{i-1}) = \frac{c(w_{i-1}w_i) + k}{c(w_{i-1}) + kV} \]用平滑后的概率乘上原来的上下文次数,就能得到一个便于比较的“调整后计数”,看出平滑对原统计结果影响有多大。
\[ c^*(w_{i-1}w_i) = \frac{[c(w_{i-1}w_i)+1]\, c(w_{i-1})}{c(w_{i-1}) + V} \]三个权重分别控制一元、二元和三元模型的影响。权重都要非负,并且加起来等于 1;具体数值用留出数据选择。
\[ \hat P(w_n \mid w_{n-2}w_{n-1}) = \lambda_1 P(w_n) + \lambda_2 P(w_n \mid w_{n-1}) + \lambda_3 P(w_n \mid w_{n-2}w_{n-1}), \quad \textstyle\sum_i \lambda_i = 1 \]先把特征加权相加,再加上偏置,得到一个分数。Sigmoid 将它转成 0 到 1 之间的概率,另一类拿到剩下的概率。
\[ \sigma(z) = \frac{1}{1+e^{-z}}, \qquad P(y=1 \mid x) = \sigma(w \cdot x + b), \qquad P(y=0 \mid x) = \sigma(-(w \cdot x + b)) \]正确标签 y 只能是 0 或 1,代入后只剩正确类别对应的那一项。模型给正确答案的概率越低,损失就越大。
\[ L_{CE}(\hat y, y) = -\big[ y \log \hat y + (1-y) \log (1-\hat y) \big] \]一个样本中,权重的梯度等于“预测概率减去正确标签”,再乘上对应特征;偏置的梯度则不需要乘特征。
\[ \frac{\partial L_{CE}}{\partial w_j} = \big[\sigma(w \cdot x + b) - y\big]\, x_j, \qquad \frac{\partial L_{CE}}{\partial b} = \sigma(w \cdot x + b) - y \]从当前参数 θ 中减去梯度乘以学习率 η,就是一次更新。步长需要选得合适,并不是越大越好。
\[ \theta \leftarrow \theta - \eta \nabla_\theta L \]λ 控制约束强度。L2 的额外更新与权重大小成正比;L1 在非零点使用符号函数,在零点则用次梯度。这组写法没有对偏置加惩罚。
\[ L + \lambda \|w\|_2^2 \ \Rightarrow\ w \leftarrow w - \eta \nabla L - 2\eta\lambda w \qquad\qquad L + \lambda \|w\|_1 \ \Rightarrow\ w_j \leftarrow w_j - \eta \tfrac{\partial L}{\partial w_j} - \eta\lambda\,\mathrm{sign}(w_j) \]每个类别 c 都有自己的权重和偏置。分数取指数后,再除以 K 个类别的指数总和,得到的概率就会加起来等于 1。
\[ \hat y_c = \frac{\exp(w_c^\top x+b_c)}{\sum_{j=1}^K \exp(w_j^\top x+b_j)} \]标签采用独热表示,只有正确类别 c* 的位置为 1。因此求和后,只剩正确类别概率的负对数。
\[ L = -\sum_{c=1}^K y_c\log\hat y_c = -\log\hat y_{c^*} \quad (y_{c^*}=1) \]用两个向量的点积,除以它们各自长度的乘积,就能消除整体长度的影响,比较方向。两个向量都不能为零。
\[ \cos(u,v) = \frac{u^\top v}{\|u\|_2\|v\|_2}, \qquad u\ne 0,\ v\ne 0 \]先计算从 a 到 b 的变化,再把这个变化加到 c 上,看看结果附近有哪些词。这是一种近似规律,并不适用于所有词语关系。
\[ v_d \approx v_b-v_a+v_c \]出现过的词先对次数取以 10 为底的对数,再加 1;没出现过的词取零。这里采用第 6 讲 PDF 第 54 页给出的词频写法。
\[ \mathrm{tf}_{t,d}=\begin{cases}1+\log_{10} c(t,d)&c(t,d)>0\\0&c(t,d)=0\end{cases} \]N 是文档总数,df 是包含这个词的文档数。如果每篇文档都有这个词,它的 IDF 就是零。再把 IDF 与词频权重相乘,得到最终权重。
\[ \mathrm{idf}_t=\log_{10}\frac{N}{\mathrm{df}_t},\qquad \mathrm{tfidf}_{t,d}=\mathrm{tf}_{t,d}\,\mathrm{idf}_t \]把实际一起出现的概率,与两个词各自概率的乘积比较。以 2 为底取对数时,单位是比特;PPMI 保留正值,把负值改为零。
\[ \operatorname{PMI}(w,c)=\log_2\frac{P(w,c)}{P(w)P(c)},\qquad \operatorname{PPMI}(w,c)=\max(0,\operatorname{PMI}(w,c)) \]T 是所有目标词与上下文词的配对总数,不一定等于语料中的词数。行总和、列总和都必须来自同一张表。边缘计数为正时,零共现对应的 PPMI 按零处理。
\[ \operatorname{PMI}(w,c)=\log_2\frac{f_{wc}\,T}{(\sum_j f_{wj})(\sum_i f_{ic})},\qquad T=\sum_{i,j}f_{ij} \]点积衡量目标词向量 w 和上下文向量 c 有多相似,sigmoid 把这个分数变成概率。两个向量都是学出来的。"不是邻居"的概率是剩下的部分。
\[ P(+\mid w,c)=\sigma(\mathbf{c}\cdot\mathbf{w})=\frac{1}{1+\exp(-\mathbf{c}\cdot\mathbf{w})},\qquad P(-\mid w,c)=\sigma(-\mathbf{c}\cdot\mathbf{w}) \]真邻居的点积高、每个抽出来的词点积低时,损失就小。它是 k+1 个是非判断的交叉熵,这些判断被当作相互独立。
\[ L_{CE}=-\Big[\log\sigma(\mathbf{c}_{pos}\cdot\mathbf{w})+\sum_{i=1}^{k}\log\sigma(-\mathbf{c}_{neg_i}\cdot\mathbf{w})\Big] \]每个梯度都是(预测概率 − 标签)乘以词对里的另一个向量。正样本的上下文向量朝 w 靠近,每个负样本的上下文向量远离 w,w 则根据所有这些词对一起调整。η 是学习率。
\[ \mathbf{c}_{pos}\leftarrow\mathbf{c}_{pos}-\eta\big[\sigma(\mathbf{c}_{pos}\cdot\mathbf{w})-1\big]\mathbf{w},\qquad \mathbf{c}_{neg}\leftarrow\mathbf{c}_{neg}-\eta\big[\sigma(\mathbf{c}_{neg}\cdot\mathbf{w})\big]\mathbf{w} \] \[ \mathbf{w}\leftarrow\mathbf{w}-\eta\Big[\big[\sigma(\mathbf{c}_{pos}\cdot\mathbf{w})-1\big]\mathbf{c}_{pos}+\sum_{i=1}^{k}\big[\sigma(\mathbf{c}_{neg_i}\cdot\mathbf{w})\big]\mathbf{c}_{neg_i}\Big] \]M 存放共现次数。一个矩阵里每个目标词一个向量,另一个矩阵里每个上下文词一个向量,要求它们的点积只用 d 个维度就能逼近 log M。
\[ V^{\top}U\approx\log M \]对文本里所有词向量的每一个坐标,应用同一条规则,例如取平均或取最大值。词序会丢失。
\[ \mathbf{v}=\operatorname{pool}(\mathbf{v}_1,\dots,\mathbf{v}_n) \]它们都把加权和 z 映射成输出。Sigmoid 输出在 (0, 1),tanh 输出在 (−1, 1),ReLU 保留正数、把负数变成零。ReLU 最常用。
\[ \sigma(z)=\frac{1}{1+e^{-z}},\qquad \tanh(z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}},\qquad \operatorname{ReLU}(z)=\max(0,z) \]隐藏层对输入加权求和后,用激活函数 g 处理。输出层就是作用在隐藏向量上的多分类逻辑回归。公式按 Jurafsky & Martin 第 7 章写出,课件只给了示意图。
\[ \mathbf{h}=g(W\mathbf{x}+\mathbf{b}),\qquad \hat{\mathbf{y}}=\operatorname{softmax}(U\mathbf{h}) \]第 6 讲课件的 TF 例表与前一页公式采用了不同写法,PMI 例题还有一处分母笔误。对应笔记保留了说明,并使用一致的计数重新计算。
把术语说清楚
按英文名称排列,方便对照课件;中文说明会先解释意思。
作用在一个单元加权和上的非线性函数。Sigmoid、tanh 和 ReLU 是标准选择。没有它,多层叠加会塌缩成一个线性模型。
把每种可能结果的次数都增加一点,再换算成概率,就能给没出现过的搭配留出机会。增加 1 叫加一平滑,增加 k 叫加 k 平滑。加一通常对语言模型改动过大,但这类方法在朴素贝叶斯等模型中很常用。
带偏见的词向量造成伤害的两种方式。分配性伤害指资源或机会分配不公,例如"程序员对应男性"这种关联扭曲了招聘搜索。表征性伤害指表示本身就带有贬损性的关联,不管有没有用它做任何决定。
把一对词之间的关系用到另一对词上。假设 a 和 b 的关系,类似于 c 和 d 的关系,就在 b − a + c 附近寻找 d 的词向量。这个方法只对部分关系有效。
在各项特征加权相加后,再额外加上的一个数。即使输入特征都是零,它也能影响预测,相当于给分类边界一个可以整体移动的余地。
要算一串词一起出现的概率,可以从左往右计算:先算第一个词的概率,再依次乘上“已经看到前面这些词时,下一个词出现的概率”。
封闭词表假设测试时的词都已经在词表里。开放词表允许遇到新词,因此必须安排处理办法,例如用一个“未知词”标记统一表示。
已知输入和正确答案后,选择一组参数,让模型给这些正确答案尽量高的概率。把这个目标改写成负对数,就得到分类中使用的交叉熵损失。
一个词除了字面意思,也可能让人感到愉快、紧张或有掌控感。VAD 用三个维度描述这种色彩:愉悦度、情绪强度和掌控感。
凸损失函数有一个有用的性质:如果找到了局部最小点,它也是全局最小点。但最小点不一定只有一个,梯度下降能否收敛仍取决于步长等条件。逻辑回归的损失是凸的,神经网络的损失通常不是。
先考虑两个向量各自的长度,再比较它们指向的方向。结果在 −1 到 1 之间,越大说明方向越接近。如果其中一个是零向量,就不能直接计算余弦相似度。第 7 讲补充了它比直接用点积好的原因:不然高频词的长向量总会占上风。
对于只有一个正确类别的例子,取“模型给正确类别的概率”的负对数。正确答案的概率越高,损失越小;如果模型很自信地猜错了,损失就会很大。
如果两个词经常出现在相似的语境里,它们的含义往往也有联系。因此,我们可以通过观察一个词怎样被使用,来了解它的意思。
外在评估把模型放进语音识别等实际任务,看看最终效果有没有提高;内在评估直接给模型打分,例如计算困惑度。前者更接近我们真正想解决的问题,后者通常更方便。
把单元排成层,信息从输入经过一个或多个隐藏层流到输出。每个隐藏单元是加权求和再接激活函数。输出层就是作用在隐藏向量上的多分类逻辑回归。
特征是输入中可以测量的线索,例如一条评论里有多少个积极词。权重决定这条线索对分类分数影响多大,以及它支持还是反对这个类别。
有些句子的开头会让人先理解错,读到后面才需要重新解释。例如 “The old man the boat” 中,man 是动词。这说明只看附近几个词,可能会错过整句话的结构。
Global Vectors 的缩写,一种静态词向量模型。它从整张词—词共现矩阵出发,用固定的少量维度拟合目标词向量和上下文向量,使它们的点积逼近矩阵的对数。它建立在 PPMI 的直觉和矩阵分解之上。
从数据中留出一部分,不用来训练权重,而用来选择平滑强度、正则化强度等设置。最后还要用另一份测试数据评估效果,避免一边调模型一边用测试答案。
有些设置不是模型通过训练权重自动学出来的,例如学习率、一批用多少样本、平滑或正则化的强度。这些设置叫超参数,通常用验证数据比较不同选择。
把看不同长度上下文的模型结合起来,例如混合一元、二元和三元模型的预测。每个权重都不能为负,而且加起来要等于 1,结果才仍然是概率分布。权重也可以随语境改变。
除了预测误差,再对较大的权重收取额外“代价”。L2 使用权重的平方,通常把权重往小的方向拉;L1 使用绝对值,可以让部分权重变成零,相当于只留下部分特征。
语言模型会为一串词分配概率,或者根据已经看到的文字,预测下一个词可能是什么,以及各个候选词有多大概率出现。
词元是多个词形共有的词典形式,例如 break 和 broke 对应同一个词元。义项是一个具体含义;多义性则是同一个词有多个通常相互关联的含义。
在各种参数取值中,选择最能让已观测数据出现的那一组。对于简单的词频模型,做法就是用某种结果出现的次数,除以相应的总次数。
当答案有多个互斥类别时,为每个类别分别打分,再用 softmax 把这些分数变成总和为 1 的概率。这就是从二分类推广到多分类的逻辑回归。
对每个真实的(目标词,上下文词)对,随机抽 k 个词充当"不是邻居"的样本。抽样概率按一元词频的幂次加权,常用指数 0.75,这让罕见词被抽中的机会略微增加。
n-gram 指连续出现的 n 个文本单元。用它建立语言模型时,前 n−1 个单元用于预测下一个:一元模型不看前文,二元模型看前一个,三元模型看前两个。
一组数字中只有一个位置是 1,其余都是 0。它可以标记一个类别或词表中的一个词。不过,不同词的 1 位于不同位置,这种表示本身看不出词义是否相近。
词表外的词,就是没有收入模型词表的词。一种处理办法是把训练中的稀有词、测试中的陌生词,都替换为 <UNK>,让模型提前学会怎样处理“未知词”。
模型把训练中的例子贴得太紧,连偶然的规律或噪声也记住了,结果换一批新例子就表现变差。问题在于学到的规律没能很好地推广。
困惑度根据模型给测试文本的概率计算,并把文本长度的影响平均掉。在相同的评估条件下,越低越好。如果每次都有若干个等概率选项,它就等于选项的数量。
先看两个词实际一起出现了多少,再和“它们互不相关时,预计会一起出现多少”作比较。PMI 是这两个概率之比的对数;PPMI 把负值改为零。次数太少时,估计可能不可靠。
两种激活函数。ReLU 即 max(0, z),正数原样通过,负数变成零,是最常用的选择。tanh 是以零为中心的 S 形曲线,输出在 −1 到 1 之间。
课上展开的那种 word2vec。一个逻辑回归分类器用两个向量点积的 sigmoid,判断一个上下文词是否属于目标词附近。真邻居是正样本,随机抽出的词是负样本。
把多个类别的分数一起转换成概率:每个分数先取指数,再除以所有指数值的总和。有限分数得到的概率都大于零,而且加起来等于 1。
稀疏向量里有很多零,通常是因为大量可能的语境没有出现过。稠密词向量一般更短,大多数位置不是零,把词的信息集中在较少的数字里。第 7 讲给出了典型长度:稀疏向量两万到五万,稠密向量 50 到 1000。
静态词向量让同一个词无论出现在哪里,都使用同一组数字。上下文词向量会随句子改变,因此同一个词在不同语境中可以有不同的表示。
每看完一个样本,或一小批样本,就调整一次参数,不必等全部训练样本算完。训练时通常会打乱样本顺序,让更新不总沿着同一种排列进行。
在输入和设置相同的情况下,确定性系统会给出相同结果;随机系统会使用随机性,结果可能不同。语言模型按概率采样时具有随机性,但固定的解码方式也可以得到确定的输出。
同义词在某些语境中表示相同意思;相似的词共享一些重要属性,例如咖啡和茶;相关的词在同一个场景中有联系,例如咖啡和杯子,但它们不是同一种东西。
word2vec 给每个词保存两个向量:作为目标词时用一个,作为上下文词时用另一个,分别放在矩阵 W 和 C 里。常见的最终表示是把两者相加。
把词放在行上,把文档放在列上,表格中的每个数表示这个词在这篇文档里出现了多少次。横着看是一个词在不同文档中的分布,竖着看是一篇文档的词频。
一个词如果在某篇文档里经常出现,却不是到处都出现,就更能代表这篇文档。TF 衡量它在当前文档中的频率,IDF 则降低那些几乎每篇文档都有的词的权重。
分词负责把文本切成单元;词干提取按规则缩短词形,例如 Porter 算法;词形还原则找到对应的词典形式。它们都在整理输入,但解决的是不同问题。
词型看“有几种不同的词”,词次看“总共出现了多少次”。统一小写并忽略标点后,“the cat chased the cat” 有 3 种词,出现了 5 次。
用一组数字表示一个词。通过词的使用语境得到这些数字后,模型就能利用相似词之间的联系,而不只是把每个词当成互不相干的名字。
目标词两侧各有多少个词算作上下文。小窗口(约 ±2)找到用法相似的词,大窗口(约 ±5)找到主题相关的词。它对稀疏向量和稠密向量都有影响。
得到稠密词向量的三条路线。Word2vec 对词对训练一个分类器并保留它的权重,包括 skip-gram 和 CBOW 两种变体;GloVe 对共现矩阵的对数做矩阵分解;SVD 直接对矩阵降维,LSA 将它用于文本。第 6 讲点了三者的名,第 7 讲展开了前两种。
WordNet 把表达同一个概念的词义放进同义词集,还记录“某物是一种什么”和“某物是另一物的一部分”等关系。
未做平滑的计数模型,可能给训练中没有出现过的搭配分配零概率。如果测试文本里出现了它,整段文本的概率就会成为零,对数概率不再有限,困惑度则变为无穷大。