Bootstrap

一幅图真正理解LSTM、BiLSTM

目录

1 前言

1.1 RNN回忆与概览

1.2 LSTM回忆与概览

1.3 循环神经网络的几种输入输出结构

2 图解 LSTM 内部结构和数据流

2.1 简洁的结构图

2.2 LSTM的原理剖析图

​3 图解BiLSTM及其应用

3.1 看2层的 LSTM 是如何运转的

3.2 看1层的 BiLSTM 是如何运转的

3.3 看2层的 BiLSTM 是如何运转的


1 前言

本文对RNN、LSTM、BiLSTM的内部结构和输入输出做了透彻的剖析,目标是能够解答LSTM和BiLSTM的任何疑问。

  • RNN:循环神经网络
  • LSTM:长短期记忆网络
  • BiLSTM:双向长短期记忆网络

重要的先验知识

  • 本质上单个RNN cell是在多个时间步上展开的形式,也可以理解为RNN是神经网络在时序上的权重共享(CNN相当于空间上的权重共享)LSTM也都是一样

An unrolled recurrent neural network.

1.1 RNN回忆与概览

RNN的不足:它的记忆是短期的。

  • 原因:在反向传播过程中,RNN中存在梯度消失问题(因为RNN在时序上共享参数,梯度在反向传播过程中,不断连乘,数值不是越来越大就是越来越小。梯度是用于更新神经网络权重的值,梯度消失问题是指随着时间推移,梯度在传播时会下降,如果梯度值变得非常小,则不会继续学习。因此,在RNN中,梯度小幅更新的网络层会停止学习,这些通常是较早的层。由于这些层不学习,RNN无法记住它在较长序列中学习到的内容,因此它的记忆是短期的

1.2 LSTM回忆与概览

LSTM内部结构相对RNN做了改进,BiLSTM中Bi指的是Bi-directional(双向的)的缩写,是由前向LSTM与后向LSTM组合而成,LSTM和BiLSTM如下图所示:

LSTM优点:

  • LSTM是克服短期记忆问题提出的解决方案,它引入称作“门”的内部机制,可以调节信息流。
  • 这些门结构可以学习序列中哪些数据是要保留的重要信息,哪些是要删除的。通过这样做,它可以沿着长链序列传递相关信息来执行预测。

1.3 循环神经网络的几种输入输出结构

从RNN或LSTM结构可以看出,它们的输入输出其实很灵活,不同应用场景可以选择不同输入输出方式,例如下:

单输入-多输出:(仅在第一个时间步输入)

 

单输入-多输出:(在多个时间步输入)

多输入-多输出:

 

多输入-单输出:

 

2 图解 LSTM 内部结构和数据流

2.1 简洁的结构图

2.2 LSTM的原理剖析图

3 图解BiLSTM及其应用

3.1 看2层的 LSTM 是如何运转的

3.2 看1层的 BiLSTM 是如何运转的

用一个文本情感分析的例子来说明:

  • 如下图,单层的BiLSTM其实就是2个LSTM,一个正向去处理序列,一个反向去处理序列,处理完后,两个LSTM的输出会拼接起来
  • 特别注意:在这个案例中,所有时间步计算完后,才算是下面这个BiLSTM的结果,如下图,正向LSTM经过6个时间步得到一个结果向量,反向LSTM同样经过6个时间步后,得到另一个结果,然后这两个结果向量拼接起来,作为BiLSTM的最终输出。
    • 疑问:是不是NLP里面大多时候只需要最后一个时刻的输出即可?
    • 答案:这属于N VS 1结构,即N次输入,1次输出。这种结构通常用来处理序列分类问题。如输入一段文字判别它所属的类别,输入一个句子判断其情感倾向,输入一段视频并判断它的类别等等。

3.3 看2层的 BiLSTM 是如何运转的

用OCR识别算法CRNN来说明,以下是CRNN算法的数据处理流程图:

 

 更详细的说,在CRNN算法中,输入BiLSTM的特征序列,它的维度是(26, 512),长下图这样:

 因为CRNN算法中,图像输入是固定为32(高) x 100(宽)的长条图,经过特征提取器后,高会下采样32倍,宽度方向下采样4倍(由于补边操作,导致w最终=(100/4+1)=26),所以,相当于32 x 100的图像信息,被裁剪成26份,每一份的信息用512个值表示,如下:

 重要解释归纳如下:

  1. 关于时间步:26个切片,也即26个序列,也就是26个时间步,即双层的BiLSTM(也就是4个LSTM,每层一个前向LSTM和一个反向LSTM)会自循环计算26次,从物理意义上说,相当于LSTM按顺序(从左往右同时从右往左)遍历计算了上图26个切片信息。
  2. 关于输入列向量Xt:每个序列由512个元素的向量组成,每个时间步,BiLSTM就是去取这512个元素的向量值丢到LSTM单元中去计算。形象的说,就是3.1节中,input_size也即Xt,变为512维向量。
  3. 关于输出的拼接:BiLSTM每个时间步其实是由2个相反方向的LSTM在计算结果,它们2个的结果会拼接起来,所以,BiLSTM的输出维度是2 x hidden_size
  4. 关于全连接层:CRNN算法中,在上下两层BiLSTM中间,穿插了一个全连接层,来过度上下两层BiLSTM的输入输出关系。至于为什么要加全连接层,我目前也不是特别清楚,估计是把向量长度拉回原来长度。理论上,不加全连接层,两层BiLSTM也完全是可以轻松的衔接起来的。

CRNN算法中,双层BiLSTM代码实现如下:

;