当前位置: 首页 > article >正文

深度学习知识点:RNN

文章目录

  • 1.简单介绍
  • 2.网络结构
  • 3.应对梯度消失

1.简单介绍

循环神经网络(RNN,Recurrent Neural Network)是一类用于处理序列数据的神经网络。与传统网络相比,变化不是特别大,不如CNN的变化那么大。
为什么要有循环神经网络:
传统神经网络:输入一个数据处理一个数据,互不干扰
但是有些数据是连贯性的,比如一个句子(我今天早上8点醒的),就不可能将每一个字或一些词单独处理,而是在处理这个字的同时还要考虑到与前面字的关系,因此循环神经网络就可以解决这一问题。

描述 图1: 传统神经网络

2.网络结构

RNN 不是刚性地记忆所有固定长度的序列,而是通过隐藏状态来存储之前时间步的信息。
也就是说在循环神经网络的隐藏层中,输入的数据走向有两个:输出和等待,等待是指等待第二个数据的到来并对第二个数据的隐藏特征产生影响。

描述 图2: 循环神经网络

可以看出,典型的 RNN 是有环结构(图3a)。一个典型的 RNN 网络架构包含一个输入,一个输出和一个神经网络单元 。和普通的前馈神经网络的区别在于:RNN 的神经网络单元不但与输入和输出存在联系,而且自身也存在一个循环 / 回路 / 环路 / 回环 (loop)。这种回路允许信息从网络中的一步传递到下一步。 同时,RNN 还能按时间序列展开循环 (unroll the loop) 为图2b:

描述 图3: a)等号左:整体网络;b)等号右:整体网络的分解

由上图可知,上一个时刻的网络状态将会作用于到下一个时刻的网络状态,还表明 RNN 和序列数据密切相关。同时,RNN 要求每一个时刻都有一个输入,但是不一定每个时刻都需要有输出。 最终我们需要的只是h t的结果,举个例子:拿出手写数据集中的一张照片,将其分割成784维的向量,我们只需要在最后一维向量输入进去后看整体的结果是属于0-9的哪种类别即可,最后的输出结果隐含了前面的信息,所以中间隐藏层的结果我们并不需要知道。 进一步地,公式化 RNN 的结构如下:

描述 图4: RNN结构推导式

在图中有一条单向流动的信息流是从输入单元到达隐藏单元的,与此同时另一条单向流动的信息流从隐藏单元到达输出单元。在某些情况下,RNNs 会打破后者的限制,引导信息从输出单元返回隐藏单元,这些被称为 “Back Projections”,并且隐藏层的输入还包括上一隐藏层的状态,即隐藏层内的节点可以自连也可以互连(这实际上就是 LSTM)。

循环神经网络的输入是序列数据,每个训练样本是一个时间序列,包含多个相同维度的向量。网络的参数如何通过训练确定?这里就要使用解决 RNN 训练问题的 BPTT(Back Propagation Through Time)算法。
右侧为计算时便于理解记忆而产生的结构。简单说,x 为输入层,o 为输出层,s 为隐含层,而 t 指第几次的计算;V、W、U为权重(在 RNN 中,每一层都共享参数U、V、W,降低了网络中需要学习的参数,提高学习效率。 xt 表示 t 时刻的输入, St表示 t 时刻的隐状态, Ot表示 t 时刻的输出。

  • 输入单元(input units): { x 0 , ⋅ ⋅ ⋅ , x t − 1 , x t , x t + 1 , ⋅ ⋅ ⋅ } \{x_{0}, \cdot \cdot \cdot, x_{t-1}, x_{t}, x_{t+1}, \cdot \cdot \cdot\} {x0,,xt1,xt,xt+1,}

  • 隐藏单元(hidden units): { s 0 , ⋅ ⋅ ⋅ , s t − 1 , s t , s t + 1 , ⋅ ⋅ ⋅ } \{s_{0}, \cdot \cdot \cdot, s_{t-1}, s_{t}, s_{t+1}, \cdot \cdot \cdot\} {s0,,st1,st,st+1,}

  • 输出单元(output units): { o 0 , ⋅ ⋅ ⋅ , o t − 1 , o t , o t + 1 , ⋅ ⋅ ⋅ } \{o_{0}, \cdot \cdot \cdot, o_{t-1}, o_{t}, o_{t+1}, \cdot \cdot \cdot\} {o0,,ot1,ot,ot+1,}

  • 输入层: x t x_{t} xt 表示时刻 t t t 的输入。

t 次的中间的隐含层状态为:

s t = f ( U ⋅ x t + W ⋅ s t − 1 ) s_{t} = f(U \cdot x_{t} + W \cdot s_{t-1}) st=f(Uxt+Wst1)

  • f f f 是非线性激活函数,比如 t a n h tanh tanh

输出层

o t = s o f t m a x ( V ⋅ s t ) o_{t} = softmax(V \cdot s_{t}) ot=softmax(Vst)

  • softmax 函数是归一化的指数函数,使每个元素的范围都在 0 到 1 之间 ,并且所有元素的和为 1。

反向传播
E 3 E_3 E3举例,当反向传播时,不仅会传递回隐层 s 3 s_3 s3,还会向输入层 x 3 x_3 x3进行传递,只要是反向有参数的地方就会更新。

描述

3.应对梯度消失

在进行反向传播时,循环神经网络也面临梯度消失或者梯度爆炸问题,这种问题表现在时间轴上。如果输入序列的长度很长,人们很难进行有效的参数更新。比如:我今天早上8点起床,中午吃了粘豆包,晚上开车去了电影院。我去电影院这个动作和早上中午的并没有很大关系,但是RNN在计算时是没有取舍的。

通常来说梯度爆炸更容易处理一些。梯度爆炸时我们可以设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。

应对梯度消失问题的解决方案:

  • 合理地初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。
  • 使用激活函数 ReLu,代替 sigmoid 和 tanh。
  • 使用其他结构的 RNNs,比如长短时记忆网络(LSTM)和 门控循环单元 (GRU),这是最流行的做法。

http://www.kler.cn/a/472253.html

相关文章:

  • ChatGPT网络错误如何解决
  • el-table 多级表头
  • Qt 5.14.2 学习记录 —— 오 信号与槽机制(2)
  • springboot + vue+elementUI图片上传流程
  • Spring Boot整合Minio实现文件上传
  • HTML 迷宫游戏
  • [网络安全]BurpSuite爆破实战解题详析之BUUCTF Brute 1
  • 2025运维故障记 2 | 1/6 哪吒汽车官网无法正常访问
  • linux下的MongoDB手动安装部署详解
  • Perlin Noise算法
  • maven的pom.xml配置详解
  • 为什么ip属地一会河南一会江苏
  • Spring Boot项目中使用单一动态SQL方法可能带来的问题
  • 《Opencv》信用卡信息识别项目
  • 【NLP高频面题 - Transformer篇】Position encoding为什么选择相加而不是拼接呢?
  • 2. 模型和算法
  • thinkphp通过html生成pdf
  • C#设计模式(行为型模式):观察者模式
  • 国产编辑器EverEdit - 如何对汉字按笔划数排序?
  • 态势感知是自动化,势态知感是智能化
  • Excel表头/字段一致的表格拼接【python语言】
  • 【UE5 C++课程系列笔记】22——多线程基础——FRunnable和FRunnableThread
  • fmql裸跑编译过程记录
  • Allure 集成 pytest
  • 学习echarts折线图tooltip属性中formatter文字设置不同颜色的方法
  • 新型企业电站 源网荷储充一体化管理系统 EMS3.0具备哪些功能?