【深度学习】RNN-程序员宅基地

技术标签: rnn  深度学习  人工智能  神经网络  

1. 什么是RNN

        循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)。

2.RNN的优势

2-1 RNN 

        在传统的全连接神经网络中,模型结构是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。前提假设都是:元素之间是相互独立的,输入与输出也是独立的。这样就造成了在训练时,全连接神经网络学习不到上下文之间的联系。例如,要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。如下图为全链接神经网络。

        RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。如下图为循环神经网络。

        循环神经网络的本质是:像人一样拥有记忆的能力。因为我们当前时刻的输出是由记忆和当前时刻的输入决定的,就像你现在大四,你的知识是由大四学到的知识(当前输入)和大三以及大三以前学到的东西的(记忆)的结合,RNN在这点上也类似,神经网络最擅长做的就是通过一系列参数把很多内容整合到一起,然后学习这个参数,因此,他的输出就依赖于当前的输入和记忆。简要的介绍RNN就是一个简要的结构在重复使用。RNN的基础定义如下, 其中Xt:表示t时刻的输入,ot:表示t时刻的输出,ht:表示t时刻的记忆。

        其中使用f()作为激活函数,一般使用tanh,做非线性映射,过滤信息。在预测的时候带着当前时刻的记忆ht去预测。假如要预测“我是中国“的下一个词出现的概率,这里已经很显然了,运用softmax来预测每个词出现的概率,但预测不能直接带用一个矩阵来预测,所有预测的时候还要带一个权重矩阵W,用公式表示为:

        U、V、W作为参数是被所有的cell是共享的。

2-2 RNN的向前传播流程

        RNN 一个非常重要的概念就是时刻。首先,它进行前向传递并进行预测。其次,它使用损失函数将预测与基础事实进行比较。损失函数输出一个错误值,该错误值是对网络执行得有多糟糕的估计。最后,它使用该误差值进行反向传播,计算网络中每个节点的梯度。

        x_{t}时刻的循环神经网络的输入包括t和从t_0时刻传递来的隐藏状态h_0。

        循环神经网络在t时刻接收到输入x_{t}之后,隐藏层的值是s_{t} ,输出值是o_{t} 。 s_{t}的值不仅仅取决于x_{t} ,还取决于s_{t-1}。为了将当前时刻的隐含状态 s_{t-1}转化为最终的输出 o_{t},循环神经网络还需要另一个全连接层来完成这个过程。这和卷积神经网络中最后的全连接层意义是一样的。(如果不考虑 RNN 的输出还需要一个全连接层的情况,那么 s_{t-1}o_{t} 的值是一样的)。

3.RNN梯度消失

3-1 梯度消失的定义

        网络层之间的梯度(值小于 1.0)重复相乘导致的指数级减小会产生梯度消失,主要是因为网络层数太多,太深,导致梯度无法传播,如果导数小于1,那么随着网络层数的增加梯度更新信息会朝着指数衰减的方式减少,从而导致层数比较浅的权重没有更新,这就是梯度消失。

3-2 梯度消失本质原因

        梯度传递的链式法则所导致的,神经网络的反向传播是逐层对激活函数求偏导数并相乘。梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。

3-3 链式法则

        假的时间序列只有三段, [公式] 为给定值,神经元没有激活函数,则RNN最简单的前向传播过程如下:

        损失函数为: 

        对t=3时刻的 U、V、W求损失函数 L3的偏导

         化简之后的公式如下:

        tanh激活函数可以将实数映射到(-1,1)区间,当tanh的输出极值接近-1和1时,也面临梯度饱和的问题。 tanh和tanh导数的图像如下:

    可以看出 tanh‘  \leq 1 ,训练过程中几乎都是小于1的,而W 的值一般会处于0~1之间,当时间序列足够长,即t足够大时,足够多<=1的值累乘,就会造成\prod_{j=k+1}^{t}tanh'W趋近于0,这就造成了梯度消失;而当W值很大(一般为初始化不当引起)时,就会趋近于无穷,这就造成了梯度爆炸。

特别说明 

        Q:为什么梯度消失使RNN的长时记忆失效,会忘记很久之前的信息?

        A:        因为RNN的特殊性在于,它的权重是共享的。参数V在任何时刻的梯度不会出现问题(因为不依赖于前面的时刻),但是参数UW每一时刻都由前面所有时刻共同决定,是一个相加的过程。这样会存在一个问题,如果文本很长,计算了若干步之后,计算最前面的导数时,最前面的导数就会消失或爆炸,但当前时刻整体的梯度并不会消失,因为它是求和的过程,当下的梯度总会在,只是前面的梯度没了,但是更新时,由于权值共享,所以整体的梯度还是会更新,通常人们所说的梯度消失就是指的这个,指的是当下梯度更新时,用不到前面的信息了,因为距离长了,前面的梯度就会消失,也就是没有前面的信息了,但要知道,整体的梯度并不会消失因为当下的梯度还在,并没有消失。这样整体的梯度还是会更新,只是将前面的信息给遗忘了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44750512/article/details/128835946

智能推荐

QGIS二次开发(C++/Qt):栅格计算器_qgis二次开发 c++-程序员宅基地

文章浏览阅读652次,点赞15次,收藏6次。编写一个具有加、减、乘、除、对数、指数计算功能的栅格图层计算工具,计算结果以tiff格式的栅格文件输出。思路:1.自行设计界面,逐个实现计算功能;2.调用QGIS原生栅格计算器。本文使用第二种方法,直接调用QGIS的栅格计算器。_qgis二次开发 c++

记一次 java.io.IOException: Attempted read from closed stream-程序员宅基地

文章浏览阅读4.4k次,点赞6次,收藏2次。在一次项目问题排查过程中,发现总是 报错 java.io.IOException: Attempted read from closed stream,根据异常的堆栈分析,定位到了问题的根源。问题示例如下:public class Main { public static void main(String[] args) throws ClientProtocolException,..._java.io.ioexception: attempted read from closed stream.

Python中数据清洗缺失值,重复值和异常值的处理_df_replace_outliers = df.replace( df['a'],np.nan, -程序员宅基地

文章浏览阅读2.1k次。1 缺失值的处理1.1 常规缺失值的处理np.nan,NaN,None,NaT(时间数据类型的缺失值)等df.isnull()1.判断每一个df中的数据是否为缺失值,是则返回True,否则返回False2.可以利用True为1,False为0的特性,sum()即为缺失值数量df.notnull()判断每个df中的值是否不为缺失值,是不为缺失值返回True,不是不为缺失值则返回Falsedf.dropna() 1.删除缺失值,可以指定axis来控制删除出现缺失值的行或者列 2.使用dropna_df_replace_outliers = df.replace( df['a'],np.nan, )

SQLite3 极简教程 & Go 使用 SQLite 内存模式操作数据结构_golang sqlite 内存数据库 附加-程序员宅基地

文章浏览阅读1.1w次。SQLite 简介关键词: RDBMS (embedded), CSQLite is a database engine written in the C language. It is not a standalone app; rather, it is a library that software developers embed in their apps...._golang sqlite 内存数据库 附加

Struts1介绍_struts1引用包-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏7次。struts:[strʌts]支柱; 撑杆; 支杆; 支撑; 趾高气扬的步态; 高视阔步的样子;引入strutsModel1结构如图1所示: Model1是一个以JSP文件为中心的模式,在这种模式中JSP页面不仅负责表现逻辑,也负责控制逻辑。专业书籍上称之为逻辑耦合在页面中,这种处理方式,对一些规模很小的项目如:一个简单的留言簿,也没什么太大的坏处,实际上,人们开始接触一些对自己来说是新的东西的时候,比如,用JSP访问数据库时,往往喜欢别人能提供一个包含这一切的单个JSP页面,因为这样在.._struts1引用包

关于使用okhttp3响应乱码问题-程序员宅基地

文章浏览阅读178次。然后在创建OkHttpClient.Builder()的地方配置拦截器。,不加拦截器也可以达到相同的效果。通过 okhttp3 去请求。配置响应拦截器,解压缩响应体。进行压缩,然后返回数据给。

随便推点

【全解析 | PTA】浙大版《Python 程序设计》题目集-第三章_len('3//11//2018'.split('/'))的结果是_____。-程序员宅基地

文章浏览阅读5.2k次,点赞52次,收藏111次。Python/PTA/浙大版/Python程序设计/题解_len('3//11//2018'.split('/'))的结果是_____。

成功粉碎北信源监控程序vrvedp_m.exe ,vrvrf_c64.exe,svchost.exe,vrvrf_c.exe-程序员宅基地

文章浏览阅读1.7w次,点赞4次,收藏12次。公司安装了北信源的监控软件,用360粉碎了大部分北信源的程序文件,但是有几个程序进程始终开机启动,进程无法杀死,一度成了我的一块心病!后来不知咋的灵光一闪,彻底将其粉碎的毛都不剩,现将成功经验分享给大家;电脑基本环境:win10 专业版,360安全卫士粉碎操作步骤(因我电脑已经粉碎了北信源,所以图片以其他文件做示范):找到北信源残余卸载不到的程序文件所在的位置(就是这些东西vr..._vrvedp_m.exe

码云托管小项目-本地笔记文件管理系统_学习文档笔记托管码云-程序员宅基地

文章浏览阅读3.2k次。项目描述这是一个很简单的类博客系统,旨在方便管理本地笔记文档,整体采用spring+springmvc+angularjs+bootstrap+markdown实现,主要包括分类、查看、搜索等功能。项目背景由于记忆有限,学的东西难免忘记,因此就需要一定的笔记来帮助记忆。 之前基本都是在CSDN用博客,或者有道云笔记,或者直接本地文件系统的文档来充当笔记。 这些方式都有他们的优势..._学习文档笔记托管码云

.Net 连接 Mysql 8.0.29-30版本异常: Character set utf8mb3 is not supported by .Net Framework_character set 'utf8mb3' is not supported by .net f-程序员宅基地

文章浏览阅读8.9k次,点赞3次,收藏8次。Character set utf8mb3 is not supported by .Net Framework 解决方法_character set 'utf8mb3' is not supported by .net framework.

Python之(18)ctypes使用-程序员宅基地

文章浏览阅读1.1k次,点赞22次,收藏25次。ctypes是一个 Python 标准库,它提供了和 C 语言库交互的能力。利用ctypes,你可以在 Python 中加载动态链接库(DLLs 或在 Unix-like 系统中的 shared objects),并且可以调用这些库中的函数。这使得Python可以使用已经编译好的代码,这通常是为了性能或者重用现有的C代码。要使用ctypes然后,你可以加载一个库,调用其中的函数,传递参数,以及获取返回值。# 对于 Windows DLL# 对于 Unix-like 系统上的 shared object。_ctypes使用

几个查期刊的网站_standard journal abbreviation (iso4)-程序员宅基地

文章浏览阅读4.9k次。(1)Ecological Indicators | Standard Journal Abbreviation (ISO4) - Academic Acceleratorhttps://academic-accelerator.com/Journal-Abbreviation/Ecological-Indicators(2)Remote Sensing in Ecology and Conservation 期刊投稿经验分享,Remote Sensing in Ecology and Conserva_standard journal abbreviation (iso4)

推荐文章

热门文章

相关标签