这两天被LSTM搞的头大,作为深度学习只入门四天的我对各式各样的名词真心无力。但好在功夫不负有心人,终于初步理解了LSTM
目标
- 以
周期数列
为例,学习LSTM的使用,并初步理解LSTM的输入与输出
LSTM应用场景
数据涉及到序列的,并且序列数据有界。都可以以LSTM为核心来进行学习。
怎样的数据涉及到序列,以本文的周期数列为例子,每一项,都与之前项有必然的链式关系,并且数据有界,一般的,但凡有存在链式关系的数据,都可以进行泛化预测。天气预报、语言对话(NLP),温度预测,乃至股票预测都是可能的,但是这些都有一个非常非常重要的因素,那就是相关数据的分析,比如影响温度的因素是什么?所以从这一点来说,股票又是不可预测的。需要注意的是像如发散的无穷数列是很难使用LSTM预测的。因为如果预测样本不在拟合的范围内。此时预测的数据是很难的。
从一开始我一直想预测等差数列,但是效果太差,只有靠近样本中心,效果才会好,我一直以为是我对LSTM的理解用法有问题,但我今天在取快递的路上突然想到,如果训练数据都在一个边界内训练,要想预测边界外的数据理论上是不可能的,因为情况太多。因此我认为要想能够预测等差数列,必须要对数据定义一个边界,至于边界与真实数据怎么样的映射关系这是需要分析的,只有处理好了边界映射,训练的效果才会好。
为什么LSTM处理序列数据那么强大,因为它有’记忆’,在内部设计有处理序列之间关系的算法。LSTM又叫长短期记忆(LSTM,long short-term memory)
以最简单的周期数列开始
下面我们将以最简单的周期数列开始,学习LSTM,现有
周期数列{1,2,3,1,2,3}
预测后面的结果,当然这样的预测实际意义是不大的。案例的目的仅仅是以这数据为基础,方便理解LSTM工作原理,事实上,复杂的训练也是以这简单的数据为核心开始的。
训练数据输入与输出的处理
LSTM数据输入格式
数据输入格式(batch_size,timesteps,input_features)
这是一个3D张量
,这个输入也只能必须当且仅当是3D张量,不懂什么叫张量?如果是读过高中那就没问题,计算机张量
和数学向量
基本上是一回事,两者本质上是对信号的一种表达。如果LSTM作为第一层,训练数据必须为3D张量
timesteps 表示
序列长度
,打个比方,我们将周期数列转换为一批又一批的序列数据,LSTM在每次进行记忆的就是单个序列中每个特征值之间的联系。这里的特征值可以理解为周期数列的1,2,3,1,2,3。因为我们的周期数列长度为6,注意这个6不一定是序列长度,序列长度是你定义的,他应该大于1小于6。假设我们现在定义序列长度为2。那么根据周期数列{1,2,3,1,2,3}我们可以推出以下数据
手动转换周期数列为3D张量
对于周期数列 {1,2,3,1,2,3}一定存在这样的关系,我们从左边取序列长度为2
数据有,这是一个滑动固定窗口的过程,注意高亮数据
原始数据 | 张量每一批(timesteps,input_features) | 张量输出每一批 |
---|---|---|
{
1,2 ,3,1,2,3} |
[[1],[2]] | 3 |
{1,2,3 ,1,2,3} |
[[2],[3]] | 1 |
{1,2,3,1 ,2,3} |
[[3],[1]] | 2 |
{1,2,3,1,2 |