LSTM

    xiaoxiao2025-08-11  6

    LSTM结构理解与python实现

    [原博客地址](https://blog.csdn.net/flyinglittlepig/article/details/72229041)

    LSTM结构理解与python实现

    上篇博客中提到,简单的RNN结构求解过程中易发生梯度消失或梯度爆炸问题,从而使得较长时间的序列依赖问题无法得到解决,其中一种越来越广泛使用的解决方法就是 Long Short Term Memory network (LSTM)。本文对LSTM做一个简单的介绍,并用python实现单隐藏层LSTM。

    参考资料:

    理解LSTM: http://colah.github.io/posts/2015-08-Understanding-LSTMs/ (一个非常棒的博客,对LSTM基本结构的讲解浅显易懂)LSTM前向和后向传播:http://arunmallya.github.io/writeups/nn/lstm/index.html#/ (公式简单明了)Alex Graves的博士论文:Supervised Sequence Labelling with Recurrent Neural Networks (详细的公式推导)

    1. 理解 LSTM

    (1) 前向计算

    LSTM是一类可以处理长期依赖问题的特殊的RNN,由Hochreiter 和 Schmidhuber于1977年提出,目前已有多种改进,且广泛用于各种各样的问题中。LSTM主要用来处理长期依赖问题,与传统RNN相比,长时间的信息记忆能力是与生俱来的。

    所有的RNN链式结构中都有不断重复的模块,用来随时间传递信息。传统的RNN使用十分简单的结构,比如 tanhtanh 层 (如下图所示)。

    传统RNN链式结构中重复模块的单层结构( 图片来源)

    LSTM链式结构中重复模块的结构更加复杂,有四个互相交互的层 (如下图所示)。

    LSTM链式结构中重复模块的结构( 图片来源)

    图中各种符号含义如下图所示,黄色的方框表示神经网络层,圆圈表示两个向量间逐点操作,直线箭头表示向量流向,汇聚箭头表示向量串接,分裂箭头表示向量复制流向不同的方向。

    与传统RNN相比,除了拥有隐藏状态外,LSTM还增加了一个细胞状态(cell state,即下图中最上边的水平线),记录随时间传递的信息。在传递过程中,通过当前输入、上一时刻隐藏层状态、上一时刻细胞状态以及门结构来增加或删除细胞状态中的信息。门结构用来控制增加或删除信息的程度,一般由 sigmoidsigmoid 和点乘符号(图片来源)

    LSTM共包含3个门结构,来控制细胞状态和隐藏状态,下边分别进行介绍。

    遗忘门 (output gate)

    从名字易知,遗忘门决定上一时刻细胞状态 Ct1Ct−1 中。

    遗忘门 (forget gate) ( 图片来源)

    输入门 (input gate)

    顾名思义,输入门用来控制当前输入新生成的信息 C¯tC¯t 层用来控制有多少新信息可以传递给细胞状态。

    输入门 (input gate) ( 图片来源)

    更新细胞状态

    基于遗忘门和输入门的输出,来更新细胞状态。更新后的细胞状态有两部分构成,一,来自上一时刻旧的细胞状态信息 Ct1Ct−1

    更新细胞状态 ( 图片来源)

    输出门 (output gate)

    最后,基于更新的细胞状态,输出隐藏状态 htht

    输出门 (隐藏状态的输出) ( 图片来源)

    以上是LSTM的前向计算过程,下面介绍求解梯度的反向传播算法。

    (2) 梯度求解:BPTT 随时间反向传播

    (1) 前向计算各时刻遗忘门状态 ftft 的偏导数。

    δδ 的反向传播

    定义 δht=Ehtδht=∂E∂ht

    由于 ht=ottanh(Ct)ht=ot∗tanh(Ct) 累加。

    由于 Ct=itC¯t+ftCt1Ct=it∗C¯t+ft∗Ct−1

    由于 it=f(netit)=sigmoid(Whiht1+Wxixt+bi)it=f(netit)=sigmoid(Whi∗ht−1+Wxi∗xt+bi) δnetC¯t=δC¯t

    最新回复(0)