序列建模之循环和递归网络 - 循环神经网络篇

68 篇文章 0 订阅
31 篇文章 0 订阅

序言

在探索序列数据的深层规律时,循环神经网络( RNN \text{RNN} RNN)以其独特的设计思想成为了序列建模领域的中流砥柱。与传统的神经网络不同, RNN \text{RNN} RNN引入了循环结构,使得网络能够处理任意长度的序列数据,并在处理过程中保留对之前信息的记忆。这种设计使得 RNN \text{RNN} RNN能够捕捉序列中的时间依赖性和动态变化,从而有效应用于自然语言处理、时间序列预测、语音识别等多个领域。通过训练, RNN \text{RNN} RNN能够学习到序列数据的内在规律和模式,进而对未来的数据进行预测或生成。

循环神经网络

  • 基于序列建模之循环和递归网络 - 展开计算图篇中的图展开和参数共享的思想,我们可以设计各种循环神经网络。
  • 循环神经网络中一些重要的设计模式包括以下几种:
    • 每个时间步都有输出,并且隐藏单元之间有循环连接的循环网络,如图例1所示。
    • 每个时间步都产生一个输出,只有当前时刻的输出到下个时刻的隐藏单元之间有循环连接的循环网络,如图例2所示。
    • 隐藏单元之间存在循环连接,但读取整个序列后产生单个输出的循环网络,如图例3所示。
  • 图例1非常具有代表性的例子,我们将会在本篇章大部分涉及这个例子。
  • 任何图灵可计算的函数都可以通过这样一个有限维的循环网络计算,在这个意义上图例1公式1的循环神经网络是万能的。
    • RNN \text{RNN} RNN经过若干时间步后读取输出,这与由图灵机所用的时间步是渐近线性的,与输入长度也是渐近线性的 ( Siegelmann and Sontag, 1991; Siegelmann, 1995; Siegelmann and Sontag, 1995;Hyotyniemi, 1996 \text{Siegelmann and Sontag, 1991; Siegelmann, 1995; Siegelmann and Sontag, 1995;Hyotyniemi, 1996} Siegelmann and Sontag, 1991; Siegelmann, 1995; Siegelmann and Sontag, 1995;Hyotyniemi, 1996)。
    • 由图灵机计算的函数是离散的,所以这些结果都是函数的具体实现,而不是近似。
    • RNN \text{RNN} RNN作为图灵机使用时,需要一个二进制序列作为输入,其输出必须离散化后提供二进制输出。
    • 利用单个有限大小的特定RNN计算在此设置下的所有函数是可能的( Siegelmann and Sontag (1995) \text{Siegelmann and Sontag (1995)} Siegelmann and Sontag (1995) 用了 886 886 886 个单元)。
    • 图灵机的 ‘‘输入’’ 是要计算函数的详细说明 ( specification \text{specification} specification),所以模拟此图灵机的相同网络足以应付所有问题。
    • 用于证明的理论 RNN \text{RNN} RNN可以通过激活和权重(由无限精度的有理数表示)来模拟无限堆栈。
  • 现在我们研究图例1 RNN \text{RNN} RNN的前向传播公式。
    • 这个图没有指定隐藏单元的激活函数。我们假设使用双曲正切激活函数。
    • 此外,图中没有明确指定何种形式的输出和损失函数。
    • 我们假定输出是离散的,如用于预测词或字符的 RNN \text{RNN} RNN
    • 一种代表离散变量的自然方式是把输出 ο \boldsymbol{\omicron} ο 作为每个离散变量可能值的非标准化对数概率。
    • 然后,我们可以应用 softmax \text{softmax} softmax函数后续处理后,获得标准化后概率的输出向量 y ^ \hat{\boldsymbol{y}} y^
    • RNN \text{RNN} RNN从特定的初始状态 h ( 0 ) \boldsymbol{h}^{(0)} h(0) 开始前向传播。
    • t = 1 t = 1 t=1 t = τ t = \tau t=τ 的每个时间步,我们应用以下更新方程:
      { a ( t ) = b + W h ( t − 1 ) + U x ( t ) — 公式1 h ( t ) = tanh ⁡ ( a ( t ) ) — 公式2 ο ( t ) = c + V h ( t ) — 公式3 y ^ ( t ) = softmax ( ο ( t ) ) — 公式4 \begin{cases}\begin{aligned}\boldsymbol{a}^{(t)}&=\boldsymbol{b}+\boldsymbol{Wh}^{(t-1)}+\boldsymbol{Ux}^{(t)} &\quad\textbf{---\footnotesize{公式1}}\\ \boldsymbol{h}^{(t)}&=\tanh(\boldsymbol{a}^{(t)}) &\quad\textbf{---\footnotesize{公式2}}\\ \boldsymbol{\omicron}^{(t)}&=\boldsymbol{c}+\boldsymbol{Vh}^{(t)} &\quad\textbf{---\footnotesize{公式3}}\\ \hat{\boldsymbol{y}}^{(t)}&=\text{softmax}(\boldsymbol{\omicron}^{(t)})&\quad\textbf{---\footnotesize{公式4}}\end{aligned}\end{cases} a(t)h(t)ο(t)y^(t)=b+Wh(t1)+Ux(t)=tanh(a(t))=c+Vh(t)=softmax(ο(t))1234 — 公式1 \quad\textbf{---\footnotesize{公式1}} 1 — 公式2 \quad\textbf{---\footnotesize{公式2}} 2 — 公式3 \quad\textbf{---\footnotesize{公式3}} 3 — 公式4 \quad\textbf{---\footnotesize{公式4}} 4
      • 其中的参数的偏置向量 b \boldsymbol{b} b c \boldsymbol{c} c连同权重矩阵 U \boldsymbol{U} U V \boldsymbol{V} V W \boldsymbol{W} W,分别对应于输入到隐藏、隐藏到输出和隐藏到隐藏的连接。
      • 这个循环网络将一个输入序列映射到相同长度的输出序列。
      • x \boldsymbol{x} x 序列配对的 y \boldsymbol{y} y 的总损失就是所有时间步的损失之和。
    • 例如, L ( t ) L^{(t)} L(t) 为给定的 x ( 1 ) , … , x ( t ) \boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(t)} x(1),,x(t) y ( t ) \boldsymbol{y}^{(t)} y(t) 的负对数似然,则:
      { L ( { x ( 1 ) , … , x ( τ ) } , { y ( 1 ) , … , y ( τ ) } ) — 公式5 = ∑ t L ( t ) — 公式6 = − ∑ t log ⁡ p model ( y ( t ) ∣ { x ( 1 ) , … , x ( t ) } ) — 公式7 \begin{cases}\begin{aligned}&L(\{\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(\tau)}\},\{\boldsymbol{y}^{(1)},\dots,\boldsymbol{y}^{(\tau)}\})&\quad\textbf{---\footnotesize{公式5}}\\&=\sum\limits_t L^{(t)}&\quad\textbf{---\footnotesize{公式6}}\\&=-\sum\limits_t\log p_{\text{model}}(y^{(t)}|\{\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(t)}\})&\quad\textbf{---\footnotesize{公式7}}\end{aligned}\end{cases} L({x(1),,x(τ)},{y(1),,y(τ)})=tL(t)=tlogpmodel(y(t){x(1),,x(t)})567 — 公式5 \quad\textbf{---\footnotesize{公式5}} 5 — 公式6 \quad\textbf{---\footnotesize{公式6}} 6 — 公式7 \quad\textbf{---\footnotesize{公式7}} 7
      • 其中, p model ( y ( t ) ∣ { x ( 1 ) , … , x ( t ) } ) p_{\text{model}}(y^{(t)}|\{\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(t)}\}) pmodel(y(t){x(1),,x(t)})需要读取模型输出向量 y ^ ( t ) \hat{\boldsymbol{y}}^{(t)} y^(t) 中对应于 y ( t ) y^{(t)} y(t) 的项。
      • 关于各个参数计算这个损失函数的梯度是昂贵的操作。
      • 梯度计算涉及执行一次前向传播(如在图例1展开图中从左到右的传播),接着是由右到左的反向传播。
      • 运行时间是 O ( τ ) \Omicron(\tau) O(τ),并且不能通过并行化来降低,因为前向传播图是固有循序的; 每个时间步只能一前一后地计算。
      • 前向传播中的各个状态必须保存,直到它们反向传播中被再次使用,因此内存代价也是 O ( τ ) \Omicron(\tau) O(τ)
      • 应用于展开图且代价为 O ( τ ) \Omicron(\tau) O(τ) 的反向传播算法称为通过时间反向传播 ( back-propagation through time, BPTT \text{back-propagation through time, BPTT} back-propagation through time, BPTT),将在计算循环神经网络的梯度进一步讨论。
      • 因此隐藏单元之间存在循环的网络非常强大但训练代价也很大。
      • 我们是否有其他选择呢?

Teacher Forcing和输出循环网络

  • 仅在一个时间步的输出和下一个时间步的隐藏单元间存在循环连接的网络(示于图例2)确实没有那么强大(因为缺乏隐藏到隐藏的循环连接)。
    • 例如,它不能模拟通用图灵机。
    • 因为这个网络缺少隐藏到隐藏的循环,它要求输出单元捕捉用于预测未来的关于过去的所有信息。
    • 因为输出单元明确地训练成匹配训练集的目标,它们不太能捕获关于过去输入历史的必要信息,除非用户知道如何描述系统的全部状态,并将它作为训练目标的一部分。
    • 消除隐藏到隐藏循环的优点在于,任何基于比较时刻 t t t 的预测和时刻 t t t 的训练目标的损失函数中的所有时间步都解耦了。
    • 因此训练可以并行化,即在各时刻 t t t 分别计算梯度。因为训练集提供输出的理想值,所以没有必要先计算前一时刻的输出。
  • 从输出导致循环连接的模型可用 Teacher Forcing \text{Teacher Forcing} Teacher Forcing进行训练。
    • Teacher Forcing是使用最大似然准则的过程,并且在时刻 t + 1 t + 1 t+1 接收真实值 y ( t ) y^{(t)} y(t) 作为输入(训练模型时)。
    • 我们可以通过检查两个时间步的序列得知这一点。条件最大似然准则是:
      { log ⁡ p ( y ( 1 ) , y ( 2 ) ∣ x ( 1 ) , x ( 2 ) ) — 公式8 = log ⁡ p ( y ( 2 ) ∣ y ( 1 ) , x ( 1 ) , x ( 2 ) ) + log ⁡ p ( y ( 1 ) ∣ x ( 1 ) , x ( 2 ) ) — 公式9 \begin{cases} \begin{aligned} &\log p(\boldsymbol{y}^{(1)},\boldsymbol{y}^{(2)}|\boldsymbol{x}^{(1)},\boldsymbol{x}^{(2)}) &\quad\textbf{---\footnotesize{公式8}}\\ &=\log p(\boldsymbol{y}^{(2)}|\boldsymbol{y}^{(1)},\boldsymbol{x}^{(1)},\boldsymbol{x}^{(2)})+\log p(\boldsymbol{y}^{(1)}|\boldsymbol{x}^{(1)},\boldsymbol{x}^{(2)})&\quad\textbf{---\footnotesize{公式9}} \end{aligned} \end{cases} {logp(y(1),y(2)x(1),x(2))=logp(y(2)y(1),x(1),x(2))+logp(y(1)x(1),x(2))89 — 公式8 \quad\textbf{---\footnotesize{公式8}} 8 — 公式9 \quad\textbf{---\footnotesize{公式9}} 9
      • 在这个例子中,同时给定迄今为止的 x \boldsymbol{x} x 序列和来自训练集的前一 y \boldsymbol{y} y 值,我们可以看到在时刻 t = 2 t = 2 t=2 时,模型被训练为最大化 y ( 2 ) \boldsymbol{y}^{(2)} y(2) 的条件概率。
      • 因此最大似然在训练时指定正确反馈,而不是将自己的输出反馈到模型。
      • 图例4所示。
  • 我们使用 Teacher Forcing \text{Teacher Forcing} Teacher Forcing的最初动机是为了在缺乏隐藏到隐藏连接的模型中避免通过时间反向传播。
    • 只要模型一个时间步的输出与下一时间步计算的值存在连接, Teacher Forcing \text{Teacher Forcing} Teacher Forcing仍然可以应用到这些存在隐藏到隐藏连接的模型。
    • 然而,只要隐藏单元成为较早时间步的函数, BPTT \text{BPTT} BPTT算法是必要的。
    • 因此训练某些模型时要同时使用 Teacher Forcing \text{Teacher Forcing} Teacher Forcing BPTT \text{BPTT} BPTT
  • 如果之后网络在开环 ( open-loop \text{open-loop} open-loop) 模式下使用,即网络输出(或输出分布的样本)反馈作为输入,那么 Teacher Forcing \text{Teacher Forcing} Teacher Forcing的缺点就会出现。
    • 在这种情况下,训练期间该网络看到的输入与测试时看到的会有很大的不同。
    • 减轻此问题的一种方法是同时使用 Teacher Forcing \text{Teacher Forcing} Teacher Forcing和自由运行的输入进行训练,例如在展开循环的输出到输入路径上预测几个步骤的正确目标值。
    • 通过这种方式,网络可以学会考虑在训练时没有接触到的输入条件(如自由运行模式下,自身生成自身),以及将状态映射回使网络几步之后生成正确输出的状态。
    • 另外一种方式 ( Bengio et al., 2015b \text{Bengio et al., 2015b} Bengio et al., 2015b) 是通过随意选择生成值或真实的数据值作为输入以减小训练时和测试时看到的输入之间的差别。
    • 这种方法利用了课程学习策略,逐步使用更多生成值作为输入。

计算循环神经网络的梯度

  • 计算循环神经网络的梯度是容易的。
  • 我们可以简单地将深度前馈网络之反向传播和其他的微分算法篇 - 一般化的反向传播中的推广反向传播算法应用于展开的计算图,而不需要特殊化的算法。
  • 由反向传播计算得到的梯度,并结合任何通用的基于梯度的技术就可以训练 RNN \text{RNN} RNN
  • 为了获得 BPTT \text{BPTT} BPTT算法行为的一些直观理解,我们举例说明如何通过BPTT计算上述 RNN \text{RNN} RNN公式(公式1公式5)的梯度。
    • 计算图的节点包括参数 U \boldsymbol{U} U V \boldsymbol{V} V W \boldsymbol{W} W b \boldsymbol{b} b c \boldsymbol{c} c,以及以 t t t 为索引的顺序节点 x ( t ) \boldsymbol{x}^{(t)} x(t) h ( t ) \boldsymbol{h}^{(t)} h(t) ο ( t ) \boldsymbol{\omicron}^{(t)} ο(t) L ( t ) L^{(t)} L(t)

    • 对于每一个节点 N \textbf{N} N,我们需要基于 N \textbf{N} N 后面的节点的梯度,递归地计算梯度 ∇ N L \nabla_{\textbf{N}}L NL

    • 我们从紧接着最终损失的节点开始递归: ∂ L ∂ L ( t ) = 1 \frac{\partial L}{\partial L^{(t)}}=1 L(t)L=1 — 公式10 \quad\textbf{---\footnotesize{公式10}} 10

    • 在这个导数中,我们假设输出 ο ( t ) \boldsymbol{\omicron}^{(t)} ο(t) 作为 softmax \text{softmax} softmax 函数的参数,我们可以从 softmax \text{softmax} softmax 函数可以获得关于输出概率的向量 y ^ \hat{\boldsymbol{y}} y^。我们也假设损失是迄今为止给定了输入后的真实目标 y ( t ) y^{(t)} y(t) 的负对数似然。对于所有 i i i t t t,关于时间步 t t t 输出的梯度 ∇ ο ( t ) L \nabla_{\boldsymbol{\omicron}^{(t)}}L ο(t)L如下:
      ( ∇ ο ( t ) L ) i = ∂ L ∂ ο i ( t ) = ∂ L ∂ L ( t ) ∂ L ( t ) ∂ ο i ( t ) = y ^ i ( t ) − 1 i , y ( t ) (\nabla_{\boldsymbol{\omicron}^{(t)}}L)_i=\frac{\partial L}{\partial \omicron_i^{(t)}}=\frac{\partial L}{\partial L^{(t)}} \frac{\partial L^{(t)}}{\partial \omicron_i^{(t)}}=\hat{y}_i^{(t)}-\boldsymbol{1}_{i,y^{(t)}} (ο(t)L)i=οi(t)L=L(t)Lοi(t)L(t)=y^i(t)1i,y(t) — 公式11 \quad\textbf{---\footnotesize{公式11}} 11

    • 我们从序列的末尾开始,反向进行计算。在最后的时间步 τ \tau τ h ( τ ) \boldsymbol{h}^{(\tau)} h(τ) 只有 ο τ \boldsymbol{\omicron}^{\tau} οτ 作为后续节点,因此这个梯度很简单:
      ∇ h ( τ ) L = V ⊤ ∇ ο ( τ ) L \nabla_{\boldsymbol{h}^{(\tau)}}L=\boldsymbol{V}^\top \nabla_{\boldsymbol{\omicron}^{(\tau)}}L h(τ)L=Vο(τ)L — 公式12 \quad\textbf{---\footnotesize{公式12}} 12

    • 然后,我们可以从时刻 t = τ − 1 t = \tau − 1 t=τ1 t = 1 t = 1 t=1 反向迭代,通过时间反向传播梯度,注意 h ( t ) ( t < τ ) \boldsymbol{h}^{(t)}(t < \tau) h(t)(t<τ) 同时具有 ο ( t ) \boldsymbol{\omicron}^{(t)} ο(t) h ( t + 1 ) \boldsymbol{h}^{(t+1)} h(t+1) 两个后续节点。因此,它的梯度由下式计算:
      { ∇ h ( t ) L = ( ∂ h ( t + 1 ) ∂ h ( t ) ) ⊤ ( ∇ h ( t + 1 ) L ) + ( ∂ ο ( t ) ∂ h ( t ) ) ⊤ ( ∇ ο ( t ) L ) — 公式13 = W ⊤ ( ∇ h ( t + 1 ) L ) diag ( 1 − ( h ( t + 1 ) ) 2 ) + V ⊤ ( ∇ ο ( t ) L ) — 公式14 \begin{cases}\begin{aligned}\nabla_{\boldsymbol{h}^{(t)}}L&=\left(\frac{\partial \boldsymbol{h}^{(t+1)}}{\partial \boldsymbol{h}^{(t)}}\right)^\top(\nabla_{\boldsymbol{h}^{(t+1)}}L)+(\frac{\partial \boldsymbol{\omicron}^{(t)}}{\partial \boldsymbol{h}^{(t)}})^\top(\nabla_{\boldsymbol{\omicron}^{(t)}}L) &\quad\textbf{---\footnotesize{公式13}}\\&=\boldsymbol{W}^\top(\nabla_{\boldsymbol{h}^{(t+1)}}L)\text{diag}\left(1-(\boldsymbol{h}^{(t+1)})^2\right)+\boldsymbol{V}^\top(\nabla_{\boldsymbol{\omicron}^{(t)}}L) &\quad\textbf{---\footnotesize{公式14}}\end{aligned}\end{cases} h(t)L=(h(t)h(t+1))(h(t+1)L)+(h(t)ο(t))(ο(t)L)=W(h(t+1)L)diag(1(h(t+1))2)+V(ο(t)L)1314 — 公式13 \quad\textbf{---\footnotesize{公式13}} 13 — 公式14 \quad\textbf{---\footnotesize{公式14}} 14

      • 其中 diag ( 1 − ( h ( t + 1 ) ) 2 ) \text{diag}\left(1-(\boldsymbol{h}^{(t+1)})^2\right) diag(1(h(t+1))2)表示包含元素 1 − ( h i ( t + 1 ) ) 2 1-(\boldsymbol{h}_i^{(t+1)})^2 1(hi(t+1))2的对角矩阵。
      • 这是关于时刻 t + 1 t+1 t+1与隐藏单元 i i i关联的双曲正切的 Jacobian \text{Jacobian} Jacobian
    • 一旦获得了计算图内部节点的梯度,我们就可以得到关于参数节点的梯度。

      • 因为参数在许多时间步共享,必须在表示这些变量的微积分操作时谨慎对待。
      • 我们希望实现的等式使用深度前馈网络之反向传播和其他的微分算法篇 - 一般化的反向传播中的 bprop \text{bprop} bprop 方法计算计算图中单一边对梯度的贡献。
      • 然而微积分中的 ∇ W f \nabla_{\boldsymbol{W}}f Wf 算子,计算 W \boldsymbol{W} W 对于 f f f 的贡献时将计算图中的所有边都考虑进去了。
      • 为了消除这种歧义,我们定义只在 t t t 时刻使用的虚拟变量 W ( t ) \boldsymbol{W}^{(t)} W(t) 作为 W \boldsymbol{W} W 的副本。
      • 然后,我们可以使用 ∇ W ( t ) \nabla_{\boldsymbol{W}^{(t)}} W(t) 表示权重在时间步 t t t 对梯度的贡献。
    • 使用这个表示,关于剩下参数的梯度可以由下式给出:
      { ∇ c L = ∑ t ( ∂ ο ( t ) ∂ c ) ⊤ ∇ ο ( t ) L = ∑ t ∇ ο ( t ) L — 公式15 ∇ b L = ∑ t ( ∂ h ( t ) ∂ b ) ⊤ ∇ h ( t ) L = ∑ t diag ( 1 − ( h ( t ) ) 2 ) ∇ h ( t ) L — 公式16 ∇ V L = ∑ t ∑ i ( ∂ L ∂ ο i ( t ) ) ∇ V ο i ( t ) = ∑ t ( ∇ ο ( t ) L ) h ( t ) ⊤ — 公式17 ∇ W L = ∑ t ∑ i ( ∂ L ∂ h i ( t ) ) ∇ W ( t ) h i ( t ) — 公式18 = ∑ t diag ( 1 − ( h ( t ) ) 2 ) ( ∇ h ( t ) L ) h ( t − 1 ) ⊤ — 公式19 ∇ U L = ∑ t ∑ i ( ∂ L ∂ h i ( t ) ) ∇ U ( t ) h i ( t ) — 公式20 = ∑ t diag ( 1 − ( h ( t ) ) 2 ) ( ∇ h ( t ) L ) x ( t ) ⊤ — 公式21 \begin{cases} \begin{aligned} \nabla_{\boldsymbol{c}}L&=\sum\limits_t\left(\frac{\partial \boldsymbol{\omicron}^{(t)}}{\partial \boldsymbol{c}}\right)^\top\nabla_{\boldsymbol{\omicron}^{(t)}}L=\sum\limits_t \nabla_{\boldsymbol{\omicron}^{(t)}}L &\quad\textbf{---\footnotesize{公式15}} \\ \nabla_{\boldsymbol{b}}L&=\sum\limits_t\left(\frac{\partial \boldsymbol{h}^{(t)}}{\partial \boldsymbol{b}}\right)^\top\nabla_{\boldsymbol{h}^{(t)}}L=\sum\limits_t \text{diag}\left(1-(\boldsymbol{h}^{(t)})^2\right) \nabla_{\boldsymbol{h}^{(t)}}L &\quad\textbf{---\footnotesize{公式16}} \\ \nabla_{\boldsymbol{V}}L&=\sum\limits_t\sum\limits_i \left(\frac{\partial L}{\partial \omicron_i^{(t)}}\right) \nabla_{\boldsymbol{V}}{\omicron_i^{(t)}}=\sum\limits_t(\nabla_{\boldsymbol{\omicron}^{(t)}}L)\boldsymbol{h}^{(t)^\top} &\quad\textbf{---\footnotesize{公式17}} \\ \nabla_{\boldsymbol{W}}L&=\sum\limits_t\sum\limits_i \left(\frac{\partial L}{\partial h_i^{(t)}} \right) \nabla_{\boldsymbol{W}^{(t)}}{h_i^{(t)}} &\quad\textbf{---\footnotesize{公式18}} \\ &=\sum\limits_t \text{diag}\left(1-(\boldsymbol{h}^{(t)})^2\right)(\nabla_{\boldsymbol{h}^{(t)}}L)\boldsymbol{h}^{(t-1)^\top} &\quad\textbf{---\footnotesize{公式19}} \\ \nabla_{\boldsymbol{U}}L&=\sum\limits_t\sum\limits_i \left(\frac{\partial L}{\partial h_i^{(t)}} \right) \nabla_{\boldsymbol{U}^{(t)}}{h_i^{(t)}} &\quad\textbf{---\footnotesize{公式20}} \\ &=\sum\limits_t \text{diag}\left(1-(\boldsymbol{h}^{(t)})^2\right)(\nabla_{\boldsymbol{h}^{(t)}}L)\boldsymbol{x}^{(t)^\top} &\quad\textbf{---\footnotesize{公式21}} \end{aligned} \end{cases} cLbLVLWLUL=t(cο(t))ο(t)L=tο(t)L=t(bh(t))h(t)L=tdiag(1(h(t))2)h(t)L=ti(οi(t)L)Vοi(t)=t(ο(t)L)h(t)=ti(hi(t)L)W(t)hi(t)=tdiag(1(h(t))2)(h(t)L)h(t1)=ti(hi(t)L)U(t)hi(t)=tdiag(1(h(t))2)(h(t)L)x(t)15161718192021

    • 因为计算图中定义的损失的任何参数都不是训练数据 x ( t ) \boldsymbol{x}^{(t)} x(t) 的父节点,所以我们不需要计算关于它的梯度。

作为有向图模型的循环网络

  • 目前为止,我们接触的循环网络例子中损失 L ( t ) L^{(t)} L(t) 是训练目标 y ( t ) \boldsymbol{y}^{(t)} y(t) 和输出 ο ( t ) \boldsymbol{\omicron}^{(t)} ο(t) 之间的交叉熵。
    • 与前馈网络类似,原则上循环网络几乎可以使用任何损失。
    • 但必须根据任务来选择损失。
    • 如前馈网络,我们通常希望将RNN的输出解释为一个概率分布,并且我们通常使用与分布相关联的交叉熵来定义损失。
    • 均方误差是与单位高斯分布的输出相关联的交叉熵损失,例如前馈网络中所使用的。
  • 当我们使用一个预测性对数似然的训练目标,如(公式5),我们将RNN训练为能够根据之前的输入估计下一个序列元素 y ( t ) \boldsymbol{y}^{(t)} y(t) 的条件分布。这可能意味着,我们最大化对数似然:
    log ⁡ p ( y ( t ) ∣ x ( 1 ) , … , x ( t ) ) \log p(\boldsymbol{y}^{(t)}|\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(t)}) logp(y(t)x(1),,x(t)) — 公式22 \quad\textbf{---\footnotesize{公式22}} 22
  • 或者,如果模型包括来自一个时间步的输出到下一个时间步的连接:
    log ⁡ p ( y ( t ) ∣ x ( 1 ) , … , x ( t ) , y ( 1 ) , … , y ( t − 1 ) ) \log p(\boldsymbol{y}^{(t)}|\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(t)},\boldsymbol{y}^{(1)},\dots,\boldsymbol{y}^{(t-1)}) logp(y(t)x(1),,x(t),y(1),,y(t1)) — 公式23 \quad\textbf{---\footnotesize{公式23}} 23
  • 将整个序列 y \boldsymbol{y} y 的联合分布分解为一系列单步的概率预测是捕获关于整个序列完整联合分布的一种方法。
    • 当我们不把过去的 y \boldsymbol{y} y 值反馈给下一步作为预测的条件时,那么有向图模型不包含任何从过去 y ( i ) \boldsymbol{y}^{(i)} y(i) 到当前 y ( t ) \boldsymbol{y}^{(t)} y(t) 的边。
    • 在这种情况下,输出 y \boldsymbol{y} y 与给定的 x \boldsymbol{x} x 序列是条件独立的。
    • 当我们反馈真实的 y \boldsymbol{y} y 值(不是它们的预测值,而是真正观测到或生成的值)给网络时,那么有向图模型包含所有从过去 y ( i ) \boldsymbol{y}^{(i)} y(i) 到当前 y ( t ) \boldsymbol{y}^{(t)} y(t) 的边。
  • 举一个简单的例子,让我们考虑对标量随机变量序列 Y = { y ( 1 ) , … , y ( τ ) } \mathbb{Y}=\{\text{y}^{(1)},\dots,\text{y}^{(\tau)}\} Y={y(1),,y(τ)} 建模的 RNN \text{RNN} RNN,也没有额外的输入 x \text{x} x
    • 在时间步 t t t 的输入仅仅是时间步 t − 1 t − 1 t1 的输出。
    • RNN \text{RNN} RNN定义了关于 y \text{y} y 变量的有向图模型。我们使用链式法则(用于条件概率的概率与信息论篇 - 链式法则)参数化这些观察值的联合分布:
      P ( Y ) = P ( y ( 1 ) , … , y ( τ ) ) = ∏ t = 1 τ P ( y ( t ) ∣ y ( t − 1 ) , y ( t − 2 ) , … , y ( 1 ) ) P(\mathbb{Y})=P(\textbf{y}^{(1)},\dots,\textbf{y}^{(\tau)})=\prod\limits_{t=1}^{\tau}P(\textbf{y}^{(t)}|\textbf{y}^{(t-1)},\textbf{y}^{(t-2)},\dots,\textbf{y}^{(1)}) P(Y)=P(y(1),,y(τ))=t=1τP(y(t)y(t1),y(t2),,y(1)) — 公式24 \quad\textbf{---\footnotesize{公式24}} 24
    • 其中当 t = 1 t = 1 t=1 时竖杠右侧显然为空。因此,根据这样一个模型,一组值 { y ( 1 ) , … , y ( τ ) } \{\text{y}^{(1)},\dots,\text{y}^{(\tau)}\} {y(1),,y(τ)}的负对数似然为:
      L = ∑ t L ( t ) L=\sum\limits_tL^{(t)} L=tL(t) — 公式25 \quad\textbf{---\footnotesize{公式25}} 25
    • 其中, L ( t ) = − log ⁡ P ( y ( t ) = y ( t ) ∣ y ( t − 1 ) , y ( t − 2 ) , … , y ( 1 ) ) L^{(t)}=-\log P(\text{y}^{(t)}={y}^{(t)}|y^{(t-1)},y^{(t-2)},\dots,y^{(1)}) L(t)=logP(y(t)=y(t)y(t1),y(t2),,y(1)) — 公式26 \quad\textbf{---\footnotesize{公式26}} 26
  • 图模型中的边表示哪些变量直接依赖于其他变量。
    • 许多图模型的目标是省略不存在强相互作用的边以实现统计和计算的效率。
    • 例如,我们通常可以作 Markov \text{Markov} Markov假设,即图模型应该只包含从 { y ( t − k ) , … , y ( t − 1 ) } \{\text{y}^{(t-k)},\dots,\text{y}^{(t-1)}\} {y(tk),,y(t1)} y ( t ) \text{y}^{(t)} y(t) 的边,而不是包含整个过去历史的边。
    • 然而,在一些情况下,我们认为整个过去的输入会对序列的下一个元素有一定影响。
    • 当我们认为 y ( t ) \text{y}^{(t)} y(t) 的分布可能取决于遥远过去 (在某种程度) 的 y ( i ) \text{y}^{(i)} y(i) 的值,且无法通过 y ( t − 1 ) \text{y}^{(t-1)} y(t1) 捕获 y ( i ) \text{y}^{(i)} y(i) 的影响时, RNN \text{RNN} RNN将会很有用。
  • 解释 RNN \text{RNN} RNN作为图模型的一种方法是将 RNN \text{RNN} RNN视为定义一个结构为完全图的图模型,且能够表示任何一对 y \text{y} y 值之间的直接联系。
    • 图例5是关于 y \text{y} y 值且具有完全图结构的图模型。
    • RNN \text{RNN} RNN完全图的解释基于排除并忽略模型中的隐藏单元 h ( t ) \boldsymbol{h}^{(t)} h(t)
  • 更有趣的是,将隐藏单元 h ( t ) \boldsymbol{h}^{(t)} h(t) 视为随机变量,从而产生 RNN \text{RNN} RNN 图 模 型 结 构 1 图模型结构^1 1
    • 在图模型中包括隐藏单元预示 RNN \text{RNN} RNN能对观测的联合分布提供非常有效的参数化。
    • 假设我们用表格表示法来表示离散值上任意的联合分布,即对每个值可能的赋值分配一个单独条目的数组,该条目表示发生该赋值的概率。
    • 如果 y y y 可以取 k k k 个不同的值,表格表示法将有 O ( k τ ) \Omicron(k^\tau) O(kτ) 个参数。对比 RNN \text{RNN} RNN,由于参数共享, RNN \text{RNN} RNN的参数数目为 O ( 1 ) \Omicron(1) O(1)且是序列长度的函数。
    • 我们可以调节 RNN \text{RNN} RNN的参数数量来控制模型容量,但不用被迫与序列长度成比例。
    • 展开计算图篇 - 公式5)展示了所述 RNN \text{RNN} RNN通过循环应用相同的函数 f f f 以及在每个时间步的相同参数 θ \boldsymbol{\theta} θ,有效地参数化的变量之间的长期联系。
    • 图例6说明了这个图模型的解释。
    • 在图模型中结合 h ( t ) \boldsymbol{h}^{(t)} h(t) 节点可以用作过去和未来之间的中间量,从而将它们解耦。遥远过去的变量 y ( i ) y^{(i)} y(i) 可以通过其对 h \boldsymbol{h} h 的影响来影响变量 y ( t ) y^{(t)} y(t)
    • 该图的结构表明可以在时间步使用相同的条件概率分布有效地参数化模型,并且当观察到全部变量时,可以高效地评估联合分配给所有变量的概率。
  • 即便使用高效参数化的图模型,某些操作在计算上仍然具有挑战性。例如,难以预测序列中缺少的值。
  • 循环网络为减少的参数数目付出的代价是优化参数可能变得困难。
  • 在循环网络中使用的参数共享依赖于相同参数可用于不同时间步的假设。
    • 等效地,假设给定时刻 t t t 的变量后,时刻 t + 1 t+1 t+1 变量的条件概率分布是平稳的 ( stationary \text{stationary} stationary),这意味着之前的时间步与下个时间步之间的关系并不依赖于 t t t
    • 原则上,可以使用 t t t作为每个时间步的额外输入,并让学习器在发现任何时间依赖性的同时,在不同时间步之间尽可能多地共享。
    • 相比在每个 t t t 使用不同的条件概率分布已经好很多了,但网络将必须在面对新 t t t 时进行推断。
  • 为了完整描述将 RNN \text{RNN} RNN作为图模型的观点,我们必须描述如何从模型采样。
    • 我们需要执行的主要操作是简单地从每一时间步的条件分布采样。
    • 然而,这会导致额外的复杂性。
    • RNN \text{RNN} RNN必须有某种机制来确定序列的长度。
    • 这可以通过多种方式实现。
  • 在当输出是从词汇表获取的符号的情况下,我们可以添加一个对应于序列末端的特殊符号 ( Schmidhuber, 2012 \text{Schmidhuber, 2012} Schmidhuber, 2012)。当产生该符号时,采样过程停止。在训练集中,我们将该符号作为序列的一个额外成员,即紧跟每个训练样本 x ( τ ) \boldsymbol{x}^{(\tau)} x(τ)之后。
  • 另一种选择是在模型中引入一个额外的 Bernoulli \text{Bernoulli} Bernoulli输出,表示在每个时间步决定继续或停止。
    • 相比向词汇表增加一个额外符号,这种方法更普遍,因为它适用于任何 RNN \text{RNN} RNN,而不仅仅是输出符号序列的 RNN \text{RNN} RNN
    • 例如,它可以应用于一个产生实数序列的 RNN \text{RNN} RNN
    • 新的输出单元通常使用 sigmoid \text{sigmoid} sigmoid单元,并通过交叉熵训练。
    • 在这种方法中, sigmoid \text{sigmoid} sigmoid被训练为最大化正确预测的对数似然,即在每个时间步序列决定结束或继续。
  • 确定序列长度 τ \tau τ 的另一种方法是将一个额外的输出添加到模型并预测整数 τ \tau τ 本身。
    • 模型可以采出 τ \tau τ 的值,然后采 τ \tau τ 步有价值的数据。
    • 这种方法需要在每个时间步的循环更新中增加一个额外输入,使得循环更新知道它是否是靠近所产生序列的末尾。
    • 这种额外的输入可以是 τ \tau τ 的值,也可以是 τ − t \tau-t τt 即剩下时间步的数量。
    • 如果没有这个额外的输入, RNN \text{RNN} RNN可能会产生突然结束序列,如一个句子在最终完整前结束。
    • 此方法基于分解:
      P ( x ( 1 ) , … , x ( τ ) ) = P ( τ ) P ( x ( 1 ) , … , x ( τ ) ∣ τ ) P(\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(\tau)})=P(\tau)P(\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(\tau)}|\tau) P(x(1),,x(τ))=P(τ)P(x(1),,x(τ)τ) — 公式27 \quad\textbf{---\footnotesize{公式27}} 27
      直接预测 τ \tau τ 的例子见 Goodfellow et al. (2014d) \text{Goodfellow et al. (2014d)} Goodfellow et al. (2014d)

注1:给定这些变量的父变量,其条件分布是确定性的。尽管设计具有这样确定性的隐藏单元的图模型是很少见的,但这是完全合理的。


基于上下文的RNN序列建模

  • 作为有向图模型的循环网络描述了没有输入 x \boldsymbol{x} x 时,关于随机变量序列 y ( t ) y^{(t)} y(t) RNN \text{RNN} RNN如何对应于有向图模型。
    • 当然,如式(10.8)所示的RNN包含一个输入序列 x ( 1 ) , x ( 2 ) , … , x ( τ ) \boldsymbol{x}^{(1)},\boldsymbol{x}^{(2)},\dots,\boldsymbol{x}^{(\tau)} x(1),x(2),,x(τ)
    • 一般情况下, RNN \text{RNN} RNN允许将图模型的观点扩展到不仅代表 y y y 变量的联合分布也能表示给定 x \boldsymbol{x} x y y y 条件分布。
    • 如在深度前馈网络之基于梯度的学习篇 - 用最大拟然学习条件分布的前馈网络情形中所讨论的,任何代表变量 P ( y ; θ ) P(\boldsymbol{y};\boldsymbol{\theta}) P(y;θ) 的模型都能被解释为代表条件分布 P ( y ∣ ω ) P(\boldsymbol{y}|\boldsymbol{\omega}) P(yω) 的模型,其中 ω = θ \boldsymbol{\omega}=\boldsymbol{\theta} ω=θ
    • 我们能像之前一样使用 P ( y ∣ ω ) P(\boldsymbol{y}|\boldsymbol{\omega}) P(yω) 代表分布 P ( y ∣ x ) P(\boldsymbol{y}|\boldsymbol{x}) P(yx) 来扩展这样的模型,但要令 ω \boldsymbol{\omega} ω 是关于 x \boldsymbol{x} x 的函数。
    • RNN \text{RNN} RNN的情况,这可以通过不同的方式来实现。此处,我们回顾最常见和最明显的选择。
  • 之前,我们已经讨论了将 t = 1 , … , τ t=1,\dots,\tau t=1,,τ的向量 x ( t ) \boldsymbol{x}^{(t)} x(t) 序列作为输入的 RNN \text{RNN} RNN。另一种选择是只使用单个向量 x \boldsymbol{x} x 作为输入。当 x \boldsymbol{x} x 是一个固定大小的向量,我们可以简单地将其看作产生 y \boldsymbol{y} y 序列 RNN \text{RNN} RNN的额外输入。将额外输入提供到 RNN \text{RNN} RNN的一些常见方法是:
    • 在每个时刻作为一个额外输入,或
    • 作为初始状态 h ( 0 ) \boldsymbol{h}^{(0)} h(0),或
    • 结合两种方式。
  • 第一个也是最常用的方法如图例7所示。
    • 输入 x \boldsymbol{x} x 和每个隐藏单元向量 h ( t ) \boldsymbol{h}^{(t)} h(t) 之间的相互作用通过新引入的权重矩阵 R \boldsymbol{R} R 参数化的,这是只包含 y y y 序列的模型所没有的。
    • 同样的乘积 x ⊤ R \boldsymbol{x}^\top\boldsymbol{R} xR 在每个时间步作为隐藏单元的一个额外输入。
    • 我们可以认为 x \boldsymbol{x} x的选择(确定 x ⊤ R \boldsymbol{x}^\top\boldsymbol{R} xR 值),是有效地用于每个隐藏单元的一个新偏置参数。
    • 权重与输入保持独立。
    • 我们可以把这种模型视为采用非条件模型的 θ \boldsymbol{\theta} θ 并使之成为 ω \boldsymbol{\omega} ω,其中 ω \boldsymbol{\omega} ω内的偏置参数现在是输入的函数。
  • RNN \text{RNN} RNN可以接收向量序列 x ( t ) \boldsymbol{x}^{(t)} x(t) 作为输入,而不是仅接收单个向量 x \boldsymbol{x} x 作为输入。(公式1)描述的 RNN \text{RNN} RNN对应条件分布 P ( y ( 1 ) , … , y ( τ ) ) P(\boldsymbol{y}^{(1)},\dots,\boldsymbol{y}^{(\tau)}) P(y(1),,y(τ)),并在条件独立的假设下这个分布分解为:
    ∏ t P ( y ( t ) ∣ x ( 1 ) , … , x ( t ) ) \prod\limits_tP(\boldsymbol{y}^{(t)}|\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(t)}) tP(y(t)x(1),,x(t)) — 公式28 \quad\textbf{---\footnotesize{公式28}} 28
  • 为去掉条件独立的假设,我们可以在时刻 t t t 的输出到时刻 t + 1 t + 1 t+1 的隐藏单元添加连接,如图例8所示。该模型就可以代表关于 y \boldsymbol{y} y 序列的任意概率分布。这种给定一个序列表示另一个序列分布的模型的还是有一个限制,就是这两个序列的长度必须是相同的。我们将在后续篇章:基于编码/解码的序列到序列架构中描述如何消除这种限制。

  • 图例1:计算循环网络(将 x \boldsymbol{x} x 值的输入序列映射到输出值 ο \omicron ο 的对应序列) 训练损失的计算图。
    • 计算循环网络(将 x \boldsymbol{x} x 值的输入序列映射到输出值 ο \omicron ο 的对应序列) 训练损失的计算图。
      在这里插入图片描述

    • 说明:

      • 损失 L L L 衡量每个 ο \omicron ο 与相应的训练目标 y \boldsymbol{y} y 的距离。
      • 当使用 softmax \text{softmax} softmax 输出时,我们假设 ο \omicron ο 是未归一化的对数概率。
      • 损失 L L L 内部计算 y ^ = softmax ( x ) \hat{\boldsymbol{y}}=\text{softmax}(\boldsymbol{x}) y^=softmax(x),并将其与目标 y \boldsymbol{y} y 比较。
      • RNN \text{RNN} RNN输入到隐藏的连接由权重矩阵 U \boldsymbol{U} U 参数化,隐藏到隐藏的循环连接由权重矩阵 W \boldsymbol{W} W 参数化以及隐藏到输出的连接由权重矩阵 V \boldsymbol{V} V 参数化。
      • 公式1定义了该模型中的前向传播。
      • 左图:使用循环连接绘制的 RNN \text{RNN} RNN和它的损失。
      • 右图:同一网络被视为展开的计算图,其中每个节点现在与一个特定的时间实例相关联。

  • 图例2:此类 RNN \text{RNN} RNN的唯一循环是从输出到隐藏层的反馈连接。
    • 此类 RNN \text{RNN} RNN的唯一循环是从输出到隐藏层的反馈连接。
      在这里插入图片描述

    • 说明:

      • 在每个时间步 t t t,输入为 x t \boldsymbol{x}_t xt, 隐藏层激活为 h ( t ) \boldsymbol{h}^{(t)} h(t),输出为 ο ( t ) \boldsymbol{\omicron}^{(t)} ο(t),目标为 y ( t ) \boldsymbol{y}^{(t)} y(t),损失为 L ( t ) L^{(t)} L(t)
      • 左图:回路原理图。
      • 右图:展开的计算图。
      • 这样的 RNN \text{RNN} RNN没有图例1表示的 RNN \text{RNN} RNN 那样强大(只能表示更小的函数集合)。
      • 图例1中的 RNN \text{RNN} RNN可以选择将其想要的关于过去的任何信息放入隐藏表示 h \boldsymbol{h} h 中并且将 h \boldsymbol{h} h 传播到未来。
      • 该图中的 RNN \text{RNN} RNN被训练为将特定输出值放入 ο \boldsymbol{\omicron} ο 中,并且 ο \boldsymbol{\omicron} ο 是允许传播到未来的唯一信息。
      • 此处没有从 h \boldsymbol{h} h 前向传播的直接连接。
      • 之前的 h \boldsymbol{h} h 仅通过产生的预测间接地连接到当前。
      • ο \boldsymbol{\omicron} ο 通常缺乏过去的重要信息,除非它非常高维且内容丰富。
      • 这使得该图中的 RNN \text{RNN} RNN不那么强大,但是它更容易训练,因为每个时间步可以与其他时间步分离训练,允许训练期间更多的并行化,如Teacher Forcing和输出循环网络所述。


  • 图例4: Teacher Forcing \text{Teacher Forcing} Teacher Forcing的示意图。
    • Teacher Forcing \text{Teacher Forcing} Teacher Forcing的示意图。
      在这里插入图片描述

    • 说明:

      • Teacher Forcing \text{Teacher Forcing} Teacher Forcing是一种训练技术,适用于输出与下一时间步的隐藏状态存在连接的 RNN \text{RNN} RNN
      • 左图:训练时,我们将训练集中正确的输出 y ( t ) \boldsymbol{y}^{(t)} y(t) 反馈到 h ( t + 1 ) \boldsymbol{h}^{(t+1)} h(t+1)
      • 右图:当模型部署后,真正的输出通常是未知的。在这种情况下,我们用模型的输出 ο ( t ) \boldsymbol{\omicron}^{(t)} ο(t) 近似正确的输出 y ( t ) \boldsymbol{y}^{(t)} y(t),并反馈回模型。




总结

循环神经网络以其强大的序列处理能力,在序列建模领域展现出了卓越的性能。其独特的循环结构赋予了网络记忆能力,使得网络能够在处理序列数据时保持对历史的敏感性和连续性。通过不断的学习和训练, RNN \text{RNN} RNN能够学习到序列数据中的复杂模式和规律,为自然语言处理、时间序列分析等领域带来了革命性的变化。然而, RNN \text{RNN} RNN也面临着梯度消失或爆炸等问题,限制了其在处理长序列时的性能。随着研究的深入和技术的发展,新的网络架构和优化方法不断涌现,为 RNN \text{RNN} RNN的进一步应用提供了更加广阔的空间。

往期内容回顾

序列建模之循环和递归网络 - 展开计算图篇
深度网络现代实践 - 深度前馈网络之反向传播和其他的微分算法篇
深度网络现代实践 - 深度前馈网络之反向传播和其他的微分算法篇-续
应用数学与机器学习基础 - 概率与信息论篇
深度网络现代实践 - 深度前馈网络之基于梯度的学习篇

  • 32
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绎岚科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值