目录
什么是长短期记忆网络(LSTM)?
长短期记忆网络——通常被称为LSTM,是一种特殊的RNN,能够学习长期依赖性。由 Hochreiter 和 Schmidhuber(1997)提出的,并且在接下来的工作中被许多人改进和推广。LSTM 在各种各样的问题上表现非常出色,现在被广泛使用。
LSTM 被明确设计用来避免长期依赖性问题。长时间记住信息实际上是 LSTM 的默认行为,而不是需要努力学习的东西!
所有递归神经网络都具有神经网络的链式重复模块。在标准的 RNN 中,这个重复模块具有非常简单的结构,例如只有单个 tanh 层。
LSTM 也具有这种类似的链式结构,但重复模块具有不同的结构。不是一个单独的神经网络层,而是四个,并且以非常特殊的方式进行交互。
不要担心细节。稍后我们将逐步浏览 LSTM 的图解。现在,让我们试着去熟悉我们将使用的符号。
在上面的图中,每行包含一个完整的向量,从一个节点的输出到其他节点的输入。粉色圆圈表示逐点运算,如向量加法;而黄色框表示学习的神经网络层。行合并表示串联,而分支表示其内容正在被复制,并且副本将转到不同的位置。
长短期记忆网络(LSTM)的发展历史
1997年,Sepp Hochreiter 和 Jürgen Schmidhuber[1]提出了长短期记忆神经网络(LSTM),有效解决了RNN难以解决的人为延长时间任务的问题,并解决了RNN容易出现梯度消失的问题。
1999年,Felix A. Gers等人[2]发现[1]中提出的LSTM在处理连续输入数据时,如果没有重置网络内部的状态,最终会导致网络崩溃。因此,他们在文献[1]基础上引入了遗忘门机制,使得LSTM能够重置自己的状态。
2000年,Felix A. Gers和Jiirgen Schmidhuber[3]发现,通过在LSTM内部状态单元内添加窥视孔(Peephole)连接,可以增强网络对输入序列之间细微特征的区分能力。
2005年,Alex Graves和Jürgen Schmidhuber[4]在文献[1] [2] [3]的基础上提出了一种双向长短期记忆神经网络(BLSTM),也称为vanilla LSTM,是当前应用最广泛的一种LSTM模型。
2005年-2015年期间,相关学者提出了多种LSTM变体模型,此处不多做描述。
2016年,Klaus Greff 等人[5]回顾了LSTM的发展历程,并比较分析了八种LSTM变体在语音识别、手写识别和弦音乐建模方面的能力,实验结果表明这些变体不能显著改进标准LSTM体系结构,并证明了遗忘门和输出激活功能是LSTM的关键组成部分。在这八种变体中,vanilla LSTM的综合表现能力最佳。另外,还探索了LSTM相关超参数的设定影响,实验结果表明学习率是最关键的超参数,其次是网络规模(网络层数和隐藏层单元数),而动量梯度等设置对最终结果影响不大。
下图展示了Simple RNN(图左)和vanilla LSTM(图右,图中蓝色线条表示窥视孔连接)的基本单元结构图[5]:
在众多LSTM变体中,2014年Kyunghyun Cho等人[6]提出的变体引起了众多学者的关注。Kyunghyun Cho等人简化了LSTM架构,称为门控递归单元(GRU)。GRU摆脱了单元状态,基本结构由重置门和更新门组成。LSTM和GRU的基本结构单元如下图(具体可参考:Illustrated Guide to LSTM’s and GRU’s: A step by step explanation)。
在GRU被提出后,Junyoung Chung等人[7]比较了LSTM和GRU在复音音乐和语音信号建模方面的能力,实验结果表明GRU和LSTM表现相当。
GRU被提出至今(2019年),也只有几年时间,关于它的一些应用利弊到目前还未探索清楚。不过,相对于LSTM架构,GRU的的参数较少,在数据量较大的情况下,其训练速度更快。
LSTM是深度学习技术中的一员,其基本结构比较复杂,计算复杂度较高,导致较难进行较深层次的学习,例如谷歌翻译也只是应用7-8层的LSTM网络结构。另外,在训练学习过程中有可能会出现过拟合,可以通过应用dropout来解决过拟合问题(这在Keras等框架中均有实现,具体可参考:LSTM原理与实践,原来如此简单)。
LSTM在当前应用比较的结构是双向LSTM或者多层堆叠LSTM,这两种结构的实现在Keras等框架中均有对应的API可以调用。
下图展示一个堆叠两层的LSTM结构图(来源:运用TensorFlow处理简单的NLP问题):
下图展示了一个双向LSTM的结构图(来源:双向LSTM)
长短期记忆网络(LSTM)的核心思路
LSTM 的关键是细胞状态,即图中上方的水平线。
细胞状态有点像传送带。它贯穿整个链条,只有一些次要的线性交互作用。信息很容易以不变的方式流过。
LSTM 可以通过所谓“门”的精细结构向细胞状态添加或移除信息。
门可以选择性地以让信息通过。它们由 S 形神经网络层和逐点乘法运算组成。
S 形网络的输出值介于 0 和 1 之间,表示有多大比例的信息通过。0 值表示“没有信息通过”,1 值表示“所有信息通过”。
一个 LSTM 有三种这样的门用来保持和控制细胞状态。
如果对详细的技术原理感兴趣,可以看看这篇文章《
Illustrated Guide to LSTM’s and GRU’s: A step by step explanation》
长短期记忆网络(LSTM)基本原理
原始的RNN基本结构图如下图所示
由上图可知,RNN展开后由多个相同的单元连续连接。但是,RNN的实际结构确和上图左边的结构所示,是一个自我不断循环的结构。即随着输入数据的不断增加,上述自我循环的结构把上一次的状态传递给当前输入,一起作为新的输入数据进行当前轮次的训练和学习,一直到输入或者训练结束,最终得到的输出即为最终的预测结果。
LSTM是一种特殊的RNN,两者的区别在于普通的RNN单个循环结构内部只有一个状态。而LSTM的单个循环结构(又称为细胞)内部有四个状态。相比于RNN,LSTM循环结构之间保持一个持久的单元状态不断传递下去,用于决定哪些信息要遗忘或者继续传递下去。
包含三个连续循环结构的RNN如下图,每个循环结构只有一个输出:
包含三个连续循环结构的LSTM如下图,每个循环结构有两个输出,其中一个即为单元状态:
一层LSTM是由单个循环结构结构组成,既由输入数据的维度和循环次数决定单个循环结构需要自我更新几次,而不是多个单个循环结构连接组成(此处关于这段描述,在实际操作的理解详述请参考:Keras关于LSTM的units参数,还是不理解? ),即当前层LSTM的参数总个数只需计算一个循环单元就行,而不是计算多个连续单元的总个数。
下面将由一组图来详细结构LSTM细胞的基本组成和实现原理。LSTM细胞由输入门、遗忘门、输出门和单元状态组成。
- 输入门:决定当前时刻网络的输入数据有多少需要保存到单元状态。
- 遗忘门:决定上一时刻的单元状态有多少需要保留到当前时刻。
- 输出门:控制当前单元状态有多少需要输出到当前的输出值。
下图展示了应用上一个时刻的输出h_t-1和当前的数据输入x_t,通过遗忘门得到f_t的过程。
下图展示了应用上一个时刻的输出h_t-1和当前的数据输入x_t,通过输入门得到i_t,以及通过单元状态得到当前时刻暂时状态C~t的过程。
下图展示了应用上一个细胞结构的单元状态C_t-1、遗忘门输出f_t、输入门输出i_t以及单元状态的输出C~t,得到当前细胞的状态C_t的过程。
下图展示了应用上一个时刻的输出h_t-1和当前的数据输入x_t,通过输出门得到o_t的过程,以及结合当前细胞的单元状态C_t和o_t得到最终的输出h_t的过程。
长短期记忆网络(LSTM)代码实现
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
# 假设我们有一些数据
data = np.random.random((1000, 20)) # 1000个样本,每个样本20个特征
# 将数据分为训练集和测试集
train_data = data[:800]
test_data = data[800:]
# 定义LSTM模型
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(20, 1))) # 50个神经元
model.add(Dense(1))
# 编译模型
model.compile(optimizer='adam', loss='mse')
# 训练模型
model.fit(train_data, epochs=10, batch_size=32)
# 测试模型
test_loss = model.evaluate(test_data)
print(f"Test loss: {test_loss}")
长短期记忆网络(LSTM)的优缺点
优点
- 长程依赖建模:LSTM能够有效地解决梯度消失问题,能够捕获并利用长期依赖关系 。
- 灵活性:LSTM的遗忘门、输入门和输出门的设计赋予了它动态调整信息流动的能力,使其能适应各种序列数据的复杂特性 。
- 广泛应用:LSTM在自然语言处理、语音识别、时间序列预测等多个领域表现出色,已成为解决序列建模问题的标准工具之一 。
- 可以学习到时序特征:LSTM具有对时间的敏感性,能够学习到时序数据中的模式和特征,这使得它在时间序列预测、信号处理等任务中具有优势 。
缺点
- 计算复杂性:LSTM具有更多的参数和更复杂的计算过程,导致更高的计算成本和更长的训练时间 。
- 过拟合风险:由于LSTM强大的建模能力,它可能容易过拟合,特别是在数据有限的情况下,需要采取正则化策略或使用更简洁的模型架构 。
- 解释性较差:LSTM的内部机制复杂,理解和解释网络的决策过程相对困难,不利于模型的调试和优化 。
- 需要大量数据进行训练:LSTM有更多的参数需要训练,因此需要更多的数据来避免过拟合。如果训练数据不足,LSTM可能面临泛化能力不足的问题
长短期记忆网络(LSTM)应用场景
- 文本生成:LSTM能够生成连贯且符合语法的文本,常用于聊天机器人、文本摘要生成等场景 。
- 机器翻译:LSTM在自然语言处理任务中应用广泛,如机器翻译,能够理解源语言文本并生成目标语言文本 。
- 语音识别:LSTM用于处理声学特征序列,捕捉语音信号中的语言结构和上下文信息,将音频流转换为文本 。
- 时间序列预测:在金融、气象、能源等领域,LSTM用于对股票价格、气温、电力消耗等时间序列数据进行预测 。
- 手写识别:2009年,应用LSTM搭建的神经网络模型赢得了ICDAR手写识别比赛冠军 。
- 机械故障诊断和预测:自2015年以来,LSTM被用于处理机械设备的振动信号,进行故障诊断和预测 。
- 优化智能助手:例如,苹果公司使用LSTM来优化Siri应用,提高其理解和响应能力 。