- 作者:韩信子 @ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/36
- 本文地址:http://www.showmeai.tech/article-detail/239
- 申明:版权所有,转载请分割平台与作者并注明出处
- 珍藏 ShowMeAI 查看更多精彩内容
本系列为 斯坦福 CS224n《自然语言解决与深度学习 (Natural Language Processing with Deep Learning)》的全套学习笔记,对应的课程视频能够在 这里 查看。
ShowMeAI 为 CS224n 课程的全副课件,做了 中文翻译和正文 ,并制作成了 GIF 动图!点击 第 6 讲 - 循环神经网络与语言模型 和 第 7 讲 - 梯度隐没问题与 RNN 变种 查看的课件正文与带学解读。更多材料获取形式见文末。
引言
CS224n是顶级院校斯坦福出品的深度学习与自然语言解决方向专业课程,核心内容笼罩 RNN、LSTM、CNN、transformer、bert、问答、摘要、文本生成、语言模型、浏览了解等前沿内容。
本篇笔记对应斯坦福 CS224n 自然语言解决专项课程的常识板块:语言模型、循环神经网络 RNN、变种 RNN (LSTM、GRU 等) 。首先介绍了语言模型及其利用场景,进而介绍循环神经网络 RNN 及优化后的变种 LSTM 和 GRU 模型。
笔记外围词
- 语言模型
- RNN
- 循环神经网络
- 双向 RNN
- 深度 RNN
- 长短时记忆网络
- LSTM
- GRU
1. 语言模型
(语言模型局部内容也能够参考 ShowMeAI 的对吴恩达老师课程的总结文章 深度学习教程 | 序列模型与 RNN 网络)
1.1 简介
语言模型计算特定序列中多个单词以肯定程序呈现的概率。一个 \(m\) 个单词的序列 \({w_{1}, \dots, w_{m}}\) 的概率定义为 \(P\left(w_{1}, \dots, w_{m}\right)\)。单词 \(w_i\) 前有肯定数量的单词,其个性会依据它在文档中的地位而扭转,\(P\left(w_{1}, \dots, w_{m}\right)\) 个别只思考前 \(n\) 个单词而不是思考全副之前的单词。
$$
P(w_{1}, \ldots, w_{m})=\prod_{i=1}^{i=m} P(w_{i} \mid w_{1}, \ldots, w_{i-1}) \approx \prod_{i=1}^{i=m} P(w_{m} \mid w_{i-n}, \ldots, w_{i-1})
$$
下面的公式在语音辨认和机器翻译零碎中有重要的作用,它能够辅助筛选语音辨认和机器翻译的最佳后果序列。
在现有的机器翻译零碎中,对每个短语 / 句子翻译,系统生成一些候选的词序列 (例如,\({ I have,I has,I had,me have,me had}\)),并对其评分以确定最可能的翻译序列。
在机器翻译中,对一个输出短语,通过评判每个候选输入词序列的得分的高下,来选出最好的词程序。为此,模型能够在不同的单词排序或单词抉择之间进行抉择。它将通过一个概率函数运行所有单词序列候选项,并为每个候选项调配一个分数,从而实现这一指标。最高得分的序列就是翻译后果。例如:
- 相比
small is the cat
,翻译零碎会给the cat is small
更高的得分; - 相比
walking house after school
,翻译零碎会给walking home after school
更高的得分。
1.2 n-gram 语言模型
为了计算这些概率,每个 n-gram 的计数将与每个单词的频率进行比拟,这个称为 n-gram 语言模型。
- 例如,如果抉择 bi-gram 模型 (二元语言模型),每一个 bi-gram 的频率,通过将单词与其前一个单词相结合进行计算,而后除以对应的 uni-gram 的频率。
- 上面的两个公式展现了 bi-gram 模型和 tri-gram 模型的区别。
$$
p(w_{2} \mid w_{1}) =\frac{count (w_{1}, w_{2})}{count(w_{1})}
$$
$$
p(w_{3} \mid w_{1}, w_{2}) =\frac{count (w_{1}, w_{2}, w_{3})}{count (w_{1}, w_{2})}
$$
上式 tri-gram 模型的关系次要是基于一个固定的上下文窗口 (即前 \(n\)个单词) 预测下一个单词。个别 \(n\)的取值为多大才好呢?
-
在某些状况下,后面的间断的 \(n\) 个单词的窗口可能不足以捕捉足够的上下文信息。
- 例如,思考句子 (相似完形填空,预测下一个最可能的单词)
Asthe proctor started the clock, the students opened their __
。如果窗口只是基于后面的三个单词the students opened their
,那么基于这些语料计算的下划线中最有可能呈现的单词就是为books
——然而如果 \(n\) 足够大,能包含全副的上下文,那么下划线中最有可能呈现的单词会是exam
。
这就引出了 n-gram 语言模型的两个次要问题:「稠密性 」和「 存储」。
1) n-gram 语言模型的稠密性问题
n-gram 语言模型的问题源于两个问题。
① 对应公式中的 分子,可能有稠密性问题。
- 如果 \(w_1\),\(w_2\),\(w_3\) 在语料中从未呈现过,那么 \(w_3\) 的概率就是 \(0\)。
- 为了解决这个问题,在每个单词计数前面加上一个很小的 \(\delta\),这就是平滑操作。
② 对应公式中的 分母,可能有稠密性问题。
- 如果 \(w_1\),\(w_2\) 在语料中从未呈现过,那么 \(w_3\) 的概率将会无奈计算。
- 为了解决这个问题,这里能够只是独自思考 \(w_2\),这就是
backoff
操作。
减少 \(n\) 会让稠密问题更加重大,所以个别 \(n \leq 5\)。
2) n-gram 语言模型的存储问题
咱们晓得须要存储在语料库中看到的所有 n-gram 的统计数。随着 \(n\)的减少(或语料库大小的减少),模型的大小也会减少。
1.3 基于文本滑窗的预估型语言模型 (NNLM)
Bengio 的论文《A Neural Probabilistic Language Model》中首次解决了下面所说的“维度劫难”,这篇论文提出一个自然语言解决的大规模的深度学习模型,这个模型可能通过学习单词的分布式示意,以及用这些示意来示意单词的概率函数。
下图展现了 NNLM 对应的神经网络构造,在这个模型中,输出向量在暗藏层和输入层中都被应用。
上面公式展现了由规范 tanh 函数 (即暗藏层) 组成的 softmax 函数的参数以及线性函数 \(W^{(3)} x+b^{(3)}\),捕捉所有后面 \(n\) 个输出词向量。
$$
\hat{y}=\operatorname{softmax}\left(W^{(2)} \tanh \left(W^{(1)}x+b^{(1)}\right)+W^{(3)} x+b^{(3)}\right)
$$
留神权重矩阵 \(W^{(1)}\)是利用在词向量上 (上图中的绿色实线箭头),\(W^{(2)}\)是利用在暗藏层 (也是绿色实线箭头) 和 \(W^{(3)}\)是利用在词向量 (绿色虚线箭头)。
这个模型的简化版本如下图所示:
- 蓝色的层示意输出单词的 embedding 拼接:\(e=\left[e^{(1)} ; e^{(2)} ; e^{(3)} ; e^{(4)}\right]\)
- 红色的层示意暗藏层:\(\boldsymbol{h}=f\left(\boldsymbol{W} e+\boldsymbol{b}_{1}\right)\)
- 绿色的输入散布是对词表的一个 softmax 概率分布:\(\hat{y}=\operatorname{softmax}\left(\boldsymbol{U} \boldsymbol{h}+\boldsymbol{b}_{2}\right)\)
2. 循环神经网络 (RNN)
(循环神经网络局部内容也能够参考 ShowMeAI 的对吴恩达老师课程的总结文章深度学习教程 | 序列模型与 RNN 网络)
传统的统计翻译模型,只能以无限窗口大小的前 \(n\) 个单词作为条件进行语言模型建模,循环神经网络与其不同,RNN 有能力以语料库中所有后面的单词为条件进行语言模型建模。
下图展现的 RNN 的架构,其中矩形框是在一个工夫步的一个暗藏层 \(t\)。
每个这样的暗藏层都有若干个神经元,每个神经元对输出向量用一个线性矩阵运算而后通过非线性变动 (例如 tanh 函数) 失去输入。
-
在每一个工夫步,暗藏层都有两个输出
- 前一个工夫步的暗藏层 \(h_{t-1}\)
- 以后工夫步的输出 \(x_t\)
- 前一个工夫步的暗藏层 \(h_{t-1}\) 通过和权重矩阵 \(W^{(hh)}\) 相乘和以后工夫步的输出 \(x_t\) 和权重矩阵 \(W^{(hx)}\) 相乘失去以后工夫步的暗藏层 \(h_t\)
- \(h_t\) 和权重矩阵 \(W^{(S)}\) 相乘,接着对整个词表通过 softmax 计算失去下一个单词的预测后果 \(\hat y\),如上面公式所示:
$$
h_{t} =\sigma\left(W^{(h h)} h_{t-1}+W^{(h x)} x_{[t]}\right)
$$
$$
\hat{y} =\operatorname{softmax}\left(W^{(S)} h_{t}\right)
$$
每个神经元的输出和输入如下图所示:
在这里一个有意思的中央是在每一个工夫步应用雷同的权重 \(W^{(hh)}\)和 \(W^{(hx)}\)。这样模型须要学习的参数就变少了,这与输出序列的长度无关——这从而解决了维度劫难。
以下是网络中每个参数相干的详细信息:
- \(x_{1}, \dots, x_{t-1}, x_{t}, x_{t+1}, \dots x_{T}\):含有 \(T\) 个单词的语料库对应的词向量
- \(h_{t}=\sigma\left(W^{(h h)} h_{t-1}+W^{(h x)} x_{t}\right)\):每个工夫步 \(t\) 的暗藏层的输入特色的计算关系
- \(x_{t} \in \mathbb{R}^{d}\):在工夫步 \(t\) 的输出词向量
- \(W^{h x} \in \mathbb{R}^{D_{h} \times d}\):输出词向量 \(x_t\) 对应的权重矩阵
- \(W^{h h} \in \mathbb{R}^{D_{h} \times D_{h}}\):上一个工夫步的输入 \(h_{t-1}\) 对应的权重矩阵
- \(h_{t-1} \in \mathbb{R}^{D_{h}}\):上一个工夫步 \(t-1\) 的非线性函数输入。\(h_{0} \in \mathbb{R}^{D_{h}}\) 是在工夫步 \(t=0\) 的暗藏层的一个初始化向量
- \(\sigma\):非线性函数 (这里是 sigmoid 函数)
- \(\hat{y}=\operatorname{softmax}\left(W^{(S)} h_{t}\right)\):在每个工夫步 \(t\) 全副单词的概率分布输入。实质上 \(\hat y\) 是给定文档上下文分数 (例如 \(h_{t-1}\)) 和最初观测的词向量 \(x_t\),对一个呈现单词的预测。这里 \(W^{(S)} \in \mathbb{R}^{|V| \times D_{h}}\),\(\hat{y} \in \mathbb{R}^{\left | V \right |}\),其中 \(\left | V \right |\) 是词汇表的大小。
一个 RNN 语言模型的例子如下图所示。
图中的符号有一些的不同:
- \(W_h\) 等同于 \(W^{(hh)}\)
- \(W_e\) 等同于 \(W^{(hx)}\)
- \(U\) 等同于 \(W^{(S)}\)
- \(E\) 示意单词输出 \(x^{(t)}\) 转化为 \(e^{(t)}\)
在 RNN 中罕用的损失函数是在之前介绍过的穿插熵误差。上面的公式是这个函数在工夫步 \(t\) 全副单词的求和。最初计算词表中的 softmax 计算结果展现了基于后面所有的单词对输入单词 \(x^{(5)}\) 的不同抉择的概率分布。这时的输出能够比 4 到 5 个单词更长。
2.1 RNN 损失与困惑度
RNN 的损失函数个别是穿插熵误差。
$$
J^{(t)}(\theta)=\sum_{j=1}^{\left | V \right |} y_{t, j} \times \log \left(\hat{y}_{t, j}\right)
$$
在大小为 \(T\)的语料库上的穿插熵误差的计算如下:
$$
J=-\frac{1}{T} \sum_{t=1}^{T} J^{(t)}(\theta)=-\frac{1}{T} \sum_{t=1}^{T} \sum_{j=1}^{\left | V \right |} y_{t, j} \times \log \left(\hat{y}_{t, j}\right)
$$
2.2 RNN 的优缺点及利用
RNN 有以下长处:
- 它能够解决任意长度的序列
- 对更长的输出序列不会减少模型的参数大小
- 对工夫步 \(t\) 的计算实践上能够利用后面很多工夫步的信息
- 对输出的每个工夫步都利用雷同的权重,因而在解决输出时具备对称性
然而 RNN 也有以下有余:
- 计算速度很慢——因为它每一个工夫步须要依赖上一个工夫步,所以不能并行化
- 在理论中因为梯度隐没和梯度爆炸,很难利用到后面工夫步的信息
运行一层 RNN 所需的内存量与语料库中的单词数成正比。
例如,咱们把一个句子是为一个 mini batch,那么一个有 \(k\) 个单词的句子在内存中就会占用 \(k\) 个词向量的存储空间。同时,RNN 必须维持两对 \(W\) 和 \(b\) 矩阵。然而 \(W\) 的可能是十分大的,它的大小不会随着语料库的大小而变动 (与传统的语言模型不一样)。对于具备 \(1000\)个循环层的 RNN,矩阵 \(W\)的大小为 \(1000 \times 1000\)而与语料库大小无关。
RNN 能够利用在很多工作,例如:
- 标注工作 (词性标注、命名实体辨认)
- 句子分类 (情感分类)
- 编码模块 (问答工作,机器翻译和其余很多工作)
在前面的两个工作,咱们心愿失去对句子的示意,这时能够通过采纳该句子中工夫步长的所有暗藏状态的 \(element-wise\)的最大值或平均值来取得。
下图是一些材料中对 RNN 模型的另外一种示意。它将 RNN 的每个隐层用一个环来示意。
2.3 梯度隐没与梯度爆炸问题
(梯度隐没和梯度爆炸局部内容也能够参考 ShowMeAI 的对吴恩达老师课程的总结文章深度学习教程 | 深度学习的实用层面)
RNN 从一个工夫步流传权值矩阵到下一个工夫步。回忆一下,RNN 实现的指标是通过长距离的工夫步来流传上下文信息。例如,思考以下两个句子:
场景 1
Jane walked into the room. John walked in too. Jane said hi to __
场景 2
Jane walked into the room. John walked in too. It was late in the day, and everyone was walking home after a long day at work. Jane said hi to __
对下面的两个句子,依据上下文,都能够晓得空白处的答案是John
,第二个在两个句子的上下文中均提及了好几次的人。
迄今为止咱们对 RNN 的理解,在现实状况下,RNN 也是可能计算失去正确的答案。然而,在理论中,RNN 预测句子中的空白处答案正确可能性,第一句要比第二句高。这是因为在反向流传的阶段的过程中,从后面工夫步中回传过去的梯度值会逐步隐没。因而,对于长句子,预测到 John
是空白处的答案的概率会随着上下文信息增大而缩小。
上面,咱们探讨梯度隐没问题背地的数学起因。
思考公式在工夫步 \(t\),计算 RNN 误差 \(\frac{dE}{dW}\),而后咱们把每个工夫步的误差都加起来。也就是说,计算并累积每个工夫步长 \(t\) 的 \(\frac{dE_t}{dW}\)。
$$
\frac{\partial E}{\partial W}=\sum_{i=1}^{T} \frac{\partial E_{t}}{\partial W}
$$
通过将微分链式法则利用于以下公式来计算每个工夫步长的误差
$$
\begin{aligned}
h_{t} &=\sigma\left(W^{(h h)} h_{t-1}+W^{(h x)} x_{[t]}\right) \\
\hat{y} &=\operatorname{softmax}\left(W^{(S)} h_{t}\right)
\end{aligned}
$$
下列公式展现对应的微分计算。留神 \(\frac{d h_{t}}{d h_{k}}\) 是 \(h_t\) 对之前所有的 \(k\) 个工夫步的偏导数。
$$
\frac{\partial E_{t}}{\partial W}=\sum_{k=1}^{T} \frac{\partial E_{t}}{\partial y_{t}} \frac{\partial y_{t}}{\partial h_{t}} \frac{\partial h_{t}}{\partial h_{k}} \frac{\partial h_{k}}{\partial W}
$$
下式展现了计算每个 \(\frac{d h_{t}}{d h_{k}}\) 的关系;这是在工夫距离 \([k,t]\) 内对所有的暗藏层的利用一个简略的微分链式法则。
$$
\frac{\partial h_{t}}{\partial h_{k}}=\prod_{j=k+1}^{t} \frac{\partial h_{j}}{\partial h_{j-1}}=\prod_{j=k+1}^{t} W^{T} \times \operatorname{diag}\left[f^{\prime}\left(j_{j-1}\right)\right]
$$
因为 \(h \in \mathbb{R}^{D_{n}}\),每个 \(\frac{\partial h_{j}}{\partial h_{j-1}}\) 是 \(h\) 的 Jacobian 矩阵的元素:
$$
\begin{aligned}
\frac{\partial h_{j}}{\partial h_{j-1}}&=\left[\frac{\partial h_{j}}{\partial h_{j-1,1}} \cdots \frac{\partial h_{j}}{\partial h_{j-1, D_{n}}}\right] \\
&=\begin{bmatrix}
{\frac{\partial h_{j, 1}}{\partial h_{j-1,1}}} & \cdots & {\frac{\partial h_{j,1}}{\partial h_{j-1, D_{n}}}} \\
\vdots & \ddots & \vdots \\
{\frac{\partial h_{j, D_{n}}}{\partial h_{j – 1,1}}} & \cdots & {\frac{\partial h_{j, D_{n}}}{\partial h_{j-1, D_{n}}}}
\end{bmatrix}
\end{aligned}
$$
将公式合起来,咱们有以下关系。
$$
\frac{\partial E}{\partial W}=\sum_{t=1}^{T} \sum_{k=1}^{t} \frac{\partial E_{t}}{\partial y_{t}} \frac{\partial y_{t}}{\partial h_{t}}\left(\prod_{j=k+1}^{t} \frac{\partial h_{j}}{\partial h_{j-1}}\right) \frac{\partial h_{k}}{\partial W}
$$
下式展现了 Jacobian 矩阵的范数。这里的 \(\beta_{W}\) 和 \(\beta_{h}\) 是这两个矩阵范数的上界值。因而通过公式所示的关系计算在每个工夫步 \(t\) 的局部梯度范数。
$$
\left\|\frac{\partial h_{j}}{\partial h_{j-1}}\right\| \leq \left\| W^{T} \right\| \quad \left\| \operatorname{diag} \left [f^{\prime}\left(h_{j-1}\right)\right]\right\| \leq \beta_{W} \beta_{h}
$$
计算这两个矩阵的 L2 范数。在给定的非线性函数 sigmoid 下,\(f^{\prime}\left(h_{j-1}\right)\) 的范数只能等于 1。
$$
\left\|\frac{\partial h_{t}}{\partial h_{k}}\right\|=\left\|\prod_{j=k+1}^{t} \frac{\partial h_{j}}{\partial h_{j-1}}\right\| \leq (\beta_{W} \beta_{h})^{t-k}
$$
当 \(t – k\) 足够大和 \(\beta_{W} \beta_{h}\) 远远小于 1 或者远远大于 1,指数项 \(\left(\beta_{W} \beta_{h}\right)^{t-k}\) 的值就很容易变得十分小或者十分大。
因为单词之间的间隔过大,用一个很大的 \(t-k\) 评估穿插熵误差可能会呈现问题。在反向流传的晚期就呈现梯度隐没,那么远处单词对在工夫步长 \(t\)预测下一个单词中,所起到的作用就会变得很小。
在试验的过程中:
- 一旦梯度的值变得十分大,会导致在运行过程中容易检测到其引起的溢出 (即 NaN);这样的问题称为「梯度爆炸」问题。
-
当梯度靠近为 0 的时候,梯度近乎不再存在,同时升高模型对语料库中的远距离的单词的学习品质;这样的问题称为「梯度隐没」问题。
- 如果绝对梯度隐没问题的有更直观的理解,你能够拜访这个 样例网站。
2.4 梯度隐没与爆炸解决办法
当初咱们晓得了梯度隐没问题的实质以及它在深度神经网络中如何体现进去,让咱们应用一些简略实用的启发式办法来解决这些问题。
2.4.1 梯度爆炸解决办法
为了解决梯度爆炸的问题,Thomas Mikolov 等人首先提出了一个简略的启发式解决方案,每当梯度大于一个阈值的时候,将其截断为一个很小的值,具体如上面算法中的伪代码所示。
$$
\begin{array}{l}
\hat{g} \leftarrow \frac{\partial E}{\partial W} \\
\text {if}\|\hat{g}\| \geq \text {threshold then} \\
\qquad \hat{g} \leftarrow \frac{\text { threshold}}{\|\hat{g}\|} \hat{g} \\
\text {end if}
\end{array}
$$
❐ Algorithm : Pseudo-code for norm clipping in the gradients whenever they explode【范数梯度裁剪的伪代码】
下图可视化了梯度截断的成果。它展现了一个权值矩阵为 \(W\) 和偏置项为 \(b\) 的很小的 RNN 神经网络的决策界面。该模型由一个繁多单元的循环神经网络组成,在大量的工夫步长上运行;实心箭头论述了在每个梯度降落步骤的训练过程。
当在梯度降落的过程中,模型碰到指标函数中的高误差壁时,梯度被推到决策面上的一个边远的地位。截断模型生成了虚线,在那里它将误差梯度拉回到凑近原始梯度的中央。
2.4.2 梯度隐没解决办法
为了解决梯度隐没问题,钻研人员提出两个技术:
- 第一个技术是不去随机初始化 \(W^{(hh)}\),而是初始化为单位矩阵。
- 第二个技术是应用 Rectified Linear (ReLU) 单元代替 sigmoid 函数。ReLU 的导数是 \(0\) 或者 \(1\)。这样梯度传回神经元的导数是 \(1\),而不会在反向流传了肯定的工夫步后梯度变小。
2.5 深度双向循环神经网络
后面局部咱们解说了用 RNN 如何应用过来的词来预测序列中的下一个单词。同理,能够通过令 RNN 模型向反向读取语料库,依据将来单词进行预测。
Irsoy 等人展现了一个双向深度神经网络;在每个工夫步 \(t\),这个网络维持两个暗藏层,一个是从左到右流传,而另外一个是从右到左流传。
为了在任何时候维持两个暗藏层,该网络要耗费的两倍存储空间来存储权值和偏置参数。最初的分类后果 \(\hat y\),是联合由两个 RNN 暗藏层生成的后果得分产生。
下图展现了双向 RNN 的网络结构。
而下式展现了给出了建设双向 RNN 隐层的数学公式。两个公式之间惟一的区别是递归读取语料库的方向不同。最初一行展现了通过总结过来和未来的单词示意,显示用于预测下一个单词的分类关系:
$$
\overrightarrow{h}_{t}=f(\overrightarrow{W} x_{t}+\overrightarrow{V} \overrightarrow{h}_{t-1}+\overrightarrow{b})
$$
$$
\overleftarrow{h}_{t}=f(\overleftarrow{W} x_{t}+\overleftarrow{V} \overleftarrow{h}_{t-1}+\overleftarrow{b})
$$
$$
\hat{y}_{t}=g (U h_{t}+c)=g(U \left[\overrightarrow{h}_{t} ; \overleftarrow{h}_{t}\right]+c)
$$
RNN 也能够是多层的。下图展现一个多层的双向 RNN,其中上面的暗藏层流传到下一层。
如图所示,在该网络架构中,在工夫步 \(t\),每个两头神经元从前一个工夫步 (在雷同的 RNN 层) 接管一组参数和前一个 RNN 暗藏层的两组参数;这两组参数一组是从左到右的 RNN 输出,另外一组是从右到左的 RNN 输出。
为了构建一个 L 层的深度 RNN,上述的关系要批改为在公式中的关系,其中在第 \(i\) 层的每个两头神经元的输出是在雷同工夫步 \(t\) 的 RNN 第 \(i-1\) 层的输入。最初的输入 \(\hat y\),每个工夫步都是输出参数通过所有隐层流传的后果。
$$
\overrightarrow{h}_{t}^{(i)}=f\left(\overrightarrow{W}^{(i)} h_{t}^{(i-1)}+\overrightarrow{V}^{(i)} \overrightarrow{h}_{t-1}^{(i)}+\overrightarrow{b}^{(i)}\right)
$$
$$
\overleftarrow{h}_{t}^{(i)}=f\left(\overleftarrow{W}^{(i)} h_{t}^{(i-1)}+\overleftarrow{V}^{(i)} \overleftarrow{h}_{t+1}^{(i)}+\overrightarrow{b}^{(i)}\right)
$$
$$
\hat{y}_{t}=g\left(U h_{t}+c\right)=g\left(U\left[\overrightarrow{h}_{t}^{(L)} ; \overleftarrow{h}_{t}^{(L)}\right]+c\right)
$$
2.6 利用:基于 RNN 的翻译零碎
(神经机器翻译局部内容也能够参考 ShowMeAI 的对吴恩达老师课程的总结文章深度学习教程 | Seq2Seq 序列模型和注意力机制)
传统的翻译模型是非常复杂的:它们蕴含很多利用在语言翻译流程的不同阶段的机器学习算法。这里解说采纳 RNN 作为传统翻译模型的代替办法。
思考下图中展现的 RNN 模型:其中德语短语 Echt dicke Kiste 翻译为 Awesome sauce。
首先,前三个工夫步的暗藏层编码德语单词为一些语言的单词特色 (\(h_3\))。前面两个工夫步解码 \(h_3\) 为英语单词输入。下式别离展现了编码阶段和解码阶段(后两行)。
$$
{h_{t}=\phi\left(h_{t-1}, x_{t}\right)=f\left(W^{(h h)} h_{t-1}+W^{(h x)} x_{t}\right)}
$$
$$
{h_{t}=\phi\left(h_{t-1}\right)=f\left(W^{(h h)} h_{t-1}\right)}
$$
$$
{y_{t}=\operatorname{softmax}\left(W^{(s)} h_{t}\right)}
$$
个别能够认为应用穿插熵函数的 RNN 模型能够生成高精度的翻译后果。在理论中,在模型中减少一些扩大办法能够晋升翻译的准确度体现。
$$
\max _{\theta} \frac{1}{N} \sum_{n=1}^{N} \log p_{\theta}\left(y^{(n)} \mid x^{(n)}\right)
$$
扩大 1:在训练 RNN 的编码和解码阶段时,应用不同的权值。这使两个单元解耦,让两个 RNN 模块中的每一个进行更准确的预测。这意味着在公式中 \(\phi()\) 函数里应用的是不同的 \(W^{(hh)}\) 矩阵。
扩大 2:应用三个不同的输出计算解码器中的每个暗藏状态
- 前一个暗藏状态 \(h_{t-1}\) (规范的)
- 编码阶段的最初一个暗藏层 (上图中的 \(c=h_T\))
- 前一个预测的输入单词 \(\hat y_{t-1}\)
将上述的三个输出联合将之前公式的解码函数中的 \(\phi\) 函数转换为下式的 \(\phi\) 函数。上图展现了这个模型。
$$
h_{t}=\phi\left(h_{t-1}, c, y_{t-1}\right)
$$
扩大 3:应用多个 RNN 层来训练深度循环神经网络。神经网络的层越深,模型的就具备更强的学习能力从而能晋升预测的准确度。当然,这也意味着须要应用大规模的语料库来训练这个模型。
扩大 4:训练双向编码器,进步准确度。
扩大 5:给定一个德语词序列 \(A B C\),它的英语翻译是 \(X Y\)。在训练 \(RNN\)时不应用 \(A B C \to X Y\),而是应用 \(C B A \to X Y\)。这么解决的起因是 \(A\)更有可能被翻译成 \(X\)。因而对后面探讨的梯度隐没问题,反转输出句子的程序有助于升高输入短语的错误率。
3.Gated Recurrent Units (GRU 模型)
(GRU 模型的解说也能够参考 ShowMeAI 的对吴恩达老师课程的总结文章深度学习教程 | 序列模型与 RNN 网络)
除了迄今为止探讨的扩大办法之外,咱们曾经理解到 RNN 通过应用更简单的激活单元来取得体现更好。到目前为止,咱们曾经探讨了从暗藏状态 \(h_{t-1}\)向 \(h_t\)转换的办法,应用了一个仿射转换和 \(point-wise\)的非线性转换。
研究者通过调整门激活函数的构造实现对 RNN 构造的批改。
尽管实践上 RNN 能捕捉长距离信息,但实际上很难训练网络做到这一点。门管制单元能够让 RNN 具备更多的持久性内存,从而更容易捕捉长距离信息。让咱们从数学角度上探讨 GRU 如何应用 \(h_{t-1}\) 和 \(x_t\) 来生成下一个暗藏状态 \(h_t\)。而后咱们将深刻理解 GRU 架构。
Update gate:\(z_{t} =\sigma \left(W^{(z)} x_{t}+U^{(z)} h_{t-1}\right)\)
Reset gate:\(r_{t} =\sigma\left(W^{(r)} x_{t}+U^{(r)} h_{t-1}\right)\)
New memory:\(\tilde{h}_{t} = \tanh \left(r_{t} \circ U h_{t-1}+W x_{t}\right)\)
Hidden state:\(h_{t} = \left(1-z_{t}\right) \circ \tilde{h}_{t}+z_{t} \circ h_{t-1}\)
上述的共识能够认为是 GRU 的四个基本操作阶段,上面对这些公式作出更直观的解释,下图展现了 GRU 的根本构造和计算流程:
- ① 新记忆生成:一个新的记忆 \(\tilde{h}_{t}\) 是由一个新的输出单词 \(x_t\) 和过来的暗藏状态 \(h_{t-1}\) 独特计算所得。这个阶段是将新输出的单词与过来的暗藏状态 \(h_{t-1}\) 相结合,依据过来的上下文来总结失去向量 \(\tilde{h}_{t}\)。
- ② 重置门:复位信号 \(r_t\) 是负责确定 \(h_{t-1}\) 对总结 \(\tilde{h}_{t}\) 的重要水平。如果确定 \(\tilde{h}_{t}\) 与新的记忆的计算无关,则复位门可能齐全打消过来的暗藏状态 (即疏忽之前暗藏的信息)。
- ③ 更新门:更新信号 \(z_t\) 负责确定有多少 \(h_{t-1}\) 能够向前传递到下一个状态。例如,如果 \(z_{t} \approx 1\),而后 \(h_{t-1}\) 简直是齐全向前传递到下一个暗藏状态。反过来,如果 \(z_{t} \approx 0\),而后大部分的新的记忆 \(\tilde{h}_{t}\) 向前传递到下一个暗藏状态。
- ④ 隐状态:利用更新门的倡议,应用过来的暗藏输出 \({h}_{t-1}\) 和新生成的记忆 \(\tilde{h}_{t}\) 生成暗藏状态 \({h}_{t}\)。
须要留神的是,为了训练 GRU,咱们须要学习所有不同的参数:\(W, U, W^{(r)}, U^{(r)}, W^{(z)}, U^{(z)}\)。这些参数同样是通过反向流传算法学习所得。
4. 长短时记忆网络 (LSTM)
(LSTM 模型的解说也能够参考 ShowMeAI 的对吴恩达老师课程的总结文章深度学习教程 | 序列模型与 RNN 网络)
Long-Short-Term-Memories 是和 GRU 有一点不同的另外一种类型的简单激活神经元。它的作用与 GRU 相似,然而神经元的构造有一点区别。咱们首先来看看 LSTM 神经元的数学公式,而后再深刻理解这个神经元的设计架构:
输出门 /Input gate:\(i_{t}=\sigma\left(W^{(i)} x_{t}+U^{(i)} h_{t-1}\right)\)
忘记门 /Forget gate:\(f_{t}=\sigma\left(W^{(f)} x_{t}+U^{(f)} h_{t-1}\right)\)
输入门 /Output/Exposure gate:\(o_{t}=\sigma\left(W^{(o)} x_{t}+U^{(o)} h_{t-1}\right)\)
新记忆生成 /New memory cell:\(\tilde{c}_{t}=\tanh \left(W^{(c)} x_{t}+U^{(c)} h_{t-1}\right)\)
最终记忆合成 /Final memory cell:\(c_{t}=f_{t} \circ c_{t-1}+i_{t} \circ \tilde{c}_{t}\)
$$
h_{t}=o_{t} \circ \tanh \left(c_{t}\right)
$$
下图是 LSTM 的计算图示
咱们能够通过以下步骤理解 LSTM 的架构以及这个架构背地的意义:
- ① 新记忆生成:这个阶段是相似于 GRU 生成新的记忆的阶段。咱们基本上是用输出单词 \(x_t\) 和过来的暗藏状态来生成一个包含新单词 \(x^{(t)}\) 的新的记忆 \(\tilde{c}_{t}\)。
- ② 输出门:咱们看到在生成新的记忆之前,新的记忆的生成阶段不会查看新单词是否重要——这须要输出门函数来做这个判断。输出门应用输出词和过来的暗藏状态来决定输出值是否值得保留,从而用来进入新内存。因而,它产生它作为这个信息的指示器。
- ③ 忘记门:这个门与输出门相似,只是它不确定输出单词的有用性——而是评估过来的记忆是否对以后记忆的计算有用。因而,忘记门查看输出单词和过来的暗藏状态,并生成 \(f_t\)。
- ④ 最终记忆合成:这个阶段首先依据遗记门 \(f_t\) 的判断,相应地遗记过来的记忆 \(c_{t-1}\)。相似地,依据输出门 \(i_t\) 的判断,相应地输出新的记忆 \(\tilde c_t\)。而后将下面的两个后果相加生成最终的记忆 \(c_t\)。
- ⑤ 输入门:这是 GRU 中没有明确存在的门。这个门的目标是从暗藏状态中拆散最终的记忆。最终的记忆 \(c_t\) 蕴含很多不须要存储在暗藏状态的信息。暗藏状态用于 LSTM 的每个单个门,因而,该门是要评估对于记忆单元 \(c_t\) 的哪些局部须要露出在暗藏状态 \(h_t\) 中。用于评估的信号是 \(o_t\),而后与 \(c_t\) 通过 \(o_{t} \circ \tanh \left(c_{t}\right)\) 运算失去最终的 \(h_t\)。
5. 参考资料
- 本教程的 在线浏览版本
- 《斯坦福 CS224n 深度学习与自然语言解决》课程学习指南
- 《斯坦福 CS224n 深度学习与自然语言解决》课程大作业解析
- 【双语字幕视频】斯坦福 CS224n | 深度学习与自然语言解决(2019·全 20 讲)
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 与深度学习的将来