ShowMeAI为斯坦福CS224n《自然语言处理与深度学习(Natural Language Processing with Deep Learning)》课程的全部课件,做了中文翻译和注释,并制作成了GIF动图!
本讲内容的深度总结教程可以在这里 查看。视频和课件等资料的获取方式见文末。
(本篇内容也可以参考ShowMeAI的对吴恩达老师课程的总结文章深度学习教程 | 序列模型与RNN网络)
语言建模的任务是预测下一个单词是什么
更正式的说法是:给定一个单词序列 x ( 1 ) , x ( 2 ) , … , x ( t ) \boldsymbol{x}^{(1)}, \boldsymbol{x}^{(2)}, \ldots, \boldsymbol{x}^{(t)} x(1),x(2),…,x(t),计算下一个单词 x ( t + 1 ) x^{(t+1)} x(t+1) 的概率分布:
P ( x ( t + 1 ) ∣ x ( t ) , … , x ( 1 ) ) P\left(\boldsymbol{x}^{(t+1)} \mid \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(1)}\right) P(x(t+1)∣x(t),…,x(1))
还可以将语言模型看作评估一段文本是自然句子(通顺度)的概率
例如,如果我们有一段文本 x ( 1 ) , … , x ( T ) x^{(1)},\dots,x^{(T)} x(1),…,x(T),则这段文本的概率(根据语言模型)为
P ( x ( 1 ) , … , x ( T ) ) = P ( x ( 1 ) ) × P ( x ( 2 ) ∣ x ( 1 ) ) × ⋯ × P ( x ( T ) ∣ x ( T − 1 ) , … , x ( 1 ) ) = ∏ t = 1 T P ( x ( t ) ∣ x ( t − 1 ) , … , x ( 1 ) ) \begin{aligned} P\left(\boldsymbol{x}^{(1)}, \ldots, \boldsymbol{x}^{(T)}\right) &=P\left(\boldsymbol{x}^{(1)}\right) \times P\left(\boldsymbol{x}^{(2)} \mid \boldsymbol{x}^{(1)}\right) \times \cdots \times P\left(\boldsymbol{x}^{(T)} \mid \boldsymbol{x}^{(T-1)}, \ldots, \boldsymbol{x}^{(1)}\right) \\ &=\prod_{t=1}^{T} P\left(\boldsymbol{x}^{(t)} \mid \boldsymbol{x}^{(t-1)}, \ldots, \boldsymbol{x}^{(1)}\right) \end{aligned} P(x(1),…,x(T))=P(x(1))×P(x(2)∣x(1))×⋯×P(x(T)∣x(T−1),…,x(1))=t=1∏TP(x(t)∣x(t−1),…,x(1))
the students opened their __
问题:如何学习一个语言模型?
回答(深度学习之前的时期):学习一个 n-gram 语言模型
定义:n-gram是一个由 n n n 个连续单词组成的块
the
, students
, opened
, their
the students
, students opened
, opened their
the students opened
, students opened their
the students opened their
想法:收集关于不同 n-gram 出现频率的统计数据,并使用这些数据预测下一个单词
P ( x ( t + 1 ) ∣ x ( t ) , … , x ( 1 ) ) = P ( x ( t + 1 ) ∣ x ( t ) , … , x ( t − n + 2 ) ) = P ( x ( t + 1 ) , x ( t ) , … , x ( t − n + 2 ) ) P ( x ( t ) , … , x ( t − n + 2 ) ) \begin{aligned} P\left(\boldsymbol{x}^{(t+1)} \mid \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(1)}\right) & =P\left(\boldsymbol{x}^{(t+1)} \mid \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)}\right)\\ &=\frac{P\left(\boldsymbol{x}^{(t+1)}, \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)}\right)}{P\left(\boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)}\right)} \end{aligned} P(x(t+1)∣x(t),…,x(1))=P(x(t+1)∣x(t),…,x(t−n+2))=P(x(t),…,x(t−n+2))P(x(t+1),x(t),…,x(t−n+2))
≈ count ( x ( t + 1 ) , x ( t ) , … , x ( t − n + 2 ) ) count ( x ( t ) , … , x ( t − n + 2 ) ) \approx \frac{\operatorname{count}\left(\boldsymbol{x}^{(t+1)}, \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)}\right)}{\operatorname{count}\left(\boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)}\right)} ≈count(x(t),…,x(t−n+2))count(x(t+1),x(t),…,x(t−n+2))
假设我们正在学习一个 4-gram 的语言模型
students opened their
出现了 1000 1000 1000次students opened their books
出现了 400 400 400次P ( books ∣ students opened their ) = 0.4 P(\text{books} \mid \text{students opened their})=0.4 P(books∣students opened their)=0.4
students opened their exams
出现了 100 100 100次P ( exams ∣ students opened their ) = 0.1 P( \text{exams} \mid \text{students opened their})=0.1 P(exams∣students opened their)=0.1
proctor
吗?
proctor
,所以 exams
在这里的上下文中应该是比 books
概率更大的。问题1:如果students open their ww
从未出现在数据中,那么概率值为 0 0 0
(Partial)解决方案:为每个 w ∈ V w \in V w∈V 添加极小数 δ \delta δ ,这叫做平滑。这使得词表中的每个单词都至少有很小的概率。
问题2:如果students open their
从未出现在数据中,那么我们将无法计算任何单词 w w w 的概率值
(Partial)解决方案:将条件改为open their
,也叫做后退处理。
Note/注意: n n n 的增加使稀疏性问题变得更糟。一般情况下 n n n 不能大于 5 5 5。
问题:需要存储你在语料库中看到的所有 n-grams 的计数
增加 n n n 或增加语料库都会增加模型大小
Try for yourself: https://nlpforhackers.io/language-models/
稀疏性问题:
today the company
和today he bank
都是4/26,都只出现过四次可以使用语言模型来生成文本
使用trigram运行以上生成过程时,会得到上图左侧的文本
令人惊讶的是其具有语法但是是不连贯的。如果我们想要很好地模拟语言,我们需要同时考虑三个以上的单词。但增加 n n n 使模型的稀疏性问题恶化,模型尺寸增大
回忆一下语言模型任务
window-based neural model 在第三讲中被用于NER问题
超越 n-gram 语言模型的改进
NNLM存在的问题
我们需要一个神经结构,可以处理任何长度的输入
RNN的优点
RNN的缺点
获取一个较大的文本语料库,该语料库是一个单词序列
输入RNN-LM;计算每个步骤 t t t 的输出分布
步骤 t t t 上的损失函数为预测概率分布 y ^ ( t ) \hat{\boldsymbol{y}}^{(t)} y^(t) 与真实下一个单词 y ( t ) {\boldsymbol{y}}^{(t)} y(t) ( x ( t + 1 ) x^{(t+1)} x(t+1)的独热向量)之间的交叉熵
J ( t ) ( θ ) = C E ( y ( t ) , y ^ ( t ) ) = − ∑ w ∈ V y w ( t ) log y ^ w ( t ) = − log y ^ x t + 1 ( t ) J^{(t)}(\theta)=C E\left(\boldsymbol{y}^{(t)}, \hat{\boldsymbol{y}}^{(t)}\right)=-\sum_{w \in V} \boldsymbol{y}_{w}^{(t)} \log \hat{\boldsymbol{y}}_{w}^{(t)}=-\log \hat{\boldsymbol{y}}_{\boldsymbol{x}_{t+1}}^{(t)} J(t)(θ)=CE(y(t),y^(t))=−w∈V∑yw(t)logy^w(t)=−logy^xt+1(t)
J ( θ ) = 1 T ∑ t = 1 T J ( t ) ( θ ) = 1 T ∑ t = 1 T − log y ^ x t + 1 ( t ) J(\theta)=\frac{1}{T} \sum_{t=1}^{T} J^{(t)}(\theta)=\frac{1}{T} \sum_{t=1}^{T}-\log \hat{\boldsymbol{y}}_{\boldsymbol{x}_{t+1}}^{(t)} J(θ)=T1t=1∑TJ(t)(θ)=T1t=1∑T−logy^xt+1(t)
J ( 1 ) ( θ ) + J ( 2 ) ( θ ) + J ( 3 ) ( θ ) + J ( 4 ) ( θ ) + ⋯ = J ( θ ) = 1 T ∑ t = 1 T J ( t ) ( θ ) J^{(1)}(\theta)+J^{(2)}(\theta)+J^{(3)}(\theta)+J^{(4)}(\theta)+\cdots=J(\theta)=\frac{1}{T} \sum_{t=1}^{T} J^{(t)}(\theta) J(1)(θ)+J(2)(θ)+J(3)(θ)+J(4)(θ)+⋯=J(θ)=T1t=1∑TJ(t)(θ)
J ( θ ) = 1 T ∑ t = 1 T J ( t ) ( θ ) J(\theta)=\frac{1}{T} \sum_{t=1}^{T} J^{(t)}(\theta) J(θ)=T1t=1∑TJ(t)(θ)
∂ J ( t ) ∂ W h = ∑ i = 1 t ∂ J ( t ) ∂ W h ∣ ( i ) \frac{\partial J^{(t)}}{\partial \boldsymbol{W}_{\boldsymbol{h}}}=\sum_{i=1}^{t}\left.\frac{\partial J^{(t)}}{\partial \boldsymbol{W}_{\boldsymbol{h}}}\right|_{(i)} ∂Wh∂J(t)=i=1∑t∂Wh∂J(t)∣∣∣∣(i)
Source: https://www.khanacademy.org/math/multivariable-calculus/multivariable-derivatives/differentiating-vector-valued-functions/a/multivariable-chain-rule-simple-version
d d t f ( x ( t ) , y ( t ) ) = ∂ f ∂ x d x d t + ∂ f ∂ y d y d t \frac{d}{d t} f(x(t), y(t))=\frac{\partial f}{\partial x} \frac{d x}{d t}+\frac{\partial f}{\partial y} \frac{d y}{d t} dtdf(x(t),y(t))=∂x∂fdtdx+∂y∂fdtdy
d d t f ( x ( t ) , y ( t ) ) = ∂ f ∂ x d x d t + ∂ f ∂ y d y d t \frac{d}{d t} f(x(t), y(t))=\frac{\partial f}{\partial x} \frac{d x}{d t}+\frac{\partial f}{\partial y} \frac{d y}{d t} dtdf(x(t),y(t))=∂x∂fdtdx+∂y∂fdtdy
Source: https://medium.com/@samim/obama-rnn-machine-generated-political-speeches-c8abd18a2ea0
Source: https://medium.com/deep-writing/harry-potter-written-by-artificial-intelligence-8a9431803da6
Source: https://gist.github.com/nylki/1efbaa36635956d35bcc
Source: http://aiweirdness.com/post/160776374467/new-paint-colors-invented-by-neural-network
补充讲解
相比n-gram更流畅,语法正确,但总体上仍然很不连贯
食谱的例子中,生成的文本并没有记住文本的主题是什么
哈利波特的例子中,甚至有体现出了人物的特点,并且引号的开闭也没有出现问题
RNN是否可以和手工规则结合?
= ∏ t = 1 T ( 1 y ^ x t + 1 ( t ) ) 1 / T = exp ( 1 T ∑ t = 1 T − log y ^ x t + 1 ( t ) ) = exp ( J ( θ ) ) =\prod_{t=1}^{T}\left(\frac{1}{\hat{y}_{x_{t+1}}^{(t)}}\right)^{1 / T}=\exp \left(\frac{1}{T} \sum_{t=1}^{T}-\log \hat{\boldsymbol{y}}_{\boldsymbol{x}_{t+1}}^{(t)}\right)=\exp (J(\theta)) =t=1∏T(y^xt+1(t)1)1/T=exp(T1t=1∑T−logy^xt+1(t))=exp(J(θ))
Source: https://research.fb.com/building-an-efficient-neural-language-model-over-a-billion-words/
语言模型是一项基准测试任务,它帮助我们衡量我们在理解语言方面的 进展
语言建模是许多NLP任务的子组件,尤其是那些涉及生成文本或估计文本概率的任务
可以点击 B站 查看视频的【双语字幕】版本
【双语字幕+资料下载】斯坦福CS224n | 深度学习与自然语言处理(2019·全20讲)