最近由于项目需要,需要使用LSTM进行时间序列预测,由此通过这篇文件,回忆并总结下LSTM的一些关键性问题。
一、LSTM原理:
1、一句话总结LSTM
LSTM即是长短期记忆网络
2、LSTM中门和时间步
门和时间步的概念
-- LSTM的中有四个门,每个门负责是否把短期记忆纳入长期记忆中(或者说负责将短期记忆的某一部分是否纳入长期记忆)
-- 每个时间步,都是网络的一个瞬时状态(cell)
样本和时间步的联系
-- 样本最小批次长度 = 时间步个数
-- 具体流程是:
-- 设样本总数是N,时间步数为t
-- 将样本按时间线从上到下排序,然后分为 N/t 批次 ,每批次长度为t
二、LSTM 返回值分析:
1、state_h
即是hidden state ,即是短期记忆输出;
-- 它的一部分内容最终会增强或者遗忘后,加入到长期记忆中,成为长期记忆的一部分;
-- 同时长期记忆的内容state_c也会在第四道门输出门处影响最终输出state_h
2、state_c
即是cell state,即是长期记忆依赖
-- return_sequences和return_state默认就是false
3、return_sequences=False && return_state=False
-- 返回:只返回最后一个时间步的state_h的值
4、return_sequences=True && return_state=False
-- 返回:输出的hidden state 包含全部时间步的结果
5、return_sequences=False && return_state=True
-- 返回:最后一个时间步的 hidden state。最后一个时间步 cell state结果。
6、return_sequences=True && return_state=True
-- 返回:lstm1 存放的就是全部时间步的 hidden state。state_h 存放的是最后一个时间步的 hidden state。state_c 存放的是最后一个时间步的 cell state
三、使用LSTM进行预测
究竟是使用短期记忆的输出还是长期记忆的输出?
1、后面如果使用全连接层+softmax
一般设置:return_sequences=False,即是只输出最后一个时间步的短期记忆输出作为最终输出
2、如果后面还接LSTM
则需要输出全部时间步的 hidden state作为下一个LSTM的输入
3、目前只碰到过这两种情况
有其他情况再接着补充(其实只要输出的维度,可以构建损失函数即可,具体看实际场景,能不能构建这样的损失函数)