深度学习-7.循环神经网络RNN

循环神经网络

  • 展开计算图
  • RNN
    • 导师驱动过程和输出循环网络
    • 计算循环神经网络的梯度
  • 双向RNN
  • 深度循环网络
  • 递归神经网络
  • 长期依赖的挑战
  • 回声状态网络
  • 渗漏单元和其他多时间尺度的策略
    • 时间维度的跳跃连接
    • 渗漏单元和一系列不同时间尺度
    • 删除连接
  • 长短期记忆和其他门控RNN
    • LSTM
    • GRU(门控循环单元)
  • 优化长期依赖
    • 截断梯度
    • 引导流信息正则化
  • 外显记忆

逐渐偏重于科普而非技术

展开计算图

对于一个动态系统 s ( t ) = f ( s ( t − 1 ) ; θ ) s^{(t)}=f(s^{(t-1)};\theta) s(t)=f(s(t1);θ) s ( t ) s^{(t)} s(t)是系统的状态
展开图如下所示

f
f
f
s . . .
s _ t
s_t+1
s . . .

RNN

基于上面所说到的计算展开图和参数共享的思想,我们可以设计各种循环神经网络。

  1. 每个时间步都有输出,且隐藏单元之间有循环连接的循环网络
graph LR
x--U-->B((h))--W-->B((h))--V-->C((o))-->D((L))-->E((y))

展开图如下(mermaid流程图画得有点奇怪)

W
U
V
U
V
U
V
W
W
W
...
h2
x2
o2
L2
y2
x3
h3
o3
L3
y3
x4
h4
o4
L4
y4
...
  1. 每个时间步都有输出,只有当前时刻的输出到下一时刻的隐藏单元之间有循环连接
U
V
W
x
h
o
L
y

展开图如下(mermaid流程图画得更奇怪了)

W
U
V
U
V
U
V
W
W
W
...
h2
x2
o2
L2
y2
x3
h3
o3
L3
y3
x4
h4
o4
L4
y4
...

这种循环神经网络不能模拟通用图灵机,因为它缺少隐藏到隐藏的循环连接
3. 隐藏单元之间有循环连接,但只有到整个序列最后才产生单个输出

W
W
W
V
U
U
U
...
h1
h2
h3
o
y
x1
x2
x3

导师驱动过程和输出循环网络

由输出反馈到模型而产生循环连接的模型可用导师驱动过程进行训练。
可以在缺乏隐藏到隐藏连接的模型中避免通过时间反向传播。
它不再使用极大似然准则,而是将下一个时刻的真实值作为输入。

计算循环神经网络的梯度

使用BPTT算法可以计算RNN的梯度

双向RNN

如下图所示,典型的双向循环神经网络意图将输入序列 x x x映射到目标序列 y y y,在每个步骤 t t t上具有损失 L ( t ) L^{(t)} L(t)。循环性 h h h在时间上向前传播信息(向右),而循环性 g g g在时间上向后传播信息(向左)。因此在每个点 t t t,输出单元 o ( t ) o^{(t)} o(t)可以受益于关于过去和将来的两重相关概要。
深度学习-7.循环神经网络RNN_第1张图片

深度循环网络

循环神经网络可以通过许多方式变得更深,例如隐藏循环状态可以被分为具有层次的组;可以向输入到隐藏、隐藏到隐藏以及隐藏到输出的部分引入更深的计算(如MLP);可以引入跳跃连接来缓解路径延长的效应。

递归神经网络

递归神经网络是一种树形结构,是RNN的一种扩展,现已成功应用在了自然语言处理和计算机视觉等领域,其潜在用途是能够学习推论。
递归神经网络有一个明显的优势,对于同样长度的序列,网络深度可以急剧地减小到log级别,这样有可能解决长期依赖的问题。但其面临的一个难点是如何以一个最佳的方式构造树。现有的解决办法是使用不依赖数据的树结构,如平衡二叉树。

长期依赖的挑战

循环神经网络会产生一些数学上的挑战,根本问题是经过许多阶段传播后的梯度趋向于消失(大多数情况)或趋向于爆炸(很少出现,但影响很大)。

回声状态网络

h ( t ) h^{(t)} h(t) h ( t + 1 ) h^{(t + 1)} h(t+1)的权重映射以及从 x ( t ) x^{(t)} x(t) h ( t ) h^{(t)} h(t)的输入权重映射是循环神经网络种最难学习的参数。研究者提出的避免这种困难的方法是设定隐藏单元,使其能很好地捕捉过去输入历史,并且只学习输出权重。
回声状态网络ESN以及流体状态机LSM分别独立地提出了这种想法。两者其实是类似的,只不过后者使用脉冲神经元而不是ESN中的连续隐藏单元。这两种方式头被称为储层计算,因为隐藏单元形成了可能不获输入历史不同方面的临时特征池。

渗漏单元和其他多时间尺度的策略

时间维度的跳跃连接

增加从遥远过去的变量到目前变量的连接直接连接是得到粗时间尺度的一种办法。

渗漏单元和一系列不同时间尺度

设置线性自连接单元可以使导数乘积接近1,连接权重设置为 α \alpha α,当 α \alpha α接近1时,欢动平均值能记住过去很长一段时间的信息,而当 α \alpha α接近0时,关于过去的信息被迅速丢弃。
渗漏单元在回声状态网络中也很有用。

删除连接

组织多个时间尺度上的RNN状态也是一个不错的方法,能使信息在较慢的时间尺度上更容易地长距离流动。

长短期记忆和其他门控RNN

LSTM

LSTM即长短时记忆神经网络,它除了外部的RNN循环之外,还具有内部的LSTM细胞循环,因此它不是简单地向输入和循环单元的仿射变换之后施加一个逐元素的非线性。与普通的循环网络类似,每个单元有相同的输入和输出,但也有更多的参数和控制信息流动的门控单元系统。最重要的组成部分是状态单元 s i ( t ) s^{(t)}_i si(t),与渗漏单元有类似的线性自环。然而此处自环的权重由遗忘门 f i ( t ) f^{(t)}_i fi(t)控制,由sigmoid单元将权重设置为0和1之间的值。
深度学习-7.循环神经网络RNN_第2张图片
元胞框图如上所示。

GRU(门控循环单元)

与LSTM不同,GRU的每个门控单元同时控制以往银子和更新状态单元的决定。复位门和更新门能独立地忽略状态向量的一部分。更新门像条件渗漏累计器一样可以线性门控任意维度,从而选择将它复制或完全由新的目标状态值替换并完全忽略它。复位门控制当前状态中哪些部分用于计算下一个目标状态,在过去状态和未来状态之间引入了附加的非线性效应。

优化长期依赖

截断梯度

强非线性函数往往倾向于非常大或非常小的梯度,他们的目标函数往往存在着一个“悬崖”,函数值在比较小的区间内会急剧变化。如果使用常规的优化函数或不变的学习率,优化函数的损失大小会急剧增大或减小,呈现为Inf或Nan。
一种有效的解决方式是设置一个范数上界,当梯度高于阈值时将其截断。

引导流信息正则化

梯度截断能够处理梯度爆炸问题,但不能解决梯度消失,为此又产生了一些新的想法。
例如在展开循环架构的计算图中,沿着弧边相关联的梯度乘积接近1的部分创建路径。实现这一点的方式是使用LSTM以及其他门控机制。
另一个想法就是使用正则化和约束参数来引导信息流。特别是即使损失函数只对序列尾部的输出做出惩罚,我们也希望梯度向量 ∇ h ( t ) L \nabla_{h^{(t)}}L h(t)L ∇ h ( t ) L ∂ h ( t ) ∂ h ( t − 1 ) \nabla_{h^{(t)}}L\frac{\partial h^{(t)}}{\partial h^{(t-1)}} h(t)Lh(t1)h(t)一样大。在此目标下,提出了正则项:
Ω = ∑ t ( ∣ ∣ ( ∇ h ( t ) L ) ∂ h ( t ) ∂ h ( t − 1 ) ∣ ∣ ∣ ∣ ∇ h ( t ) L ∣ ∣ − 1 ) 2 \Omega=\sum_t(\frac{||(\nabla_{h^{(t)}}L)\frac{\partial h^{(t)}}{\partial h^{(t-1)}}||}{||\nabla_{h^{(t)}}L||} - 1)^2 Ω=t(h(t)L(h(t)L)h(t1)h(t)1)2
计算这一梯度的正则项可能有些困难,但后向传播向量 ∇ h ( t ) L \nabla_{h^{(t)}}L h(t)L也可以考虑为恒值作为近似。
这种方法的一个主要弱点是在处理数据冗余的任务时如语言模型,它并不像LSTM一样有效。

外显记忆

知识的种类繁多,有些知识是隐含的、潜意识的并且难以用语言表达,而神经网络擅长存储隐性知识,但难以记住事实。被存储在神经网络的参数中之前,随机梯度下降需要多次提供相同的输入数据进行训练,但即便如此,这些输入也不会被特别精确地存储,为了解决这一问题,记忆网络便出现了。
例如神经网络图灵机,不需要明确地监督指示采取哪些行动而能学习从记忆单元读写任意内容,并通过使用基于内容的软注意机制等进行端到端的训练。

你可能感兴趣的:(deep,learning,深度学习,rnn,人工智能)