互联网上也有很多类似教程,比如:
·
<a href="http://monik.in/a-noobs-guide-to-implementing-rnn-lstm-using-tensorflow/">使用Tensorflow实现RNN-LSTM的noob指南</a>
<a href="https://svds.com/tensorflow-rnn-tutorial/">TensorFlow RNN教程</a>
<a href="https://medium.com/towards-data-science/lstm-by-example-using-tensorflow-feb0c1968537">LSTM通过使用Tensorflow的示例</a>
<a href="https://medium.com/@erikhallstrm/hello-world-rnn-83cd7105b767">如何在TensorFlow中构建RNN</a>
<a href="http://www.wildml.com/2016/08/rnns-in-tensorflow-a-practical-guide-and-undocumented-features/">Tensorflow中的RNN,实用指南和未记载的特征</a>
<a href="http://mourafiq.com/2016/05/15/predicting-sequences-using-rnn-in-tensorflow.html">使用循环神经网络(LSTM)和TensorFlow进行序列预测</a>
<a href="https://iamtrask.github.io/2015/11/15/anyone-can-code-lstm/">任何人都可以学习在Python中编写LSTM-RNN</a>
<a href="https://medium.com/google-cloud/how-to-do-time-series-prediction-using-rnns-and-tensorflow-and-cloud-ml-engine-2ad2eeb189e8">如何使用RNN,TensorFlow和Cloud ML Engine进行时间序列预测</a>
但是作者仍然坚持写出这篇文章主要有三个原因:
1.
技术在发展,早期的教程不能应付新版本。
2.
大多数教程使用的事例是合成数据,而作者在这该文中所用事例数据皆来源于现实生活。
3.
有些教程如果你事先了解关于Tensorflow API的一些信息,这将使得在理解它们时存在困难。
文中,作者以宾夕法尼亚大学(Penn Tree
<b>数据准备:</b>
股票价格是长度为N的时间序列,定义为p0,p1,... ,pN- 1,其中pi是指在第i日的收盘价,0≤i<N。试想一下,我们有一个固定大小的滑动窗口w(下文将其称为input_size),为了保障所有的滑动窗口中的数据之间不重叠,我们需要每次将窗口向右移动w个单位。
上图为标准普尔500价格。我们在一个滑动窗口中使用内容来预测下一个,而在两个连续的窗口之间没有重叠。
将建立的RNN模型中LSTM单元作为基本的隐藏单元。我们使用在时间t内从第一个滑动窗口W0到窗口Wt的值:
W0=(p0,p1,...,pw-1)
W1=(pw,pw+1,...p2w-1)
...
Wt=(ptw,ptw+1,...,p(t+1)w-1)
来预测下一个窗口Wt+1的值:
Wt+1=(p(t+1)w,p(t+1)w+1,...,p(t+2)w-1)
以上类似于在学习一个近似函数f(W0,W1,... ,Wt)≈Wt+1。
价格的顺序首先被分成不重叠的小窗口。每个都包含input_size数字,每个都被认为是一个独立的输入元素。然后,任何num_steps连续的输入元素被分组到一个训练输入中,形成一个在Tensorfow上进行训练的“非滚动”版本的RNN。相应的标签就是它们后面的输入元素。
<b>数据标准化</b>
以下我们以最新的10%的数据作为测试数据。S&P500指数随着时间的推移而增加,导致测试集中大部分数值超出训练集的范围,也就是说该模型必须预测一些以前从未见过的数字。
图: RNN模型必须预测训练数据的规模之外的数字
为解决这一问题,作者将任务变成预测相对变化率而不是绝对值。在t时刻的标准化滑动窗口W't中,所有的值除以最后一个滑动窗口Wt-1中的未知价格价格:
<b>建立模型:</b>
<b>定义参数:</b>
lstm_size:一个LSTM图层中的单元数量。
num_layers:堆叠的LSTM层的数量。
init_learning_rate:开始学习的速率。
learning_rate_decay:后期训练时期的衰减率。
init_epoch:使用常量init_learning_rate的时期数。
max_epoch:训练中的时期总数
input_size:滑动窗口的大小/一个训练数据点
batch_size:在一个小批量中使用的数据点的数量。
<b>定义图形</b>
(1)首先初始化一个新的图表。
(2)图表的工作原理应在其范围内定义。
2.targets:训练标签y,形状张量(#数据例子input_size)。
3.learning_rate:一个简单的浮点数。
(5)如果需要的话,我们可以将单元格堆叠成多层。MultiRNNCell有助于依次连接多个简单单元来组成一个单元。
(8)定义隐藏层和输出层之间的权重和偏差。
(2)按照定义初始化变量。
(3)训练时期的学习率应该预先计算好。指数是指epoch指数。
(4)下面的每个循环完成一次epoch训练。
(5)下面的每个循环完成一次epoch训练。
小结
1.用于with [tf.name_scope]
(https://www.tensorflow.org/api_docs/python/tf/name_scope)("your_awesome_module_name"):将包含在类似目标上的元素一起打包。
2.许多tf.*方法接受name=参数。分配一个定制的名字可以让你阅读图表时更容易。
之后,将训练进度和总结结果写入文件。
上图由示例代码构建的RNN图。“训练”模块已经“从主图表中删除”,因为它在预测时间内不是模型的实际部分。
单击“output_layer”模块将其展开并详细检查结构。
作者在示例中使用了以下配置。
num_layers=1
keep_prob=0.8
batch_size = 64
init_learning_rate
= 0.001
learning_rate_decay
= 0.99
init_epoch = 5
max_epoch = 100
num_steps=30
上图是在测试数据中最近200天的预测结果。使用input_size = 1和lstm_size = 32来训练模型。
上图是在测试数据中最近200天的预测结果。模型使用input_size = 1和lstm_size = 128进行训练。
上图在测试数据中的最近200天的预测结果。使用input_size = 5,lstm_size = 128和max_epoch = 75(替代50)训练模型。
文章原标题《Predict Stock Prices Using RNN: Part 1》
作者:Lilian Weng
译者:乌拉乌拉,审校:袁虎。