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

序言

在探索序列数据的深层规律时,循环神经网络( 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和输出循环网络

计算循环神经网络的梯度

  • 计算循环神经网络的梯度是容易的。
  • 我们可以简单地将深度前馈网络之反向传播和其他的微分算法篇 - 一般化的反向传播中的推广反向传播算法应用于展开的计算图,而不需要特殊化的算法。
  • 由反向传播计算得到的梯度,并结合任何通用的基于梯度的技术就可以训练 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序列建模


  • 图例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和输出循环网络所述。

  • 图例3:关于时间展开的循环神经网络,在序列结束时具有单个输出。
    • 关于时间展开的循环神经网络,在序列结束时具有单个输出。
      在这里插入图片描述

    • 说明:

      • 这样的网络可以用于概括序列并产生用于进一步处理的固定大小的表示。
      • 在结束处可能存在目标(如此处所示),或者通过更下游模块的反向传播来获得输出 ο ( t ) \boldsymbol{\omicron}^{(t)} ο(t) 上的梯度。

  • 图例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),并反馈回模型。


  • 图例6:在 RNN \text{RNN} RNN图模型中引入状态变量的示意图。
    • RNN \text{RNN} RNN图模型中引入状态变量的示意图。
      在这里插入图片描述

    • 说明:

      • 尽管它是输入的确定性函数,但它有助于我们根据式(展开计算图篇 - 公式5)获得非常高效的参数化。
      • 序列中的每个阶段(对于 h ( t ) \boldsymbol{h}^{(t)} h(t) y ( t ) \boldsymbol{y}^{(t)} y(t))使用相同的结构(每个节点具有相同数量的输入),并且可以与其他阶段共享相同的参数。


总结

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

往期内容回顾

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400798.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

winform 大头针实现方法——把窗口钉在最上层

平时我们再使用成熟的软件的时候&#xff0c;会发现有个大头针的功能挺不错的。就是点一下大头针&#xff0c;窗口就会钉住&#xff0c;一直保持在最上面一层&#xff0c;这样可以一边设置参数&#xff0c;一边观察这个窗口里面的变化&#xff0c;比较方便。下面我就来简单实现…

移动APP测试有哪些注意事项?专业APP测试报告如何获取?

移动APP在其生命周期中有不同的阶段&#xff0c;从开始到投入目标市场再到被淘汰。移动APP的成功有多种因素&#xff0c;例如创建、部署、推广、粘性等。但是&#xff0c;创建出色APP的关键在于它的测试&#xff0c;软件测试负责为客户提供安全有效的产品&#xff0c;因此移动A…

大数据-83 Spark 集群 RDD编程简介 RDD特点 Spark编程模型介绍

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Golang 与 Java:编程语言比较及如何选择

Golang 与 Java&#xff1a;哪种语言更好&#xff1f;我们的详细比较指南涵盖了语法、性能和流行度方面的主要差异&#xff0c;以帮助您做出决定。 在规划项目时&#xff0c;有许多编程语言可供选择。但一开始就选择正确的语言是成功启动或交付的关键。选择错误的语言&#xff…

Apache Tomcat 信息泄露漏洞排查处理CVE-2024-21733)

一、漏洞描述 Apache Tomcat作为一个流行的开源Web服务器和Java Servlet容器并用于很多中小型项目的开发中。其中,Coyote作为Tomcat的连接器组件,是Tomcat服务器提供的供客户端访问的外部接口,客户端通过Coyote与服务器建立链接、发送请求并且接收响应。 近日发现Apache To…

【python】OpenCV—Optical Flow

文章目录 1、光流2、Opencv 中光流的实现3、稀疏光流4、密集光流4.1、farneback4.2、lucaskanade_dense4.3、rlof 5、涉及到的库5.1、cv2.goodFeaturesToTrack5.2、cv2.calcOpticalFlowPyrLK5.3、cv2.optflow.calcOpticalFlowSparseToDense5.4、cv2.calcOpticalFlowFarneback5.…

CentOS7.9上通过KVM安装Centos虚拟机

目录 1 开发前准备&#xff08;先确保服务器可以虚拟化&#xff09;&#xff1a; 2、安装KWM环境 3、创建镜像文件存放目录 4、创建镜像文件存放目录 5、安装桥连接虚拟网络 6、安装虚拟机 7、配置操作系统 8、虚拟机配置网卡地址 9、克隆虚拟机执行 1开发前准备&am…

Unity教程(十)Tile Palette搭建平台关卡

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

IDEA 创建类时自动生成注释

一、背景 在开发的过程中&#xff0c;公司都会要求开发针对自己创建的类进行一些描述说明&#xff0c;为了便于程序员在创建类时快速生成注释。 二、如何配置? 打开File -> Settings -> Editor -> File and Code Templates -> Includes&#xff0c;在File Header…

Unity新输入系统结构概览

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 在学习新输入系统之前&#xff0c;我们需要对其构成有个印象 1.输入动作&#xff08;Inputaction&#xff09; 是定义输…

一次caffeine引起的CPU飙升问题

背景 背景是上游服务接入了博主团队提供的sdk&#xff0c;已经长达3年&#xff0c;运行稳定无异常&#xff0c;随着最近冲业绩&#xff0c;流量越来越大&#xff0c;直至某一天&#xff0c;其中一个接入方&#xff08;流量很大&#xff09;告知CPU在慢慢上升且没有回落的迹象&…

2分钟搭建一个简单的WebSocket服务器

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注。个人知乎 如何用2分钟在本地搭建一个简单的 WebSocket 服务器&#xff1f;其实使用 Node.js&#xff0c;加上一些流行的库&#xff0c;是很容易实现的。前端同学通过自己搭建 WebSocket 服务器&#xff0c;对于…

百问网全志系列开发板音频ALSA配置步骤详解

8 ALSA 8.1 音频相关概念 ​ 音频信号是一种连续变化的模拟信号&#xff0c;但计算机只能处理和记录二进制的数字信号&#xff0c;由自然音源得到的音频信号必须经过一定的变换&#xff0c;成为数字音频信号之后&#xff0c;才能送到计算机中作进一步的处理。 ​ 数字音频系…

系统重装简记

写在文章开头 因为固态损毁而更换固态&#xff0c;所以需要进行系统重装&#xff0c;由于系统重装都是固定的繁琐的步骤&#xff0c;所以就以这篇文章来记录一下系统重装的一些日常步骤&#xff0c;希望对你有帮助。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核…

《Linux运维总结:基于x86_64架构CPU使用docker-compose一键离线部署etcd 3.5.15容器版分布式集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面对不同的客户部署业务系统&#xff0…

【网编】——UDP编程

宏观操作 服务器&#xff1a;socket创套接字—bind绑定连接—recvfrom接收数据/sendto发送数据 客户端&#xff1a;socket创套接字—sendto发送数/recvfrom接收数据—close关闭套接字 函数 recv ssize_t recvfrom ( int sockfd , void * buf , size_t len , int flags , str…

链接Mysql 报错connection errors; unblock with ‘mysqladmin flush-hosts‘错误的解决方法!亲测有效!

文章目录 前言一、使用 mysqladmin flush-hosts 命令解锁 IP 地址二、增加 max_connect_errors 参数三、检查连接错误的原因 前言 今天正常的对各大的测试服进行重启的时候发现每台服务器都启动失败&#xff01;查看日志发现每台服务器都报一下的错误 java.sql.SQLException:…

【学习笔记】Day 13

一、进度概述 1、《地震勘探原理》第六章 二、详情 个人感觉第五&#xff0c;六&#xff0c;八章的解释更倾向于地质学那边负责的&#xff0c;但是多了解相关原理&#xff0c;肯定是有利于 DL-FWI 的相关研究的&#xff0c;所以这里只是做一个粗略的归纳&#xff0c;相关内容详…

android车载手机互联投屏新专题-实战作业布置

背景&#xff1a; 学习了马哥的投屏实战开发课程后&#xff0c;大家都可以实现如下图一样的手机车机多端互联的投屏场景。 即已经实现了手机和车机投屏互动&#xff0c;车机上手机画面屏幕可以与手机实体屏幕一样就是常见的Mirror模式&#xff0c;如果不一样就是课程里面讲的扩…

【策略模式】设计模式系列:在Java中实现灵活的行为选择(实战指南)

文章目录 策略模式&#xff1a;在Java中实现灵活的行为选择引言1. 策略模式的组成1.1 抽象策略 (Strategy)1.2 具体策略 (Concrete Strategy)1.3 上下文 (Context)1.4 UML类图和时序图 2. 策略模式在Java中的实现步骤一&#xff1a;定义抽象策略接口步骤二&#xff1a;创建具体…