一、LSTM的基础知识
输入层:(batch_size, time_steps, input_dim)
LSTM输入层的维度是3
(1)batch_size:量级——每次训练轮次(batch)中数据量大小
(2)time_steps:时间维度——每个训练批次(batch)中单个输入数据所持续的时间步长(一个数据窗口的长度)
(3)input_dim:数据维度——每个训练批次(batch)中单个输入数据的维度
隐含层:num_units
用于记忆过去时刻网络状态的节点数量
输出层:output_dim
输出数据的维度,如:类别个数
训练方式:用一个批次的数据训练LSTM网络后,执行一次LSTM网络参数的更新操作。
二、LSTM的逻辑结构
图1[1]和图2[1]是目前最流行的理解LSTM等递归神经网络(RNN)的一种讲解方式,初学者看到这幅图确实很容易理解LSTM的展开形式,但也是最误导初学者的图示。作为初学者,看完这幅图你是否也是这样理解的呢?
(1)设置LSTM网络参数中的隐层单元个数就是为展开后的LSTM模块的数量(即图2中的展开后的t个LSTM单元)
(2)输入数据在每个训练轮次中分别对应输入到展开后t个相应的LSTM单元
(3)LSTM网络包括图2所示的t个模块/单元
展开后的效果
然而,以上理解其实是错误的,这种展开效果仅仅只是一个LSTM模块的一种时间维度上一种计算效果图
实际上,LSTM都没有展开效果图上的这t个单独的模块,而仅仅只有一个,所有的数据训练都是在训练一个LSTM模块/单元,并在每一个批次所有数据完成训练后更新一次网络参数。
三、LSTM的实际物理结构
图3[2] 和图4[2] 则是LSTM实际物理结构图
由图3[2] 可以看出,事实上只有一个LSTM模块自己环绕自己来完成上面的时间维度上的展开效果
输入:上一时刻的网络状态向量、上一时刻
网络输出向量、当前时刻
的输入向量
输出:的网络状态向量、
网络输出向量
由图4[2] 则进一步详细揭示了LSTM模块内部的实际物理结构,我们设置LSTM的参数hidden_size或者num_units(不同的深度学习框架参数名称不一样)是设置了一个LSTM模块内部的状态向量和输出向量的维度,而不是LSTM模块/单元的数量。
图示实例讲解:
batch_size = 1
time_steps = 6
input_dim = 1
一个批次的数量数据只有一条,该条数据的时间跨度为6(对应图3中的X(t),一个时间窗中的数量,如:传感器的采样频率——每秒采样的数据量)、维度为1(如:1轴传感器数据)
num_units = 128
图3和图4中不同颜色分别对应一层不同激活函数的神经网络,这里num_units=128就设置了每一层网络的神经元个数,也就对应图4所示的每一个层神经网络、整个LSTM网络输出向量和状态向量的维度。
四、LSTM中的门控(结合上图实例)
LSTM网络主要包括:输入门、输出门、遗忘门
每一个门控逻辑/函数都是由num_units = 128个的隐含层神经元来实现相关功能
隐含层中的num_units = 128个隐层神经元与输入向量x之间是全连接关系,即完成 非线性映射函数功能,本质上就是通过参数矩阵
对输入向量
进行不同维度上的数据筛选。
五、总结
对于很多像我这样的初学者来说,看 [1] 所给出的LSTM原理效果图,在一定程度上有利于理解LSTM的时间维度上的相关原理,但是也很容易被误导以为LSTM网络有多个LSTM单元构成!
实际上,
(1)LSTM网络仅有一个LSTM逻辑单元/模块
(2)每个LSTM网络中的门控逻辑都是由多个隐层神经元构成,每一层的隐层神经元个数是由LSTM网络参数num_units = 128控制的
(3)LSTM网络的输入是3维的
(4)LSTM输入参数time_steps是控制时间维度上执行几次自身状态向量和输出向量的自我传递和利用
(5)LSTM的输入层与LSTM内部门控逻辑中的隐含层之间是全连接关系,因此不要被图2误导认为输入层参数time_steps与LSTM单元/模块的个数是一样的,整个LSTM网络就只有一个LSTM功能单元/模块。
参考文献:
(1)http://colah.github.io/posts/2015-08-Understanding-LSTMs/
(2)https://blog.csdn.net/shenxiaoming77/article/details/79390595