- 作者:韩信子 @ShowMeAI,路遥 @ShowMeAI,奇异果 @ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/36
- 本文地址:http://www.showmeai.tech/article-detail/240
- 申明:版权所有,转载请分割平台与作者并注明出处
- 珍藏 ShowMeAI 查看更多精彩内容
ShowMeAI 为 斯坦福 CS224n《自然语言解决与深度学习 (Natural Language Processing with Deep Learning)》课程的全副课件,做了 中文翻译和正文,并制作成了 GIF 动图!
本讲内容的 深度总结教程 能够在 这里 查看。视频和课件等材料的获取形式见 文末。
引言
(本篇内容也能够参考 ShowMeAI 的对吴恩达老师课程的总结文章深度学习教程 | 序列模型与 RNN 网络)
概述
-
介绍一个新的 NLP 工作
- Language Modeling 语言模型
-
介绍一个新的神经网络家族
- Recurrent Neural Networks (RNNs)
1. 语言模型
1.1 语言模型
语言建模 的工作是预测下一个单词是什么
更正式的说法是:给定一个单词序列 \(\boldsymbol{x}^{(1)}, \boldsymbol{x}^{(2)}, \ldots, \boldsymbol{x}^{(t)}\),计算下一个单词 \(x^{(t+1)}\) 的概率分布:
$$
P\left(\boldsymbol{x}^{(t+1)} \mid \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(1)}\right)
$$
- 其中,\(x^{(t+1)}\) 能够是词表中的任意单词 \(V=\left{\boldsymbol{w}_{1}, \ldots, \boldsymbol{w}_{|V|}\right}\)
- 这样做的零碎称为 Language Model 语言模型
1.2 语言模型
- 还能够将语言模型看作 评估一段文本是天然句子(通顺度)的概率
- 例如,如果咱们有一段文本 \(x^{(1)},\dots,x^{(T)}\),则这段文本的概率 (依据语言模型) 为
$$
\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}
$$
- 语言模型提供的是 \(\prod_{t=1}^{T} P\left(\boldsymbol{x}^{(t)} \mid \boldsymbol{x}^{(t-1)}, \ldots, \boldsymbol{x}^{(1)}\right)\)
1.3 随处可见的语言模型
1.4 随处可见的语言模型
1.5 n-gram 语言模型
the students opened their __
- 问题:如何学习一个语言模型?
- 答复(深度学习之前的期间):学习一个 n-gram 语言模型
-
定义:n-gram 是一个由 \(n\) 个间断单词组成的块
- unigrams:
the
,students
,opened
,their
- bigrams:
the students
,students opened
,opened their
- trigrams:
the students opened
,students opened their
- 4-grams:
the students opened their
- unigrams:
- 想法:收集对于不同 n-gram 呈现频率的统计数据,并应用这些数据预测下一个单词
1.6 n-gram 语言模型
- 首先,咱们做一个简化假如:\(x^{(t+1)}\) 只依赖于后面的 \(n-1\) 个单词
$$
\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}
$$
- 问题:如何失去 n -gram 和(n-1)-gram 的概率?
- 答复:通过在一些大型文本语料库中计算它们(统计近似)
$$
\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)}
$$
1.7 n-gram 语言模型:示例
假如咱们正在学习一个 4-gram 的语言模型
-
例如,假如在语料库中:
students opened their
呈现了 \(1000\)次students opened their books
呈现了 \(400\)次
$$
P(\text{books} \mid \text{students opened their})=0.4
$$
students opened their exams
呈现了 \(100\)次
$$
P(\text{exams} \mid \text{students opened their})=0.1
$$
-
咱们应该漠视上下文中的
proctor
吗?- 在本例中,上下文里呈现了
proctor
,所以exams
在这里的上下文中应该是比books
概率更大的。
- 在本例中,上下文里呈现了
1.8 n-gram 语言模型的稠密性问题
- 问题 1 :如果
students open their ww
从未呈现在数据中,那么概率值为 \(0\) - (Partial)解决方案:为每个 \(w \in V\) 增加极小数 \(\delta\),这叫做平滑。这使得词表中的每个单词都至多有很小的概率。
- 问题 2 :如果
students open their
从未呈现在数据中,那么咱们将无奈计算任何单词 \(w\) 的概率值 - (Partial)解决方案:将条件改为
open their
,也叫做后退解决。
- Note/ 留神: \(n\) 的减少使稠密性问题变得更糟。个别状况下 \(n\) 不能大于 \(5\)。
1.9 n-gram 语言模型的存储问题
问题:须要存储你在语料库中看到的所有 n-grams 的计数
减少 \(n\) 或减少语料库都会减少模型大小
1.10 n-gram 语言模型在实践中的利用
Try for yourself: https://nlpforhackers.io/lang…
-
你能够在你的笔记本电脑上,在几秒钟内建设一个超过 170 万个单词库 (Reuters) 的简略的三元组语言模型
- Reuters 是 商业和金融新闻的数据集
稠密性问题:
- 概率分布的粒度不大。
today the company
和today he bank
都是 4 /26,都只呈现过四次
1.11 n-gram 语言模型的生成文本
- 能够应用语言模型来生成文本
- 应用 trigram 运行以上生成过程时,会失去上图左侧的文本
- 令人诧异的是其具备语法然而是不连贯的。如果咱们想要很好地模仿语言,咱们须要同时思考三个以上的单词。但减少 \(n\) 使模型的稠密性问题好转,模型尺寸增大
1.12 如何搭建一个神经语言模型?
-
回顾一下语言模型工作
- 输出:单词序列 \(\boldsymbol{x}^{(1)}, \boldsymbol{x}^{(2)}, \ldots, \boldsymbol{x}^{(t)}\)
- 输入 :下一个单词的概 \(P\left(\boldsymbol{x}^{(t+1)} \mid \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(1)}\right)\) 率散布
- window-based neural model 在第三讲中被用于 NER 问题
1.13 固定窗口的神经语言模型
- 应用和 NER 问题中同样网络结构
1.14 固定窗口的神经语言模型
1.15 固定窗口的神经语言模型
超过 n-gram 语言模型的 改良
- 没有稠密性问题
- 不须要察看到所有的 n -grams
NNLM 存在的 问题
- 固定窗口太小
- 扩充窗口就须要扩充权重矩阵 \(W\)
- 窗口再大也不够用
- \(x^{(1)}\)和 \(x^{(2)}\) 乘以齐全不同的权重。输出的解决不对称
咱们须要一个神经构造,能够解决任何长度的输出
2. 循环神经网络(RNN)
2.1 循环神经网络(RNN)
- 外围想法:重复使用雷同的权重矩阵 \(W\)
2.2 RNN 语言模型
2.3 RNN 语言模型
-
RNN 的 长处
- 能够解决 任意长度 的输出
- 步骤 \(t\) 的计算 (实践上) 能够应用 许多步骤前 的信息
- 模型大小不会 随着输出的减少而 减少
- 在每个工夫步上利用雷同的权重,因而在解决输出时具备 对称性
-
RNN 的 毛病
- 循环串行计算速度慢
- 在实践中,很难从许多步骤前返回信息
2.4 训练一个 RNN 语言模型
- 获取一个 较大的文本语料库,该语料库是一个单词序列
-
输出 RNN-LM;计算 每个步骤 \(t\) 的输入散布
- 即预测到目前为止给定的每个单词的概率分布
- 步骤 \(t\) 上的 损失函 数为预测概率分布 \(\hat{\boldsymbol{y}}^{(t)}\) 与实在下一个单词 \({\boldsymbol{y}}^{(t)}\) (\(x^{(t+1)}\)的独热向量)之间的 穿插熵
$$
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(\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)}
$$
2.5 训练一个 RNN 语言模型
$$
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)
$$
2.6 训练一个 RNN 语言模型
- 然而:计算整个语料库 \(\boldsymbol{x}^{(1)}, \ldots, \boldsymbol{x}^{(T)}\) 的损失和梯度太低廉了
$$
J(\theta)=\frac{1}{T} \sum_{t=1}^{T} J^{(t)}(\theta)
$$
- 在实践中,咱们通常将 \(\boldsymbol{x}^{(1)}, \ldots, \boldsymbol{x}^{(T)}\) 看做一个句子或是文档
- 回顾:随机梯度降落容许咱们计算小块数据的损失和梯度,并进行更新
- 计算一个句子的损失 \(J(\theta)\) (实际上是一批句子),计算梯度和更新权重。反复上述操作。
2.7 RNN 的反向流传
- 问题:对于 反复的 权重矩阵 \(W_h\) 的偏导数 \(J^{(t)}(\theta)\)
- 答复:反复权重的梯度是每次其呈现时的梯度的总和
$$
\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)}
$$
2.8 多变量链式法则
Source: https://www.khanacademy.org/m…
- 对于一个多变量函数 \(f(x,y)\) 和两个单变量函数 \(x(t)\) 和 \(y(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}
$$
2.9 RNN 的反向流传:简略证实
- 对于一个多变量函数 \(f(x,y)\) 和两个单变量函数 \(x(t)\) 和 \(y(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}
$$
2.10 RNN 的反向流传
- 问题:如何计算?
- 答复:反向流传的工夫步长 \(i=t,\dots,0\)。累加梯度。这个算法叫做“backpropagation through time”
2.11 RNN 语言模型的生成文本
- 就像 n -gram 语言模型一样,你能够应用 RNN 语言模型通过反复采样来生成文本。采样输入是下一步的输出。
2.12 RNN 语言模型的生成文本
Source: https://medium.com/@samim/oba…
Source: https://medium.com/deep-writi…
Source: https://gist.github.com/nylki…
Source: http://aiweirdness.com/post/1…
补充解说
- 相比 n -gram 更晦涩,语法正确,但总体上依然很不连贯
- 食谱 的例子中,生成的文本并没有记住文本的主题是什么
-
哈利波特 的例子中,甚至有体现出了人物的特点,并且引号的开闭也没有呈现问题
- 兴许某些神经元或者暗藏状态在跟踪模型的输入是否在引号中
-
RNN 是否能够和手工规定联合?
- 例如 Beam Serach,然而可能很难做到
3. 评估语言模型
3.1 评估语言模型
- 规范语言模型评估指标是 perplexity 困惑度
- 这等于穿插熵损失 \(J(\theta)\) 的指数
$$
=\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))
$$
- 困惑度越低成果越好
3.2 RNN 极大地改善了困惑度
Source: https://research.fb.com/build…
3.3 为什么咱们要关怀语言模型?
-
语言模型是一项 基准测试 工作,它帮忙咱们 掂量 咱们在了解语言方面的 停顿
- 生成下一个单词,须要语法,句法,逻辑,推理,事实世界的常识等
-
语言建模 是许多 NLP 工作的子组件,尤其是那些波及生成文本或预计文本概率的工作
- 预测性打字、语音辨认、手写辨认、拼写 / 语法纠正、作者辨认、机器翻译、摘要、对话等等
3.4 要点回顾
- 语言模型:预测下一个单词的零碎
-
循环神经网络:一系列神经网络
- 采纳任意长度的程序输出
- 在每一步上利用雷同的权重
- 能够抉择在每一步上生成输入
- 循环神经网络 \(\ne\) 语言模型
- 咱们曾经证实,RNNs 是构建 LM 的一个很好的办法。
- 但 RNNs 的用途要大得多!
3.5 RNN 可用于句子分类
- 如何计算句子编码
- 根底形式:应用最终隐层状态
- 通常更好的形式:应用所有隐层状态的逐元素最值或均值
- Encoder 的构造在 NLP 中十分常见
3.6 RNN 语言模型可用于生成文本
- 这是一个条件语言模型的示例。咱们应用语言模型组件,并且最要害的是,咱们依据条件来调整它
4. 视频教程
能够点击 B 站 查看视频的【双语字幕】版本
https://www.bilibili.com/vide…
5. 参考资料
- 本讲带学的 在线阅翻页本
- 《斯坦福 CS224n 深度学习与自然语言解决》课程学习指南
- 《斯坦福 CS224n 深度学习与自然语言解决》课程大作业解析
- 【双语字幕视频】斯坦福 CS224n | 深度学习与自然语言解决(2019·全 20 讲)
- Stanford 官网 | CS224n: Natural Language Processing with Deep Learning
ShowMeAI 系列教程举荐
- 大厂技术实现 | 举荐与广告计算解决方案
- 大厂技术实现 | 计算机视觉解决方案
- 大厂技术实现 | 自然语言解决行业解决方案
- 图解 Python 编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解 AI 数学根底:从入门到精通系列教程
- 图解大数据技术:从入门到精通系列教程
- 图解机器学习算法:从入门到精通系列教程
- 机器学习实战:手把手教你玩转机器学习系列
- 深度学习教程 | 吴恩达专项课程 · 全套笔记解读
- 自然语言解决教程 | 斯坦福 CS224n 课程 · 课程带学与全套笔记解读
自然语言解决 (NLP) 教程
- NLP 教程(1)- 词向量、SVD 合成与 Word2vec
- NLP 教程(2)- GloVe 及词向量的训练与评估
- NLP 教程(3)- 神经网络与反向流传
- NLP 教程(4)- 句法分析与依存解析
- NLP 教程(5)- 语言模型、RNN、GRU 与 LSTM
- NLP 教程(6)- 神经机器翻译、seq2seq 与注意力机制
- NLP 教程(7)- 问答零碎
- NLP 教程(8)- NLP 中的卷积神经网络
- NLP 教程(9)- 句法分析与树形递归神经网络
斯坦福 CS224n 课程带学详解
- 斯坦福 NLP 课程 | 第 1 讲 – NLP 介绍与词向量初步
- 斯坦福 NLP 课程 | 第 2 讲 – 词向量进阶
- 斯坦福 NLP 课程 | 第 3 讲 – 神经网络常识回顾
- 斯坦福 NLP 课程 | 第 4 讲 – 神经网络反向流传与计算图
- 斯坦福 NLP 课程 | 第 5 讲 – 句法分析与依存解析
- 斯坦福 NLP 课程 | 第 6 讲 – 循环神经网络与语言模型
- 斯坦福 NLP 课程 | 第 7 讲 – 梯度隐没问题与 RNN 变种
- 斯坦福 NLP 课程 | 第 8 讲 – 机器翻译、seq2seq 与注意力机制
- 斯坦福 NLP 课程 | 第 9 讲 – cs224n 课程大我的项目实用技巧与教训
- 斯坦福 NLP 课程 | 第 10 讲 – NLP 中的问答零碎
- 斯坦福 NLP 课程 | 第 11 讲 – NLP 中的卷积神经网络
- 斯坦福 NLP 课程 | 第 12 讲 – 子词模型
- 斯坦福 NLP 课程 | 第 13 讲 – 基于上下文的表征与 NLP 预训练模型
- 斯坦福 NLP 课程 | 第 14 讲 – Transformers 自注意力与生成模型
- 斯坦福 NLP 课程 | 第 15 讲 – NLP 文本生成工作
- 斯坦福 NLP 课程 | 第 16 讲 – 指代消解问题与神经网络办法
- 斯坦福 NLP 课程 | 第 17 讲 – 多任务学习(以问答零碎为例)
- 斯坦福 NLP 课程 | 第 18 讲 – 句法分析与树形递归神经网络
- 斯坦福 NLP 课程 | 第 19 讲 – AI 平安偏见与偏心
- 斯坦福 NLP 课程 | 第 20 讲 – NLP 与深度学习的将来