sequence-prediction-problems-learning-lstm-recurrent-neural-networks.md 11.8 KB
Newer Older
W
wizardforcel 已提交
1
# 5 个使用 LSTM 循环神经网络的简单序列预测问题的示例
W
wizardforcel 已提交
2 3 4 5 6 7 8

> 原文: [https://machinelearningmastery.com/sequence-prediction-problems-learning-lstm-recurrent-neural-networks/](https://machinelearningmastery.com/sequence-prediction-problems-learning-lstm-recurrent-neural-networks/)

序列预测不同于传统的分类和回归问题。

它要求您考虑观察的顺序,并使用具有记忆的长短期记忆(LSTM)循环神经网络等模型,并且可以学习观察之间的任何时间依赖性。

W
wizardforcel 已提交
9
应用 LSTM 来学习如何在序列预测问题上使用它们是至关重要的,为此,您需要一套明确定义的问题,使您能够专注于不同的问题类型和框架。至关重要的是,您可以建立您对序列预测问题如何不同的直觉,以及如何使用像 LSTM 这样复杂的模型来解决它们。
W
wizardforcel 已提交
10

W
wizardforcel 已提交
11
在本教程中,您将发现一套 5 个狭义定义和可扩展的序列预测问题,您可以使用这些问题来应用和了解有关 LSTM 循环神经网络的更多信息。
W
wizardforcel 已提交
12 13 14

完成本教程后,您将了解:

W
wizardforcel 已提交
15 16 17
*   简单的记忆任务,用于测试 LSTM 的学习记忆能力。
*   简单的打印任务,用于测试 LSTM 的学习时间依赖表现力。
*   用于测试 LSTM 解释能力的简单算术任务。
W
wizardforcel 已提交
18 19 20 21 22

让我们开始吧。

![5 Examples of Simple Sequence Prediction Problems for Learning LSTM Recurrent Neural Networks](img/b45c5a73c43228fa44ebdd42dcf41db3.jpg)

W
wizardforcel 已提交
23
5 用于学习 LSTM 循环神经网络的简单序列预测问题示例
W
wizardforcel 已提交
24 25 26 27
照片由 [Geraint Otis Warlow](https://www.flickr.com/photos/gpwarlow/850611221/) ,保留一些权利。

## 教程概述

W
wizardforcel 已提交
28
本教程分为 5 个部分;他们是:
W
wizardforcel 已提交
29 30 31

1.  序列学习问题
2.  价值记忆
W
wizardforcel 已提交
32 33
3.  打印随机整数
4.  打印随机子序列
W
wizardforcel 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
5.  序列分类

## 问题的属性

序列问题的设计考虑了一些属性:

*   **缩小**。集中于序列预测的一个方面,例如记忆或函数近似。
*   **可扩展**。在选择的狭隘焦点上或多或少地变得困难。
*   **重新定型**。提出每个问题的两个或更多个框架以支持不同算法学习能力的探索。

我试图提供狭隘的焦点,问题困难和所需的网络架构。

如果您有进一步扩展的想法或类似的精心设计的问题,请在下面的评论中告诉我。

## 1.序列学习问题

W
wizardforcel 已提交
50
在该问题中,生成 0.0 和 1.0 之间的连续实数值序列。给定过去值的一个或多个时间步长,模型必须预测序列中的下一个项目。
W
wizardforcel 已提交
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

我们可以直接生成这个序列,如下所示:

```py
from numpy import array

# generate a sequence of real values between 0 and 1.
def generate_sequence(length=10):
	return array([i/float(length) for i in range(length)])

print(generate_sequence())
```

运行此示例将打印生成的序列:

```py
[ 0\. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
```

这可以被视为记忆挑战,如果在前一时间步骤观察,模型必须预测下一个值:

```py
X (samples),	y
0.0,			0.1
0.1,			0.2
0.2,			0.3
...
```

网络可以记住输入 - 输出对,这很无聊,但会展示网络的功能近似能力。

该问题可以被构造为随机选择的连续子序列作为输入时间步骤和序列中的下一个值作为输出。

```py
X (timesteps),		y
0.4, 0.5, 0.6,		0.7
0.0, 0.2, 0.3,		0.4
0.3, 0.4, 0.5,		0.6
...
```

这将要求网络学习向最后看到的观察添加固定值或记住所生成问题的所有可能子序列。

该问题的框架将被建模为多对一序列预测问题。

W
wizardforcel 已提交
96
这是测试序列学习的原始特征的简单问题。这个问题可以通过多层感知机网络来解决。
W
wizardforcel 已提交
97 98 99 100 101

## 2.价值记忆

问题是要记住序列中的第一个值,并在序列的末尾重复它。

W
wizardforcel 已提交
102
该问题基于用于在 1997 年论文[长期短期记忆](http://www.bioinf.jku.at/publications/older/2604.pdf)中证明 LSTM 的“实验 2”。
W
wizardforcel 已提交
103 104 105 106 107

这可以被视为一步预测问题。

给定序列中的一个值,模型必须预测序列中的下一个值。例如,给定值“0”作为输入,模型必须预测值“1”。

W
wizardforcel 已提交
108
考虑以下两个 5 个整数的序列:
W
wizardforcel 已提交
109 110 111 112 113 114

```py
3, 0, 1, 2, 3
4, 0, 1, 2, 4
```

W
wizardforcel 已提交
115
Python 代码将生成两个任意长度的序列。如果您愿意,可以进一步概括。
W
wizardforcel 已提交
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137

```py
def generate_sequence(length=5):
	return [i for i in range(length)]

# sequence 1
seq1 = generate_sequence()
seq1[0] = seq1[-1] = seq1[-2]
print(seq1)
# sequence 2
seq1 = generate_sequence()
seq1[0] = seq1[-1]
print(seq1)
```

运行该示例生成并打印上述两个序列。

```py
[3, 1, 2, 3, 3]
[4, 1, 2, 3, 4]
```

W
wizardforcel 已提交
138
可以对整数进行归一化,或者更优选地对单热编码进行归一化。
W
wizardforcel 已提交
139 140 141 142 143

这些模式引入了皱纹,因为两个序列之间存在冲突的信息,并且模型必须知道每个一步预测的上下文(例如,它当前正在预测的序列),以便正确地预测每个完整序列。

我们可以看到序列的第一个值重复作为序列的最后一个值。这是指示器为模型提供关于它正在处理的序列的上下文。

W
wizardforcel 已提交
144
冲突是从每个序列中的第二个项目到最后一个项目的过渡。在序列 1 中,给出“2”作为输入并且必须预测“3”,而在序列 2 中,给出“2”作为输入并且必须预测“4”。
W
wizardforcel 已提交
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165

```py
Sequence 1:

X (samples),	y
...
1,				2
2,				3

Sequence 2:

X (samples),	y
...
1,				2
2,				4
```

这种皱纹对于防止模型记忆每个序列中的每个单步输入 - 输出值对非常重要,因为序列未知模型可能倾向于这样做。

该成帧将被建模为一对一的序列预测问题。

W
wizardforcel 已提交
166
这是多层感知机和其他非循环神经网络无法学习的问题。必须记住多个样本中序列中的第一个值。
W
wizardforcel 已提交
167 168 169 170 171 172 173 174 175 176 177 178 179

这个问题可以被定义为提供除最后一个值之外的整个序列作为输入时间步长并预测最终值。

```py
X (timesteps),		y
3, 0, 1, 2, 		3
4, 0, 1, 2, 		4
```

每个时间步仍然一次显示给网络,但网络必须记住第一个时间步的值。不同的是,网络可以通过时间反向传播更好地了解序列之间和长序列之间的差异。

This framing of the problem would be modeled as a many-to-one sequence prediction problem.

W
wizardforcel 已提交
180
同样,多层感知机无法学习这个问题。
W
wizardforcel 已提交
181

W
wizardforcel 已提交
182
## 3.打印随机整数
W
wizardforcel 已提交
183

W
wizardforcel 已提交
184
在这个问题中,生成随机的整数序列。模型必须记住特定滞后时间的整数,并在序列结束时打印它。
W
wizardforcel 已提交
185

W
wizardforcel 已提交
186
例如,10 个整数的随机序列可以是:
W
wizardforcel 已提交
187 188 189 190 191

```py
5, 3, 2, 1, 9, 9, 2, 7, 1, 6
```

W
wizardforcel 已提交
192
该问题可能被设置为在第 5 个时间步骤打印该值,在这种情况下为 9。
W
wizardforcel 已提交
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211

下面的代码将生成随机的整数序列。

```py
from random import randint

# generate a sequence of random numbers in [0, 99]
def generate_sequence(length=10):
	return [randint(0, 99) for _ in range(length)]

print(generate_sequence())
```

运行该示例将生成并打印随机序列,例如:

```py
[47, 69, 76, 9, 71, 87, 8, 16, 32, 81]
```

W
wizardforcel 已提交
212
可以对整数进行归一化,但更优选地,可以使用单热编码。
W
wizardforcel 已提交
213

W
wizardforcel 已提交
214
该问题的简单框架是打印当前输入值。
W
wizardforcel 已提交
215 216 217 218 219 220 221 222 223 224 225 226

```py
yhat(t) = f(X(t))
```

例如:

```py
X (timesteps),		y
5, 3, 2, 1, 9,		9
```

W
wizardforcel 已提交
227
这个微不足道的问题可以通过多层感知机轻松解决,并可用于测试线束的校准或诊断。
W
wizardforcel 已提交
228

W
wizardforcel 已提交
229
更具挑战性的问题框架是打印前一时间步的值。
W
wizardforcel 已提交
230 231 232 233 234 235 236 237 238 239 240 241

```py
yhat(t) = f(X(t-1))
```

For example:

```py
X (timesteps),		y
5, 3, 2, 1, 9,		1
```

W
wizardforcel 已提交
242
这是多层感知机无法解决的问题。
W
wizardforcel 已提交
243

W
wizardforcel 已提交
244
echo 的索引可以进一步推迟,从而对 LSTM 内存产生更多需求。
W
wizardforcel 已提交
245

W
wizardforcel 已提交
246
与上面的“值记忆”问题不同,每个训练时期都会产生一个新的序列。这将要求模型学习泛化打印解,而不是记忆特定序列或随机数序列。
W
wizardforcel 已提交
247 248 249

在这两种情况下,问题都将被建模为多对一序列预测问题。

W
wizardforcel 已提交
250
## 4.打印随机子序列
W
wizardforcel 已提交
251 252 253

该问题还涉及生成随机的整数序列。

W
wizardforcel 已提交
254
这个问题要求模型记住并输出输入序列的部分子序列,而不是像前一个问题那样打印单个前一个时间步骤。
W
wizardforcel 已提交
255

W
wizardforcel 已提交
256
最简单的框架将是前一节中的打印问题。相反,我们将专注于序列输出,其中最简单的框架是模型记住并输出整个输入序列。
W
wizardforcel 已提交
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277

For example:

```py
X (timesteps),		y
5, 3, 2, 4, 1,		5, 3, 2, 4, 1
```

这可以被建模为多对一序列预测问题,其中输出序列直接在输入序列中的最后一个值的末尾输出。

这也可以被建模为网络为每个输入时间步长输出一个值,例如,一对一的模式。

更具挑战性的框架是输出输入序列的部分连续子序列。

For example:

```py
X (timesteps),		y
5, 3, 2, 4, 1,		5, 3, 2
```

W
wizardforcel 已提交
278
这更具挑战性,因为输入数量与输出数量不匹配。这个问题的多对多模型需要更高级的架构,例如编解码器 LSTM。
W
wizardforcel 已提交
279

W
wizardforcel 已提交
280
同样,单热编码将是优选的,尽管该问题可以被建模为标准化整数值。
W
wizardforcel 已提交
281 282 283

## 5.序列分类

W
wizardforcel 已提交
284
该问题被定义为 0 和 1 之间的随机值序列。该序列被作为问题的输入,每个时间步提供一个数字。
W
wizardforcel 已提交
285

W
wizardforcel 已提交
286
二进制标签(0 或 1)与每个输入相关联。输出值均为 0.一旦序列中输入值的累积和超过阈值,则输出值从 0 翻转为 1。
W
wizardforcel 已提交
287

W
wizardforcel 已提交
288
使用序列长度的 1/4 的阈值。
W
wizardforcel 已提交
289

W
wizardforcel 已提交
290
例如,下面是 10 个输入时间步长(X)的序列:
W
wizardforcel 已提交
291 292 293 294 295 296 297 298 299 300 301

```py
0.63144003 0.29414551 0.91587952 0.95189228 0.32195638 0.60742236 0.83895793 0.18023048 0.84762691 0.29165514
```

相应的分类输出(y)将是:

```py
0 0 0 1 1 1 1 1 1 1
```

W
wizardforcel 已提交
302
我们可以用 Python 实现它。
W
wizardforcel 已提交
303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331

```py
from random import random
from numpy import array
from numpy import cumsum

# create a sequence classification instance
def get_sequence(n_timesteps):
	# create a sequence of random numbers in [0,1]
	X = array([random() for _ in range(n_timesteps)])
	# calculate cut-off value to change class values
	limit = n_timesteps/4.0
	# determine the class outcome for each item in cumulative sequence
	y = array([0 if x < limit else 1 for x in cumsum(X)])
	return X, y

X, y = get_sequence(10)
print(X)
print(y)
```

运行该示例会生成随机输入序列,并计算二进制值的相应输出序列。

```py
[ 0.31102339  0.66591885  0.7211718   0.78159441  0.50496384  0.56941485
  0.60775583  0.36833139  0.180908    0.80614878]
[0 0 0 0 1 1 1 1 1 1]
```

W
wizardforcel 已提交
332
这是一个序列分类问题,可以建模为一对一。状态需要解释过去的时间步骤,以正确预测输出序列何时从 0 翻转到 1。
W
wizardforcel 已提交
333 334 335 336 337

## 进一步阅读

如果您要深入了解,本节将提供有关该主题的更多资源。

W
wizardforcel 已提交
338 339 340
*   [长期短期记忆](http://www.bioinf.jku.at/publications/older/2604.pdf),1997 年
*   [如何使用 Keras](http://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/) 在 Python 中使用不同的批量大小进行训练和预测
*   [用 Python 中的长短期记忆网络演示内存](http://machinelearningmastery.com/memory-in-a-long-short-term-memory-network/)
W
wizardforcel 已提交
341
*   [如何通过长短期记忆循环神经网络学习打印随机整数](http://machinelearningmastery.com/learn-echo-random-integers-long-short-term-memory-recurrent-neural-networks/)
W
wizardforcel 已提交
342 343
*   [如何将编解码器 LSTM 用于随机整数的回波序列](http://machinelearningmastery.com/learn-echo-random-integers-long-short-term-memory-recurrent-neural-networks/)
*   [如何使用 Keras 开发用于 Python 序列分类的双向 LSTM](http://machinelearningmastery.com/develop-bidirectional-lstm-sequence-classification-python-keras/)
W
wizardforcel 已提交
344 345 346

## 摘要

W
wizardforcel 已提交
347
在本教程中,您发现了一套精心设计的人工序列预测问题,可用于探索 LSTM 循环神经网络的学习和记忆功能。
W
wizardforcel 已提交
348 349 350

具体来说,你学到了:

W
wizardforcel 已提交
351 352 353
*   简单的记忆任务,用于测试 LSTM 的学习记忆能力。
*   简单的打印任务,用于测试 LSTM 的学习时间依赖表现力。
*   用于测试 LSTM 解释能力的简单算术任务。
W
wizardforcel 已提交
354 355 356

你有任何问题吗?
在下面的评论中提出您的问题,我会尽力回答。