史上最小白之RNN详解

史上最小白之RNN详解1 前言网上目前已经有诸多优秀的 RNN 相关博客 但是我写博客的出发点主要是为了加深和巩固自己的理解 所以还是决定自己再进行一下总结和描述 如有不正确的地方欢迎指正 2 区分 RNN 循环神经网络 RecurrentNeu 递归神经网络 RecursiveNeu 你有没有发现他们的缩写都是 RNN 那他们两个是同一回事儿吗 网上有一些博客把这两就当

1.前言

网上目前已经有诸多优秀的RNN相关博客,但是我写博客的出发点主要是为了加深和巩固自己的理解,所以还是决定自己再进行一下总结和描述,如有不正确的地方欢迎指正~

2.区分RNN

循环神经网络(Recurrent Neural Network),递归神经网络(Recursive Neural Network),你有没有发现他们的缩写都是RNN,那他们两个是同一回事儿吗?网上有一些博客把这两就当成了同一个RNN来说明,包括我自己在学习的时候也一直认为循环神经网络跟递归神经网络没什么区别,直到我自己写博客的时候才发现他们原来根本就不是同一回事儿,这也许就是写博客的好处吧。对于递归神经网络 RNN我自己也不是很熟悉,这里就暂时先不介绍,等我完全搞懂了后再写吧。
下文所述的RNN全是指代循环神经网络。

3.循环神经网络 Recurrent Neural Network

3.1为什么需要循环神经网络 RNN

在这里插入图片描述
上图是一幅全连接神经网络图,我们可以看到输入层-隐藏层-输出层,他们每一层之间是相互独立地,(框框里面代表同一层),每一次输入生成一个节点,同一层中每个节点之间又相互独立的话,那么我们每一次的输入其实跟前面的输入是没有关系地。这样在某一些任务中便不能很好的处理序列信息。
什么是序列信息呢?
通俗理解就是一段连续的信息,前后信息之间是有关系地,必须将不同时刻的信息放在一起理解。
比如一句话,虽然可以拆分成多个词语,但是需要将这些词语连起来理解才能得到一句话的意思。
RNN就是用来处理这些序列信息的任务,比如NLP中的语句生成问题,一句话中的每个词并不是单独存在地,而是根据上下文信息,与他的前后词有关。
如:我吃XXX,吃是一个动词,按照语法规则,那么它后面接名词的概率就比较大,在预测XXX是什么的时候就要考虑前面的动词吃的信息,如果没考虑上下文信息而预测XXX是一个动词的话,动词+动词,很大概率是不符合语言逻辑地。
为了解决这一问题,循环神经网络 RNN也就应运而生了。






3.2循环神经网络 RNN的结构

在这里插入图片描述
先看左半边图,如果不看隐藏层中的W,把它忽略,那么这其实就相当于是一个全连接神经网络的结构。那么从左图中就可以看出RNN呢其实就只是相当于在全连接神经网络的隐藏层增加了一个循环的操作。至于这个循环的操作具体是怎样的呢?单看左图可能有些懵逼,那么现在看上右图。上右图是RNN网络结构按照时间线展开图。
Xt是t时刻的输入,是一个[x0,x1,x2…xn]的向量
U是输入层到隐藏层的权重矩阵
St是t时刻的隐藏层的值
W是上一时刻的隐藏层的值传入到下一时刻的隐藏层时的权重矩阵
V是隐藏层到输出层的权重矩阵
Ot是t时刻RNN网络的输出
从上右图中可以看出这个RNN网络在t时刻接受了输入Xt之后,隐藏层的值是St,输出的值是Ot。但是从结构图中我们可以发现St并不单单只是由Xt决定,还与t-1时刻的隐藏层的值St-1有关。
这样,所谓的隐藏层的循环操作也就不难理解了,就是每一时刻计算一个隐藏层地值,然后再把该隐藏层地值传入到下一时刻,达到信息传递的目的。
具体隐藏层值St计算公式如下:
S t = f ( U ⋅ X t + W ⋅ S t − 1 + b ) S_t=f(U\cdot X_t + W\cdot S_{t-1}+b) St=f(UXt+WSt1+b)
得到t时刻隐藏层的值后,再计算输出层的值:
O t = g ( V ⋅ S t ) O_t=g(V\cdot S_t) Ot=g(VSt)
注意:在同一层隐藏层中,不同时刻的W,V,U均是相等地,这也就是RNN的参数共享。
怎么理解这个参数共享呢?
我自己的理解是,虽然说X{t-1},X{t},X{t+1}是表示不同时刻的输入,但是他们输入到RNN网络中的时候并不是作为单独的向量一个一个输入地,而是组合在一起形成一个矩阵输入,然后这个矩阵再通过权重矩阵U的变化,其实是同一时刻输入地,只是计算的先后顺序不同。因此同一个隐藏层中,不同时刻的输入他们的W,V,U参数是共享地。
接下来详细说明一下公式:
在这里插入图片描述

















3.3循环神经网络 RNN的训练方法

3.4 循环神经网络RNN的多种类型任务

3.4.1one-to-one

在这里插入图片描述
输入的是独立地数据,输出的也是独立地数据,基本上不能算作是RNN,跟全连接神经网络没有什么区别

3.4.2one-to-n

在这里插入图片描述
输入的是一个独立数据,需要输出一个序列数据,常见的任务类型有:
基于图像生成文字描述
基于类别生成一段语言,文字描述


3.4.3n-to-n

在这里插入图片描述
最为经典地RNN任务,输入和输出都是等长地序列
常见的任务有:
计算视频中每一帧的分类标签
输入一句话,判断一句话中每个词的词性



3.4.4n-to-one

在这里插入图片描述
输入一段序列,最后输出一个概率,通常用来处理序列分类问题。
常见任务:
文本情感分析
文本分类



3.4.5n-to-m

在这里插入图片描述
输入序列和输出序列不等长地任务,也就是Encoder-Decoder结构,这种结构有非常多的用法:
机器翻译:Encoder-Decoder的最经典应用,事实上这结构就是在机器翻译领域最先提出的
文本摘要:输入是一段文本序列,输出是这段文本序列的摘要序列
阅读理解:将输入的文章和问题分别编码,再对其进行解码得到问题的答案
语音识别:输入是语音信号序列,输出是文字序列
基于Encoder-Decoder的结构后续有改良出了NLP中的大杀器transformer和Bert,今后有机会再详细介绍把~





4.BiRNN 双向RNN

虽然RNN达到了传递信息的目的,但是只是将上一时刻的信息传递到了下一时刻,也就是只考虑到了当前节点前的信息,没有考虑到该节点后的信息。具体到NLP中,也就是一句话,不仅要考虑某个词上文的意思,也还要考虑下文的意思,这个时候普通的RNN就做不到了。于是就有了双向RNN(Bidirectional RNN)。

4.1BiRNN结构

在这里插入图片描述
上面是BiRNN的结构图,蓝框和绿框分别代表一个隐藏层,BiRNN在RNN的基础上增加了一层隐藏层,这层隐藏层中同样会进行信息传递,两个隐藏层值地计算方式也完全相同,只不过这次信息不是从前往后传,而是从后往前传,这样不仅能考虑到前文的信息而且能考虑到后文的信息了。
实现起来也很简单,比如一句话,“我爱NLP”,进行分词后是[“我”,“爱”,“NLP”],输入[[“我”],[“爱”],[“NLP”]],计算forward layer隐藏层值,然后将输入数据翻转成[[“NLP”],[“爱”],[“我”]],计算backward layer 隐藏层值,然后将两个隐藏层的值进行拼接,再输出就行啦。
这就是BiRNN的原理,理解了RNN的原理,应该来说还是比较简单地。


5.DRNN 深层RNN

在这里插入图片描述
上图是DRNN的结构图,很简单,每一个红框里面都是一个BiRNN,然后一层BiRNN的输出值再作为另一个BiRNN的输入。多个BiRNN堆叠起来就成了DRNN。

6.结语

7.参考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/175955.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午11:01
下一篇 2026年3月26日 下午11:01


相关推荐

  • 安卓dtmf识别_基于Python的DTMF信号识别

    安卓dtmf识别_基于Python的DTMF信号识别前言我这标题起得怎么这么像课程论文呢 啊 放心啦 这不是课程论文 这只是一个有趣 且值钱 的程序 起因是这样的 我加了几个软件兼职群 前几天我发现其中有一个项目 是利用 FFT 识别信号啥的 报价 700 性价比对于我来说我觉得挺高的了 看样子好像也不难 我就接了 过程 1 理解题意题目要求是这样的 然后有一个五百多 KB 的 dat 文件和一个频号对应表 就是说 要用傅里叶变换把 dat 文件里具体有哪些号码给

    2026年3月17日
    2
  • 内网渗透综述

    内网渗透综述目录一 什么是内网渗透二 内网基础知识三 内网渗透基本流程一 什么是内网渗透内网是一个只有组织工作人员才能访问的专用网络 简而言之就是不可简单地通过外部公网 ip 进行访问到的公司内部网络 对于一个大型公司的网络系统 通过信息收集找到网站漏洞可以顺利通过公网进入公司内部网络时 进一步对公司内部网络的渗透攻击即为内网渗透 与外网渗透区别 1 外网渗透更侧重于找漏洞寻找突破口 考验的是白帽的综合能力 外网渗透的最终还是为了进入内网

    2025年9月8日
    6
  • 搜索引擎技术之概要预览

    搜索引擎技术之概要预览

    2021年11月16日
    61
  • vscode中怎样格式化js代码_vscode格式化配置

    vscode中怎样格式化js代码_vscode格式化配置此配置支持 CSS HTML JS 和 Vue 等文件的格式化一 安装插件 Prettier Eslint VeturESlint javascript 代码检测工具 可以配置每次保存时格式化 jsPrettier Codeformatte 只关注格式化 并不具有 eslint 检查语法等能力 只关心格式化文件 最大长度 混合标签和空格 引用样式等 包括 JavaScript Flow

    2026年3月16日
    3
  • lrzsz的乱码问题[通俗易懂]

    lrzsz的乱码问题[通俗易懂]相信多数人都使用过lrzsz,它是一款在linux里可代替ftp上传和下载的程序。(来源:百度百科)lrzsz,它可以实现在windows和linux之间进行文件传输,有rz和sz两条命令。-rz:将windows上的文件传输到linux上。-sz:将linux上的文件传到windows上。在ubuntu16上lrzsz的安装:一条简单的命令即可apt-getinstalll…

    2022年6月23日
    53
  • Java基础-遍历数组

    Java基础-遍历数组Java基础-遍历数组1、语法简介2、一维数组3、二维数组4、三维数组1、语法简介在Java中,对for语句的功能给予了扩充、加强,以便更好的遍历数组。语法格式如下:for(声明循环变量:数组的名字){ ………}其中,声明的循环变量的类型必须与数组类型相同。2、一维数组代码:packageThroughArray;//遍历一维数组publicclassOneDimensionalArray{publicstaticvoidmain(String

    2026年1月22日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号