RNN(循环神经网络)

2023-11-12


DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系。今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Recurrent Neural Networks ,以下简称RNN),它广泛的用于自然语言处理中的语音识别,手写书别以及机器翻译等领域。

RNN概述

在前面讲到的DNN和CNN中,训练样本的输入和输出是比较的确定的。但是有一类问题DNN和CNN不好解决,就是训练样本输入是连续的序列,且序列的长短不一,比如基于时间的序列:一段段连续的语音,一段段连续的手写文字。这些序列比较长,且长度不一,比较难直接的拆分成一个个独立的样本来通过DNN/CNN进行训练。

而对于这类问题,RNN则比较的擅长。那么RNN是怎么做到的呢?RNN假设我们的样本是基于序列的。比如是从序列索引1到序列索引τ的。对于这其中的任意序列索引号t,它对应的输入是对应的样本序列中的x(t)。而模型在序列索引号t位置的隐藏状态h(t),则由x(t)和在t−1位置的隐藏状态h(t−1)共同决定。在任意序列索引号t,我们也有对应的模型预测输出o(t)。通过预测输出o(t)和训练序列真实输出y(t),以及损失函数L(t),我们就可以用DNN类似的方法来训练模型,接着用来预测测试序列中的一些位置的输出。

下面我们来看看RNN的模型。

RNN模型

RNN模型有比较多的变种,这里介绍最主流的RNN模型结构如下:
    在这里插入图片描述
    上图中左边是RNN模型没有按时间展开的图,如果按时间序列展开,则是上图中的右边部分。我们重点观察右边部分的图。

这幅图描述了在序列索引号t附近RNN的模型。其中:

1) x ( t ) x^{(t)} x(t)代表在序列索引号t时训练样本的输入。同样的, x ( t − 1 ) x^{(t-1)} x(t1) x ( t + 1 ) x^{(t+1)} x(t+1)代表在序列索引号t−1和t+1时训练样本的输入。

2) h ( t ) h^{(t)} h(t)代表在序列索引号t时模型的隐藏状态。 h ( t ) h^{(t)} h(t) x ( t ) x^{(t)} x(t) h ( t − 1 ) h^{(t-1)} h(t1)共同决定。

3) o ( t ) o^{(t)} o(t)代表在序列索引号t时模型的输出。 o ( t ) o^{(t)} o(t)只由模型当前的隐藏状态 h ( t ) h^{(t)} h(t)决定。

4)L(t)代表在序列索引号t时模型的损失函数。

5)y(t)代表在序列索引号t时训练样本序列的真实输出。

6)U,W,V这三个矩阵是我们的模型的线性关系参数,它在整个RNN网络中是共享的,这点和DNN很不相同。 也正因为是共享了,它体现了RNN的模型的“循环反馈”的思想。

RNN前向传播算法

有了上面的模型,RNN的前向传播算法就很容易得到了。

对于任意一个序列索引号t,我们隐藏状态 h ( t ) h^{(t)} h(t) x ( t ) x^{(t)} x(t) h ( t − 1 ) h^{(t-1)} h(t1)得到:
h ( t ) = σ ( z ( t ) ) = σ ( U x ( t ) + W h ( t − 1 ) + b ) h^{(t)} = \sigma(z^{(t)}) = \sigma(Ux^{(t)} + Wh^{(t-1)} +b ) h(t)=σ(z(t))=σ(Ux(t)+Wh(t1)+b)
    其中σ为RNN的激活函数,一般为tanh, b为线性关系的偏倚。

序列索引号t时模型的输出o(t)的表达式比较简单:
o ( t ) = V h ( t ) + c o^{(t)} = Vh^{(t)} +c o(t)=Vh(t)+c
    在最终在序列索引号t时我们的预测输出为:
y ^ ( t ) = σ ( o ( t ) ) \hat{y}^{(t)} = \sigma(o^{(t)}) y^(t)=σ(o(t))
    通常由于RNN是识别类的分类模型,所以上面这个激活函数一般是softmax。

通过损失函数L(t),比如对数似然损失函数,我们可以量化模型在当前位置的损失,即 y ^ ( t ) \hat{y}^{(t)} y^(t) y ( t ) y^{(t)} y(t)的差距。

RNN反向传播算法推导

有了RNN前向传播算法的基础,就容易推导出RNN反向传播算法的流程了。RNN反向传播算法的思路和DNN是一样的,即通过梯度下降法一轮轮的迭代,得到合适的RNN模型参数U,W,V,b,c。由于我们是基于时间反向传播,所以RNN的反向传播有时也叫做BPTT(back-propagation through time)。当然这里的BPTT和DNN也有很大的不同点,即这里所有的U,W,V,b,c在序列的各个位置是共享的,反向传播时我们更新的是相同的参数。

为了简化描述,这里的损失函数我们为交叉熵损失函数,输出的激活函数为softmax函数,隐藏层的激活函数为tanh函数。

对于RNN,由于我们在序列的每个位置都有损失函数,因此最终的损失L为:
L = ∑ t = 1 τ L ( t ) L = \sum\limits_{t=1}^{\tau}L^{(t)} L=t=1τL(t)
    其中V,c,的梯度计算是比较简单的:
∂ L ∂ c = ∑ t = 1 τ ∂ L ( t ) ∂ c = ∑ t = 1 τ y ^ ( t ) − y ( t ) \frac{\partial L}{\partial c} = \sum\limits_{t=1}^{\tau}\frac{\partial L^{(t)}}{\partial c} = \sum\limits_{t=1}^{\tau}\hat{y}^{(t)} - y^{(t)} cL=t=1τcL(t)=t=1τy^(t)y(t)
∂ L ∂ V = ∑ t = 1 τ ∂ L ( t ) ∂ V = ∑ t = 1 τ ( y ^ ( t ) − y ( t ) ) ( h ( t ) ) T \frac{\partial L}{\partial V} =\sum\limits_{t=1}^{\tau}\frac{\partial L^{(t)}}{\partial V} = \sum\limits_{t=1}^{\tau}(\hat{y}^{(t)} - y^{(t)}) (h^{(t)})^T VL=t=1τVL(t)=t=1τ(y^(t)y(t))(h(t))T
但是W,U,b的梯度计算就比较的复杂了。从RNN的模型可以看出,在反向传播时,在在某一序列位置t的梯度损失由当前位置的输出对应的梯度损失和序列索引位置t+1时的梯度损失两部分共同决定。对于W在某一序列位置t的梯度损失需要反向传播一步步的计算。我们定义序列索引t位置的隐藏状态的梯度为:
δ ( t ) = ∂ L ∂ h ( t ) \delta^{(t)} = \frac{\partial L}{\partial h^{(t)}} δ(t)=h(t)L
    这样我们可以像DNN一样从 δ ( t + 1 ) \delta^{(t+1)} δ(t+1)递推 δ ( t ) \delta^{(t)} δ(t)
δ ( t ) = ( ∂ o ( t ) ∂ h ( t ) ) T ∂ L ∂ o ( t ) + ( ∂ h ( t + 1 ) ∂ h ( t ) ) T ∂ L ∂ h ( t + 1 ) = V T ( y ^ ( t ) − y ( t ) ) + W T d i a g ( 1 − ( h ( t + 1 ) ) 2 ) δ ( t + 1 ) \delta^{(t)} =(\frac{\partial o^{(t)}}{\partial h^{(t)}} )^T\frac{\partial L}{\partial o^{(t)}} + (\frac{\partial h^{(t+1)}}{\partial h^{(t)}})^T\frac{\partial L}{\partial h^{(t+1)}} = V^T(\hat{y}^{(t)} - y^{(t)}) + W^Tdiag(1-(h^{(t+1)})^2)\delta^{(t+1)} δ(t)=(h(t)o(t))To(t)L+(h(t)h(t+1))Th(t+1)L=VT(y^(t)y(t))+WTdiag(1(h(t+1))2)δ(t+1)
    对于δ(τ),由于它的后面没有其他的序列索引了,因此有:
δ ( τ ) = ( ∂ o ( τ ) ∂ h ( τ ) ) T ∂ L ∂ o ( τ ) = V T ( y ^ ( τ ) − y ( τ ) ) \delta^{(\tau)} =( \frac{\partial o^{(\tau)}}{\partial h^{(\tau)}})^T\frac{\partial L}{\partial o^{(\tau)}} = V^T(\hat{y}^{(\tau)} - y^{(\tau)}) δ(τ)=(h(τ)o(τ))To(τ)L=VT(y^(τ)y(τ))
    有了δ(t),计算W,U,b就容易了,这里给出W,U,b的梯度计算表达式:
∂ L ∂ W = ∑ t = 1 τ d i a g ( 1 − ( h ( t ) ) 2 ) δ ( t ) ( h ( t − 1 ) ) T \frac{\partial L}{\partial W} = \sum\limits_{t=1}^{\tau}diag(1-(h^{(t)})^2)\delta^{(t)}(h^{(t-1)})^T WL=t=1τdiag(1(h(t))2)δ(t)(h(t1))T
∂ L ∂ b = ∑ t = 1 τ d i a g ( 1 − ( h ( t ) ) 2 ) δ ( t ) \frac{\partial L}{\partial b}= \sum\limits_{t=1}^{\tau}diag(1-(h^{(t)})^2)\delta^{(t)} bL=t=1τdiag(1(h(t))2)δ(t)
∂ L ∂ U = ∑ t = 1 τ d i a g ( 1 − ( h ( t ) ) 2 ) δ ( t ) ( x ( t ) ) T \frac{\partial L}{\partial U} =\sum\limits_{t=1}^{\tau}diag(1-(h^{(t)})^2)\delta^{(t)}(x^{(t)})^T UL=t=1τdiag(1(h(t))2)δ(t)(x(t))T
    除了梯度表达式不同,RNN的反向传播算法和DNN区别不大,因此这里就不再重复总结了。

RNN小结

上面总结了通用的RNN模型和前向反向传播算法。当然,有些RNN模型会有些不同,自然前向反向传播的公式会有些不一样,但是原理基本类似。

RNN虽然理论上可以很漂亮的解决序列数据的训练,但是它也像DNN一样有梯度消失时的问题,当序列很长的时候问题尤其严重。因此,上面的RNN模型一般不能直接用于应用领域。在语音识别,手写书别以及机器翻译等NLP领域实际应用比较广泛的是基于RNN模型的一个特例LSTM,下一篇我们就来讨论LSTM模型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RNN(循环神经网络) 的相关文章

  • 使用PHP语言实现ETH 及 token转账

    以太坊转账 废话不多说直接上代码 代码下载地址 https download csdn net download u012841825 11021920 github代码 用你们可爱的小手 点一下星星 https github com zc
  • Angular 模态框 入坑记

    今天用到了ui bootstrap中的modal 觉得用起来还不错 也比较简单 博主以前用个ngDialog做的模态框 虽然不知道对不对 但这个插件也还可以 这貌似是我目前为止用过最简单的功能了 所以博客内容也很简单 大家一看就能懂 因为博

随机推荐

  • Qt中布局管理使用总结

    目录 1 五大布局 1 1 QVBoxLayout垂直布局 1 2 QHBoxLayout水平布局 1 3 QGridLayout网格布局 1 4 QFormLayout表单布局 1 5 QStackedLayout分组布局 1 6 五大布
  • linux下多线程:经典生产者和消费者示例

    生产者和消费者典型案例 include
  • 使用db doctor批量更新库

    之前旧版本的封装库 在更新candence软件后 需要使用db doctor对其进行更新 但是一个一个更新太慢 搜了半天 没有找到如何批处理更新 直接硬钢 于是将放置封装库文件目录下任意类型文件全部设置 将原来选中的文件名和后缀替换为 点击
  • Mac远程Win桌面官方工具——Microsoft Remote Desktop for mac

    微软官方专门为Mac用户提供了一款类Windows mstsc的远程桌面工具 Microsoft Remote Desktop for mac 专门用于远程控制Windows桌面 但是 苹果Appstore中国区无法搜索到该软件 不知道什么
  • 简单几步升级Spring security4.x升级到5.x

    本次升级源自一次安全漏洞提醒 Spring Security 身份认证绕过漏洞 CVE 2022 22978 现将漏洞相关详情下发 如系统使用了受影响版本软件 请参照处置建议及时完成处理 风险名称 Spring Security 身份认证绕
  • oracle自动生成uuid的实现方法

    oracle自动生成uuid方法 1 创建一个表 1 create table t user id varchar2 200 name varchar2 200 2 生成uuid的语句 1 2 alter table t user modi
  • Android Studio出现ERROR: AdbHostServer.cpp:102: Unable to connect to adb daemon on port: 5037问题

    打开android studio自带模拟机出现问题 原因是adb exe因为被阻止不能启动 具体错误代码如下 Emulator emulator ERROR AdbHostServer cpp 102 Unable to connect t
  • 性能不输 x265!国产开源 AVS2 高清实时编码器 xAVS2

    2018 年 1 月 31 日 北京大学数字视频编解码技术国家工程实验室视频编码算法研究室 PKU VCL 开源了 AVS2 高清实时编码器 xAVS2 V1 0 AVS2 是我国新一代视频编码国家标准 和第一代 AVS 视频编码标准相比
  • jenkins添加网页链接方法

    代码 li 外网页测试链接 a href http www baidu com 百度 a li li 本地网页测试链接 a href http 192 168 0 236 8080 seed package index html 我的本地h
  • 高德地图实现点聚合功能的详细步骤加截取地图图片 (附源码)

    目录 介绍 准备工作 1 注册并登录高德地图开放平台 申请密钥 2 在Vue项目中安装高德地图的相关库 插件 一 点聚合 1 引入高德地图API font color purple initializeMap font color purp
  • Codeforces ZeptoLab Code Rush 2015

    Codeforces ZeptoLab Code Rush 2015 比赛链接 http codeforces com contest 526 A King of Thieves time limit per test 1 second m
  • python不能创建字典的是_python字典key不能是可以是啥类型

    python中字典的key不能是可变类型 字典可存储任意类型对象 其中值可以取任何数据类型 但键必须是不可变的 如字符串 数字或元组 语法格式 d key1 value1 key2 value2 字典是另一种可变容器模型 且可存储任意类型对
  • c++的类与对象(下)

    1 初始化列表 在创建对象时 编译器通过调用构造函数 给对象中各个成员变量一个合适的初始值 构造函数体中的语句只能将其称作为赋初值 而不能称作初始化 因为初始化只能初始化一次 初始化的本质就是只能初始化一次 而构造函数体内可以多次赋值 以一
  • 漫话算法[二分查找]:不用背你也能写出漂亮的二分查找框架并秒杀至少5道题!

    快来和叮当学习算法吧 B站同步更新 同步到开源项目Github传送门 Easy Programming及微信公众号 CVBear 项目内含Leetcode五杀刷题指南 致力于通过5个问题带你入门掌握算法套路 漫话算法 二分查找 算法模板 一
  • VT系列二:检测是否支持虚拟化

    本文只是学习此视频后的一些总结 不当之处还请指出 视频作者 小宝来了 视频连接 http bbs pediy com showthread php t 211973 约定 本文中出现的名词 虚拟机 客户机 GUEST 都是被监控的操作系统或
  • Python第一课:print()函数、变量与赋值

    Python第一课 print 函数 变量与赋值 所有的符号输入 必须是英文状态 一 print 函数的用法 单刀赴会 不带引号 数据 黄袍加身 单引号 双引号 三引号 单引号与双引号效果一致 当括号内有的语句有单引号或双引号时 三引号可以
  • 初级1 题目一 时间复杂度及示例

    1 什么是时间复杂度 常数时间的操作 一个操作如果和数据量没有关系 每次都是固定时间内完成的操作 叫做常数操作 一个算法流程中 常数操作数量的指标 就是常数操作在算法里总共有多少次 称为时间复杂度 常用O 读作big O 来表示 具体来说
  • 如何选择一款趁手的光纤测试仪

    光纤测试仪是一种用于物理学 电子与通信技术领域的物理性能测试仪器 于1996年11月1日启用 常用光纤测试表有 光功率计 光万用表 稳定光源 光时域反射仪 OTDR 和光故障定位仪 如何选择合适的光纤测试仪 选择光纤测试仪表 一般需考虑以下
  • 虚拟化原理以及应用(8)课堂笔记-第三章KVM的概述第四章-课堂笔记-virt-manager默认方式创建虚拟机(1)

    一 KVM的概念 重点 KVM关键词 1 基于Linux内核的全虚拟化解决方案 运行在支持硬件虚拟化功能的X86平台 Intel VT 或AMD V 基于LINUX内核的全虚拟化的解决方案 运行在支持硬件虚拟化功能的x86平台 intel
  • RNN(循环神经网络)

    文章目录 RNN概述 RNN模型 RNN前向传播算法 RNN反向传播算法推导 RNN小结 DNN的特例CNN的模型和前向反向传播算法 这些算法都是前向反馈的 模型的输出和模型本身没有关联关系 今天我们就讨论另一类输出和模型间有反馈的神经网络