1. RNN的网络结构(展开)


图 1 RNN网络的基本运算单元

RNN 网络是由一个个的 cell 组成的,每一个 cell 都五脏俱全:
可以看出,沿着时间轴 t 每一个RNN的单元内都有一个输入 / 隐藏 / 输出层的神经网络。

RNN的每个细胞单元在时间轴的方向上,向下一时刻的RNN细胞单元共享权重,来实现处理沿时间维度的信息。

1.2 RNN的权值共享

【权值共享的必要性】

  • 减少运算的权重参数:
  • 权重共享的本质是特征提取,在针对特征的时候,权值共享显得尤为重要
  • 权重共享有利于模型泛化:因为普通神经网络的输入是固定的,但是权重共享可以让输入不固定,比如比如很多张图像,每张图像上有个人脸,但是人脸在图像的不同位置,或者图像的大小也不相同,此时权重共享可以全图扫描,搜索人脸,进而把特征提取出来。

权重共享使得模型能够处理一个连续序列的特征,而不管输入的序列总长度是多少。
当这个连续序列在样本的不同位置时,依然能够识别,而不是学习每个位置的规则,这不仅抓住了不同特征之间的连续性,也减少了学习规则

我们先来看一下CNN 网络的空间范围的权值共享。
CNN 卷积网络的过程中,一个卷积核对一整幅原图进行计算的时候,扫描整幅图所有的部分用的是同一个卷积核。如下:

图 2 用一个卷积核进行卷积运算的全过程

可以看的很清楚,无论这个卷积核在原图的哪一个部分做运算,总是这同一个卷积核,最后输出得到一个特征图。

图 3 CNN通过卷积运算共享权重参数的过程细节

如上图所示,详细展示了,如何在卷积核运算的过程中 共享同一组权重参数,而且右边的神经网络层也可以看的很清楚,右面神经网络图的部分的 颜色对应的是左边卷积核中相同颜色的部分对应的参数。可以很直观的看到,参数的在整个过程中被共享,有效地减少了传统方法中的“全连接”运算导致的参数过多情况。


对于RNN 网络,我个人认为是存在两种意义上的【权值共享】:

  • cell 内部的权值共享,也就是跟CNN一样,卷积核在做卷积操作的时候可以共享权值
  • 在RNN网络的 cell 与 cell 之间,因为如果 RNN 对图片提取特征的话,提取的特征图信息是存在隐藏层里面的,也就是 <图1> 中的 S 序列中(这一点是类似于CNN网络的)。所以,cell 与 cell 之间的权值共享,其实是相当于共享每个细胞单元提取出的图片特征。


图 4 普通的提取特征的 CNN网络结构层和 RNN单个神经单元的比对

1.3 RNN计算方法


再看到这张图,定义以下符号:

  • 每一个时刻的输出为 OtO_tOt​
  • XXX 代表本细胞单元的输入值,X=[X1,X2,...,Xm]X = [X_1,X_2,...,X_m]X=[X1​,X2​,...,Xm​] 如果输入的是一张图片,那么XXX 就是像素的展开(平铺)值
  • UUU 表示本细胞单元的 输入层隐藏层 之间的权重矩阵
  • VVV 表示 隐藏层输出层 之间的权重矩阵
  • WWW 用来衡量上一时刻的隐藏层的数据在这一时刻的运算中起多大作用的衡量指标。换句话说,就是上一个细胞单元中的隐藏层的数据对本细胞运算的影响程度
  • StS_tSt​ 代表在本细胞单元与矩阵 VVV 进行运算产生输出之前,所有之前运算的总和,这些元素包括:
    ① 上一时刻细胞单元的 St−1S_{t-1}St−1​与 WWW 的乘积
    ② 本时刻细胞单元输入的特征提取结果 U⋅XtU·X_tU⋅Xt​(也就是本层的输入层与输入权重矩阵 UUU 的积运算)
    PS: StS_tSt​ 不仅仅由本细胞单元中的输入 XXX 决定,还由上一时刻的隐藏层的数值有关系

具体公式如下:
Ot=g(V⋅St)O_t = g(V·S_t)Ot​=g(V⋅St​)
St=f(U⋅Xt+W⋅St−1)S_t=f(U·X_t+W·S_{t-1})St​=f(U⋅Xt​+W⋅St−1​)

其实我认为这个地方对于 StS_tSt​ 的理解可以由两种方式:

  • 第一种就是如上St=f(U⋅Xt+W⋅St−1)S_t=f(U·X_t+W·S_{t-1})St​=f(U⋅Xt​+W⋅St−1​),认为 t−1t-1t−1 时刻的隐藏层信息 St−1S_{t-1}St−1​ 是与 ttt 时刻隐藏层信息进行共享,因为他们维度是一样的,所以只需要通过 UUU 矩阵来协调 XtX_tXt​ 的维度(使其与隐藏层的维度一致),然后在 ttt 时刻,将这两个结果进行直接求和得到 ttt 时刻隐藏层的数据。
  • 第二种理解是认为 t−1t-1t−1 时刻的隐藏层信息 St−1S_{t-1}St−1​ 与 ttt 时刻输入层 XtX_tXt​ 进行共享,这两个数据虽然数据长度不一样,但好在都是一维的,所以在输入层进行加和,得到 (St−1+Xt,1)(S_{t-1} + X_t, 1)(St−1​+Xt​,1) 维度的数据,然后将这个数据与特定维度的矩阵做运算,使其满足 ttt 时刻隐藏层的输入维度,同样也达到了目的。

总结来讲,这两种理解方式的不同就相当于:
1 × 3 + 2 × 6 = 15
(1 + 2)× 5 = 15

希望这么说可以帮大家更好的理解

1.4 RNN面对的问题

  • 梯度爆炸
  • 梯度消失


想要详细了解可以参考网页:
https://www.cnblogs.com/pinking/p/9418280.html

【如何解决梯度爆炸和消失问题】

1、对于RNN,可以通过梯度截断,避免梯度爆炸

2、可以通过添加正则项,避免梯度爆炸

3、使用LSTM等自循环和门控制机制,避免梯度消失,参考:https://www.cnblogs.com/pinking/p/9362966.html

4、优化激活函数,譬如将sigmold改为relu,避免梯度消失

一篇文章玩转 RNN 网络 原理相关推荐

  1. kafka异步推送设置重试_一篇文章了解 Kafka 幂等性的原理及实践

    01 幂等性如此重要 Kafka作为分布式MQ,大量用于分布式系统中,如消息推送系统.业务平台系统(如结算平台),就拿结算来说,业务方作为上游把数据打到结算平台,如果一份数据被计算.处理了多次,产生的 ...

  2. java黄油刀_一篇文章玩转ButterKnife,让代码更简洁

    前言 话说,Android开发的兄弟们都知道,每次初始化控件,设置相应的事件,写的那点过程多而且恶心.我们先一块回顾下不堪的曾经~那些年,我们是这样初始化控件: // 每次的习惯上来写一个initVi ...

  3. python udp创建addr_一篇文章搞定Python 网络编程之UDP协议

    基于UDP协议的socket PS:udp是无连接的,先启动那一端都不会报错 server端 import socket # 导入socket模块udp_sk = socket.socket(type ...

  4. 一篇文章带你了解网络编程(总结)

    目录 一.概述 二.网络分层 1.网络体系结构 1.1.OSI参考模型 1.2.TCP/IP参考模型 2.网络协议 2.1.IP协议(Internet protocol) 2.2.TCP协议(Tran ...

  5. 一篇文章看明白 HashMap 工作原理

    HashMap 源码分析 简介 HashMap 是 Java 语言中常用的用于存放键值对数据类型的集合类.随着 JDK(Java Developmet Kit)版本的更新,JDK 1.8 对 Hash ...

  6. 一篇文章教会你Python网络爬虫程序的基本执行流程

    网络爬虫是指在互联网上自动爬取网站内容信息的程序,也被称作网络蜘蛛或网络机器人.大型的爬虫程序被广泛应用于搜索引擎.数据挖掘等领域,个人用户或企业也可以利用爬虫收集对自身有价值的数据. 一个网络爬虫程 ...

  7. reactrouter监听路由变化_一篇文章搞懂前端路由原理解析和实现方式

    在单页应用如此流行的今天,曾经令人惊叹的前端路由已经成为各大框架的基础标配,每个框架都提供了强大的路由功能,导致路由实现变的复杂. 想要搞懂路由内部实现还是有些困难的,但是如果只想了解路由实现基本原理 ...

  8. 一篇文章玩转全网音乐信息库MusicBrainz API

    MusicBrainz 没有/没有/没有 复杂的OAuth认证,直接访问即可! MusicBrainz WebAPI 目前Musicbrainz提供两种WebAPI: XML Web Service ...

  9. 一篇文章带你熟悉 TCP/IP 协议(网络协议篇二)

    涤生_Woo 2017年11月11日阅读 15544 关注 一篇文章带你熟悉 TCP/IP 协议(网络协议篇二) 同样的,本文篇幅也比较长,先来一张思维导图,带大家过一遍. 一图看完本文 一. 计算机 ...

最新文章

  1. oracle 日期格式转换 ‘ddMONyyyy’ 'ddMMMyyyy'
  2. 【工具】模板引擎 Velocity
  3. WebSocket——stomp连接错误[Whoops! Lost connection to XXX]解决方案
  4. zabbix安装与使用
  5. Wireshark抓包介绍和TCP三次握手分析
  6. [vue] 你知道style加scoped属性的用途和原理吗?
  7. LeetCode 第 34 场双周赛(385/2842,前13.5%)
  8. python对文件操作的相关函数_python文件操作的相关函数深入理解Django中内置的用户认证...
  9. java纪元时间_Java实现纪元秒和本地日期时间互换的方法【经典实例】
  10. 利用CSS实现悬停下拉菜单
  11. idea lombok插件安装_开发效率不高?墙裂推荐这十款精选 IntelliJ IDEA 插件
  12. 如何成为一个真正在路上的Linuxer
  13. mac安装telnet命令
  14. 利用DHT网络原理制作bt采集蜘蛛,开源版
  15. 自定义View学习之玩转字体变色
  16. ps抠头发丝详细教程,去除人像中的杂乱头发
  17. 6-23 sdust-Java-可实现多种排序的Book类
  18. 关于网线连内网,无线连外网,内外网同时连通的方法探究
  19. mysql 与sqlserver对比?哪个更好用?
  20. 海康智能分析服务器设置,【胖猴小玩闹】智能门锁与网关: 海康萤石智能门锁的网关分析(三)...

热门文章

  1. 笛卡尔之“我思故我在”
  2. 高帧频CMOS相机研发方案
  3. ERROR:ORA-28009: connection to sys should be as sy - [oracle10g]
  4. AOP :五种Advice注解
  5. 从书中学爬虫靠谱吗?深夜读《爬虫实战 从数据到产品》
  6. Chicken Soup 【你,远比你以为的更美丽】
  7. TaiChi Lang 让Python代码提速100倍!(高性能计算、图形学、仿真等领域;加速 Python 中计算密集任务程序;希望使用 Python 开发但部署到其它环境)
  8. 利用139,189,yahoo等邮箱短信提示来免费发短信提示
  9. 工商局爬虫 商标网爬虫
  10. 《C Prime Plus》(第六版) 第03章 编程练习 8 品脱/盎司/大汤勺/茶勺单位换算