[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}\) 函数。
可以将 \(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}\) 能够 缓解梯度消失的问题,但仍然可能遇到 梯度爆炸 的问题。
参考
一切都是命运石之门的选择,本文章来源于博客园,作者:MarisaMagic,出处:https://www.cnblogs.com/MarisaMagic/p/17950041,未经允许严禁转载