循环神经网络

介绍循环神经网络的基本概念,包括RNN的结构、训练方法、长短期记忆网络(LSTM)及门控循环单元(GRU)等内容

基本概念

  • FNN、CNN 处理序列数据的局限性
    • 只适合:图片分类、识别等任务
    • 不适合:连续数据处理,与时间有关数据(序列依赖关系)
      • 比如语音、文本、视频、金融数据(股票波动)
      • 整个数据由若干同类型单元组成,称为 “帧”,如音素、字词、每帧图像
      • 帧与帧之间存在相互依赖关系,不再满足独立性假设, 需要考虑数据前后位置关系
    • 无法处理变长度数据
      • 全部或者部分丧失数据之间前后依赖性
      • 单次处理数据长度不能过长,容易引起参数爆炸

循环神经网络(Recurrent Neural Network, RNN)

  • 给定输入序列 X=[x1,x2,…,xT]X = [x_1, x_2, \dots, x_T],RNN 的计算过程为:
    • 输入层:序列中的每个时间步 tt,输入 xtx_t

    • 隐藏层:每个时间步的隐藏状态 hth_t 根据当前输入 xtx_t 和前一时间步的隐藏状态 ht−1h_{t-1} 计算:

      ht=f(Whx⋅xt+Whh⋅ht−1+bh)h_t = f (W_{hx} \cdot x_t + W_{hh} \cdot h_{t-1} + b_h)
      • WhxW_{hx}:输入到隐藏层的权重矩阵
      • WhhW_{hh}:隐藏层到隐藏层的权重矩阵(时间共享)
      • bhb_h:隐藏层的偏置。
      • ff:激活函数(如 tanh 或 ReLU)
    • 输出层:计算每个时间步的输出 yty_t:

      yt=g(Why⋅ht+by)y_t = g (W_{hy} \cdot h_t + b_y)
      • WhyW_{hy}:隐藏层到输出层的权重矩阵
      • gg:输出激活函数(如 softmax 或 sigmoid)

双向循环神经网络

  • 基本思想

    • 普通 RNN 只能利用序列的过去信息(即从 t=1t=1 到 t=Tt=T 的顺序)
    • BiRNN 在同一时间步 tt 同时考虑:
      • 前向 RNN:从 t=1t=1 到 t=Tt=T 的正向传播
      • 后向 RNN:从 t=Tt=T 到 t=1t=1 的反向传播
    • 最终输出结合两种方向的信息
  • 每个时间步 tt 的隐藏状态为:ht=[htf;htb]h_t = [h_t^f; h_t^b]

    • htfh_t^f:前向隐藏状态
    • htbh_t^b:后向隐藏状态
    • 输出 yty_t 结合了前向和后向隐藏状态的信息
  • 给定输入序列 X=[x1,x2,…,xT]X = [x_1, x_2, \dots, x_T]

    • 前向 RNN:htf=f(Whxf⋅xt+Whhf⋅ht−1f+bhf)h_t^f = f (W_{hx}^f \cdot x_t + W_{hh}^f \cdot h_{t-1}^f + b_h^f)

    • 后向 RNN:htb=f(Whxb⋅xt+Whhb⋅ht+1b+bhb)h_t^b = f (W_{hx}^b \cdot x_t + W_{hh}^b \cdot h_{t+1}^b + b_h^b)

    • 输出层:每个时间步的输出 yt=g(Why⋅[htf;htb]+by)y_t = g (W_{hy} \cdot [h_t^f; h_t^b] + b_y)

  • 基本循环神经网络和双向神经网络:只有单个隐藏层,不能很好学习数据内部关系

  • Deep(Bidirectional)RNN:叠加多个隐藏层,即在每个时刻会有多个隐藏层,有更强学习能力,但需要更多训练数据

  • 循环神经网络训练算法 —— 基于时间的反向传播 BPTT(Back-Propagation Through Time)

  • 优化问题

    • RNN 循环神经网络在时间维度上非常深,导致在训练中很容易发生梯度爆炸和梯度消失问题
    • 训练时梯度不能在较长序列中一直传递下去,从而使 RNN 无法捕捉到长距离的影响
  • 正则化方法(Dropout)

RNN 的架构类型

架构类型输入形态输出形态应用场景特点
一对一单一输入 xx单一输出 yy图像分类无时间维度,类似传统神经网络
一对多单一输入 xx序列输出 [y1,…,yT][y_1, \dots, y_T]图像描述生成单一输入扩展为序列输出,常结合解码器使用
多对一序列输入 [x1,…,xT][x_1, \dots, x_T]单一输出情感分析、分类将输入序列压缩为单一结果,依赖隐藏状态捕捉序列信息
多对多 (定长)序列输入序列输出视频帧分类、同步时间序列处理输入和输出长度相同,适合逐时间步预测
多对多 (变长)序列输入序列输出机器翻译、对话生成Encoder-Decoder/Seq2Seq;编码器提取上下文向量,解码器生成序列输出
长短期记忆网络 (LSTM)序列输入灵活长期时间序列预测通过记忆单元和门机制缓解梯度消失问题
门控循环单元 (GRU)序列输入灵活长距离依赖建模结构更简洁,效率更高,但效果与 LSTM 相近

LSTM

LSTM

  • 公式:假设当前输入为 xtx_t,前一时刻的隐藏状态和记忆单元状态分别为 ht−1h_{t-1} 和 ct−1c_{t-1}

    • 遗忘门(Forget Gate):决定当前时刻哪些信息需要从记忆单元中删除

      ft=σ(Wf⋅[ht−1,xt]+bf)f_t = \sigma (W_f \cdot [h_{t-1}, x_t] + b_f)
      • ft∈[0,1]f_t \in [0, 1]:表示是否保留记忆单元中信息的比例
    • 输入门(Input Gate):决定当前输入信息的重要性,并选择性地将其添加到记忆单元

      it=σ(Wi⋅[ht−1,xt]+bi)i_t = \sigma (W_i \cdot [h_{t-1}, x_t] + b_i)
      • it∈[0,1]i_t \in [0, 1]:表示当前输入的重要程度
    • 候选记忆单元状态:

      c~t=tanh⁡(Wc⋅[ht−1,xt]+bc)\tilde {c}_t = \tanh (W_c \cdot [h_{t-1}, x_t] + b_c)
      • c~t\tilde {c}_t:表示当前输入的候选记忆信息
    • 更新记忆单元状态(Cell State):用来存储长期的上下文信息

      ct=ft⊙ct−1+it⊙c~tc_t = f_t \odot c_{t-1} + i_t \odot \tilde {c}_t
      • ctc_t:结合过去的记忆和当前的输入,更新记忆单元状态
    • 输出门(Output Gate):决定从记忆单元中读取哪些信息作为当前的隐藏状态输出

      ot=σ(Wo⋅[ht−1,xt]+bo)o_t = \sigma (W_o \cdot [h_{t-1}, x_t] + b_o)
      • ot∈[0,1]o_t \in [0, 1]:表示当前记忆单元中哪些信息用于生成隐藏状态
    • 隐藏状态:

      ht=ot⊙tanh⁡(ct)h_t = o_t \odot \tanh (c_t)
      • hth_t:作为当前时刻的输出信息
  • 综述所述,LSTM 公式可描述如下

    [c~totitft]=[tanh⁡σσσ](xtht−1)+bct=ft⊙ct−1+it⊙c~tht=ot⊙tanh⁡(ct)\begin {align*} \begin {bmatrix} \tilde {c}_t \\ o_t \\ i_t \\ f_t \end {bmatrix} &= \begin {bmatrix} \tanh \\ \sigma \\ \sigma \\ \sigma \end {bmatrix} \begin {pmatrix} \mathbf {x}_t \\ \mathbf {h}_{t-1} \end {pmatrix} + \mathbf {b} \\ c_t &= f_t \odot c_{t-1} + i_t \odot \tilde {c}_t\\ h_t &= o_t \odot \tanh (c_t) \end {align*}

GRU

GRU

  • GRU 比 LSTM 网络更简单的循环神经网络

    • LSTM 中引入三个门函数控制输入值、记忆值和输出值,参数较多,训练起来比较困难
    • 遗忘门和输入门合并成更新门,另外多一个重置门
    • 不需要计算额外的内部状态 cc,在当前状态 hth_t 和历史状态 ht−1h_{t-1} 之间引入线性依赖关系
  • 公式:假设当前时刻的输入为 xtx_t,上一时刻的隐藏状态为 ht−1h_{t-1}

    • 更新门:控制当前时刻的隐藏状态中有多少信息需要从上一时刻传递,以及有多少新信息需要添加

      zt=σ(Wz⋅[ht−1,xt]+bz)z_t = \sigma (W_z \cdot [h_{t-1}, x_t] + b_z)
      • zt∈[0,1]z_t \in [0, 1]:更新门的输出,表示上一时刻的隐藏状态与当前时刻的输入的权重
    • 重置门:决定丢弃多少过去的记忆,从而有选择性地 “重置” 上一时刻的隐藏状态

      rt=σ(Wr⋅[ht−1,xt]+br)r_t = \sigma (W_r \cdot [h_{t-1}, x_t] + b_r)
      • rt∈[0,1]r_t \in [0, 1]:重置门的输出,控制当前时刻如何利用上一时刻的隐藏状态
    • 候选隐藏状态:将记忆直接集成到隐藏状态 hth_t 中,结构更为简单

      h~t=tanh⁡(Wh⋅[rt⊙ht−1,xt]+bh)\tilde {h}_t = \tanh (W_h \cdot [r_t \odot h_{t-1}, x_t] + b_h)
      • h~t\tilde {h}_t:基于当前输入和重置后的隐藏状态计算得到的候选隐藏状态
    • 隐藏状态更新:

      ht=zt⊙ht−1+(1−zt)⊙h~t=zt⊙ht−1+(1−zt)⊙tanh⁡(Whxt+Uh(rt∘ht−1)+bh)\begin {align*} h_t &= z_t \odot h_{t-1} + (1 - z_t) \odot \tilde {h}_t \\ &= z_t\odot h_{t-1}+(1-z_t)\odot\tanh (W_hx_t+U_h (r_t\circ h_{t-1})+b_h) \end {align*}
      • hth_t:结合上一时刻的隐藏状态(通过更新门的权重)和候选隐藏状态,更新当前隐藏状态
  • 当 zt=0z_t=0 且 rt=1r_t=1 时,隐状态 hth_t 退化为简单循环神经网络,即 ht=tanh⁡(Whxt+Uhht−1+bh)h_t=\tanh (W_hx_t+U_hh_{t-1}+b_h)

Seq2Seq 模型

Seq2Seq(Sequence-to-Sequence)

  • 输入序列 → 输出序列的模型

  • 典型任务:机器翻译、文本摘要、对话生成

  • 核心特性:输入和输出长度不必相等

  • 公式表示:

Y=fθ(X)其中X=(x1,...,xm),Y=(y1,...,yn) Y = f_\theta (X) \quad\text{其中} X = (x_1,...,x_m), \quad Y=(y_1,...,y_n)
  • 特点:
    • 强调 “序列映射” 关系

    • 可以使用 RNN、LSTM、GRU 或 Transformer 实现

      • 不一定是端到端的(可以有特征工程或分阶段处理)

End-to-End(端到端)

  • 模型直接从原始输入到目标输出,不需要人工设计中间步骤

  • 核心思想:所有处理通过一个模型学习完成

  • 特点:数据驱动,最小人工干预

  • 例子:

    • 图片 → 描述(Image Captioning)
    • 语音 → 文本(ASR)
  • End-to-End 是训练方式或设计理念,而非具体网络结构

Encoder-Decoder(编码器 - 解码器)

  • 一种具体模型结构

  • 分两步:

    • Encoder:把输入序列编码成上下文向量(Context Vector 或一系列 hidden states)
    • Decoder:根据上下文生成输出序列
  • 公式表示:

  • Encoder:

    H=Encoder(X)其中H=(h∗1,...,hm)H = \text{Encoder}(X) \quad\text{其中} H=(h*1,...,h_m)
  • Decoder:

    yt=Decoder(y∗<t,H)y_t = \text{Decoder}(y_{*{<t}}, H)
  • 特点:

    • Encoder-Decoder 是 Seq2Seq 的典型实现方式

    • 可以支持 Attention(增强性能,解决长序列瓶颈)

这篇文档有帮助吗?

On this page

页面信息