其他分享
首页 > 其他分享> > LSTM模型

LSTM模型

作者:互联网

LSTM比RNN复杂很多,RNN只有一个参数矩阵A,LSTM有4个(遗忘门,输入门,更新值,输出门)

 

LSTM有一个非常重要的传输带Ct,过去的信息通过这个传输带送给下一时刻,不会发生太大变化,并且通过这个传输带避免梯度消失的问题

LSTM有很多门让信息有选择的通过

遗忘门:

 

 

将a向量待入sigmod函数得到相对应的f值,然后将这个f值与c传输带相乘得到output,当的值为0时,output也会相应的等于0,那么该条信息就不通过,当值为1时,output输出c本身,该条信息通过

 

 h(t-1) 与xt做点积得到更高的向量,然后计算Wf与这个向量的乘积得到新的向量,再将这个新向量带入sigmod函数得到ft,且ft在0~1之间,Wf需要通过反向传播在训练数据里传播

 

输入门:

it的计算依赖于上一时刻的状态向量h(t-1)和新的时刻输入Xt,与遗忘门类似,h(t-1) 与xt做点积得到更高的向量,然后计算Wi与这个向量的乘积得到新的向量,再将这个新向量带入sigmod函数得到it,且it在0~1之间,输入门有自己的参数矩阵记作Wi,需要在训练数据中学习,

 

 计算每次更新的值:

h(t-1) 与xt做点积得到更高的向量,然后计算Wc与这个向量的乘积得到新的向量,再将这个新向量带入tanh函数得到it,且Ct在-1~1之间,它有自己的参数矩阵记作Wc

 

计算出遗忘门ft ,输入门it, 更新值Ct, 以及传输带旧值C(t-1), 就可以更新现在的传输带值Ct

ft 和 C(t-1) 是维度相同的向量,二者进行点积,遗忘门ft可以选择性的遗忘C(t-1)中的元素(那些output=0的信息),it 和 Ct点积更新新的值在传输带上,它们的和记作Ct,这样就完成了对传输带的一轮更新

用遗忘门删除了传送带上的某些信息,同时再加入新的信息,得到新的传输带的值Ct 

 

输出门

更新完Ct,就到了最后一步,状态向量ht的输出

首先计算输出门Ot,与之前一样,h(t-1) 与xt做点积得到更高维的向量,然后计算Wo与这个向量的乘积得到新的向量,再将这个新向量带入sigmod函数得到Ot,且Ot在0~1之间,输入门有自己的参数矩阵记作Wo,需要在训练数据中学习

 

 对Ct元素的每一个向量做双曲正切,带入tanh()函数中得到的新向量与Ot做点积,得到ht

ht有两份copies,一份传给下一时刻的状态向量ht,一份作为LSTM的输出

 

LSTM参数

LSTM共有4个参数矩阵,所以×4

 

 用Keras实现LSTM

from keras.models import Sequential
from keras.layers import LSTM, Embedding, Dense,Flatten
vocabulary = 10000   #一共有10000个词
embedding_dim = 32  #词向量X的维度
word_num = 500       #句子的长度,超过500会截断,不够的通过zero_padding补零
state_dim = 32       #状态向量h的维度

model = Sequential()  #建立一个Sequential模型,往里加层
model.add(Embedding(vocabulary, embedding_dim, input_length=word_num)) #首先第一层word embedding
model.add(LSTM(state_dim, return_sequences=False))   #然后是SimpleRNN layer,return_sequences=False只输入最后一个状态ht,其余不输出
model.add(Dense(1,activation='sigmoid') ) #全连接层,输出一个0/1的数
model.summary()

 

 由于我们只输出最后一个状态向量,所以是32维

 

 LSTM与SimpleRNN对比:

二者主要的区别是多了一条传输带,让过去的信息可以很容易的传到下一时刻,这样就有了更长的记忆

标签:模型,传输,得到,LSTM,遗忘,向量,Ct
来源: https://blog.csdn.net/KK_1657654189/article/details/121798248