前言

循环神经网络 RNN 是一种对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息。它的核心特点就是网络中存在循环,可以使得信息可以从当前步骤传递到下一步骤,从而能够记住之前的信息。相当于是它是一个有记忆的网络,特别适合处理句子、时间序列等有前后依赖关系的数据。

传统的神经网络都有一个主要局限:假设输入是相互独立的,没有记忆功能,每次输入单独处理。循环神经网络中引入了上下文信息,作为当前时间步下网络的输出,传递给下一个时间步

image.png

一些经典的 RNN

Elman RNN

Elman RNN 是最早的 RNN 架构之一,目的就是为了处理时间序列数据并且学习其中的时间依赖模式。最核心的创新就是引入了上下文单元,也就隐藏状态,这个状态会在时间步之间循环传递,作为网络的记忆。

RNN 的核心是循环单元,单步循环单元的输入输出关系如下

1765100578840.png

将循环神经网络的隐藏层展开,展开的示意图如下所示

1765111074463.png

如图中所示,其中 x(t)x(t) 是 t 时刻的输入向量, h(t)h(t) 是 t 时刻的隐藏状态, y(t)y(t) 是 t 时刻的输出,每个时刻都是共享同一组参数。对于单个时间步 tt 来说,在 tt 时刻中

h(t)=tanh(Wh(t1)+Ux(t)+bh)y(t)=Vh(t)+byh(t)=\tanh(Wh(t-1)+Ux(t)+b_h)\\y(t)=Vh(t)+b_y

其中 WW 是隐藏状态到隐藏状态的权重矩阵, UU 是输入到隐藏状态的权重矩阵, VV 是隐藏状态到输出的权重矩阵, by,bhb_y,b_h 是偏置项,在 RNN 中的激活函数通常采用 tanh\tanh 函数或者 ReLUReLU 函数。

Elman RNN 使用 BPTT 算法进行训练,网络的先过程如下

  • 前向传播整个序列,计算每个时间步的损失
  • 从最后一个时间步开始,反向计算损失对每个参数在每个时间步的梯度,由于参数在所有时间步共享,所以梯度会沿着时间轴一直向后传播
  • 将所有时间步的梯度累加,然后更新参数

Elman RNN 的结构比较简单,清晰的展示了循环神经网络的核心思想,就是利用循环连接维护网络状态。而且 RNN 的模型参数很少,使其能泛化到不同步长的序列。

但是 Elman RNN 最大的缺陷就是梯度消失或梯度爆炸的问题,在 BPTT 过程中,梯度需要沿着时间步连续相乘,对于长序列,梯度会发生梯度消失或梯度爆炸,导致网络无法学习到长距离的依赖关系。而且由于更新机制比较简单,隐藏状态在每次更新的时候都会被重写,难以长期保存精确信息。

Jordan RNN

Jordan RNN 网络是最早,最简单的循环神经网络之一,它为解决序列处理问题提供了一种基础的反馈机制。它的核心思想就是将网络的输出在下一个时间步反馈到输入层,这使得网络能够记住自己之前的决策,从而处理与时间相关的模式。

1765111730946.png

在每一步运行时,除了接收外部输入以外,还会接收来自网络的上一时间步的输出作为额外的输入。将当前外部输入和上一时间步的输出连接起来,形成扩展的输入向量,计算隐藏状态时,通常将反馈的输出直接作为额外的输入接入隐藏层的。

h(t)=tanh(Wxhx(t)+Wchy(t1)+bh)y(t)=Whyh(t)+byh(t)=\tanh(W_{xh}x(t)+W_{ch}y(t-1)+b_h)\\y(t)=W_{hy}h(t)+b_y

Jordan RNN 的反馈的信息是输出层的信息,记忆的并非是隐藏状态,而是之前的决策。由于它反馈的只是当前时间步下的最终输出,而不是更丰富的隐藏状态,这就限制了 RNN 的记忆的能力。

RNN Encoder-Decoder

RNN Encoder-Decoder 的核心思想就是将输入序列编码成一个固定维度的上下文向量,然后再用这个向量解码成目标序列,它完美的解决了从序列到序列之间的映射问题。整体结构如下

1765286033468.png

  • 编码器 RNN:通常是一个循环神经网络
    • 输入一个可变长度的原始序列,编码器按顺序逐个读取原序列的每个元素,在每一步都更新其隐藏状态,这个隐藏状态包含了到目前为止的所读序列的信息。
    • 读完最后一个输入之后,编码器的最终隐藏状态就作为整个输入序列的上下文向量输出。如果中间的编码器是双向的 RNN,那通常就是两个 RNN 的拼接。
  • 上下文向量:是整个模型的关键,是一个固定大小的向量,所有输入序列的信息,无论多长都需要流经这个固定的维度的向量
  • 解码器 RNN:另一个独立的循环神经网络,将上下文向量按顺序输入到 RNN 中。基于上一步的隐藏状态和输出,计算出新的隐藏状态,并且预测当前步的输出作为下一步的输入。当前步的输出就是当前预测的概率最大的结果。

RNN Encoder-Decoder 将所有的输入信息都压缩进一个固定长度的上下文向量中,可以处理输入和输出长度不同的任务,但是当序列过长就导致难以保留全部细节信息,导致性能下降。

长短期记忆神经网络 LSTM

长短期记忆神经网络,是一种特殊的循环神经网络,是循环神经网络的重要突破。传统简单的 RNN,只能处理较接近的上下文情况,能获取的上下文的信息很短,有些时候需要非常远的上下文信息,但是 RNN 导致长时间前的有用的信息被忽略掉了。LSTM 的设计就是为了解决这个问题的,同时 LSTM 也能解决 RNN 中的梯度消失或者梯度爆炸的问题。

LSTM 的核心创新就是引入了门控单元,能够有选择地保留、遗忘和更新信息,通过设计流程来传递长期信息,避免了梯度消失的问题。另外 LSTM 有两个状态变量,单元状态 CtC_t 和隐藏状态 hth_t

1765244774604.png

每个单元的结构

  • 核心记忆单元:单元状态,用 CtC_t 表示,在时间步之间流动,只受到少量线性操作的影响,使得梯度能稳定传播

  • 候选值:接收上一层的输出值,生成可能加入单元状态的新信息

    C~t=tanh(WC[ht1,xt]+bC)\tilde{C}_t=\tanh(W_C[h_{t-1},x_t]+b_C)

  • 三个门控结构:三个门结构每一个都是 Sigmoid 神经网络层,输出值为 0 到 1 之间,决定信息通过的量

    • 遗忘门:决定丢弃什么信息,输出 0 时完全遗忘,输出 1 时完全保留

      ft=σ(Wf[ht1,xt]+bf)f_t=\sigma(W_f[h_{t-1},x_t]+b_f)

    • 输入门:决定哪些信息存入单元状态

      it=σ(Wi[ht1,xt]+bi)i_t=\sigma(W_i[h_{t-1},x_t]+b_i)

    • 输出门:决定输出的信息,其中 hth_t 就是新的隐藏状态,也是当前时间步的输出,其中 \odot 是逐元素相乘

      ot=σ(Wo[ht1,xt]+bo)ht=ottanh(Ct)o_t=\sigma(W_o[h_{t-1},x_t]+b_o)\\h_t=o_t\odot \tanh(C_t)

  • 更新单元状态:基于遗忘门和输入门的决定,更新单元状态

    Ct=ftCt1+itC~tC_t=f_t\odot C_{t-1}+i_t\odot \tilde{C}_{t}

  • 最终输出:一般是直接输出 hth_t ,但是在构建一个完整的、用于解决实际任务的神经网络时, hth_t 通常不是最终的答案,此时在后续可以连接一个输出层。例如对于多分类任务,输出为 yt=softmax(Wyht+by)y_t=softmax(W_yh_t+b_y)

LSTM 模拟了人类的记忆的过程,选择遗忘不重要的过去,专注于当前重要的信息,并且有控制地输出。

Peephole 连接

Peephole 连接是 lSTM 的一种变体结构,在传统的 LSTM 门控单元中,额外增加了从单元状态到各个门的加权连接。在标准的 LSTM 中,通过三个门来控制信息流,这三个门的计算只依赖于 ht1h_{t-1}xtx_t ,所以门在决定开关时,并没有直接看到单元状态本身的值 Ct1C_{t-1} 。Peephole LSTM 中提出让门控单元窥探单元状态的内容,可能有助于做出更精确的决策。将三个门的方程设计为如下的形式

1765245593533.png

  • 遗忘门:窥探上一时刻的单元状态 Ct1C_{t-1}

    ft=σ(Wf[Ct1,ht1,xt]+bf)f_t=\sigma(W_f[C_{t-1},h_{t-1},x_t]+b_f)

  • 输入门:窥探上一时刻的单元状态 Ct1C_{t-1}

    it=σ(Wi[Ct1,ht1,xt]+bi)i_t=\sigma(W_i[C_{t-1},h_{t-1},x_t]+b_i)

  • 输出门:窥探当前时刻更新之后的单元状态 CtC_t

    ot=σ(Wo[Ct,ht1,xt]+bo)o_t=\sigma(W_o[C_t,h_{t-1},x_t]+b_o)

Peephole 为模型提供了更精细的控制能力,能在某些任务上提高性能,但是它为每个门都增加了相关的权重,这提高了模型的复杂度。由于输出门依赖于当前步计算出的 CtC_t ,它引入了额外的计算依赖,使得并行化计算变得更加复杂。

双向 LSTM

双向长短期记忆网络是一种经典的序列建模神经网络结构,在标准的 LSTM 的基础上增加了逆向时间序列的信息传递,从而能够同时利用过去和未来的上下文信息。通过增加一个从后向前处理的 LSTM 层,使当前时刻的输出能同时依赖于过去未来的上下文信息。

  • 前向的 LSTM:按照时间顺序从前向后处理序列
  • 反向的 LSTM:按照时间顺序从后向前处理序列

它的参数数量是单向 LSTM 的两倍,训练时两个方向同时进行反向传播

TCN-LSTM

TCN-LSTM 是一种结合了卷积神经网络时序建模能力和循环神经网络长距离依赖捕捉能力的混合神经网络结构,旨在克服各自模型的局限性,提供更强大的时间序列建模能力。

  • TCN 的优点:并行计算、感受野可控、梯度稳定等
  • LSTM 的优点:长距离依赖、顺序建模、状态记忆等
  • 结合之后,利用 TCN 提取局部特征,再利用 LSTM 建模长期依赖关系

TCN 和 LSTM 的连接结构如下

1765269776324.png

  • 串联结构
    • TCN 作为特征提取器:提取时间序列的局部模式和层次特征
    • LSTM 作为时序建模其:对 TCN 提取的特征序列建模
  • 并联结构
  • 编码器-解码器结构

TCN 层是专门为时序数据设计的卷积神经网络,主要作用就是局部特征提取与并行计算,中是由多个残差块堆叠而成的,每个残差块中包含的特性如下

  • 因果卷积:卷积核仅作用于当前时刻以及历史时刻的数据,避免未来信息泄露
  • 空洞卷积:通过再卷积核中引入空洞,在不增加参数的前提下扩大感受野
  • 残差连接:缓解深层网络梯度消失问题,确保特征在传递过程中不丢失

门控循环单元 GRU

GRU 是 LSTM 的一种简化的变体,旨在保持 LSTM 性能的同时减少参数和计算复杂度。将 LSTM 的三个门简化为了两个门,两个 Sigmoid 神经网络层

每个单元的结构

1765122431625.png

  • 更新门:同时控制遗忘和记忆的程度,决定新旧信息的融合比例,用于计算候选隐藏状态

    zt=σ(Wz[ht1,xt]+bz)z_t=\sigma(W_z[h_{t-1},x_t]+b_z)

  • 重置门:控制对过去信息的忽略程度,决定有多少信息需要被忘记或重置

    rt=σ(Wr[ht1,xt]+br)r_t=\sigma(W_r[h_{t-1},x_t]+b_r)

  • 候选的隐藏状态:生成可能加入隐藏状态的新信息

    h~t=tanh(W[rtht1,xt]+b)\tilde{h}_t=\tanh(W[r_t\odot h_{t-1},x_t]+b)

  • 最终隐藏状态更新,新旧信息加权组合

    ht=(1zt)ht1+zth~th_t=(1-z_t)\odot h_{t-1}+z_t\odot \tilde{h}_t

GRU 在保持 LSTM 的核心能力的同时,也提供了更高的计算效率,更简洁的框架,在实际使用中,它们两个的性能差异很小。

双向 GRU

双向 GRU 是 GRU 的一个扩展,旨在利用过去和未来的上下文信息,来增强序列数据的处理能力。对于单向的 GRU 在编码一个序列时,每个时间步的隐藏状态只依赖于当前时刻以及之前的输入,而双向的 GRU 通过结合两个独立的 GRU 层来克服这个限制。双层的 GRU 结构由两个独立的 GRU 组成

  • 前向的 GRU:按时间顺序处理输入序列
  • 反向的 GRU:按时间逆序处理输入序列

之后将两个方向在每个时间步产生的隐藏状态进行组合,形成最终的输出

1765198816554.png

在每个时间步中,双向 GRU 会结合两个独立的 GRU 生成一个最终的输出向量 h(t)h(t) ,比较常用的组合有三种

  • 拼接:将两个方向的隐藏状态在特征维度上拼接起来 h(t)=[hf(t),hr(t)]h(t)=[h_f(t),h_r(t)] ,保留了前后向 GRU 的全部信息
  • 求和:将两个方向的隐藏状态逐个元素相加 h(t)=hf(t)+hr(f)h(t)=h_f(t)+h_r(f) ,减少了参数和计算量,属于是一种参数融合
  • 平均:将两个方向的隐藏状态取均值 ht=hf(t)+hr(t)2h_t=\frac{h_f(t)+h_r(t)}{2} ,对两个方向上的信息进行平滑操作

双向 GRU 在最终的处理中,有着相较于 GRU 更多的上下文信息,最终输出的组合方式可以根据任务需求选择。但是参数和计算量是单向 GRU 的两倍,而且必须要等待完整的输入序列才能开始反向处理。

深度 GRU

深度 GRU 通过堆叠多个 GRU 层来构建更深的网络,以学习更抽象更复杂的序列特征。深层 GRU 的核心就是多个 GRU 层的堆叠,前一层的输出序列作为后一层的输入序列,深度 GRU 可以捕捉更复杂的时序依赖关系和模式。

  • 底层:学习局部低级的时序模式
  • 中层:学习中等范围的模式
  • 高层:学习全局的高级的语义

1765200980035.png

在时间步 tt 时,每一层的输入输出状态如下

  • 第一层 ht1=GRU1(xt,ht11)h_t^1=GRU^1(x_t,h_{t-1}^1)
  • llhtl=GRUl(htl1,ht1l)h_t^l=GRU^l(h_{t}^{l-1},h_{t-1}^l)
  • 最终输出 output=htLoutput=h_t^L

在深度 GRU 中,每一层之间的连接方式有多种

  • 标准堆叠:第 ll 层的输入就是第 l1l-1 层的输出
  • 残差连接:
  • 密集连接:第 ll 层的输入为当前前面所有层输出的拼接

TCN-GRU

与上述的 TCN-LSTM 一样,只是 TCN 与 GRU 的组合,这里就不再赘述了

回声状态网络 ESN

Echo State Network 回声状态网络,是一种特殊的递归神经网络,核心特点就是通过稀疏随机连接的动态储备池替代传统的 RNN 隐藏层,无需训练隐藏层的权重,仅优化输出层连接权重,大幅度降低了训练的复杂度。它的结构可以分为三个部分:输入层、储备池、输出层

  • 输入层:接收外部时序数据,将其映射到储备池的输入空间

  • 储备池:核心的动态层,通过稀疏随机连接产生复杂的非线性响应,记忆输入序列的历史信息。

    • 储备池有两个权重矩阵,输入权重 WiW_i 和循环权重 WhW_h ,还可以选择使用储备池偏置项 bb
    • 输入权重随机采样自 [a,a][-a, a] ,通常 a[0.5,1.0]a\in[0.5,1.0] ,确保输入信号能有效驱动储备池
    • 循环权重随机采样自 [1,1][-1,1] ,再通过稀疏化和谱半径调整,满足回声状态条件,即保证储备池状态不会随时间发散,且能对输入序列产生持续的影响
    • 储备池能记住输入序列的历史信息,记忆的长度与节点数、稀疏度和谱半径相关
    • 在储备池中通过稀疏循环连接和激活函数,将线性输入转化为高维的非线性特性空间,如下的 f()f() 就是激活函数

    h(t)=f(Wix(t)+Whh(t1)+b)h(t)=f(W_ix(t)+W_hh(t-1)+b)

  • 输出层:线性组合储备池状态与输入信号,输出最终结果

    • ESN 的训练过程比传统的 RNN 简单很多,核心就是求解输出层的权重
    • 将整个训练时序数据输入到 ESN 中之后,记录每个时刻的输入 xtx_t 和储备池的状态 hth_t ,构建矩阵 X=[x1,h1,...xn,hn]X=[x_1,h_1,...x_n,h_n] ,网络最终的输出为 Y=WoXY=W_oX ,而与输入信息对应的目标矩阵为 Y=[y1,...yn]Y=[y_1,...y_n] ,其中的 WoW_o 是唯一需要训练的参数
    • 最后通过最小二乘法最小化损失函数 Loss=YWoX22Loss=\Vert Y-W_oX\Vert_2^2 ,可以加入正则化避免过拟合,最终的解为 Wo=YXT(XXTλI)1W_o=YX^T(XX^T\lambda I)^{-1}
  • 回声状态条件:ESN 的储备池必须满足回声条件才能保证模型稳定且具有记忆能力

    • 定义:对于任意有界的序列输入,储备池的状态最终会收敛到有界的区域,且不同的初始状态的影响会逐渐消失
    • 判断条件:循环权重的谱半径小于 1
    • 实现方式:对随机生成的权重,先计算其谱半径,之后再将其缩放到 0.8~0.95 之间

ESN 的结构设计需要在以下的几个参数上进行权衡,以适配具体的任务

  • 储备池节点数:节点数越大,记忆容量也就越大,但是计算量和存储的开销也成正比地增加
  • 稀疏度:稀疏度过高导致降低状态耦合,记忆能力下降,但是过低会导致状态发散
  • 谱半径:谱半径越接近 1,记忆能力越强,但是稳定性越差,谱半径过小会导致状态快速衰减,导致记忆变短
  • 正则化参数:正则化参数增大可避免过拟合,但是会降低模型的拟合能力,需要通过交叉验证选择

Leaky ESN

Leaky ESN 是经典 ESN 的一个变体,专门用于处理时间常数变化缓慢或具有非平稳特性的时间序列数据。核心思想就是为神经元的状态更新引入一个泄漏率,可以看作是一个低通滤波器,动态调整网络对历史状态和当前输入的依赖程度。

Leaky ESN 的整体结构与 ESN 一致,最核心的特点体现在储备池内部状态的更新方程多了一个泄漏积分器神经元的机制,在 Leaky ESN 中储备池在 tt 时刻的更新公式变为

h(t)=(1α)h(t1)+αf(Wix(t)+Wh(t1)+b)h(t)=(1-\alpha)h(t-1)+\alpha f(W_ix(t)+Wh(t-1)+b)

其中 α(0,1]\alpha\in(0,1] 是泄漏率,是 Leaky ESN 的核心。当 α=1\alpha=1 时,公式退化为经典的 ESN,当 α0\alpha\rightarrow0 时,网络状态变化非常缓慢,但是能更好的维持历史的信息。参数 α\alpha 控制了状态更新的速度,小的 α\alpha 让储备池由更长的记忆,能平滑噪声,适合学习变化缓慢的特征,大的 α\alpha 让神经元响应速度更快,适合捕捉动态。

Deep ESN

Deep ESN 是 ESN 的架构向深度方向的扩展,通过层级化的储备池来学习时间序列数据中更加丰富和层次化的时空特征。经典的 ESN 只有一个浅层的储备池,而 Deep ESN 的核心就是将多个储备池堆叠起来,形成一个深度架构。较低层的储备池捕捉输入数据中简单的、局部的、快速变化的模式,而较高层的储备池则是基于底层的抽象表示,进一步组合出更复杂、全局的、缓慢变化的模式。Deep ESN 网络的结构如下

  • 输入层:接收外部时间序列信号 x(t)x(t)
  • 深层储备池:由多个级联的储备池组成的深度结构,每一层都有自己的权重矩阵和状态向量。在高层的储备池的输入就来自于它的下一层的当前状态
    • 第 1 层 h1(t)=f(Wi1x(t)+Wh1h1(t1)+b1)h^1(t)=f(W^1_ix(t)+W^1_hh^1(t-1)+b^1)
    • jjhj(t)=f(Wijhj1(t)+Whjhj(t1)+bj)h^j(t)=f(W^j_ih^{j-1}(t)+W_h^jh^j(t-1)+b^j)
  • 输出层:从所有层或者最高层的储备池状态中读取信息,生成最终的输出,最终的输出为 y(t)=Wo[h1(t),...,hN(t),x(t)]y(t)=W_o[h^1(t),...,h^N(t),x(t)] 。其中 WoW_o 依然是唯一需要训练的权重矩阵

Deep ESN 通过堆叠具有多个层间前馈连接的储备池,构建了一个分层的多时间尺度的动态特征提取器,继承了 ESN 训练简单,高效的核心优势,提升了模型对复杂时序数据的建模能力。

后记

循环神经网络优点就是适合序列建模,可处理变长序列,而且整个模型是循环的共享参数,所以模型的规模不会随着序列的长度增长。但是相对于现在的 Transformer 来说,它是顺序计算的,难以并行计算,训练也比较困难,所以只适合用于短序列或者资源受限的场景中。RNN 及其变体是序列建模的重要基础,但是目前在许多任务中被 Transformer 取代。

就先写这么多吧,后续再补充