【动手学深度学习笔记】--门控循环单元GRU

news2024/10/12 22:33:01

文章目录

  • 门控循环单元GRU
    • 1.门控隐状态
      • 1.1重置门和更新门
      • 1.2候选隐状态
      • 1.3隐状态
    • 2.从零开始实现
      • 2.1读取数据
      • 2.2初始化模型参数
      • 2.3定义模型
      • 2.4训练与预测
    • 3.简洁实现

门控循环单元GRU

学习视频:门控循环单元(GRU)【动手学深度学习v2】

官方笔记: 门控循环单元(GRU)

image-20230909102736928

思考一下这种梯度异常在实践中的意义:

  • 我们可能会遇到这样的情况:早期观测值对预测所有未来观测值具有非常重要的意义。 考虑一个极端情况,其中第一个观测值包含一个校验和, 目标是在序列的末尾辨别校验和是否正确。 在这种情况下,第一个词元的影响至关重要。 我们希望有某些机制能够在一个记忆元里存储重要的早期信息。 如果没有这样的机制,我们将不得不给这个观测值指定一个非常大的梯度, 因为它会影响所有后续的观测值。
  • 我们可能会遇到这样的情况:一些词元没有相关的观测值。 例如,在对网页内容进行情感分析时, 可能有一些辅助HTML代码与网页传达的情绪无关。 我们希望有一些机制来跳过隐状态表示中的此类词元。
  • 我们可能会遇到这样的情况:序列的各个部分之间存在逻辑中断。 例如,书的章节之间可能会有过渡存在, 或者证券的熊市和牛市之间可能会有过渡存在。 在这种情况下,最好有一种方法来重置我们的内部状态表示。

在学术界已经提出了许多方法来解决这类问题。 其中最早的方法是“长短期记忆”(long-short-term memory,LSTM), 门控循环单元(gated recurrent unit,GRU)是一个稍微简化的变体,通常能够提供同等的效果,并且计算的速度明显更快。

1.门控隐状态

门控循环单元与普通的循环神经网络之间的关键区别在于: 前者支持隐状态的门控。 这意味着模型有专门的机制来确定应该何时更新隐状态, 以及应该何时重置隐状态。 这些机制是可学习的,并且能够解决了上面列出的问题。 例如,如果第一个词元非常重要, 模型将学会在第一次观测之后不更新隐状态。 同样,模型也可以学会跳过不相关的临时观测。 最后,模型还将学会在需要的时候重置隐状态。 下面我们将详细讨论各类门控。

1.1重置门和更新门

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

image-20230909104314999

1.2候选隐状态

image-20230909104608771

1.3隐状态

image-20230909105341463

门控循环单元具有以下两个显著特征:

  • 重置门有助于捕获序列中的短期依赖关系
  • 更新们有助于捕获序列中的长期依赖关系

2.从零开始实现

2.1读取数据

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)

2.2初始化模型参数

下一步是初始化模型参数。 我们从标准差为0.01的高斯分布中提取权重, 并将偏置项设为0,超参数num_hiddens定义隐藏单元的数量, 实例化与更新门、重置门、候选隐状态和输出层相关的所有权重和偏置。

def get_params(vocab_size, num_hiddens, device):
    num_inputs = num_outputs = vocab_size

    def normal(shape):
        return torch.randn(size=shape, device=device)*0.01

    def three():
        return (normal((num_inputs, num_hiddens)),
                normal((num_hiddens, num_hiddens)),
                torch.zeros(num_hiddens, device=device))

    W_xz, W_hz, b_z = three()  # 更新门参数
    W_xr, W_hr, b_r = three()  # 重置门参数
    W_xh, W_hh, b_h = three()  # 候选隐状态参数
    # 输出层参数
    W_hq = normal((num_hiddens, num_outputs))
    b_q = torch.zeros(num_outputs, device=device)
    # 附加梯度
    params = [W_xz, W_hz, b_z, W_xr, W_hr, b_r, W_xh, W_hh, b_h, W_hq, b_q]
    for param in params:
        param.requires_grad_(True)
    return params

2.3定义模型

现在我们将定义隐状态的初始化函数init_gru_state,与之前定义的init_rnn_state函数一样, 此函数返回一个形状为(批量大小,隐藏单元个数)的张量,张量的值全部为零。

def init_gru_state(batch_size, num_hiddens, device):
    return (torch.zeros((batch_size, num_hiddens), device=device), )

现在我们准备定义门控循环单元模型, 模型的架构与基本的循环神经网络单元是相同的, 只是权重更新公式更为复杂。

def gru(inputs, state, params):
    W_xz, W_hz, b_z, W_xr, W_hr, b_r, W_xh, W_hh, b_h, W_hq, b_q = params
    H, = state
    outputs = []
    for X in inputs:
        Z = torch.sigmoid((X @ W_xz) + (H @ W_hz) + b_z)
        R = torch.sigmoid((X @ W_xr) + (H @ W_hr) + b_r)
        H_tilda = torch.tanh((X @ W_xh) + ((R * H) @ W_hh) + b_h)
        H = Z * H + (1 - Z) * H_tilda
        Y = H @ W_hq + b_q
        outputs.append(Y)
    return torch.cat(outputs, dim=0), (H,)

2.4训练与预测

训练和预测的工作方式与之前一样

vocab_size, num_hiddens, device = len(vocab), 256, d2l.try_gpu()
num_epochs, lr = 500, 1
model = d2l.RNNModelScratch(len(vocab), num_hiddens, device, get_params,
                            init_gru_state, gru)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

3.简洁实现

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

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)

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

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

相关文章

iOS App上架新规解析:如何进行App备案

摘要 本文将以iOS技术博主的身份,解析iOS App上架新规中的App备案要求。通过探讨备案对开发者和市场的影响,介绍备案流程和所需材料,帮助开发者了解如何进行App备案。 引言 近年来,移动应用市场蓬勃发展,但同时也存…

数据库基础——数据库、数据表和SQL语句

数据库、数据表和SQL语句 数据库、数据表和SQL语句是什么?数据库安装数据库登录及退出创建、查看数据库及修改名字查看及修改数据库编码删除数据库使用或查看当前正在使用的数据库创建、查看数据表及修改名字查看及修改数据表编码查看及修改数据表结构增加约束删除约…

概念解析 | 非极大值抑制(NMS):原理、缺点和改进

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:非极大值抑制(NMS)及其改进工作。 非极大值抑制(NMS):原理、缺点和改进 1. 背景介绍 在计算机视觉中,物体检测是一个核心且充满挑战的问题。众多算法和技术应运而生,其…

离散数学_十章-图 ( 6 ):欧拉通路与哈密顿通路

📷10.6 欧拉通路与哈密顿通路 1. 欧拉通路与欧拉回路1.1 定义1.2 性质1.3 *寻找欧拉通路(了解) 2. 哈密顿通路和哈密顿回路2.1 定义2.2 性质2.3定理**狄拉克定理****欧尔定理** 1. 欧拉通路与欧拉回路 欧拉通路是一种特殊的图路径,它要求在一个图中通过…

如何防范 AI 盗取你的密码

现如今,随着人工智能(AI)应用的普及和快速迭代,几乎任何人都可以轻而易举地利用AI进行密码破解之类的攻击。这已经引起了业界的担忧。下面,我将围绕着:密码破解究竟意味着什么,基于AI的密码猜测…

抖店商品卡流量怎么做?给你们说下其中的猜你喜欢,是怎么玩的

我是王路飞。 抖店的商品卡流量玩法,因为是免费的,现在也是平台大力扶持的。 所以很受一些新手商家的喜欢,毕竟是免费的流量,自己的利润也会增加。 我这边的话一直都是找达人带货玩法为主,自然流量为辅,…

怎么扫码听音频?音频在线生码的方法

现在很多小伙伴喜欢听书而不是自己看,那么当我们想分享一段听书音频时,有什么的方法能够更快更好地来让其他人获取内容呢?想要提高传播的效率,那么制作音频二维码(音视频二维码制作-一键免费生成音视频二维码在线工具-…

Windows 点击任务栏图标没有反应

事情是这样的 我在 Windows 系统点击任务栏的虚拟机,点击没有反应。 怎么办啊 右键任务栏,选择任务管理器 找到对应的服务,鼠标右键,选择最大化。 就可以在屏幕显示了

听觉刺激期间的神经血管耦合:ERPs和fNIRS血流动力学

导读 强度依赖性振幅变化(IDAP)已在事件相关电位(ERPs)中进行了广泛的研究,并与多种精神疾病相关联。本研究旨在探讨功能近红外光谱(fNIRS)在IDAP范式中的应用,该范式与ERPs相关,可以指示神经血管耦合的存在。两个实验分别有33和31名参与者。…

创新造型,引领未来——探索OLED透明屏造型的创新与应用

OLED透明屏作为一项颠覆性的显示技术,正在以其卓越的透明度和灵活性在各个行业中崭露头角。 而在OLED透明屏的应用中,造型设计的创新成为了吸引消费者和提升用户体验的重要因素。 一、OLED透明屏的特点 OLED透明屏采用有机发光二极管技术,其…

框架分析(11)-测试框架

框架分析(11)-测试框架 专栏介绍Selenium框架特性多语言支持多浏览器支持元素定位页面操作等待机制浏览器控制测试报告并行执行集成测试框架 优缺点分析优点开源免费跨平台多语言支持强大的定位器支持多种测试框架 缺点学习曲线较陡峭依赖浏览器驱动可靠…

Bun v0.8.0 正式发布,Zig 编写的 JavaScript 运行时

Bun 是采用 Zig 语言编写的高性能 “全家桶” JavaScript 运行时,官方称其为 "all-in-one JavaScript runtime"。 所谓 "all in one",是因为 Bun 提供了打包、转译、安装和运行 JavaScript & TypeScript 项目的功能&#xff0c…

OpenRoads Designer道路边坡渐变过渡之一末端条件异常

道路分段使用不同的断面模板,在分界处存在两端断面(末端条件)边坡结构差异的情况下,需要通过末端条件异常在接头处添加渐变过渡: 添加末端条件异常: 输入渐变范围桩号: 通过末端条件异常实现两模…

Java 并发编程面试题——synchronized 与 volatile

目录 1.synchronized1.1.synchronized 是什么?有什么作用?1.2.如何使用 synchronized?1.3.synchronized 的底层原理是什么?1.3.1.synchronized 同步语句块1.3.2.synchronized 修饰方法13.3.总结 1.4.JDK1.6 之后的 synchronized 底…

Kotlin(六) 类

目录 创建类 调用类 类的继承------open 构造函数 创建类 创建类和创建java文件一样,选择需要创建的目录New→Kotlin File/Class Kotlin中也是使用class关键字来声明一个类的,这一点和Java一致。现在我们可以在这个类中加入字段和函数来丰富它的功…

XnViewMP for Mac: 轻松浏览,精细管理,一键操作

XnViewMP for Mac是一款专业的图片浏览器、查看器和转换器,XnViewMP Mac版支持查看超过500种图像格式并导出为大约70种不同的文件格式,提供了易于使用但功能强大的批量转换模块,还有Unicode 支持、多种语言的翻译和方便的模块化界面&#xff…

Python超入门(2)__迅速上手操作掌握Python

​​​​​​​ # 5.字符串 # 5.字符串 course "Pythons Course for Beginner" # ""内可使用 # 012345678…… course2 Python For "Beginner" # 内可使用" course3 Hi John, Here is our first email to you.# 多行字符…

Window环境下安装VMware虚拟机来安装 CentOs7

软硬件准备 软件:VMware(16 pro):阿里云盘分享. 硬件:因为是在宿主机上运行虚拟化软件VMware安装centos,所以对宿主机的配置有一定的要求。最起码i5CPU双核、硬盘500G、内存4G以上。 镜像:CentOS7 ,下载地址 http://is…

30天入门Python(基础篇)——第1天:为什么选择Python

文章目录 专栏导读作者有话说为什么学习Python原因1(总体得说)原因2(就业说) Python的由来(来自百度百科)Python的版本 专栏导读 🔥🔥本文已收录于《30天学习Python从入门到精通》 🉑🉑本专栏专门针对于零基础和需要重新复习巩固…

记账工具:轻松添加新账户并记录明细

记账工具是一款方便易用的软件,可以帮助您轻松管理您的账目。它具有简单易用的界面,让您能够快速添加新账户并记录明细。此外,它还支持打印本页功能,让您能够轻松打印出您所记录的账目信息。 第一步,我们要打开晨曦记…