[NLP复习笔记] RNN、LSTM

1. RNN

1.1 RNN 简介

循环神经网络\(\text{Recurrent Neural Network}\),简称 \(\text{RNN}\))是一种用于处理序列数据的神经网络。其核心思想是使用循环结构来保持一个内部状态,这个状态理论上可以捕获到目前为止的全部信息流。\(\text{RNN}\) 中最基本的单位是一个具有循环连接的神经网络单元,这个单元在每个时间点会接收两个输入,即 当前的输入数据前一时间点的隐藏状态。根据这两个输入,单元会更新自己的隐藏状态,并且生成一个输出。


1.2 RNN 结构

以下是 \(\text{RNN}\) 的示意图及时序展开图:

  • \(x^{(t)}\) 表示输入层的输入

  • \(U\)输入层到隐藏层 的权值参数

  • \(h^{(t)}\) 表示隐藏层的输出,激活函数一般为 \(\text{tanh}\) (双曲正切函数) 或 \(\text{ReLU}\)

  • \(W\) 为上一时刻的 隐藏层到隐藏层 的权值参数

  • \(o^{(t)}\) 为输出层的输出,激活函数一般为 \(\text{Softmax}\)

  • \(V\)隐藏层到输出层 的权值参数

  • \(L^{(t)}\) 为损失函数

  • \(y^{(t)}\) 为时刻 \(t\) 样本对应的真实值


1.3 RNN 状态更新公式

\(f\) 一般为 \(\text{tanh}\)\(\text{ReLU}\) 函数;\(g\) 一般为 \(\text{softmax}\) 函数。

\[\begin{split} & h^{(t)} = f(Ux^{(t)} + Wh^{(t - 1)}) \\\\ & z = Vh^{(t)} \\\\ & o^{(t)} = g(z) \end{split} \]

可以将 \(h^{(t)}\) 看作网络记忆,其捕获了先前所有时间步骤中的信息。每一步的 \(o^{(t)}\) 根据时间 \(t\) 的记忆进行计算,可以看出循环神经网络 对历史信息进行了保存


1.4 RNN 的优劣

  • 优势

    \(\text{RNN}\) 是专门为处理不同长度的输入序列设计的,\(\text{RNN}\) 在时间序列的每个时间点上共享参数(权重),可以处理如语言句子或者时间序列这样长度变化的数据

  • 劣势

    \(\text{RNN}\) 理论上可以捕获长期的信息,但在实际操作中,很难学习这些依赖信息。原因是 梯度消失梯度爆炸 的问题,这导致模型无法有效地训练。

    梯度消失问题指的是在反向传播过程中,梯度逐渐变小,导致长序列中远离当前时刻的信息难以传递;梯度爆炸问题指的是梯度在反向传播过程中指数级增长,导致权重更新过大。

    \(\text{RNN}\) 在序列的每个时间点上递归地进行计算,它 不能被并行化,这导致较高的时间和资源成本。

    由于其复杂性和记忆能力,较为容易过拟合 特别是在不够多的训练数据情况下。




2. LSTM

2.1 LSTM 简介

长短期记忆网络\(\text{Long Short-Term Memory networks}\),简称 \(\text{LSTM}\))是一种 特殊的循环神经网络,它能够学习长期依赖性信息。\(\text{LSTM}\) 关键是其单元状态(\(\text{cell state}\))和各种门结构(\(\text{gates}\))。单元状态类似于传送带,信息可以在其中顺畅地流动,并只通过门结构进行微小修改。这些门结构是一系列的 \(\text{sigmoid}\) 神经网络层和 逐点乘法操作Hadamard 积),用于控制信息的流动。


2.2 LSTM 结构及更新公式

\(\text{LSTM}\) 包含的三个门分别为:

  • 遗忘门\(\text{Forget Gate}\)

    决定哪些信息将被丢弃或保留。其中 \(f_t\)遗忘门门控\(C_{t-1}\)历史状态信息,也就是上下文向量,两者相乘(做 Hadamard积)代表 \(t\) 时刻允许多少历史信息进入来决定 \(C_t\) 当前状态。如果计算出来的值为 0,则历史对当前状态无影响;如果计算出来的值为 1,则历史信息完全传到 \(t\) 时刻,没有任何信息流失。

    对应的状态更新公式如下:

    \[\begin{split} f_t &= \sigma (U_f h_{t-1} + W_f x_t) \\\\ k_t &= C_{t-1} \odot f_t \end{split} \]

    其中 \(f_t\) 为遗忘门控,\(U_f\) 为上一时刻隐藏层 \(h_{t-1}\)\(f\) 之间的权重矩阵,\(W_f\) 为当前输入层 \(x_f\)\(f\) 的权重矩阵。\(\sigma\)\(\text{sigmoid}\) 函数,用于激活作非线性变换。

    \(k_t\) 为输出的值,\(C_{t-1}\) 为历史状态信息,\(\odot\) 表示做 Hadamard 积


  • 输入门\(\text{Add Gate}\)

    决定 新输入的哪些信息将被更新到单元状态\(i_t\)输入门门控\(\tilde{C}_t\) 是当前 \(t\) 时刻输入值, 两者相乘(做 Hadamard积)得到的值 \(j_t\) 代表 \(t\) 时刻 允许多少当前输入信息进入来决定 \(C_t\) 当前状态。

    对应的状态更新公式如下:

    \[\begin{split} i_t &= \sigma(U_i h_{t-1} + W_i x_t) \\\\ \tilde{C}_t &= \tanh(U_C h_{t-1} + W_C x_t) \end{split} \]

    \[C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t = k_t + j_t \]

    \(\text{tanh}\) 为双曲正切函数,用于激活。


  • 输出门\(\text{Output Gate}\)

    决定下一个隐藏状态的值,隐藏状态包含关于前一个输出的信息。通过 输出门控 \(o_t\) 控制当前状态 \(C_t\) 对外有多少是可见的。

    对应的状态更新公式如下:

    \[\begin{split} o_t &= \sigma(U_o h_{t-1} + W_o x_t) \\\\ h_t &= o_t \odot \tanh(C_t) \end{split} \]


2.3 LSTM 的优劣

  • 优势

    \(\text{LSTM}\) 的最大优势在于其能够捕捉长期依赖性。这对于许多序列数据任务是至关重要的,比如自然语言处理和时间序列预测。

    \(\text{LSTM}\) 通过遗忘门和输入门,可以决定何时更新或丢弃内存单元中的信息,这允许它 灵活地管理内部状态。

    由于其门控机制,\(\text{LSTM}\) 能够在理论上保持梯度稳定,缓解在训练过程中梯度消失 的问题。

    具体 \(\text{LSTM}\) 是如何缓解梯度消失的,可以看一下如下文章和回答:

  • 劣势

    \(\text{LSTM}\) 由于其复杂的门控机制相比标准 \(\text{RNN}\) 更加复杂,导致它在 训练和推理时计算要求更高。其参数数量多和复杂的结构,训练时间也通常较长

    由于 \(\text{LSTM}\) 在处理序列时需要前一个时间点的结果,因此其运算难以并行化,增加了计算资源的使用

    虽然 \(\text{LSTM}\) 能够 缓解梯度消失的问题,但仍然可能遇到 梯度爆炸 的问题。




参考

[机器学习复习笔记] RNN 循环神经网络

posted @ 2024-01-07 03:14  MarisaMagic  阅读(105)  评论(0编辑  收藏  举报