循环神经网络(RNN)原理通俗解释

循环神经网络(RNN)原理通俗解释1 RNN 怎么来的 2 RNN 的网络结构及原理 3 RNN 的改进 1 双向 RNN4 RNN 的改进 2 深层双向 RNN4 1PyramidalRN RNN 的训练 BPTT6 RNN 与 CNN 的结合应用 看图说话 7 RNN 项目练手 1 RNN 怎么来的 循环神经网络的应用场景比较多 比如暂时能写论文 写程序 写诗 但是 总是会有但是的 但是他们现在还不能正常使

1.RNN怎么来的?

循环神经网络的应用场景比较多,比如暂时能写论文,写程序,写诗,但是,(总是会有但是的),但是他们现在还不能正常使用,学习出来的东西没有逻辑,所以要想真正让它更有用,路还很远。

2.RNN的网络结构及原理

RNN是一个序列到序列的模型,假设 xt1,xt,xt+1 x t − 1 , x t , x t + 1 是一个输入:“我是中国“,那么 ot1,ot o t − 1 , o t 就应该对应”是”,”中国”这两个,预测下一个词最有可能是什么?就是 ot+1 o t + 1 应该是”人”的概率比较大。

因此,我们可以做这样的定义:

Xt:tot:tSt:t X t : 表 示 t 时 刻 的 输 入 , o t : 表 示 t 时 刻 的 输 出 , S t : 表 示 t 时 刻 的 记 忆

。因为我们当前时刻的输出是由记忆和当前时刻的输入决定的,就像你现在大四,你的知识是由大四学到的知识(当前输入)和大三以及大三以前学到的东西的(记忆)的结合,RNN在这点上也类似,神经网络最擅长做的就是通过一系列参数把很多内容整合到一起,然后学习这个参数,因此就定义了RNN的基础:

St=f(UXt+WSt1) S t = f ( U ∗ X t + W ∗ S t − 1 )

大家可能会很好奇,为什么还要加一个

f() f ( )
函数,其实这个函数是神经网络中的激活函数,但为什么要加上它呢?

举个例子,假如你在大学学了非常好的解题方法,那你初中那时候的解题方法还要用吗?显然是不用了的。RNN的想法也一样,既然我能记忆了,那我当然是只记重要的信息啦,其他不重要的,就肯定会忘记,是吧。但是在神经网络中什么最适合过滤信息呀?肯定是激活函数嘛,因此在这里就套用一个激活函数,来做一个非线性映射,来过滤信息,这个激活函数可能为tanh,也可为其他。

假设你大四快毕业了,要参加考研,请问你参加考研是不是先记住你学过的内容然后去考研,还是直接带几本书去参加考研呢?很显然嘛,那RNN的想法就是预测的时候带着当前时刻的记忆 St S t 去预测。假如你要预测“我是中国“的下一个词出现的概率,这里已经很显然了,运用softmax来预测每个词出现的概率再合适不过了,但预测不能直接带用一个矩阵来预测呀,所有预测的时候还要带一个权重矩阵V,用公式表示为:

ot=softmax(VSt) o t = s o f t m a x ( V S t )

其中 ot o t 就表示时刻t的输出。

3.RNN的改进1:双向RNN

S1t=f(U1Xt+W1St1+b1) 从 前 往 后 : S t 1 → = f ( U 1 → ∗ X t + W 1 → ∗ S t − 1 + b 1 → )

:S2t=f(U2Xt+W2St1+b2) 从 后 往 前 : S t 2 → = f ( U 2 ∗ X t → + W 2 → ∗ S t − 1 + b 2 → )

ot=softmax(V[S1t;S2t]) 输 出 : o t = s o f t m a x ( V ∗ [ S t 1 → ; S t 2 → ] )

这里的 [S1t;S2t] [ S t 1 → ; S t 2 → ] 做的是一个拼接,如果他们都是1000X1维的,拼接在一起就是1000X2维的了。

双向RNN需要的内存是单向RNN的两倍,因为在同一时间点,双向RNN需要保存两个方向上的权重参数,在分类的时候,需要同时输入两个隐藏层输出的信息。

4.RNN的改进2:深层双向RNN

深层双向RNN 与双向RNN相比,多了几个隐藏层,因为他的想法是很多信息记一次记不下来,比如你去考研,复习考研英语的时候,背英语单词一定不会就看一次就记住了所有要考的考研单词吧,你应该也是带着先前几次背过的单词,然后选择那些背过,但不熟的内容,或者没背过的单词来背吧。

深层双向RNN就是基于这么一个想法,他的输入有两方面,第一就是前一时刻的隐藏层传过来的信息 h(i)t1 h → t − 1 ( i ) ,和当前时刻上一隐藏层传过来的信息 h(i1)t=[h(i1)t;h⃖ (i1)t] h t ( i − 1 ) = [ h → t ( i − 1 ) ; h ← t ( i − 1 ) ] ,包括前向和后向的。
这里写图片描述

4.1 Pyramidal RNN

由图我们发现,上一层的两个输出,作为当前层的输入,如果是非常长的序列的话,这样做的话,每一层的序列都比上一层要短,但当前层的输入 f(x) f ( x ) 也会随之增多,貌似看一起相互抵消,运算量并没有什么改进。

5.RNN的训练-BPTT

如前面我们讲的,如果要预测t时刻的输出,我们必须先利用上一时刻(t-1)的记忆和当前时刻的输入,得到t时刻的记忆:

s t = t a n h ( U x t + W s t 1 ) ” role=”presentation”> s t = t a n h ( U x t + W s t 1 )

然后利用当前时刻的记忆,通过softmax分类器输出每个词出现的概率:

ŷ t=softmax(Vst) y ^ t = s o f t m a x ( V s t )

为了找出模型最好的参数,U,W,V,我们就要知道当前参数得到的结果怎么样,因此就要定义我们的损失函数,用交叉熵损失函数:

tEt(yt,ŷ t)=ytlogŷ t t 时 刻 的 损 失 : E t ( y t , y ^ t ) = − y t l o g y ^ t

其中 yt y t t时刻的标准答案,是一个只有一个是1,其他都是0的向量; ŷ t y ^ t 是我们预测出来的结果,与 yt y t 的维度一样,但它是一个概率向量,里面是每个词出现的概率。因为对结果的影响,肯定不止一个时刻,因此需要把所有时刻的造成的损失都加起来:

E(yt,ŷ t)=tEt(yt,ŷ t)=tytlogŷ t E ( y t , y ^ t ) = ∑ t E t ( y t , y ^ t ) = − ∑ t y t l o g y ^ t

循环神经网络(RNN)原理通俗解释

如图所示,你会发现每个cell都会有一个损失,我们已经定义好了损失函数,接下来就是熟悉的一步了,那就是根据损失函数利用SGD来求解最优参数,在CNN中使用反向传播BP算法来求解最优参数,但在RNN就要用到BPTT,它和BP算法的本质区别,也是CNN和RNN的本质区别:CNN没有记忆功能,它的输出仅依赖与输入,但RNN有记忆功能,它的输出不仅依赖与当前输入,还依赖与当前的记忆。这个记忆是序列到序列的,也就是当前时刻收到上一时刻的影响,比如股市的变化。

因此,在对参数求偏导的时候,对当前时刻求偏导,一定会涉及前一时刻,我们用例子看一下:

循环神经网络(RNN)原理通俗解释

假设我们对 E3 E 3 的W求偏导:它的损失首先来源于预测的输出 ŷ 3 y ^ 3 ,预测的输出又是来源于当前时刻的记忆 s3 s 3 ,当前的记忆又是来源于当前的输出和截止到上一时刻的记忆: s3=tanh(Ux3+Ws2) s 3 = t a n h ( U x 3 + W s 2 )
因此,根据链式法则可以有:

E3W=E3ŷ 3ŷ 3s3s3W ∂ E 3 ∂ W = ∂ E 3 ∂ y ^ 3 ∂ y ^ 3 ∂ s 3 ∂ s 3 ∂ W

但是,你会发现, s2=tanh(Ux2+Ws1) s 2 = t a n h ( U x 2 + W s 1 ) ,也就是 s2 s 2 里面的函数还包含了W,因此,这个链式法则还没到底,就像图上画的那样,所以真正的链式法则是这样的:
这里写图片描述
我们要把当前时刻造成的损失,和以往每个时刻造成的损失加起来,因为我们每一个时刻都用到了权重参数W。和以往的网络不同,一般的网络,比如人工神经网络,参数是不同享的,但在循环神经网络,和CNN一样,设立了参数共享机制,来降低模型的计算量。

6.RNN与CNN的结合应用:看图说话

在图像处理中,目前做的最好的是CNN,而自然语言处理中,表现比较好的是RNN,因此,我们能否把他们结合起来,一起用呢?那就是看图说话了,这个原理也比较简单,举个小栗子:假设我们有CNN的模型训练了一个网络结构,比如是这个

循环神经网络(RNN)原理通俗解释

最后我们不是要分类嘛,那在分类前,是不是已经拿到了图像的特征呀,那我们能不能把图像的特征拿出来,放到RNN的输入里,让他学习呢?

之前的RNN是这样的:

St=tanh(UXt+WSt1) S t = t a n h ( U ∗ X t + W ∗ S t − 1 )

我们把图像的特征加在里面,可以得到:

St=tanh(UXt+WSt1+VX) S t = t a n h ( U ∗ X t + W ∗ S t − 1 + V ∗ X )

其中的X就是图像的特征。如果用的是上面的CNN网络,X应该是一个4096X1的向量。

注:这个公式只在第一步做,后面每次更新就没有V了,因为给RNN数据只在第一次迭代的时候给。

7.RNN项目练手




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

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

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


相关推荐

  • 图书管理系统设计与实现—看这篇就够了

    图书管理系统设计与实现—看这篇就够了本课程设计的目的 1 掌握企业级应用系统的基本开发流程 2 培养开发者掌握应用系统设计的基本思路和方法 3 培养开发者分析 解决问题的能力 系统要实现的功能概述 1 用户登录 管理员或会员根据用户名和密码进行身份验证登录系统 2 图书管理 根据图书编号 图书名称查询图书基本信息添加 修改 删除图书 3 读者管理 根据账号 姓名查询读者基本信息 添加 修改 删除读者信息 4 图书分类管理 根据分类名称查询图书分类信息 添加 修改 删除图书分类

    2026年3月20日
    2
  • 两小时教你使用Cursor开发微信小程序:查八字的完整教程

    两小时教你使用Cursor开发微信小程序:查八字的完整教程

    2026年3月16日
    2
  • 关于rndc-confgen 在centos 上不能用的解决方法

    关于rndc-confgen 在centos 上不能用的解决方法

    2021年9月12日
    83
  • js数组常用方法「建议收藏」

    js数组常用方法「建议收藏」1.join()(数组转字符串)数组转字符串,方法只接收一个参数:即默认为逗号分隔符()。<script> vararr=[1,2,3,4]; console.log(arr.join());//1,2,3,4 console.log(arr.join(":"));//1:2:3:4 console.log(arr);//[1,2,3,4],原数组不变&l…

    2022年5月18日
    53
  • 基于springboot的旅游管理系统

    基于springboot的旅游管理系统1,项目功能:(1)旅游路线(2)旅游景点(3)餐饮住宿(4)旅游车票(5)旅游保险(6)旅游攻略(7)注意事项(8)会员中心(9)用户管理(10)内容管理(11)业务管理(12)数据分析2,涉及技术:SpringBoot框架,Maven,Tomcat3,开发环境:IDEA,MySQL数据库4,讲解方式:从环境安装,项目搭建,以及项目介绍等进行讲解5,包含资料:项目源码(含数据库文件),环境安装包,项目文档。课程链接+项目下载:基于spr…

    2022年5月10日
    45
  • pycharm替换的快捷键_想要快速编写代码,你得熟悉这些快捷键!

    pycharm替换的快捷键_想要快速编写代码,你得熟悉这些快捷键!PyCharm常用快捷键导语工欲善其事必先利其器,想要快速编写代码,就必须要先熟悉快捷键,Python开发利器Pycharm常用快捷键如下,相信有了这些快捷键,你编写代码会事半功倍。1编辑Shift+F1外部文档Shift+Enter另起一行Alt+Enter快速修正Alt+Insert自动生成代码Ctrl+O重新方法Ctrl+Alt+T选中Ct…

    2022年8月26日
    8

发表回复

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

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