NLP之简单笔记:LSTM

一. LSTM简介

  • LSTM:即Long Short-tem Memory,长短期记忆神经网络,1997年就被提出来了。

  • 传统RNN的缺点:
         1. 每个时刻都会更新掉上一时刻memory的信息;LSTM通过增加三个门,来选择保存更多时刻的信息。
         2.会出现梯度爆炸或者消失的情况;LSTM可以解决梯度消失的情况。(严格上来讲,只能缓解梯度消失,而不能完全解决)

  • LSTM结构如下图所示,参考https://apaszke.github.io/lstm-explained.html
    在这里插入图片描述

二. LSTM的计算过程

现在有初始状态的输入xt, ht-1 ,ct-1参数说明:

  • x就是你的输入;
  • h表示hidden layer的神经元个数,就是你在定义LSTM结构时设置的参数;
  • c表示LSTM模型中记忆单元存储的状态。

LSTM的计算过程:

step1: 将xt和ht-1并起来,得到X;
step2:X分别和四个权值矩阵相乘,得到z, zi ,zf , zo

     z = tanh(WX),
     zi = sigmoid(Wi X)
     zf = sigmoid(Wf X)
     zo = sigmoid(Wo X)

step3:更新记忆单元状态,求ct
     ct = z⋅zi + ct-1 ⋅ zf

step4: 更新ht
     ht = zo ⋅ tanh(ct)

step5: 输出yt
      yt = f(ht)
(可以根据自己的需要选择f,例如选用softmax,sigmoid或者tanh函数等。)

三. LSTM的参数计算

从上面可以看到,

  • LSTM有4个输入,1个输出;
  • 输入的维度是X的维度,不是xt的维度,X_dim = x_dim + h _dim;
  • 就是4倍的 输入乘以输出 + 偏置项;
  • 因此,LSTM的参数计算为:p = 4*[ (x_dim + h_dim)*h_dim + h_dim ]

下面通过keras的示例验证一下。

"""
	基于 LSTM 的序列分类
"""
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import LSTM

max_features = 1024

model = Sequential()
model.add(Embedding(max_features, output_dim=256))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])
model.summary()
#model.fit(x_train, y_train, batch_size=16, epochs=10)
#score = model.evaluate(x_test, y_test, batch_size=16)

模型的结构和参数如下图所示:
在这里插入图片描述
可以看到LSTM这层的参数个数为197120。

输入x_dim = 256, h_dim = 128, 套用上述公式计算:4*((256+128)*128+128) = 197120

验证正确。

四. LSTM为什么能解决梯度消失的问题

4.1 RNN出现梯度消失或者爆炸的原因

RNN的结构如下图所示:
(图来自https://zhuanlan.zhihu.com/p/28687529)
在这里插入图片描述

  • 从上图可以看到,隐藏层的状态St+1是前一个时刻St和Ws的函数。
  • 现在假设损失为L,则反向求导L对Ws的导数时,会出现St+1对St求导的连乘,St+1对St求导等于Ws,即会出现很多个Ws连乘的情况。(假设激活函数就是1)
  • 如果t足够大,则当Ws小于1时,Ws * Ws * Ws…*Ws趋近于0,导致梯度消失;当Ws大于1时,Ws * Ws * Ws…*Ws会得到很大的值,导致梯度爆炸。
    在这里插入图片描述

总结:RNN中的hidden layer的weight随着t被反复的使用。

4.2 LSTM缓解梯度消失的原因

LSTM中,memory存于cell中,类比RNN,求ct对ct-1的导数,有第二节可知,
     X = [ht-1, xt]
     z = tanh(WX),
     zi = sigmoid(Wi X)
     zf = sigmoid(Wf X)
     zo = sigmoid(Wo X)
     ct = z⋅zi + ct-1 ⋅ zf
因为有:
     ht = zo ⋅ tanh(ct)
所以:
     ht-1 = zo ⋅ tanh(ct-1)
可以得到的信息:

  • ct是z, zi, zf, ct-1的函数
  • z, zi, zf是ht-1的函数
  • ht-1是ct-1的函数

因此,ct对ct-1的求导除了要计算ct = z⋅zi + ct-1 ⋅ zf这一项之外,还受到z, zi, zf这几项的影响,所以ct对ct-1的求导可能是大于1,也可能在[0,1]之间。
假如求得的gradient开始趋于0,我们可以通过设置z, zi, zf的值,让ct对ct-1的导数往1靠拢,从而解决梯度消失的问题。
那么,如何设置z, zi, zf的值呢?这几个参数是网络学习的呀!!!通过学习,决定什么时候让梯度消失,什么时候该保留。这就是LSTM多出这几个门厉害的地方了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LSTM(Long Short Term Memory)是一种用于处理序列数据的循环神经网络(RNN)模型。与传统的RNN相比,LSTM在处理长序列数据时能够更好地捕捉长期的依赖关系。 LSTM的核心是细胞状态(cell state),负责存储和传递信息。细胞状态可以被看作一个传送带,能够在整个序列中传递信息,而不受梯度消失或梯度爆炸的影响。LSTM通过门控单元(gate)结构来控制细胞状态的输入、输出和遗忘。 LSTM的门控单元包括输入门(input gate)、遗忘门(forget gate)和输出门(output gate)。输入门决定了哪些信息将被输入到细胞状态中,遗忘门决定了哪些信息将被从细胞状态中遗忘,输出门决定了哪些信息将被输出到下一步或最终输出。 在训练过程中,LSTM会通过反向传播算法来调整参数,使得模型能够适应给定的序列数据。LSTM模型的训练速度较慢,因为在时间步骤上需要进行反向传播,而且需要存储和计算更多的参数。 LSTM在实际应用中有广泛的应用,例如自然语言处理、语音识别、机器翻译等领域。它的主要优点是能够处理长时间的序列依赖关系,并且可以很好地捕捉关键信息。然而,LSTM也有一些缺点,例如模型复杂度高、训练速度慢等。 总之,LSTM是一种有效的模型,特别适用于处理序列数据,并且在实际应用中取得了很好的效果。随着深度学习的发展,LSTM的变种和改进也在不断涌现,使得序列数据的处理更加精确和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值