使用PyTorch从零开始构建Elman循环神经网络

本文以最简单的RNNs模型为例:Elman循环神经网络,讲述循环神经网络的工做原理,即使是你没有太多循环神经网络(RNNs)的基础知识,也能够很容易的理解。为了让你更好的理解RNNs,咱们使用Pytorch张量包和autograd库从头开始构建Elman循环神经网络。该文中完整代码在Github上是可实现的。网络

Elman循环神经网络并发

Jeff Elman首次提出了Elman循环神经网络,并发表在论文《Finding structure in time》中:它只是一个三层前馈神经网络,输入层由一个输入神经元x1和一组上下文神经元单元{c1 ... cn}组成。隐藏层前一时间步的神经元做为上下文神经元的输入,在隐藏层中每一个神经元都有一个上下文神经元。因为前一时间步的状态做为输入的一部分,所以咱们能够说,Elman循环神经网络拥有必定的内存——上下文神经元表明一个内存。函数

预测正弦波学习

如今,咱们来训练RNNs学习正弦函数。在训练过程当中,一次只为模型提供一个数据,这就是为何咱们只须要一个输入神经元x1,而且咱们但愿在下一时间步预测该值。输入序列x由20个数据组成,而且目标序列与输入序列相同。内存

模型实现input

首先导入包。it

接下来,设置模型的超参数。设置输入层的大小为7(6个上下文神经元和1个输入神经元),seq_length用来定义输入和目标序列的长度。基础

生成训练数据:x是输入序列,y是目标序列。变量

建立两个权重矩阵。大小为(input_size,hidden_size)的矩阵w1用于隐藏链接的输入,大小为(hidden_size,output_size)的矩阵w2用于隐藏链接的输出。 用零均值的正态分布对权重矩阵进行初始化。原理

定义forward方法,其参数为input向量、context_state向量和两个权重矩阵,链接input和context_state建立xh向量。对xh向量和权重矩阵w1执行点积运算,而后用tanh函数做为非线性函数,在RNNs中tanh比sigmoid效果要好。 而后对新的context_state和权重矩阵w2再次执行点积运算。 咱们想要预测连续值,所以这个阶段不使用任何非线性。

请注意,context_state向量将在下一时间步填充上下文神经元。 这就是为何咱们要返回context_state向量和out。

训练

训练循环的结构以下:

1.外循环遍历每一个epoch。epoch被定义为全部的训练数据所有经过训练网络一次。在每一个epoch开始时,将context_state向量初始化为0。

2.内部循环遍历序列中的每一个元素。执行forward方法进行正向传递,该方法返回pred和context_state,将用于下一个时间步。而后计算均方偏差(MSE)用于预测连续值。执行backward()方法计算梯度,而后更新权重w1和w2。每次迭代中调用zero_()方法清除梯度,不然梯度将会累计起来。最后将context_state向量包装放到新变量中,以将其与历史值分离开来。

训练期间产生的输出显示了每一个epoch的损失是如何减小的,这是一个好的衡量方式。损失的逐渐减小则意味着咱们的模型正在学习。

预测

一旦模型训练完毕,咱们就能够进行预测。在序列的每一步咱们只为模型提供一个数据,并要求模型在下一个步预测一个值。

预测结果以下图所示:黄色圆点表示预测值,蓝色圆点表示实际值,两者基本吻合,所以模型的预测效果很是好。

结论

在这里,咱们使用了Pytorch从零开始构建一个基本的RNNs模型,而且学习了如何将RNNs应用于简单的序列预测问题。

以上为译文。

连接:https://www.jianshu.com/p/7974dbea7a29

相关文章
相关标签/搜索