循环神经网络(RNN&LSTM)

1. 循环神经网络

1.1 什么是循环神经网络?

循环神经网络(Recurrent Neural Network , RNN)是专门用来处理序列数据的神经网络,它能够挖掘数据中的时序信息以及语义信息。利用了RNN的这种能力,使深度学习模型在解决语音识别、语言模型、机器翻译以及时序分析等NLP领域的问题时有所突破。

全连接神经网络在处理序列数据时存在的缺陷:比如在股票预测问题中,股票价格不仅取决于现在的输入数据状态,更依赖于历史信息,这是全连接神经网络所不能做到的。
在这里插入图片描述

1.2 循环神经网络的网络结构

下图中展示的是一种典型的RNN网络结构。
在这里插入图片描述
图中, U U U是输入层到隐藏层的权重矩阵, W W W是隐藏层到隐藏层的循环连接的权重矩阵, V V V是隐藏层到输出层的权重矩阵。 x t x_t xt表示 t t t时刻的输入, h t h_t ht表示 t t t时刻的隐藏层向量, o t o_t ot表示 t t t时刻的输出。

h t = f ( U ⋅ x t + W ⋅ h t − 1 + b h ) h_t = f(U \cdot x_t + W \cdot h_{t-1} + b_h) ht=f(Uxt+Wht1+bh)
o t = g ( V ⋅ h t + b o ) o_t = g(V \cdot h_t + b_o) ot=g(Vht+bo)

其中, f ( ⋅ ) f(\cdot) f() g ( ⋅ ) g(\cdot) g() 为激活函数。

  • 用来计算隐藏层向量 h t h_t ht的激活函数通常在RNN中选择 tanh ,有时 ReLU 也经常使用;
  • 用来计算输出 o t o_t ot的激活函数:
    • 如果是二分类问题,我们可能会使用 sigmoid 函数;
    • 如果是k分类问题,我们可能会使用 softmax 函数。

可以看出,RNN每一时刻的隐藏层向量不仅由当前时刻的输入决定,还取决于上一时刻的隐藏层向量,这就使得RNN有了记住过去时间序列信息的功能。

值得注意的一点是,循环神经网络在不同的时间步中共享相同的权重

1.3 损失函数

在RNN中,我们将损失函数定义为标准的逻辑回归损失(即 交叉熵损失)

可以参考这篇文章中关于交叉熵的介绍。

我们的神经网络的输出 y ^ ( t ) \widehat{y}^{(t)} y (t) 通常是一些概率值,而 y ( t ) y^{(t)} y(t) 是一系列确定的数值(标签),因此 y ( t ) = 1 y^{(t)} = 1 y(t)=1

单个单词或时序数据中单个片段的损失函数:
L ( t ) ( y ^ ( t ) , y ( t ) ) = − y ( t ) l o g y ^ ( t ) = − l o g y ^ ( t ) L^{(t)} (\widehat{y}^{(t)} , y^{(t)}) = -y^{(t)} log \widehat{y}^{(t)} = -log \widehat{y}^{(t)} L(t)(y (t),y(t))=y(t)logy (t)=logy (t)
序列的整体损失:(交叉熵损失的平均值)
L ( y ^ , y ) = 1 T ∑ t = 1 T L ( t ) ( y ^ ( t ) , y ( t ) ) L(\widehat{y} , y) = \frac{1}{T}\sum\limits^T_{t=1} L^{(t)} (\widehat{y}^{(t)} , y^{(t)}) L(y ,y)=T1t=1TL(t)(y (t),y(t))
然后通过back propagation的方式来计算模型中的参数,并使用梯度下降法来更新参数。

对于语言模型,一个好的语言模型能够用高度准确的词元来预测我们接下来会看到什么,比如我们打字时输入法的提示信息。
在最好的情况下,模型能够完美地估计标签词元的概率为1;
在最坏的情况下,模型预测标签词元的概率为0;
在基线上,模型的预测是词表的所有可用词元上的均匀分布。


1.4 循环神经网络存在的问题

对于长度为 T T T 的序列,我们在迭代过程中计算这 T T T 个时间步上的梯度,这将会在反向传播过程中产生长度为 O ( T ) O(T) O(T) 的矩阵乘法链。当 T T T 较大时,这可能导致数值不稳定,例如可能导致梯度爆炸或梯度消失。这样我们可以发现RNN具有附近效应,不擅长捕捉长期的依赖关系


2. LSTM

下面内容参考自 详解LSTM

2.1 LSTM 的网络结构

LSTM 全称是 Long Short Term Memory,提出该算法的动机是为了解决上面提到的RNN的长期依赖问题。而LSTM之所以能够解决RNN的长期依赖问题,是因为LSTM引入了门(gate)机制用于控制特征的流通和损失。LSTM是由一系列LSTM单元(LSTM Unit)组成,其链式结构如下图。
在这里插入图片描述
在LSTM单元中,图中每个黄色方框表示一个神经网络层,由权值,偏置以及激活函数组成;每个粉色圆圈表示元素级别操作;箭头表示向量流向;相交的箭头表示向量的拼接;分叉的箭头表示向量的复制。
在这里插入图片描述

2.2 LSTM 单元解读

LSTM的核心部分是LSTM单元中类似于传送带的部分(如下图),这一部分一般叫做单元状态(cell state)它自始至终存在于LSTM的整个链式系统中。

单元状态(cell state) 公式
在这里插入图片描述 C t = f t ⋅ C t − 1 + i t ⋅ C ~ t C_t = f_t \cdot C_{t-1} + i_t \cdot \widetilde{C}_t Ct=ftCt1+itC t

其中,

  • f t f_t ft 叫做遗忘门,表示 C t − 1 C_{t-1} Ct1 的哪些特征用于计算 C t C_t Ct f t f_t ft 是一个向量,向量的每个元素均位于[0,1]范围内。通常我们使用 s i g m o i d sigmoid sigmoid 函数作为激活函数, s i g m o i d sigmoid sigmoid 函数的输出是一个介于[0,1]区间的值。
  • i t i_t it 叫做输入门,用于控制 C ~ t \widetilde{C}_t C t 的哪些特征用于更新 C t C_t Ct 。同 f t f_t ft 一样也是一个元素介于[0,1]区间的向量,通常我们使用 s i g m o i d sigmoid sigmoid 函数作为激活函数。

遗忘门 f t f_t ft 公式
在这里插入图片描述 f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f) ft=σ(Wf[ht1,xt]+bf)

输入门 i t i_t it 与 单元状态更新值 C ~ t \widetilde{C}_t C t 公式
在这里插入图片描述 i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i) it=σ(Wi[ht1,xt]+bi)

C ~ t = t a n h ( W C ⋅ [ h t − 1 , x t ] + b C ) \widetilde{C}_t = tanh(W_C \cdot [h_{t-1}, x_t] + b_C) C t=tanh(WC[ht1,xt]+bC)

其中,

  • i t i_t it 叫做输入门,用于控制 C ~ t \widetilde{C}_t C t 的哪些特征用于更新 C t C_t Ct 。同 f t f_t ft 一样也是一个元素介于[0,1]区间的向量,通常我们使用 s i g m o i d sigmoid sigmoid 函数作为激活函数。
  • C ~ t \widetilde{C}_t C t 表示单元状态更新值,激活函数通常使用 t a n h tanh tanh

隐藏层输出 h t h_t ht 公式
在这里插入图片描述 o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o) ot=σ(Wo[ht1,xt]+bo)

h t = o t ⋅ t a n h ( C t ) h_t = o_t \cdot tanh(C_t) ht=ottanh(Ct)

其中, o t o_t ot 表示输出门(注意这里不要和RNN中的输出搞混),计算方式与 f t f_t ft i t i_t it 相同。





参考
[1] 《深度学习》
[2] 吴恩达-深度学习课程
[3] 《动手学深度学习》
[4] 史上最详细循环神经网络讲解(RNN/LSTM/GRU)
[5] 详解LSTM

猜你喜欢

转载自blog.csdn.net/qq_42757191/article/details/126400525