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