一、RNN的作用和粗略介绍:

RNN可解决的问题:

训练样本输入是连续的序列,且序列的长短不一,比如基于时间的序列:一段段连续的语音,一段段连续的手写文字。这些序列比较长,且长度不一,比较难直接的拆分成一个个独立的样本来通过DNN/CNN进行训练。

T个时间步:

我们先来看单个RNN cell:

简单的RNN前向传播实现过程:

以上代码实现:

import numpy as np 

# 定义RNN的参数。
X = [1,2]
state = [0.0, 0.0]
w_cell_state = np.asarray([[0.1, 0.2], [0.3, 0.4]])
w_cell_input = np.asarray([0.5, 0.6])
b_cell = np.asarray([0.1, -0.1])
w_output = np.asarray([[1.0], [2.0]])
b_output = 0.1 # 执行前向传播过程。
for i in range(len(X)):
before_activation = np.dot(state, w_cell_state) + X[i] * w_cell_input + b_cell
state = np.tanh(before_activation)
final_output = np.dot(state, w_output) + b_output
print ("before activation: ", before_activation)
print ("state: ", state)
print ("output: ", final_output)

二、RNN模型:

上图中左边是RNN模型没有按时间展开的图,如果按时间序列展开,则是上图中的右边部分。我们重点观察右边部分的图。

这幅图描述了在序列索引号t附近RNN的模型。其中:

    1)x(t)代表在序列索引号 t 时训练样本的输入。同样的,x(t−1)和x(t+1)代表在序列索引号t−1和t+1

时训练样本的输入。

    2)h(t)

代表在序列索引号 t 时模型的隐藏状态。h(t)

由x(t)和h(t−1)

共同决定。

    3)o(t)

代表在序列索引号 t 时模型的输出。o(t)

只由模型当前的隐藏状态h(t)决定。

    4)L(t)

代表在序列索引号 t 时模型的损失函数。

    5)y(t)

代表在序列索引号 t 时训练样本序列的真实输出。

    6)U,W,V

这三个矩阵是我们的模型的线性关系参数,它在整个RNN网络中是共享的,这点和DNN很不相同。 也正因为是共享了,它体现了RNN的模型的“循环反馈”的思想。

  

三、 RNN前向传播算法

  1. 对于任意一个序列索引号 t

    ,我们隐藏状态h(t)由x(t)

    和h(t−1)得到:

    • h(t)=σ(z(t))=σ(Ux(t)+Wh(t−1)+b)
    • 其中σ为RNN的激活函数,一般为tanh, b为线性关系的偏倚。
  2. 序列索引号 t

    时模型的输出o(t)的表达式比较简单:

    • o(t)=Vh(t)+c
  3. 在最终在序列索引号 t 时我们的预测输出为:
    • y^(t)=σ(o(t))
    • 通常由于RNN是识别类的分类模型,所以上面这个激活函数一般是softmax。
  4. 通过损失函数L(t),比如对数似然损失函数,我们可以量化模型在当前位置的损失,即y^(t)和y(t)的差距。

四、RNN反向传播算法推导

RNN反向传播算法的思路和DNN是一样的,即通过梯度下降法一轮轮的迭代,得到合适的RNN模型参数U,W,V,b,c。

由于我们是基于时间反向传播,所以RNN的反向传播有时也叫做BPTT(back-propagation through time)。

当然这里的BPTT和DNN也有很大的不同点,即这里所有的U,W,V,b,c在序列的各个位置是参数共享的,反向传播时我们更新的是相同的参数。

为了简化描述,这里的损失函数我们为对数损失函数,输出的激活函数为softmax函数,隐藏层的激活函数为tanh函数。

(1)对于RNN,由于我们在序列的每个位置 t 都有损失函数,因此最终的损失L为:

   

(2)其中 V,c 的梯度计算是比较简单的:注意:这里 o(t) = ^y(t),没有激活函数。

(3)W,U,b的梯度计算比较复杂:

从RNN的模型可以看出,在反向传播时,在某一序列位置t的梯度损失由当前位置的输出对应的梯度损失序列索引位置t+1时的梯度损失两部分共同决定。【模型图中上边和右边】对于W在某一序列位置t的梯度损失需要反向传播一步步的计算。我们定义序列索引t位置的隐藏状态的梯度为:

各个参数的更新式子:

五、RNN的应用:

(1)多对多【输入输出个数相同】

(2)多对一

(3)一对多:

只在序列中开始进行输入计算。

或者:

摘自:https://www.cnblogs.com/pinard/p/6509630.html

relu + rNN论文: Improving performance of recurrent neural network with relu nonlinearity

https://blog.csdn.net/qq_32284189/article/details/82225121

序列模型(2)-----循环神经网络RNN的更多相关文章

  1. 循环神经网络RNN模型和长短时记忆系统LSTM

    传统DNN或者CNN无法对时间序列上的变化进行建模,即当前的预测只跟当前的输入样本相关,无法建立在时间或者先后顺序上出现在当前样本之前或者之后的样本之间的联系.实际的很多场景中,样本出现的时间顺序非常 ...

  2. 循环神经网络(RNN, Recurrent Neural Networks)介绍(转载)

    循环神经网络(RNN, Recurrent Neural Networks)介绍    这篇文章很多内容是参考:http://www.wildml.com/2015/09/recurrent-neur ...

  3. 通过keras例子理解LSTM 循环神经网络(RNN)

    博文的翻译和实践: Understanding Stateful LSTM Recurrent Neural Networks in Python with Keras 正文 一个强大而流行的循环神经 ...

  4. 从网络架构方面简析循环神经网络RNN

    一.前言 1.1 诞生原因 在普通的前馈神经网络(如多层感知机MLP,卷积神经网络CNN)中,每次的输入都是独立的,即网络的输出依赖且仅依赖于当前输入,与过去一段时间内网络的输出无关.但是在现实生活中 ...

  5. 循环神经网络(RNN, Recurrent Neural Networks)介绍

    原文地址: http://blog.csdn.net/heyongluoyao8/article/details/48636251# 循环神经网络(RNN, Recurrent Neural Netw ...

  6. 循环神经网络RNN及LSTM

    一.循环神经网络RNN RNN综述 https://juejin.im/entry/5b97e36cf265da0aa81be239 RNN中为什么要采用tanh而不是ReLu作为激活函数?  htt ...

  7. 深度学习之循环神经网络RNN概述,双向LSTM实现字符识别

    深度学习之循环神经网络RNN概述,双向LSTM实现字符识别 2. RNN概述 Recurrent Neural Network - 循环神经网络,最早出现在20世纪80年代,主要是用于时序数据的预测和 ...

  8. 用纯Python实现循环神经网络RNN向前传播过程(吴恩达DeepLearning.ai作业)

    Google TensorFlow程序员点赞的文章!   前言 目录: - 向量表示以及它的维度 - rnn cell - rnn 向前传播 重点关注: - 如何把数据向量化的,它们的维度是怎么来的 ...

  9. 循环神经网络(RNN)模型与前向反向传播算法

    在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系.今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Rec ...

随机推荐

  1. nyoj 711 枚举+并查集

     #include<stdio.h>//从大到小不断枚举边直到找到s-t的路径,判断从s可以到t可以用并查集来判断 #include<stdlib.h>//枚举最大的一条边肯定 ...

  2. 洛谷 P2633 Count on a tree

    P2633 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中last ...

  3. svn代码回滚命令【转】

    本文转载自:http://www.cnblogs.com/jndream/archive/2012/03/20/2407955.html 取消对代码的修改分为两种情况:   第一种情况:改动没有被提交 ...

  4. EOJ 3348 树的顺序存储结构

    前面介绍了树的链式存储结构,那么如何用顺序存储来存储一棵树呢?在顺序存储时,我们除了存储每个结点值外,还要存储树中结点与结点之间的逻辑关系(即双亲与孩子结点之间的关系).下面介绍树的双亲存储法. 编号 ...

  5. C++_class_powerpoint_1.1

    Types and Declarations Boolean Type bool type – boolean , logic type bool literal – true, falseint a ...

  6. [源码管理] ubuntu下SVN服务器安装配置

    一.SVN安装1.安装包$ sudo apt-get install subversion2.添加svn管理用户及subversion组$ sudo adduser svnuser$ sudo add ...

  7. java+appium+安卓模拟器实现app自动化Demo

    网上有比较多相关教程,自己写一遍,加深下印象. 环境搭建 据说,很多人都被繁琐的环境搭建给吓到了. 是的,确实,繁琐. node.js 网址 cmd输入node -v,出现下图说明成功. JDK 网址 ...

  8. nginx配置访问密码,让用户输入用户名密码才能访问

    如果我们在 nginx 下搭建了一些站点,但是由于站点内容或者流量的关系,我们并不想让所有人都能正常访问,那么我们可以设置访问认证.只有让用户输入正确的用户名和密码才能正常访问.效果如下: 在 ngi ...

  9. H3BPM实例分享——金额规则大写

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  10. Lucene中Analyzer语句分析

    Lucene中Analyzer语句分析,利用lucene中自带的词法分析工具Analyzer,进行对句子的分析. 源代码如下: package com.test; import java.io.IOE ...