摘要:
本文以口语化的形式来解析了长短期记忆网络(LSTM)的工作原理,如遗忘门、输入门和输出门是如何协同工作,如何决定哪些信息应该被记住或遗忘。
发散思路,想象一下。你当前正在看一本小说,书中的人物关系错综复杂。为了捋清思路,你仅能记住一些重要信息(如主角的性格特点),只好同时忘记一些无关紧要的内容(如某些次要事件)。LSTM就像你的大脑一样,它能够有选择地记住有用的信息,忘记无用的信息。这使得LSTM非常适合处理像语音识别、机器翻译这样的任务。
遗忘门(Forget Gate)
遗忘门的作用是决定是否保留上一个时间步的信息。
遗忘门决定了哪些信息应该被丢弃,哪些应该保留在记忆细胞中。具体来说,在时刻 t,LSTM 接收到输入向量 x_t。这个向量乘以权重矩阵 W_xf,得到结果向量 A;同时,上一时刻的隐藏层状态输出向量 h_(t-1) 也参与计算,它乘以另一个权重矩阵 W_hf,得到结果向量 B。将这两个结果相加,并加上偏置项 b_f,形成一个新的向量 E。这个向量 E 不仅用于遗忘门,还会在输入门和输出门中重复使用。

接下来,向量 E 通过 Sigmoid 激活函数进行归一化处理,生成遗忘门的输出向量 F。该向量中的每个元素都在 0 到 1 之间,表示对应维度信息保留的概率;接近 1 意味着倾向于保留,而接近 0 则意味着几乎完全丢弃。最后,将 F 与前一时刻的记忆细胞状态 C_(t-1) 做按元素相(Hadamard product),以此更新记忆细胞的状态,最终得到遗忘门的输出结果 L,它代表模型的长期记忆。

输入门(Input Gate)
输入门负责决定当前时间步哪些新信息应该加入到记忆细胞中。
首先,使用上一时刻的记忆信息 C_(t-1),经过 Sigmoid 激活函数归一化之后得到向量 P。这个向量实际上是一个信息选择向量,里面的值越接近于 1,则越倾向于保留对应维度的信息;越接近于 0,则代表越倾向于遗忘对应维度的信息。与此同时,基于相同的输入向量 E(来自遗忘门的计算),送入 Tanh 激活函数,得到新的候选记忆向量 Q。此向量包含可能添加到记忆细胞的新信息。然后,将向量 P 和 Q 按元素相乘,得到向量 S。这一步骤实际上是将输入信息 Q 中有价值的部分有选择性地记录下来,作为短期记忆的一部分存储在向量 S 中。

输出门(Output Gate)
输出门决定从记忆细胞输出的信息,以及如何结合长期和短期记忆以形成下一个隐藏状态 h_t。
首先,将遗忘门处理后的长期记忆 L 与输入门处理后的新信息 S 求和,得到更新后的记忆细胞状态 C_t。这个状态不仅用于传递给下一个时间步的记忆细胞,还参与到了输出门的操作中。对更新后的记忆细胞状态 C_t 应用 Tanh 激活函数,使其值域限定在 -1 到 1 之间,随后再与输出门产生的控制信号 N(同样是通过 Sigmoid 激活输入向量 E 获得)按元素相乘。这样做的目的是根据当前的记忆状态选择性地输出信息,最终形成新的隐藏状态 h_t。

代码示例:使用Keras构建一个简单的LSTM模型
用Keras库来构建一个简单的LSTM模型,用于处理文本分类任务。假设我们有一个情感分析的任务,目标是判断一段文本的情感是正面还是负面。
#导入必要的库
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout
from tensorflow.keras.preprocessing.text import Tokenizer
为了简化,我们可以使用内置的数据集,例如IMDB电影评论数据集。
# 准备数据集
max_features = 10000 # 只考虑最常见的10000个单词
maxlen = 200 # 每条评论的最大长度
# 加载IMDB数据集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data(num_words=max_features)
# 将每条评论填充或截断到固定长度
x_train = pad_sequences(x_train, maxlen=maxlen)
x_test = pad_sequences(x_test, maxlen=maxlen)
构建LSTM模型
model = Sequential()
model.add(Embedding(input_dim=max_features, output_dim=128))
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
print(model.summary())
训练模型
batch_size = 32
epochs = 5
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(x_test, y_test))
评估模型
score, acc = model.evaluate(x_test, y_test,
batch_size=batch_size)
print(f'Test score: {score}')
print(f'Test accuracy: {acc}')
总结
LSTM最大的特点就是能够记住长期记忆。
通过上述三个门——遗忘门、输入门和输出门,LSTM 可以巧妙地控制着信息流,使得模型能够在处理序列数据时有效地学习到长期依赖关系,同时避免了传统 RNN 容易遇到的梯度消失问题。
Author:余胜辉
注:文章仅为个人理解参考,图片来源于网络。
参考文献:
《深入理解LSTM:从原理到实现》 Towards Data Science
《Deep Learning》 by Ian Goodfellow, Yoshua Bengio, and Aaron Courville
1125





