史上最直白的RNN详解(结合torch的example)
本文主要是结合torch的代码介绍RNN模型的过程及原理
目录
- 为什么需要RNN
- RNN的基本结构
- torch中的RNN
- RNN的优缺点
为什么需要RNN
在最基本的全连接神经网络中,我们所建立的网络虽然可以对一个事物进行预测,比如根据输入的图片来进行分类图片里的究竟是猫还是狗还是一根小飞棍,但是全连接神经网络的前一条数据的输入和后一条数据的输入是完全独立的,这就使得它面对一些具有序列信息的数据无法处理。我们说一句话,每个字在这句话中都扮演着不同的角色,你不可能单个拉出来理解。所以一种根据时间来处理信息的神经网络便应运而生了。
RNN的基本结构
其实简单来说RNN的运行过程可以简单理解为同一个模块不断地和输入信息循环相乘得到输出的过程,这种模式可以有效地提取输入特征序列所隐藏的信息,但这也导致了RNN序列过长后容易出现梯度消失的问题(产生的具体原因后面有解释,在这不做过多的展开),下图是RNN的结构细节:
在我自己理解中
w h y w_{hy} why:表示 y t y_t yt提取 h t h_{t} ht时刻信息的权重;
w h h w_{hh} whh:表示 h t h_t ht提取之前 h t − 1 h_{t-1} ht−1时刻信息的权重;
w x h w_{xh} wxh:表示 h t h_t ht提取 x t x_{t} xt时刻输入信息的权重;
其中 x t x_t xt是我们在t时刻的输入信息, y t y_t yt是我们在t这个时间节点的输出信息而 h t h_t ht是我们 x t x_t xt与权重矩阵 w x h w_{xh} wxh相乘的状态信息,而 w h y w_{hy} why, w h h w_{hh} whh和 w x h w_{xh} wxh是参数共享的(真正参与与输入信息和状态信息计算的只有这三个矩阵),反向传播时也只有这三个矩阵会被梯度下降算法更新。
torch中的RNN
pytorch中的RNN API文档
input_size:输入特征的维度, 一般rnn中输入的是词向量,那么 input_size 就等于一个词向量的维度,即feature_len;
hidden_size::隐藏层神经元个数,或者也叫输出的维度(因为rnn输出为各个时间步上的隐藏状态);
num_layers:网络的层数;
nonlinearity:激活函数;
bias:是否使用偏置,默认为True;
batch_first:输入数据的形式,默认是 False,形状为:(seq_len, batch_size, input_dim),也就是将序列长度放在第一位,batch_size放在第二位;
dropout:是否应用dropout, 默认不使用,如若使用将其设置成一个0-1的数字即可;
birdirectional:是否使用双向的 rnn,默认是 False;
input:当batch_first为默认True时,input的三个维度分别是batch_size、sequence_length和input_size。
output:当batch_first为默认True时,output的三个维度分别是batch_size、sequence_length和output_size。
看个一层的RNN 的例子
example:
rnn = nn.RNN(10, 20, 2)
input = torch.randn(5, 3, 10)
h0 = torch.randn(2, 3, 20)
output, hn = rnn(input, h0)
RNN的优缺点
优点:DNN无法对时间序列上有变化的情况进行处理,而在RNN中,神经元的输出可以在下一个时间段直接作用到自身,即第i层神经元在t时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(t-1)时刻的输出,这使得RNN具有了一定的记忆性,可以更加有效的提取出序列信息。
缺点:网络层次越深, 越容易引起梯度消失, 无论是纵向网络(bp), 还是横向网络(rnn), RNN随着序列的变长梯度消失是几乎无法避免的,虽然RNN使用了tanh而不是sigmoid函数来缓解这个问题,但也仅仅只是缓解而已, 而RNN随着序列的变长梯度消失于具体原因可以归结为激活函数的导数位于[0,1]区间引起的;用一个生动形象的毒鸡汤来举例子就是:
史上最直白的RNN详解(结合torch的example)相关推荐
- 史上最小白之RNN详解
1.前言 网上目前已经有诸多优秀的RNN相关博客,但是我写博客的出发点主要是为了加深和巩固自己的理解,所以还是决定自己再进行一下总结和描述,如有不正确的地方欢迎指正~ 2.区分RNN 循环神经网络(R ...
- 史上最直白之Attention详解(原理+代码)
目录 为什么要了解Attention机制 Attention 的直观理解 图解深度学习中的Attention机制 总结 为什么要了解Attention机制 在自然语言处理领域,近几年最火的是什么? ...
- 史上最简单MySQL教程详解(进阶篇)之存储过程(一)
史上最简单MySQL教程详解(进阶篇)之存储过程(一) 史上最简单MySQL教程详解(进阶篇)之存储过程(一) 什么是存储过程 存储过程的作用 如何使用存储过程 创建存储过程 DELIMITER改变分 ...
- 史上最简单MySQL教程详解(进阶篇)之存储引擎介绍及默认引擎设置
什么是存储引擎? MySQL存储引擎种类 MyISAM 引擎 InnoDB引擎 存储引擎操作 查看存储引擎 存储引擎的变更 修改默认引擎 什么是存储引擎? 与其他数据库例如Oracle 和SQL Se ...
- 史上最简单MySQL教程详解(进阶篇)之索引及失效场合总结
史上最简单MySQL教程详解(进阶篇)之索引及其失效场合总结 什么是索引及其作用 索引的种类 各存储引擎对于索引的支持 简单介绍索引的实现 索引的设置与分析 普通索引 唯一索引(Unique Inde ...
- 史上最简单MySQL教程详解(进阶篇)之视图
史上最简单MySQL教程详解(进阶篇)之视图 为什么要用视图 视图的本质 视图的作用 如何使用视图 创建视图 修改视图 删除视图 查看视图 使用视图检索 变更视图数据 WITH CHECK OPTIO ...
- 史上最小白之BM25详解与实现
史上最小白之BM25详解与实现 原理 BM25算法是一种计算句子与文档相关性的算法,它的原理十分简单:将输入的句子sentence进行分词,然后分别计算句子中每个词word与文档doc的相关度,然后进 ...
- 史上最小白之Transformer详解
1.前言 博客分为上下两篇,您现在阅读的是下篇史上最小白之Transformer详解,在阅读该篇博客之前最好你能够先明白Encoder-Decoder,Attention机制,self-Attenti ...
- 史上最小白之Attention详解
1.前言 在自然语言处理领域,近几年最火的是什么?是BERT!谷歌团队2018提出的用于生成词向量的BERT算法在NLP的11项任务中取得了非常出色的效果,堪称2018年深度学习领域最振奋人心的消息. ...
最新文章
- python3 ipaddress模块 创建 检查 操作ip地址 简介
- HTML5与jQuery实现渐变绚丽网页图片效果
- 机器学习算法与Python实践之(二)支持向量机(SVM)初级
- linux服务器su之后变成bash-4.1#
- 频率概率与贝叶斯概率
- Atitit.ati orm的设计and架构总结 适用于java c# php版
- 走进COM组件系列(一)
- 【LeetCode】【数组】题号:*304,二维区域和检索
- sql将null替换为0_Firefox浏览器将被认为包含歧视性的 Master字眼替换为 Primary
- 2000-2018年各省能源消费和碳排放数据数据、1997-2017年各省地级市县区碳排放数、各国二氧化碳排放量(人均公吨数)1960-2014年、二氧化碳排放量、各省市碳排放权额分配实施方案
- MATLAB学习笔记————(MATLAB的矩阵及其操作②)
- STM32F103C8T6红外遥控解码
- 【调剂】山东大学控制科学与工程学院生物医学实验室课题组招收硕士研究生...
- 加州大学戴维斯分校 计算机科学,UCDavis的Computer Science「加州大学戴维斯分校计算机科学专业」...
- Titanic练习 特征分析与选择
- 基于java植物大全智能识别系统设计与实现
- 如何使用 Typora 创建思维导图
- 微信小程序全栈开发实践 第三章 微信小程序开发常用的API介绍及使用 -- 3.6 网络接口简介(六)关于Page页面隐藏代码执行及Promise对象catch处理的补充
- 神经网络学习笔记3——LSTM长短期记忆网络
- SHT30 温湿度传感器,检验不通过,通讯不稳定(经常读到FF)问题处理