RNN|代码详解:用Python构建RNN模拟人脑

当你理解一句话的时候 , 肯定不会每次都会对里面的一词一句进行重新理解吧!这个很容易理解:因为人类拥有记忆力 , 所以在阅读一篇文章时 , 我们会根据之前对这些词的理解来掌握文本内容 。
那么 , 算法可以复制这个特征吗?其实与之最为接近的技术是神经网络(NN) 。 但遗憾的是 , 传统的NN无法做到这一点 。 举个例子:当想要预测一段视频中接下来会发生什么时 , 传统的神经网络是很难产生准确结果的 。
这就是循环神经网络(RNN)的概念能够发挥作用的地方 。 如今 , RNN在深度学习领域越来越流行 。 RNN的一些实际应用包括:
· 语音识别
· 机器翻译
· 音乐创作
· 手写识别
· 语法学习
RNN|代码详解:用Python构建RNN模拟人脑文章插图
本文会快速回顾典型的RNN模型中的关键元素 , 然后将设置问题陈述 , 通过在Python中从头开始实施RNN模型来最终解决问题 。
RNN|代码详解:用Python构建RNN模拟人脑文章插图
闪回:循环神经网络概念的回顾
让我们来快速回顾一下循环神经网络的概念 。
我们将使用序列数据的例子 , 比如特定公司的股票 。 一个简单的机器学习模型或人工神经网络 , 可以学习根据一些特征预测股票价格 , 如股票的数量、开盘价值等 。 除此之外 , 价格还取决于该股票在之前的几个星期和几个星期是如何表现出色的 。 对于交易者而言 , 这些历史数据实际上是进行预测的主要决定因素 。
在传统的前馈神经网络中 , 所有测试用例都被认为是独立的 。 在预测股价时 , 你能看出这是不合适的吗?NN模型不会考虑以前的股票价格——不是一个好主意!
当面对时间敏感数据时 , 我们可以依赖另一个概念——循环神经网络(RNN)!
一个典型的RNN是这样的:
RNN|代码详解:用Python构建RNN模拟人脑文章插图
起初这可能看起来很吓人 。 但是一旦开始 , 事情开始变得更简单了:
RNN|代码详解:用Python构建RNN模拟人脑文章插图
现在 , 我们可以更容易地想象出这些网络如何考虑股票价格的走势 这有助于预测当天的价格 。 在这里 , 时间t(h_t)的每个预测都取决于所有先前的预测和从它们学习的信息 。 相当直截了当吧?
RNN可以在很大程度上解决序列处理目的 , 但并非完全如此 。
文本是序列数据的另一个很好的例子 。 能够预测给定文本之后出现的单词或短语可能是非常有用的资产 。 我们希望模型能够写出莎士比亚的十四行诗!
现在 , RNN在涉及短或小的环境时非常棒 。 但是为了能够编故事并记住它 , 模型应该能够理解序列背后的背景 , 就像人脑一样 。
RNN|代码详解:用Python构建RNN模拟人脑文章插图
利用RNN进行序列预测
在本文中 , 我们将使用RNN处理序列预测问题 。 对此最简单的任务之一是正弦波预测 。 序列包含可见趋势 , 使用启发式方法很容易解决 。 这就是正弦波的样子:
RNN|代码详解:用Python构建RNN模拟人脑文章插图
我们将首先从头开始设计一个循环神经网络来解决这个问题 。 RNN模型也应该能够很好地推广 , 以便我们可以将其应用于其他序列问题 。
我们将这样制定问题——给定一个属于正弦波的50个数字的序列 , 预测系列中的第51个数字 。 是时候启动Jupyter notebook了(或者是你选择的IDE)!
RNN|代码详解:用Python构建RNN模拟人脑文章插图
使用Python对RNN进行编程
步骤0:数据准备
这是任何数据科学项目中不可避免的第一步——做任何其他事情之前准备数据 。
网络模型期望数据是什么样的?它将接受长度为50的单个序列作为输入 。 所以输入数据的形状将是:
(number_of_records x length_of_sequence x types_of_sequences)
在这里 , types_of_sequences是1 , 因为我们只有一种类型的序列——正弦波 。
另一方面 , 每个记录的输出只有一个值 。 这当然是输入序列中的第51个值 。所以它的形状将是:
(number_of_records x types_of_sequences) #where types_of_sequences is 1
让我们深入研究代码 。 首先 , 导入必要的库:
%pylab inline
import math
要创建像数据一样的正弦波 , 我们将使用Python数学库中的正弦函数:
sin_wave = np.array([math.sin(x) for x in np.arange(200)])