rnn 循环神经网络

创建日期 星期四 10 一月 2019

rnn为 recurrent natural network, 递归神经网络 是一种基于序列的神经网络,
序列可以是时间,文本序列等,和普通的神经网络的不同是rnn不光在层之间有权值,同一个层中每个神经元之间也有权值;
但是这个有个缺点是只能有短期记忆,过于长的文本之间的关系可能计算不好,这里就需要lstm;

RNN是一种可以预测未来(在某种程度上)的神经网络,可以用来分析时间序列数据(比如分析股价,预测买入点和卖出点)。在自动驾驶中,可以预测路线来避免事故。更一般的,它可以任意序列长度作为输入,而不是我们之前模型使用的固定序列长度。例如RNN可以将句子、文档、语音作为输入,进行自动翻译、情感分析、语音转文字。此外,RNN还用于作曲(谷歌Magenta项目作出的the one)、作文、图片自动生成标题。

14.1 周期神经元(Recurrent Neurons)
此前介绍的大部分是前馈神经网络,激活流只有一个方向,从输入层流向输出层。RNN和前馈神经网络很相似,不过也会向后连接。我们来看一个最简单的RNN,只有一个神经元接受输入,只产生一个输出,然后再将输出传递给自己,如图14-1(左侧)。在每一个time step t(也叫做一帧),循环神经元接受输入x(t)和前一步的输出y(t−1)。可以将这一神经元随时间展开

创建一层循环神经元也很简单,只不过在一个time step,输入和输出都是向量

每个神经元都有两套权重:一个用于本层输入x(t),一个用于上层输出y(t−1)。我们分别记为wx和wy。

一个循环神经元关于一个实例的输出:

y(t)=ϕ(xT(t)⋅wx+yT(t−1)⋅wy+b)
其中,b是偏置项,ϕ(⋅)是激活函数,比如ReLU(许多研究者更喜欢使用hyperbolic tangent (tanh)作为RNN的激活函数。例如,可以参考Vu Pham等人的Dropout Improves Recurrent Neural Networks for Handwriting Recognition。不过,基于ReLU的RNN也是可以的,比如Quoc V. Le等人的论文A Simple Way to Initialize Recurrent Networks of Rectified Linear Units。)。

一层循环神经元关于整个mini-batch的输出:

Y(t)=ϕ(XT(t)⋅Wx+YT(t−1)⋅Wy+b)=ϕ([X(t)Y(t)]⋅W+b)withW=[WxWy]
Y(t)是一个m×nneurons矩阵,包含该层在time step t关于整个mini-batch实例的输出(m是mini-batch的实例数,nneurons是神经元数量)。
X(t)是一个m×ninputs矩阵,包含该time step t所有实例的输入(ninputs是特征数)。
Wx是一个ninputs×nneurons矩阵,包含当前time step输入到输出的连接权重。
Wy是一个nneurons×nneurons矩阵,包含上个time step输出到当前time step输出的连接权重。
W的形状是(ninputs+nneurons)×nneurons
b是一个大小为nneurons的向量,包含所有神经元的偏置项。
可以看到,Y(t)是关于X(t)和Y(t−1)的函数,Y(t−1)又是关于X(t−1)和Y(t−2)的函数,等等。这使得Y(t)其实是关于X(0),X(1),⋯,X(t)的函数。

由于神经网络在第t个time step的输出是一个关于前t个time step所有输入的函数,这可以理解为一种形式的记忆(memory)。神经网络中保存前面时刻状态的部分称为memory cell(或者简单称为cell)。一个单独的周期神经元,或者一层周期神经元,就是一个很基础的cell。随后我们会看到更加复杂和强大的cell。

一般一个cell在时刻t(姑且把time step称作时刻把,不然太麻烦)的状态,记做h(t)(“h”代表“hidden”),这是一个关于当前时刻输入和前一时刻状态的函数:h(t)=f(h(t−1),xt)。在t时刻的输出,记做y(t),这也是一个关于当前时刻输入和前一时刻状态的函数。在前面讨论的基本cell中,状态和输出是一致的,但在复杂的模型中这是不一致的
输入和输出序列
RNN可以一个序列作为输入,再同时输出一个序列(如图14-4左上)。该模型可用于股价预测,输入前N天的股价,输出每一天的股价,知道第N+1天。每增加一天的输入,就预测下一天的输出。

此外,还可以序列作为输入,忽略除了最后一个之外所有的输出(如图右上)。例如用于情感分析,可以将电影评论作为输入,输出情感分值。

相反的,也可以输入单一的样本,输出一个序列(如图左下)。例如,输入可以是一幅图像,输出是该图像的标题。

最后,右下角的神经网络就是一个翻译系统了。这是序列到向量神经网络(称为encoder)和向量到序列神经网络(称为decoder)的组合。比如,输入可以是一种语言的一句话,encoder将这句话转换为向量表示,decoder再把这个向量表示转换成另一种语言的一句话。这是一个two-step模型,称为Encoder–Decoder,执行翻译任务时,效果比一个序列序列的神经网络好得多。因为原文的最后一个词可能会影响译文的第一个词,所以需要读完全句后再进行翻译。

基本RNN的TensorFlow实现
首先,我们来实现一个很简单的RNN模型,不使用TensorFlow的任何运算,以便了解底层原理。我们会创建一层有5个训练神经元的RNN(如图14-2),使用tanh激活函数。假设这一RNN有两个时刻,每一时刻的输入是大小为3的向量。下面的代码创建这一RNN,并随时间展开:

n_inputs = 3
n_neurons = 5X0 = tf.placeholder(tf.float32, [None, n_inputs])
X1 = tf.placeholder(tf.float32, [None, n_inputs])Wx = tf.Variable(tf.random_normal(shape=[n_inputs, n_neurons],dtype=tf.float32))
Wy = tf.Variable(tf.random_normal(shape=[n_neurons,n_neurons],dtype=tf.float32))
b = tf.Variable(tf.zeros([1, n_neurons], dtype=tf.float32))Y0 = tf.tanh(tf.matmul(X0, Wx) + b)
Y1 = tf.tanh(tf.matmul(Y0, Wy) + tf.matmul(X1, Wx) + b)init = tf.global_variables_initializer()#输入训练数据
import numpy as np# Mini-batch:         instance 0,instance 1,instance 2,instance 3
X0_batch = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 0, 1]]) # t = 0
X1_batch = np.array([[9, 8, 7], [0, 0, 0], [6, 5, 4], [3, 2, 1]]) # t = 1with tf.Session() as sess:init.run()Y0_val, Y1_val = sess.run([Y0, Y1], feed_dict={X0: X0_batch, X1: X1_batch})>>> print(Y0_val) # output at t = 0
[[-0.2964572 0.82874775 -0.34216955 -0.75720584 0.19011548] # instance 0
[-0.12842922 0.99981797 0.84704727 -0.99570125 0.38665548] # instance 1
[ 0.04731077 0.99999976 0.99330056 -0.999933 0.55339795] # instance 2
[ 0.70323634 0.99309105 0.99909431 -0.85363263 0.7472108 ]] # instance 3
>>> print(Y1_val) # output at t = 1
[[ 0.51955646 1. 0.99999022 -0.99984968 -0.24616946] # instance 0
[-0.70553327 -0.11918639 0.48885304 0.08917919 -0.26579669] # instance 1
[-0.32477224 0.99996376 0.99933046 -0.99711186 0.10981458] # instance 2
[-0.43738723 0.91517633 0.97817528 -0.91763324 0.11047263]] # instance 3#我们来训练一个RNN对MNIST图片进行分类。虽然CNN更适合做图像分类,这里只是使用这个例子来熟悉RNN。可以将MNIST中的每一个图像都看作是28行的序列,每一行又有28个像素点。我们使用150个循环神经元,加上一个全连接层,与输出层连接。最后是softmax层from tensorflow.contrib.layers import fully_connectedn_steps = 28
n_inputs = 28
n_neurons = 150
n_outputs = 10learning_rate = 0.001X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
y = tf.placeholder(tf.int32, [None])basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)logits = fully_connected(states, n_outputs, activation_fn=None)
xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)loss = tf.reduce_mean(xentropy)
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
training_op = optimizer.minimize(loss)
correct = tf.nn.in_top_k(logits, y, 1)
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))init = tf.global_variables_initializer()from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets("/tmp/data/")
X_test = mnist.test.images.reshape((-1, n_steps, n_inputs))n_epochs = 100
batch_size = 150with tf.Session() as sess:init.run()for epoch in range(n_epochs):for iteration in range(mnist.train.num_examples // batch_size):X_batch, y_batch = mnist.train.next_batch(batch_size)X_batch = X_batch.reshape((-1, n_steps, n_inputs))sess.run(training_op, feed_dict={X: X_batch, y: y_batch})acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch})acc_test = accuracy.eval(feed_dict={X: X_test, y: y_test})print(epoch, "Train accuracy:", acc_train, "Test accuracy:", acc_test)

深层双向RNN 与双向RNN相比,多了几个隐藏层,因为他的想法是很多信息记一次记不下来,比如你去考研,复习考研英语的时候,背英语单词一定不会就看一次就记住了所有要考的考研单词吧,你应该也是带着先前几次背过的单词,然后选择那些背过,但不熟的内容,或者没背过的单词来背吧。

深层双向RNN就是基于这么一个想法,他的输入有两方面,第一就是前一时刻的隐藏层传过来的信息h→(i)t−1h→t−1(i),和当前时刻上一隐藏层传过来的信息h(i−1)t=[h→(i−1)t;h←(i−1)t]ht(i−1)=[h→t(i−1);h←t(i−1)],包括前向和后向的。

Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。
LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力!
所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。
LSTM 中的重复模块包含四个交互的层;

这里只是部分流行的 LSTM 变体。当然还有很多其他的,如Yao, et al. (2015) 提出的 Depth Gated RNN。还有用一些完全不同的观点来解决长期依赖的问题,如Koutnik, et al. (2014) 提出的 Clockwork RNN。
要问哪个变体是最好的?其中的差异性真的重要吗?Greff, et al. (2015) 给出了流行变体的比较,结论是他们基本上是一样的。Jozefowicz, et al. (2015) 则在超过 1 万种 RNN 架构上进行了测试,发现一些架构在某些任务上也取得了比 LSTM 更好的结果。

rnn 循环神经网络相关推荐

  1. 【机器学习】RNN循环神经网络

    循环神经网络归属: 领域:机器学习 方向:自然语言处理 贡献:自动文本生成 循环神经网络实际应用: 生活中因为原始数据都是序列化的,比如自然语言,语音处理,时间序列问题(股票价格)等问题, 这个时候需 ...

  2. [译] RNN 循环神经网络系列 2:文本分类

    原文地址:RECURRENT NEURAL NETWORKS (RNN) – PART 2: TEXT CLASSIFICATION 原文作者:GokuMohandas 译文出自:掘金翻译计划 本文永 ...

  3. 小白学深度之RNN循环神经网络

    不懂CNN的建议先看一下CNN 前言 我们先看一下普通的神经网络,只要训练的数据和次数足够,这种网络是可以拟合任意函数的. 但是这种最基本的网络肯定是有很多不足的,上面那种网络只能单独的处理每一个输入 ...

  4. RNN 循环神经网络系列 5: 自定义单元

    原文地址:RECURRENT NEURAL NETWORK (RNN) – PART 5: CUSTOM CELLS 原文作者:GokuMohandas 译文出自:掘金翻译计划 本文永久链接:gith ...

  5. Recurrent Neural Networks(RNN) 循环神经网络初探

    1. 针对机器学习/深度神经网络"记忆能力"的讨论 0x1:数据规律的本质是能代表此类数据的通用模式 - 数据挖掘的本质是在进行模式提取 数据的本质是存储信息的介质,而模式(pat ...

  6. PyTorch-09 循环神经网络RNNLSTM (时间序列表示、RNN循环神经网络、RNN Layer使用、时间序列预测案例、RNN训练难题、解决梯度离散LSTM、LSTM使用、情感分类问题实战)

    PyTorch-09 循环神经网络RNN&LSTM (时间序列表示.RNN循环神经网络.RNN Layer使用.时间序列预测案例(一层的预测点的案例).RNN训练难题(梯度爆炸和梯度离散)和解 ...

  7. LSTM -长短期记忆网络(RNN循环神经网络)

    文章目录 基本概念及其公式 输入门.输出门.遗忘门 候选记忆元 记忆元 隐状态 从零开始实现 LSTM 初始化模型参数 定义模型 训练和预测 简洁实现 小结 基本概念及其公式 LSTM,即(long ...

  8. RNN循环神经网络(recurrent neural network)

     自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1  RNN循环神经网络 ...

  9. July深度学习之RNN循环神经网络

    RNN循环神经网络 一.简介 首先,为什么有BP神经网络和CNN,还要提出RNN? 因为传统的神经网络,包括CNN,它的输入和输出是互相独立的.但有些时候,后续的输出和前面的内容是相关的.比如,我是中 ...

最新文章

  1. linux floating ip,Floating IP in OpenStack Neutron
  2. 【技术干货】卷积神经网络中十大拍案叫绝的操作
  3. 基本环境安装: Centos7+Java+Hadoop+Spark+HBase+ES+Azkaban
  4. select下拉框兼容写法
  5. 判断手机浏览器还是微信浏览器(PHP)
  6. SAP CRM呼叫中心里confirm按钮的实现逻辑
  7. python可变参数函数二阶导数公式_python中函数的可变参数
  8. Mac 快速修改 hosts 文件
  9. lamda 对比两个list_正式支持多线程!Redis 6.0与老版性能对比评测
  10. 单片机原理及应用pdf_单片机原理及应用课程设计
  11. C# 打开指定文件夹下的excel
  12. Pthread多线程
  13. 知网研学不同电脑端同步无效问题
  14. Win10微软输入法不见了
  15. 【HTML】input多行文本
  16. win10家庭组(win10家庭组共享打印机)
  17. Spire.Doc利用word样式读取word文字内容(.NET)
  18. 一种非极大值抑制(non_max_suppression, nms)的代码实现方式
  19. 手机APP开发:学JAVA转安卓APP开发是不是很容易?
  20. 三种引入JavaScript方法

热门文章

  1. 基于51,人体红外感应和RC522的门禁系统
  2. OpenCV之彩色视频转黑白视频
  3. 被中国家长摧残的十种优秀儿童品质
  4. Linux下调整屏幕分辨率
  5. Apple Watch Series 8功能介绍 watch series 8续航
  6. select函数使用方法
  7. Revit二次开发之 自定义选项卡排在最前端
  8. python输入第十个斐波那契数列,0,1,1,2,3,5,8,13,21,34
  9. 在日本名古屋举行的AACSB亚太地区年会将WRDS-SSRN创新奖颁发给南京大学
  10. MySQL语法笔记(自用)