RNN理论

循环神经网络(Recurrent Neural Network,RNN)适用于处理序列数据。就像卷积神经网络是专门用于处理网格化数据(如图像)的网络,可以很容易的地扩展到具有很大宽度和高度的图像,以及可以处理大小可变的图像。循环网络适合于处理 x ( 1 ) , ⋯   , x ( τ ) x^{(1)},\cdots,x^{(\tau)} x(1),,x(τ)这样的序列输入,大多数循环网络都可以处理可变长度的序列。RNN可用于完成语音识别、机器翻译、情感分类、音乐生成、视频行为描述、姓名识别等任务。

对于常见的序列数据应用,其输入和输出的长度是不固定的,且在输入的不同位置之间并不存在可以共享的特征。即便我们简化处理难度,假设某一任务处理的数据的输入和输出长度是固定的,使用传统的全连接前馈网络为每个输入特征分配一个单独的参数,就需要网络分别学习每个位置的所有语言规则,这样要学习的权重系数太多,训练过程很容易欠拟合。RNN则是在模型的不同部分共享参数,从而使得模型可以扩展到不同长度的样本并进行泛化。具体来说,就是允许对不同位置的输入使用相同的参数,即跨时间步共享权重。

但RNN中参数共享不同于一维卷积,一维卷积输出的是一个序列,输出的每一项是相邻几项输入的参数,参数共享的概念体现在每个时间步中使用相同的卷积核;RNN中输出的每一项是前一项的函数,输出每一项是对先前的输出应用相同的更新规则而产生。这种循环方式导致参数可以通过很深的计算图共享

循环网络为减少参数的目的所付出的代价是优化参数可能变得困难在循环网络中使用参数共享的前提是相同参数可以用于不同时间步的假设。即假设给定时间 t 的变量后,时刻 t+1 变量的条件概率分布是平稳的,这意味着之前时间步和下个时间步之间的关系并不依赖于时间 t 。

RNN在序列上操作,输入序列在时刻 t (取值范围是 1 到 τ \tau τ )的输入是向量 x ( t ) x^{(t)} x(t)。RNN通常在序列的小批量上操作,并且小批量的每项具有不同的序列长度。输入数据的时间步索引不仅是实际的时间,有时候仅表示序列中的位置。RNN也可以应用于图像数据。当应用于涉及时间的数据且网络可以观察整个序列时,该网络也可以具有关于时间的向后的连接(双向RNN)。

1 计算图展开

图1

图1 计算图展开示意图

计算图展开如上图所示,左侧是回路原理图,右侧是展开后的计算图。

展开过程中引入了两个优点:

  • 无论序列的长度,学成的模型始终具有相同的输入大小,因为它指定的是从一种状态到另一种状态的转移,而不是在可变长度的历史状态上操作;
  • 可以在每个时间步中使用相同参数的相同转移函数 f

这两个因素使得学习在所有时间步和所有序列长度上操作单一的模型f是可能的,而不需要在所有可能时间步学习独立的模型。学习单一的共享模型允许泛化到没有见过的序列长度,并且估计模型所需的训练样本远少于不带参数共享的模型。

2 各种循环神经网络

常见的RNN包括一对多、多对一、多对多RNN。
常见的循环神经网络有三种:

  • 第一种是每个时间步都有输出,并且隐藏单元间有循环连接的循环网络,如2.1节所示,属于多对多RNN;
  • 第二张是每个时间步都有输出,只有当前时刻的输出到下个时刻的隐藏单元之间有循环连接的循环网络,如2.2节所示,也属于多对多RNN,只不过连接方式和上面的有所不同;
  • 隐藏单元之间存在循环连接,但读取整个序列后产生单个输出的网络,如2.3节所示,属于多对一RNN。

2.1 隐藏单元间有循环连接的RNN

在这里插入图片描述

图2 隐藏单元间具有循环连接的RNN

隐藏单元间具有循环连接的RNN非常强大。在上图中,每个时间步的输入为 x ( t ) x^{(t)} x(t),隐藏层激活为 h ( t ) h^{(t)} h(t),输出是 o ( t ) o^{(t)} o(t),目标为 y ( t ) y^{(t)} y(t),损失为 L ( t ) L^{(t)} L(t)。假设输出是离散的,当使用softmax做输出时,我们假设o是未归一化的对数概率。损失函数内部计算 y ^ = s o f t m a x ( o ) \hat{y} = softmax(o) y^=softmax(o),并计算其与真实输出y的交叉熵。输入到隐藏之间的参数为U,隐藏和隐藏之间的参数为W,隐藏到输出之间的参数为V。

前向计算

RNN中一般使用 t a n h ( x ) = e x − e − x e x + e − x tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex作为激活函数,至于tanh带来的梯度弥散问题,使用其他的办法进行解决,后文会介绍。

t = 1 t = 1 t=1 t = τ t = \tau t=τ的每个时间步,更新方程为:
(1) a ( t ) = b + W h ( t − 1 ) + U x ( t )   h ( t ) = t a n h ( a ( t ) )   o ( t ) = c + V h ( t )   y ^ ( t ) = s o f t m a x ( o ( t ) ) a^{(t)} = b + Wh^{(t-1)} + Ux^{(t)} \\~\\ h^{(t)} = tanh(a^{(t)}) \\ ~ \\ o^{(t)} = c + Vh^{(t)} \\ ~ \\\hat{y}^{(t)} = softmax(o^{(t)}) \tag{1} a(t)=b+Wh(t1)+Ux(t) h(t)=tanh(a(t)) o(t)=c+Vh(t) y^(t)=softmax(o(t))(1)

这个循环网络将一个输入序列映射到相同长度的输出序列。与x序列配对的y的总损失就是所有时间步的损失之和。对每一个时间步, L ( t ) L^{(t)} L(t)就是给定 x ( 1 ) , ⋯   , x ( t ) x^{(1)},\cdots,x^{(t)} x(1),,x(t) y ( t ) y^{(t)} y(t)的负对数似然,即:
L ( { x ( 1 ) , ⋯   , x ( t ) } , { y ( 1 ) , ⋯   , y ( t ) } ) = ∑ t = 1 τ L ( t ) = − ∑ t = 1 τ log ⁡ p m o d e l ( y ( t ) ∣ { x ( 1 ) , ⋯   , x ( t ) } ) L(\{x^{(1)},\cdots,x^{(t)}\},\{y^{(1)},\cdots,y^{(t)}\}) \\ = \sum_{t =1}^{\tau}L^{(t)} \\=-\sum_{t =1}^{\tau}\log p_{model}(y^{(t)}|\{x^{(1)},\cdots,x^{(t)}\}) L({x(1),,x(t)},{y(1),,y(t)})=t=1τL(t)=t=1τlogpmodel(y(t){x(1),,x(t)})

p m o d e l ( y ( t ) ∣ { x ( 1 ) , ⋯   , x ( t ) } p_{model}(y^{(t)}|\{x^{(1)},\cdots,x^{(t)}\} pmodel(y(t){x(1),,x(t)}需要读取模型输出向量 y ^ ( t ) \hat{y}^{(t)} y^(t)中对应于 y ( t ) y^{(t)} y(t)的项。

该RNN中关于梯度的计算代价很大。梯度计算涉及执行一次前向传播,接着是从右到左的反向传播。运行时间是 O ( τ ) O(\tau) O(τ),并且不同通过并行化来降低,因为前向传播图是固定顺序的,只能按照时间步的顺序计算。前向传播中的每个状态必须保存,因为需要在反向传播中再次使用,内存代价也是 O ( τ ) O(\tau) O(τ)。应用于展开图且代价为 O ( τ ) O(\tau) O(τ)的反向传播算法成为通过时间反向传播(back-propagation through time,BPTT),BPTT的主要含义是指需要进行从 h ( t + 1 ) h^{(t+1)} h(t+1) h ( t ) h^{(t)} h(t)的逆时间步反向计算,就像使用时光机回到过去一样。

反向计算
反向计算的推导过程和前馈网络是一致的。对每一个节点N,我们需要基于N后面节点的梯度,递归地计算梯度 ∇ N \nabla_N N,我们从紧跟着最终损失的节点开始递归:

∂ L ∂ L ( t ) = 1 \frac{\partial L}{\partial L^{(t)}} = 1 L(t)L=1
( ∇ o ( t ) L ) i (\nabla_{o^{(t)}}L)_i (o(t)L)i = ∂ L ∂ o i ( t ) = ∂ L ∂ L ( t ) ∂ L ( t ) ∂ o i ( t ) = y ^ i ( t ) − 1 i , y ( t ) \frac{\partial L}{\partial o_i^{(t)}} = \frac{\partial L}{\partial L^{(t)}}\frac{\partial L^{(t)}}{\partial o_i^{(t)}} = \hat{y}_i^{(t)} - 1_{i,y^{(t)}} oi(t)L=L(t)Loi(t)L(t)=y^i(t)1i,y(t)(i表示第i个样本)
对于 h ( τ ) h^{(\tau)} h(τ),只有 o ( τ ) o^{(\tau)} o(τ)为其后续节点, ∇ h ( τ ) L = V T ∇ o ( τ ) L \nabla_{h^{(\tau)}} L = V^T\nabla_{o^{(\tau)}} L h(τ)L=VTo(τ)L
对于 t = 1 , ⋯   , τ − 1 t = 1,\cdots,\tau-1 t=1,,τ1 h ( t ) h^{(t)} h(t) o ( t ) o^{(t)} o(t) h ( t + 1 ) h^{(t+1)} h(t+1)两个后续节点,因此 ∇ h ( t ) L = W T ( ∇ h ( t + 1 ) L ) d i a g ( 1 − ( h ( t + 1 ) ) 2 ) + V T ∇ o ( t ) L \nabla_{h^{(t)}} L = W^T(\nabla_{h^{(t+1)}} L)diag(1 - (h^{(t+1)})^2) + V^T\nabla_{o^{(t)}} L h(t)L=WT(h(t+1)L)diag(1(h(t+1))2)+VTo(t)L (注: ∇ x t a n h ( x ) = 1 − ( t a n h ( x ) ) 2 \nabla_x tanh(x) = 1 - ({tanh(x)})^2 xtanh(x)=1(tanh(x))2)

对于参数的梯度,因为参数在时间步内共享,因此对参数的梯度为各时间步的梯度之和。
∇ c L = ∑ t ∇ o ( t ) L \nabla_c L = \sum_t \nabla_{o^{(t)}} L cL=to(t)L
∇ V L = ∑ t ( ∇ o ( t ) L ) h ( t ) T \nabla_V L = \sum_t (\nabla_{o^{(t)}} L){h^{(t)}}^T VL=t(o(t)L)h(t)T
∇ b L = ∑ t d i a g ( 1 − ( h ( t ) ) 2 ) ∇ h ( t ) L \nabla_b L = \sum_t diag(1 - (h(t))^2) \nabla_{h^{(t)}} L bL=tdiag(1(h(t))2)h(t)L
∇ W L = ∑ t d i a g ( 1 − ( h ( t ) ) 2 ) ( ∇ h ( t ) L ) h ( t − 1 ) T \nabla_W L = \sum_t diag(1 - (h(t))^2) (\nabla_{h^{(t)}} L) {h^{(t-1)}}^T WL=tdiag(1(h(t))2)(h(t)L)h(t1)T
∇ U L = ∑ t d i a g ( 1 − ( h ( t ) ) 2 ) ( ∇ h ( t ) L ) x ( t ) T \nabla_U L = \sum_t diag(1 - (h(t))^2) (\nabla_{h^{(t)}} L) {x^{(t)}}^T UL=tdiag(1(h(t))2)(h(t)L)x(t)T

如果将RNN训练为能够根据过去的输入估计下一个元素 y ( t ) y^{(t)} y(t)的条件分布。隐藏单元存在连接的RNN是在最大化似然 log ⁡ p ( y ( t ) ∣ x ( 1 ) , ⋯   , x ( t ) ) \log p(y^{(t)}|x^{(1)},\cdots,x^{(t)}) logp(y(t)x(1),,x(t))

2.2 当前时刻输出单元和下一时刻隐藏单元存在循环连接的RNN

在这里插入图片描述

图 3 当前时刻输出单元和下一时刻隐藏单元存在循环连接的RNN

缺点
当前时刻输出节点和下一时刻隐藏单元存在循环连接的RNN不如隐藏单元存在循环连接的RNN强大。这是因为模型训练的目的是使得输出单元尽可能地接近训练集的目标,它们不太可能捕获关于过去历史的必要信息。

优点
消除了隐藏到隐藏单元的连接,任意时刻t的预测和训练目标之间损失函数中所有的时间步都解偶了,这是因为在模型训练过程中使用真实输出 y ( t ) y^{(t)} y(t)代替了 o ( t ) o^{(t)} o(t)。因此使得可以在各刻度t分别计算梯度,训练可以并行化了。这个过程称之为导师驱动过程

在这里插入图片描述

图 4 导师驱动过程示意图

导师驱动过程训练模型时,导师驱动训练使用前一时刻的真实输出代替预测输出。模型部署后,真实的输出是未知的,在这种情况下,用模型的输出 o ( t ) o^{(t)} o(t)近似 y ( t ) y^{(t)} y(t),并输入到下一时刻的隐藏单元。导师驱动过程的缺点是训练时隐藏单元看到的输入和测试时看到的输入有很大的不同。

如果将RNN训练为能够根据过去的输入估计下一个元素 y ( t ) y^{(t)} y(t)的条件分布。当前单元的输出和下一单元的隐藏单元存在连接的RNN是在最大化似然 log ⁡ p ( y ( t ) ∣ x ( 1 ) , ⋯   , x ( t ) , y ( 1 ) , ⋯   , y ( t − 1 ) ) \log p(y^{(t)}|x^{(1)},\cdots,x^{(t)},y^{(1)},\cdots,y^{(t-1)}) logp(y(t)x(1),,x(t),y(1),,y(t1))

2.3 具有单个输出且隐藏单元具有连接的RNN

在这里插入图片描述

图 5 具有单个输出且隐藏单元存在连接的RNN

具有单个输出且隐藏单元存在连接的RNN适用于概括序列并产生用于进一步处理的固定大小的表示。这种类型的RNN可用于情感分类等任务,例如读入电影评论输出评分。

2.4 作为有向图的RNN

作为有向图的RNN没有输入,只是通过过去的观察值预测未来的值,在时间步t的输入仅仅是时间步t-1的输出。属于零对多型RNN。

该RNN定义了关于y变量的有向图模型。使用链式法则参数化这些观察值的联合分布: P ( Y ) = P ( y ( 1 ) , ⋯   , y ( τ ) ) = Π t = 1 τ p ( y ( t ) ∣ y ( 1 ) , ⋯   , y ( t ) ) P(Y) = P(y^{(1)},\cdots,y^{(\tau)}) = \Pi_{t=1}^{\tau}p(y^{(t)}|y^{(1)},\cdots,y^{(t)}) P(Y)=P(y(1),,y(τ))=Πt=1τp(y(t)y(1),,y(t)),当t=1时,竖杠右侧为0。

解释RNN作为有向图模型的一种方法是将RNN视为定义一个结构为完全图的图模型,且任意一对y之间存在直接连接。如下图所示:

在这里插入图片描述

图6 序列y的全连接图模型

序列y的全连接图模型一个缺点是当序列中每个元素的输入和参数数目越来越多,根据图6直接参数化模型可能是非常低效的。RNN可以通过引入隐藏单元高效的参数化该模型。引入隐藏单元后形成的RNN如图7所示:

在这里插入图片描述

图 7 引入隐藏单元的高效RNN

对图6所示的全连接模型引入隐藏单元,将其视为随机变量,序列的每个阶段( h ( t ) h^{(t)} h(t) y ( t ) y^{(t)} y(t))使用相同的结构,并且在不同的时间步共享参数。在图模型中结合 h ( t ) h^{(t)} h(t)可以用作过去和未来的中间量,从而将它们解耦。遥远过去的变量 y ( i ) y^{(i)} y(i)可以通过其对 h h h的影响来影响未来的 y ( t ) y^{(t)} y(t)。该图的结构表明可以在时间步使用相同的条件概率分布有效地参数化模型,并且当观察到全部变量时,可以高效地评估联合分配给全部变量的概率。

2.5 基于上下文的RNN

基于上下文的RNN使用单个固定大小的向量x作为输入,实现一对多的RNN。

将额外输入 x 提供到RNN的一些常见做法是:

  • 将x作为每一时刻的额外输入,如图8所示;
  • 作为初始状态 h ( 0 ) h^{(0)} h(0)
  • 结合两种方式。

首先来说将x作为每一时刻的额外输入,如下图8所示:
在这里插入图片描述

图 8 将单个x作为每个时刻额外输入的RNN

图8所示的RNN可用作图像标注任务,输入x为图像,输出y为描述信息。观察到的每个元素 y ( t ) y^{(t)} y(t)同时作为输入和训练期间的目标。

图2所示的RNN是在给定x情况下,y值彼此条件独立的假设下所得到的RNN,去掉条件独立假设,可以在t时刻的输出到t+1时刻的隐藏单元之间添加连接,得到的RNN如下图所示。该RNN输入和输出也是等长度的。
在这里插入图片描述

图9 输入连接到每个时间步隐藏单元的RNN

2.6 双向RNN

前面所有的RNN在每一个时间步都只考虑了其当前时间步之前的输入的影响,然而在很多应用中,我们对 y ( t ) y^{(t)} y(t)的预测可能依赖于整个输入序列,这种RNN称之为双向RNN,可以完成手写识别、语音识别及生物信息学等多种任务。

双向RNN结合时间上从序列起点开始向后移动的RNN和另一个从序列末尾向前移动的RNN。如下图10所示。

在这里插入图片描述

图10 双向RNN

图10中的双向RNN包括两个子RNN,分别是从前向后移动的 h ( t ) h^{(t)} h(t)和从后向前移动的 g ( t ) g^{(t)} g(t)。这允许输出单元 o ( t ) o^{(t)} o(t)能够依赖于过去和未来中最敏感的表示,而不必指定t周围固定的大小。

双向RNN可以使用标准的RNN单元,也可以使用LSTM或GRU作为基本单元。

将双向RNN扩展到上下左右四个方向,则可以实现二维输入如图像上的RNN。

2.7 Encoder-Decoder / Seq2Seq RNN

seq2seq RNN属于多对多RNN,但是允许输入和输出的长度不一致,即实现N到M的映射且N不等于M。可用于语音识别、机器翻译或问答等应用中。

在这里插入图片描述

图11 seq2seq RNN

seq2seq RNN中的编码器RNN将输入序列编码为C,解码器RNN将C解码为输出序列。其好处是允许输入输出的长度不同。

在图11中,可以通过多种方式得到c,比如 c = h 4 , c = q ( h 4 ) , c = q ( h 1 , h 2 , h 3 , h 4 ) c = h_4,c=q(h_4),c=q(h_1,h_2,h_3,h_4) c=h4,c=q(h4),c=q(h1,h2,h3,h4)等。

s e q 2 s e q seq2seq seq2seq的一个明显缺点是编码器RNN输出的上下文C的维度太小而难以适当概况一个序列。可以通过将C变成一个可变长度的序列或者是将C的元素和输出序列的元素相关联,后者成为注意力机制,将在后面介绍

2.8 递归神经网络

递归神经网络被构造为树状结构而不是RNN的链式结构。可以成功应用于输入是数据结构的神经网络,如自然语言处理和计算机视觉。

递归神经网络的一个明显优势是,对于具有长度为 τ \tau τ的序列,深度可以从 τ \tau τ减少到 log ⁡ ( τ ) \log(\tau) log(τ),有助于解决长期依赖。

在这里插入图片描述

图12 递归神经网络

3 RNN中的长期依赖挑战

随着时间的推移,理论上RNN在第i步的输出结果被认为是包含了从初始到当前i对应的所有数据的信息的。但实际上RNN并没有这么好的记忆力,这个问题就被称为是长期依赖。随着时间的推移,RNN慢慢就记不得前面的输入了,对应的参数更新也很难回溯到早期。

长期依赖是指在RNN处理的序列输入中,某一个后面的输入依赖于前面很多时间步之前的某个输入。例如,要根据前面使用的是cat还是cats决定后面使用was还是were。由于当前时间步和其依赖项之间的时间步很大,所以需要在训练过程中有效的进行长期依赖的梯度传播。但在RNN中,经过许多时间步的梯度传播之后,梯度弥散和梯度爆炸都会造成梯度太小或者太大,从而使得无法进行长期依赖

以图2所示的RNN为例,隐藏单元之间通过参数W相互作用,那么 h ( t ) = W t h ( 0 ) h^{(t)} = W^th^{(0)} h(t)=Wth(0),假设 W = Q Λ Q T W = Q\Lambda Q^T W=QΛQT,其中Q正交,那么 h ( t ) = Q Λ t Q T h^{(t)} = Q \Lambda^{t} Q^T h(t)=QΛtQT。因此造成 Λ \Lambda Λ中大于1的特征值出现了梯度爆炸,而小于1的特征值出现了梯度消失。

梯度爆炸相对更易发现和解决,因为梯度爆炸造成了数值溢出,出现了值为Nan的情况,可以通过梯度截断解决,即将大于某个阈值的梯度按照按阈值进行截断处理。

梯度消失问题相对难以发现和解决,下面要介绍的GRU和LSTM可用于解决梯度消失问题。

3.1 使用leaky单元和其他多尺度时间策略优化长期依赖

处理长期依赖的一种方法是设计工作在多个时间尺度的模型,使模型的某些部分在细粒度时间尺度上操作并能处理小细节,而其他部分则在粗时间尺度上操作并能把遥远过去的信息更有效地传递过来

存在多种构建多时间尺度的策略,包括在时间轴增加跳跃连接,leaky单元使用不同时间常数整合信号,并出去一些用于建模细粒度时间尺度的连接。

3.1.1 时间维度的跳跃连接

时间维度的跳跃连接是指增加从遥远过去的变量到目前变量的直接连接,也可以引入d延时的循环连接(即允许单元可以被d时间步之前的单元影响,这可以将导数指数减小的速度从 τ \tau τ变成 τ d \frac{\tau}{d} dτ)。但这都是允许了捕获更长的依赖,但无法解决全部所有的长期依赖挑战。

3.1.2 leaky单元

即使用 u ( t ) = α u ( t − 1 ) + ( 1 − α ) v ( t ) u^{(t)} = \alpha u^{(t-1)} + (1 - \alpha)v^{(t)} u(t)=αu(t1)+(1α)v(t),设置 α \alpha α接近于1从而使得一个单元的值可以被很长时间段内的单元影响。

α \alpha α的值可以设定成固定值,也可以从模型训练过程中学习得到。

3.1.3 删除某些连接

删除某些长度为1的连接并添加长度更长的连接,使得被修改的单元在长时间尺度上运作。

3.2 门控RNN

门控RNN(gated RNN)是目前最有效的序列模型,包括长短期记忆网络(long short-term memory,LSTM)门控循环单元(gated recurrent unit,GRU)

3.2.1 LSTM

LSTM除了外部的RNN循环外,还具有内部的“LSTM 细胞”循环。引入了和隐藏单元一起具备自循环的状态单元C,引入了遗忘门、输入门、输出门三个门单元,三个门单元均使用 s i g m o i d sigmoid sigmoid函数,将权重设置为0到1之间的值。

RNN相当于一个只用脑子记录知识的学生,时间久了慢慢就忘了。LSTM/GRU可以认为是一个知道把知识记录到笔记本的学生。LSTM中增加了一个状态单元C,就相当于一个具有容量限制的笔记本。遗忘门是指记笔记的时候,总要把原有的笔记擦出一些腾出空间,遗忘门决定擦除的比例,介于0到1之间,如下面的第一个式子所示;输入门是指对新学习的知识,根据自己的理解将核心部分记录到笔记本,筛选的比例也是介于0到1之间,如下面第二个式子所示;而自己的理解就是新状态单元,如下面第三个式子所示;把新理解的知识记录到比较本后,笔记本内包含的知识就更新了,内容 = 旧内容 * 删除比例 + 记录比例 * 自己的理解,更新的结果如下面第四个式子所示;和同学吹牛皮的时候,该同学不耿直,只是从自己的笔记本中筛选一部分和别人交流,筛选的比例就是输出门,如下面第五个式子所示;最后告诉同学的就是筛选的比例 * 润色后的笔记本内容,如下面第六个式子所示。(该段内容参考自:https://mp.weixin.qq.com/s/5Kpm6GuDAJIow-jQlqmZyg)

在这里插入图片描述

图13 LSTM基本单元

遗忘门: f t = s i g m o i d ( W f [ h t − 1 , x t ] + b f ) f_t = sigmoid(W_f[h_{t-1},x_t] + b_f) ft=sigmoid(Wf[ht1,xt]+bf)
输入门: i t = s i g m o i d ( W i [ h t − 1 , x t ] + b i ) i_t = sigmoid(W_i[h_{t-1},x_t] + b_i) it=sigmoid(Wi[ht1,xt]+bi)
新状态单元: C t ∼ = t a n h ( W c [ h t − 1 , x t ] + b c ) \overset{\sim}{C_t} = tanh(W_c[h_{t-1},x_t]+b_c) Ct=tanh(Wc[ht1,xt]+bc)
更新状态单元: C t = f t ∗ C t − 1 + i t ∗ C t ∼ C_t= f_t * C_{t-1} + i_t * \overset{\sim}{C_t} Ct=ftCt1+itCt
输出单元: o t = s i g m o i d ( W o [ h t − 1 , x t ] + b o ) o_t = sigmoid(W_o[h_{t-1},x_t] + b_o) ot=sigmoid(Wo[ht1,xt]+bo)
h t = o t ∗ t a n h ( C t ) h_t = o_t * tanh(C_t) ht=ottanh(Ct)

3.2.2 GRU

GRU是LSTM的变体,将遗忘门和输入门合并得到了新的更新门,同时还混合了LSTM中的状态单元和隐藏单元。GRU的基本单元如图14所示:

在这里插入图片描述

图14 GRU基本单元

更新门: z t = s i g m o i d ( W z [ h t − 1 , x t ] + b z ) z_t = sigmoid(W_z[h_{t-1},x_t] + b_z) zt=sigmoid(Wz[ht1,xt]+bz)
相关门: r t = s i g m o i d ( W r [ h t − 1 , x t ] + b r ) r_t = sigmoid(W_r[h_{t-1},x_t] + b_r) rt=sigmoid(Wr[ht1,xt]+br)
更新细胞状态: h t ∼ = t a n h ( W h [ r t ∗ h t − 1 , x t ] + b h ) \overset \sim {h_t} = tanh(W_h[r_t * h_{t-1},x_t]+b_h) ht=tanh(Wh[rtht1,xt]+bh)
输出: h t = ( 1 − z t ) h t − 1 + z t ∗ h t ∼ h_t = (1 - z_t) h_{t-1} + z_t * \overset{\sim}{h_t} ht=(1zt)ht1+ztht

GRU的优点是当从左到右扫描输入序列时,可以由更新门决定在多大程度上保留上一状态。当更新门的值很接近于0时,表示 h t h_t ht很接近于 h t − 1 h_{t-1} ht1,这样在很长的输入序列中就减弱了长期依赖中的梯度弥散,使得RNN更有效。

LSTM更加强大灵活,但GRU更易于训练深度网络,可以把LSTM作为默认选择

4 深度RNN

深度RNN就是堆砌RNN层,但和CNN中不同,很少堆砌数十层的网络层,深度RNN中的层数一般只有数层。

深度RNN中可以使用标准RNN单元、LSTM单元、GRU单元,也可以使用双向RNN。

深度RNN一般会对单层的RNN做一些修改,常见的修改包括:
在这里插入图片描述

参考:
《深度学习》
deeplearning.ai 序列模型》
https://blog.csdn.net/lreaderl/article/details/78022724
https://mp.weixin.qq.com/s/5Kpm6GuDAJIow-jQlqmZyg

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值