快速入门深度学习9.1(用时20min)——GRU

news2024/11/18 2:34:43

速通《动手学深度学习》9.1

  • 写在最前面
  • 九、现代循环神经网络
    • 9.1 门控循环单元(GRU)
      • 9.1.1. 门控隐状态
        • 9.1.1.1. 重置门和更新门
        • 9.1.1.2. 候选隐状态
        • 9.1.1.3. 隐状态
      • 9.1.3 API简洁实现
      • 小结


请添加图片描述

🌈你好呀!我是 是Yu欸
🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!

写在最前面

很久之前的笔记。草稿箱翻到了。

跳着看的。
最近用到GRU了,所以直接到第九章

学习资料(《动手学深度学习》文档1.0):http://zh.gluon.ai/chapter_how-to-use/how-to-use.html
(2.0版本)https://zh.d2l.ai/chapter_preface/index.html

请添加图片描述

第⼀部分包括基础知识和预备知识。
1节 提供深度学习的入门课程。
2节 中,快速介绍实践深度学习所需的前提条件,例如如何存储和处理数据,以及如何应用基于线性代数、微积分和概率基本概念的各种数值运算。
3节 和 4节 涵盖了深度学习的最基本概念和技术,例如线性回归、多层感知机和正则化

第二部分,现代深度学习技术。
5节 描述了深度学习计算的各种关键组件,并为我们随后 实现更复杂的模型奠定了基础。
6节 和 7节 中,卷积神经网络(convolutional neural network,CNN),这是构成大多数现代计算机视觉系统骨干的强大工具。
8节 和 9节 中,循环神经网络(recurrent neural network,RNN),这是⼀种利用数据中的时间或序列结构的模型,通常用于自然语言处理和时间序列预测。
10节 中,注意力机制的技术,最近它们已经开始在自然语言处理中取代循环神经网络。
这一部分将 帮助读者快速了解大多数现代深度学习应用背后的基本工具。

第三部分讨论可伸缩性、效率和应用程序
11节 中,用于训练深度学习模型的几种常用优化算法。12节 将探讨影响深度学习代码计算性能的几个关键因素
13节 中,展示了深度学习在计算机视觉中的主要应⽤。
14节 和 15节 中,展示如何预训练语言表示模型并将其应用于自然语言处理任务。

九、现代循环神经网络

9.1 门控循环单元(GRU)

在 8.7节中, 讨论了如何在循环神经网络中计算梯度, 以及矩阵连续乘积可以导致梯度消失或梯度爆炸的问题。 梯度异常在实践中的意义:

  • 情况1:早期观测值对预测所有未来观测值具有非常重要的意义。
    考虑一个极端情况,其中第一个观测值包含一个校验和, 目标是在序列的末尾辨别校验和是否正确。 在这种情况下,第一个词元的影响至关重要。 我们希望有某些机制能够在一个记忆元里存储重要的早期信息。 如果没有这样的机制,我们将不得不给这个观测值指定一个非常大的梯度, 因为它会影响所有后续的观测值。

  • 情况2:一些词元没有相关的观测值。 例如,在对网页内容进行情感分析时, 可能有一些辅助HTML代码与网页传达的情绪无关。 我们希望有一些机制来跳过隐状态表示中的此类词元

  • 情况3:序列的各个部分之间存在逻辑中断。 例如,书的章节之间可能会有过渡存在, 或者证券的熊市和牛市之间可能会有过渡存在。 在这种情况下,最好有一种方法来重置内部状态表示

在学术界已经提出了许多方法来解决这类问题。 其中最早的方法是”长短期记忆”(long-short-term memory,LSTM) (Hochreiter and Schmidhuber, 1997), 我们将在 9.2节中讨论。 门控循环单元(gated recurrent unit,GRU) (Cho et al., 2014) 是一个稍微简化的变体,通常能够提供同等的效果, 并且计算 (Chung et al., 2014)的速度明显更快。 由于门控循环单元更简单,我们从它开始解读。

9.1.1. 门控隐状态

门控循环单元与普通的循环神经网络之间的关键区别在于: 前者支持隐状态的门控
这意味着模型有专门的机制来确定应该何时更新隐状态, 以及应该何时重置隐状态。 这些机制是可学习的,并且能够解决了上面列出的问题。

例如,如果第一个词元非常重要, 模型将学会在第一次观测之后不更新隐状态。
同样,模型也可以学会跳过不相关的临时观测。
最后,模型还将学会在需要的时候重置隐状态。
下面将详细讨论各类门控。

9.1.1.1. 重置门和更新门

首先介绍重置门(reset gate)更新门(update gate)
我们把它们设计成(0,1)区间中的向量, 这样我们就可以进行凸组合。
重置门允许我们控制“可能还想记住”的过去状态的数量; (短期)
更新门将允许我们控制新状态中有多少个是旧状态的副本。(长期)

我们从构造这些门控开始。 图9.1.1 描述了门控循环单元中的重置门和更新门的输入, 输入是由当前时间步的输入和前一时间步的隐状态给出。 两个门的输出是由使用sigmoid激活函数的两个全连接层给出。

在这里插入图片描述
图9.1.1 在门控循环单元模型中计算重置门和更新门
在这里插入图片描述

9.1.1.2. 候选隐状态

在这里插入图片描述
图9.1.2说明了应用重置门之后的计算流程。
在这里插入图片描述
图9.1.2 在门控循环单元模型中计算候选隐状态

9.1.1.3. 隐状态

在这里插入图片描述
这些设计可以帮助我们处理循环神经网络中的梯度消失问题, 并更好地捕获时间步距离很长的序列的依赖关系
例如,如果整个子序列的所有时间步的更新门都接近于1, 则无论序列的长度如何,在序列起始时间步的旧隐状态都将很容易保留并传递到序列结束。

图9.1.3说明了更新门起作用后的计算流。
在这里插入图片描述

总之,门控循环单元具有以下两个显著特征:
重置门有助于捕获序列中的短期依赖关系;
更新门有助于捕获序列中的长期依赖关系。

9.1.3 API简洁实现

高级API包含了前文介绍的所有配置细节, 所以我们可以直接实例化门控循环单元模型。 这段代码的运行速度要快得多, 因为它使用的是编译好的运算符而不是Python来处理之前阐述的许多细节。

读取 8.5节中使用的时间机器数据集

import torch
from torch import nn
from d2l import torch as d2l

batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)


num_inputs = vocab_size
gru_layer = nn.GRU(num_inputs, num_hiddens)
model = d2l.RNNModel(gru_layer, len(vocab))
model = model.to(device)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)
perplexity 1.1, 334788.1 tokens/sec on cuda:0
time traveller with a slight accession ofcheerfulness really thi
travelleryou can show black is white by argument said filby

在这里插入图片描述

小结

门控循环神经网络可以更好地捕获时间步距离很长的序列上的依赖关系。

重置门有助于捕获序列中的短期依赖关系。

更新门有助于捕获序列中的长期依赖关系。

重置门打开时,门控循环单元包含基本循环神经网络;
更新门打开时,门控循环单元可以跳过子序列。


欢迎大家添加好友,持续发放粉丝福利!

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1594610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构学习之路--一网打尽链表的相关操作(附C源码)

嗨嗨大家~我们今天继顺序表内容来讲解链表。话不多说,让我们走进本期的学习吧! 目录 一、线性表的链式存储 1 链式存储结构 2 链表的定义 3 链表的分类 二、链表的实现过程 1 链表的打印 2 结点的创建 3 链表的头插 4 链表的头删 5 链表的…

vue列表列表过滤

对已知的列表进行数据过滤(根据输入框里面的内容进行数据过滤) 编写案例 通过案例来演示说明 效果就是这样的 输入框是模糊查询 想要实现功能,其实就两大步,1获取输入框内容 2根据输入内容进行数据过滤 绑定收集数据 我们可以使用v-model去双向绑定 …

LazyVim开发vue2

neovim 0.5刚出来的时代,那时刚有lua插件我很狂热。每天沉迷于打造自己的IDE之中。写过一堆相关的博客,也录过一些视频教程。后来发现neovim的接口和插件更新的很快,导致配置文件要不定期的修改,才能保证新版本的插件的适配。我也…

深入理解DES算法:原理、实现与应用

title: 深入理解DES算法:原理、实现与应用 date: 2024/4/14 21:30:21 updated: 2024/4/14 21:30:21 tags: DES加密对称加密分组密码密钥管理S盒P盒安全性分析替代算法 DES算法简介 历史 DES(Data Encryption Standard)算法是由IBM研发&…

llamafactory:unified efficient fine-tuning of 100+ lanuage models

1.introduction llamafactory由三个主要模块组成,Model Loader,Data Worker,Trainer。 2.Efficient fine-tuning techniques 2.1 Efficient Optimization 冻结微调:冻结大部分参数,同时只在一小部分解码器层中微调剩…

Python怎么算平方

Python怎么算平方?下面是算平方的三种方法: 方法一:使用内置模块 >>> import math >>> math.pow(12, 2) # 求平方 144.0 方法二:使用表达式 >>> 12 ** 2 # 求平方 144 方法三&#…

量子城域网系列(三):搭建一个点对点量子保密通信网络

各位小伙伴周末愉快呀,今天是4月14日世界量子日,至于为今天是世界量子日可以围观我之前的文章:关于世界量子日。 之前的文章中我们讨论了量子密钥在通信系统各层协议中的应用,那在实际工程中如何真正落地一个量子加密网络呢&a…

minikube环境搭建

📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。 📘相关专栏Rust初阶教程、go语言基础系列、spring教程等,大家有兴趣的可以看一看 📙Jav…

Jmeter杂记:测试计划参数详解

测试计划各参数详解 1,用户自定义变量,是全局变量,供所有线程组使用,可用配置元件:用户自定义变量替代 2,连续的运行线程组,默认不勾选,则随机的运行多个线程组中的取样器&#xff…

什么是享元模式,有哪些具体应用

一、定义 享元模式是一种通过尽可能多地共享数据来最小化内存使用和对象数量,从而提高性能的设计模式。在享元模式中,如果需要相同数据的多个对象,则共享这些对象而不是创建新的对象,从而提高系统的效率。 其实有很多应用场景&am…

spring-cloud-alibaba微服务Sentinel

Sentinel 官方网站 sentinel-dashboard-1.8.7.jar包下载地址 在window通过命令行启动(java -Dserver.port8080 -Dproject.namesentinel-dashboard -jar sentinel-dashboard-1.8.7.jar),可以通过 -Dserver.port修改控制台的端口 使用的版本最好…

vue--双向数据绑定原理

Vue采用数据劫持 发布者-订阅者模式实现双向数据绑定,实现逻辑图如下所示: 数据劫持 Vue 借助Object.defineProperty()来劫持各个属性,这样一来属性存取过程都会被监听到 发布者-订阅者模式 主要实现三个对象:Observer&#…

docker 安装 nginx + httpd + php-fpm

原文地址:http://www.taoluyuan.com/index.php/archives/30/#2 展示 1.安装 1.1安装docker 1.2安装nginx 1.3安装apache-httpd 1.4安装php-fpm 2.配置nginx反向代理 httpdphp-fmp 1.安装 1.1安装docker 移除旧的版本: sudo yum remove docker 安装…

Java编程练习之多重继承

在Java中类不允许多重继承,但使用接口可以实现多重继承,因为一个类可以同时实现多个接口,这样可以将所有需要实现的接口放在implements关键字后,并使用英文逗号隔开,但这可能会在一个类中产生庞大的代码量,…

String类为什么是不可变类

为什么说String对象一旦创建,其值是不可修改的 在Java中将String设计成不可变的是综合考虑到各种因素的结果,需要综合考虑内存、同步、数据结构以安全方面的考虑。 String被设计成不可变的主要目的是为了安全和高效(效率)。 1)字符串常量池…

LeetCode第22题:生成括号【22/1000 python 递归|动态规划】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作http://t.csdnimg.cn/Q59WX作者专栏每日更新: LeetCode解锁1000题: 打…

从零自制docker-10-【cgroup进行容器资源限制】

文章目录 目的导入包的相关公开原则当前进程的挂载信息deferfor scanner.Scan()判断字符串包含新建的cgroup的默认文件cpu相关配置对应到ubuntu 22.04版本的cpu相关配置top注意查看你可使用的cpu注意坑启动后的top查看显示进程使用的cpu序号代码结果 目的 启动容器时通过-mem、…

Vol.45 这个壁纸网址,功能简单,每月37.7万访问量

哈咯,大家好,我是欧维,今天要给大家分享的网站是:极简壁纸,一个专门做电脑壁纸的网站; 它的网址是:极简壁纸_海量电脑桌面壁纸美图_4K超高清_最潮壁纸网站 网站的壁纸质量很高,页面…

Java 模块化开发

前言 之前在 Github 下载的好多代码发现都是 Java 模块化开发出来的,模块化是 JDK9 引入的,所以在 JDK9 及其后续的版本中,都可以采用模块化开发的方法来进行项目的开发。尤其是Java桌面应用开发,虽然这只是我的一个业余爱好&…

WindowsServer 2022 AD域控-006-安装副域控

试验拓扑图: 一、测试单域控故障,用户无法修改密码; 域控断网,Win10测试; 二、WindowsServer2022 DC02加入域控; 加入成功 此时域控上只有DC02这台服务器,但DC02并不是域控; 三、WindowsS…