邵洲作者

初学者如何避免在序列预测问题中遇到的陷阱?

LSTM是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。在自然语言处理、语言识别等一系列的应用上都取得了很好的效果。

《Long Short Term Memory Networks with Python》是澳大利亚机器学习专家Jason Brownlee的著作,里面详细介绍了LSTM模型的原理和使用。

该书总共分为十四个章节,具体如下:

第一章:什么是LSTMs?

第二章:怎么样训练LSTMs?

第三章:怎么样准备LSTMs的数据?

第四章:怎么样在Keras中开发LSTMs?

第五章:序列预测建模(本期内容)

第六章:怎么样开发一个Vanilla LSTM模型?(下周一发布)

第七章:怎么样开发Stacked LSTMs?

第八章:开发CNN LSTM模型

第九章:开发Encoder-Decoder LSTMs

第十章:开发Bidirectional LSTMs

第十一章:开发生成LSTMs

第十二章:诊断和调试LSTMs

第十三章:怎么样用LSTMs做预测?

第十四章:更新LSTMs模型

本文的作者对此书进行了翻译整理之后,分享给大家,本文是第五期内容。

第一期内容为:一万字纯干货|机器学习博士手把手教你入门LSTM(附代码资料)

第二期内容为:干货推荐|如何基于时间的反向传播算法来训练LSTMs?

第三期内容为:干货推荐|如何准备用于LSTM模型的数据并进行序列预测?(附代码)

第四期内容为:机器学习博士带你入门|一文学会如何在Keras中开发LSTMs(附代码)

本文有7000字左右,阅读需7分钟,建议收藏学习。

5.0 前言

5.0.1 课程目标

本节课的目的是让大家了解4个序列预测模型以及如何在Keras中实现它们。完成这一课之后,你会知道:

  • 序列预测的4种模型及其在Keras中的实现;

  • 如何将4个序列预测模型映射到共同的和有趣的预测预测问题中;

  • 初学者在序列预测问题中遇到的陷阱以及怎么样避免它们。

5.0.2 课程概览

本课程分成5个部分,它们是:

  1. 序列预测;

  2. 序列预测的模型;

  3. 模型的映射应用;

  4. 时间步长的基数;

  5. 两个常见的错误。

让我们开始吧!

5.1 序列预测

LSTMs通过学习函数( f(...))来工作,该函数将输入序列值(X)映射到输出序列值(y)上。

  1. y(t)=f(X(t))

表 5.1 一般LSTM模型的例子

所学到的映射函数是静态的,可以看做是一个接受输入变量和使用内部变量的程序。内部变量可以被表示为由网络所维持和建立或者在输入序列的每个值上所累积的内部状态。静态映射函数可以用一个不同数量的输入或者输出定义。本章节主要关注这个重要的细节。

5.2 序列预测的模型

在本章节中,将会看到4个序列预测的基本模型。我们将会用到下面的术语:

  • X:输入序列值;可能会被一个时间步限定限定,例如 X(1)

  • u:隐藏状态值;可能会被一个时间步长所限制,例如 u(1)

  • y:输出序列值;可能会被一个时间步长所限制,例如 y(1)

每个模型将会用这些术语、图片和Keras中的代码例子进行解释。重点关注学习不同类型的序列预测问题如何映射到不同类型的模型。不要太关注Keras实例的细节,因为整个章节都致力于解释更复杂的模型类型。

5.2.1 One-to-One模型

一个one-to-one模型( f(...))为每一个输入值( X(t))产生一个输出( y(t))值。

图 5.1 one-to-one序列预测问题

例如:

  1. y(1)=f(X(1))

  2. y(2)=f(X(2))

  3. y(3)=f(X(3))

  4. ...

表 5.2 one-to-one序列预测模型的例子

第一个时间步长的内部状态是0,;从这一点开始,内部状态被累计在先前的时间步长上。 

图 5.2 基于时间的one-to-one序列预测模型

这个模型对于序列预测问题是合适的,这里我们希望给定1个时间步长作为输入的时候预测1个时间步长。例如:

  • 时间系列中预测下一个真是的值;

  • 在一个句子中预测下一个单词;

这是一个对LSTM不好的使用,因为它不能学习输入或者输出的时间步长。该模型把所有的压力都放在了内部状态或者存储上。模型的结果可以用来建造一个模型,该模型有输入或输出序列以便查看通过时间步长学习是否会对预测有积极的作用。我们可以通过定义一个1个时间步长输入以及在输出层预测1个时间步长的网络来将其在Keras中应用。

  1. model = Sequential()

  2. model.add(LSTM(..., input_shape=(1, ...)))

  3. model.add(Dense(1))

表 5.3 在Keras中定义一个one-to-one序列预测模型的例子

5.2.2 One-to-Many模型

一个one-to-many模型( f(...))对于输出值( X(t))产生多个输出值( y(t)y(t+1),...)。例如:

  1. y(1),y(2)=f(X(1))

表 5.4 one-to-many序列预测模型的例子

考虑时间对于输入和输出的单独计算可能会有帮助。

图 5.3 one-to-many序列预测模型

当输出序列中的每个值被产生的时候,内部状态就被积累。该模型适合于序列预测问题,我们希望为每个输入时间步长产生序列输出。例如:

  • 从一个单一的图片中预测一个序列的词;

  • 从一个单一事件中预测一系列的观察值;

该模型一个很好的例子是为图片生成一个文字的标题。在Keras中,这需要一个卷积神经网络来从图像中抽取特征,然后接着由LSTM模型来一次性输出词的序列。输出层每个输出时间步长预测一个观察值,并且为了使用相同的输出层多次输出所需要数量的时间步长,该输出层被包裹在 TimeDistributed包裹层中。

  1. model = Sequential()

  2. model.add(Conv2D(...))

  3. ...

  4. model.add(LSTM(...))

  5. model.add(TimeDistributed(Dense(1)))

表 5.5 Keras中定义one-to-many序列预测模型的例子

5.2.3 Many-to-One模型

一个many-to-one模型( f(...))在收到多个输入值( X(t)X(t+1),...)产生一个输出( y(t))值。例如:

  1. y(1) = f(X(1), X(2))

表 5.6 many-to-one序列预测模型例子

同样,在输入序列和输出序列中考虑时间被单独计算是有帮助的。

图 5.4 many-to-one序列预测模型

在产生一个输出值之前,内部状态与每个输入值一起累积。该模型适用于序列预测问题,其中需要多个输入时间步长,以便进行进一步预测。例如:

  • 在给定一个输入观察值序列时,在时间系列中预测下一个真实值;

  • 为词输入序列预测分类标签,例如情感分析。

这个模型就像one-to-one模型一样可以在Keras中实现,输入时间步长所期望的数目可以被变化为问题所需要的样子。

  1. model = Sequential()

  2. model.add(LSTM(..., input_shape=(steps, ...)))

  3. model.add(Dense(1))

表 5.7 在Keras模型中定义一个many-to-one序列预测模型的例子

通常,当实践者实施一对一模型时,他们实际上打算实现多对一模型,例如当在时间序列预测的情况下。在第六章中一个many-to-one模型开发来用于序列预测问题,第七章中用来预测一个单向量输出,以及第八章中用来做序列分类。

5.2.4 Many-to-Many模型

一个many-to-many模型( f(...))在接收到多个输入值( X(t)X(t+1),...)产生多个输出( y(t)y(t+1),...)。例如:

  1. y(1),y(2) = f(X(1), X(2))

表 5.8 many-to-many序列预测模型的例子

图 5.5 many-to-many序列预测模型

与多对一的情况一样,状态被积累到第一次输出被创建。但是在这种情况下,输出多个时间步长。重要的是,输入时间步长的数目不必与输出时间步长的数目相匹配。该模型适用于序列预测,其中需要多个输入时间步长以预测输出时间步长序列。这些通常被称为序列到序列,或seq2seq,类型问题,并且最近可能是主要使用LSTMs进行学习的问题。例如:

  • 将一个文档的词汇总结到一个短序列词语中;

  • 将一个序列的音频数据分类到一个序列的词语中。

  1. model = Sequentail()

  2. model.add(LSTM(..., input_shape=(steps, ...), return_sequences = True))

  3. model.add(TimeDistributed(Dense(1)))

表 5.9 用相同长度的输入和输出序列在Keras中定义一个many-to-many序列预测模型的例子

如果输入和和输出时间步长的数目不同,则可以使用Encoder-Decoder结构。将输入的时间步长映射到序列中的一个固定大小的内部表示,然后使用该向量作为输入来产生输出序列的每个时间步长。

  1. model = Sequential()

  2. model.add(LSTM(..., input_shape = (in_steps, ...)))

  3. model.add(RepeatVector(out_steps))

  4. model.add(LSTM(..., return_sequences = True)

  5. model.add(TimeDistributed(Dense(1)))

表 5.10 通过不同长度的输入和输出序列在Keras中定义一个many-to-many序列预测问题

这可能是最为复杂的序列预测模型,具有许多变化和优化的探索。第九章中开发了一个many-to-many模型,其输入和输出序列有不同数目的时间步长(例如序列长度)。第10章中也开发了一个many-to-many模型,其输入和输出序列具有相同数量的时间步长。

5.3 将模型映射到应用

我真的希望你理解这些模型,以及如何把你的问题作为上述4种类型之一。为此,本节列出了10种不同的序列预测模型问题,并指出了哪些模型可以用来解决这些问题。在每一个解释中,我给出了一个可以用来解决问题的模型的例子,但是如果重新需要预测序列预测问题,则可以使用其他的模型。把这些当做最好的建议,而不是牢不可破的规则。

5.3.1 时间序列

  • 单变量预测。这是一个具有多个输入时间步长的系列,并希望预测超出输入序列的一个时间步长。这可以被多对一模型实现。

  • 多变量预测。这是多个具有多个时间步长的系列,并希望在一个或者多个输入时间序列的基础上预测一个时间步长。这可以实现many-to-one模型。每个系列就是另一个输入特征。

  • 多步长时间序列预测。这是一个或者多个具有时间步长的系列,并希望在一个或者多个输入序列上预测多个时间步长。这可以被many-to-many的模型实现。

  • 时间序列分类。这是一个或者多个具有多个时间步长的输入的系列,并希望输出一个分类标签。这个可以被many-to-one模型实现。

5.3.2 自然语言处理

  • 图像标题。这是你具有一张图片,并且希望生成一个文本描述。这可以被one-to-many模型实现。

  • 视频描述。这是你具有视频中一个系列的图片,并且希望生成一个文本的描述。这可以被many-to-many模型实现。

  • 情感分析。这里你具有一系列的文本作为输入,并希望生成一个分类标签。这可以被many-to-one模型实现。

  • 语音识别。这里你具有一个序列的语音数据作为输入,并希望生成他们所说内容的文本描述。这可以被many-to-many模型实现。

  • 文本翻译。这里你具有一种语言的一个序列的单词作为输入,希望生成另一种语言的一个序列的输出。这可以被many-to-many模型实现。

  • 文本摘要。这里你具有一个文档的文本作为输入,并希望产生该文档的短文本摘要作为输出。这可以被many-to-many模型实现。

5.4 来自时间步长的基数(不是特征!)

混淆的一个共同点是将上述序列映射模型与多个输入和输入特征相混淆。序列可以由单个值组成,每个时间步长一个值。

或者序列可以被简单地表达为时间步长上多个观察值的一个向量(例如,在给定时间步长,根据[X1,X2]来预测[y1,y2])。向量在时间步长中的每个item可以被认为是它自己的单独的时间序列。它没有对上述模型的描述。例如,输入温度(X1)和压力(X2)的一个时间步长的模型并预测温度(y1)和压力(y2)的一个时间步长是one-to-one的模型,而不是many-to-many模型。

图 5.6 多特征序列预测模型

模型可以接受两个值作为输入,具有两个分别的内部状态,并且预测两个值,并且预测两个值,但是只有一个序列的时间步长表示输入,并作为输出预测。上述序列预测模型的基数是指时间步长,而不是特征。

5.5 两个经常的误解

特征vs时间步长的混淆导致了实践者在实现LSTMs模型的时候的两个主要的误解。

5.5.1 时间步长作为输入特征

在以前的时间步长滞后观察值被界定为模型的输入特征。这是感知机输入序列预测问题中经典的fixed-window-based方法。相反地,该序列应该作为多输入时间步长(例如many-to-one模型)呈现给模型。这种混乱可能会导致你认为自己已经实现了one-to-many或者many-to-many模型,实际上你只有一个单一的向量输入一个时间步长。

5.5.2 时间步长作为输出特征

在多个未来时间步长的预测被界定为模型的输出特征。这是感知机和其它机器学习算法中用于多步预测的经典的基于固定窗口的方法。相反,应该一次生成一个时间步长的模型。这种混乱可能会导致你认为你已经实现了one-to-many或many-to-many的序列预测模型,实际上你只有一个单一的向量输出一个时间步长(例如,seq2vec不是seq2seq)。

注意:帧时间步长作为序列预测问题的特征是一种有效的策略,并且及时在使用循环神经网络时也可以提高性能(试试它!)。这里重要的一点是了解常见的陷阱,而不是在自己预测问题的时候欺骗自己。

5.6 扩展阅读

这个章节提供了一些用于扩展阅读的资源。

5.6.1 论文

  • The Unreasonable Effectiveness of Recurrent Neural Networks, 2015.

5.7 扩展

你是否想更加深入地了解序列预测模型?本节列出了本课程一些您可能需要考虑的具有挑战性的扩展:

  • 总结在你自己的备忘录上总结这4个模型;

  • 累出多变量时间序列可以被构造的所有方式和可以使用的二次预测模型;

  • 为该模型选择一个模型一个应用程序,并用示例输入和输出序列绘制图表;

  • 列出每个模型的序列预测问题的2个新实例;

  • 在arXiv.org上找到5篇近期的关于LSTM的论文,列出标题并说明它们讨论了哪些序列预测模型。

欢迎大家将自己做了的扩展分享给我们。

5.8 总结

在本课程中,你发现了4个序列预测的模型,以及怎样在Keras中实现它们。具体来说,你学习到了:

  • 序列预测的4个模型以及怎么样在Keras中实现它们;

  • 序列预测问题的例子以及它们映射到哪4个模型;

  • 在应用序列预测模型中初学者可能会遇到的陷阱以及怎么样避免它们;

AMiner学术头条
AMiner学术头条

AMiner平台由清华大学计算机系研发,拥有我国完全自主知识产权。系统2006年上线,吸引了全球220个国家/地区800多万独立IP访问,数据下载量230万次,年度访问量1000万,成为学术搜索和社会网络挖掘研究的重要数据和实验平台。

https://www.aminer.cn/
专栏二维码
入门LSTM序列预测
6
相关数据
机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

时间递归神经网络技术

时间递归神经网络 (aka.循环神经网络, RNN) 是一类擅长处理序列数据的神经网络,其单元连接形成一个有向环。一般人工神经网络(ANN)由多层神经元组成,典型的连接方式是在前馈神经网络中,仅存在层与层之间的互相连接,而同层神经元之间没有连接。RNN在此基础上结合了隐藏层的循环连接,从而能从序列或时序数据中学习特征和长期依赖关系。RNN隐藏层的每一单独计算单元对应了数据中某个时间节点的状态,它可以是简单神经元、神经元层或各式的门控系统。 每一单元通过参数共享的层间顺序连接,并随着数据序列传播。这一特性使得RNN中每一单元的状态都取决于它的过去状态,从而具有类似“记忆”的功能,可以储存并处理长时期的数据信号。 大多数RNN能处理可变长度的序列,理论上也可以建模任何动态系统。

反向传播算法技术

反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法计算对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。 在神经网络上执行梯度下降法的主要算法。该算法会先按前向传播方式计算(并缓存)每个节点的输出值,然后再按反向传播遍历图的方式计算损失函数值相对于每个参数的偏导数。

卷积神经网络技术

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

语音识别技术

自动语音识别是一种将口头语音转换为实时可读文本的技术。自动语音识别也称为语音识别(Speech Recognition)或计算机语音识别(Computer Speech Recognition)。自动语音识别是一个多学科交叉的领域,它与声学、语音学、语言学、数字信号处理理论、信息论、计算机科学等众多学科紧密相连。由于语音信号的多样性和复杂性,目前的语音识别系统只能在一定的限制条件下获得满意的性能,或者说只能应用于某些特定的场合。自动语音识别在人工智能领域占据着极其重要的位置。

语言识别技术

在自然语言处理中,语言识别或语言猜测是确定给定内容所使用的自然语言的问题。针对该问题的计算方法被视为文本分类的特例,并用各种统计方法解决。

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

序列到序列技术

时间序列预测技术

时间序列预测法其实是一种回归预测方法,属于定量预测,其基本原理是;一方面承认事物发展的延续性,运用过去时间序列的数据进行统计分析,推测出事物的发展趋势;另一方面充分考虑到偶然因素影响而产生的随机性,为了消除随机波动的影响,利用历史数据进行统计分析,并对数据进行适当处理,进行趋势预测。

推荐文章
暂无评论
暂无评论~