NLP学习笔记(三) GRU基本介绍

news2024/11/19 4:22:42

大家好,我是半虹,这篇文章来讲门控循环单元 (Gated Recurrent Unit, GRU)

文章行文思路如下:

  1. 首先通过长短期记忆网络引出为什么需要门控循环单元
  2. 然后介绍门控循环单元的核心思想与运作方式
  3. 最后通过简洁的代码深入理解门控循环单元的运作方式

在之前的文章中,我们已经介绍过循环神经网络和长短期记忆网络

知道了长短期记忆网络是为了缓解循环神经网络容易出现梯度消失的情况而设计的

然而,长短期记忆网络的参数确实有点多,计算速度也是有点慢,所以后来就有人提出了门控循环单元

门控循环单元与长短期记忆网络效果相当,但是其参数更少,且计算速度更快


对比长短期记忆网络,门控循环单元去除了记忆元,但仍保留了门机制,只不过门机制的种类稍有不同

以下是循环神经网络、长短期记忆网络、门控循环单元三者的对比

网络是否有记忆元传递状态是否有门机制门机制的种类
循环神经网络隐状态
长短期记忆网络隐状态、记忆元输入门、遗忘门、输出门
门控循环单元隐状态重置门、更新门

我们发现,门控循环单元仅在隐状态上就能实现对长期记忆的控制

这是怎么做到的呢?其核心就在于门机制,通过门机制控制隐状态中的信息流动

从直觉上来说,先前重要的记忆会保留在隐状态,不重要的记忆会被过滤,以此达到长期记忆的目的


门控循环单元中的门机制包括两类:

  • 重置门:用于控制记住多少旧状态,英文为 Reset Gate \text{Reset Gate} Reset Gate
  • 更新门:用于控制新旧状态的占比,英文为 Update Gate \text{Update Gate} Update Gate

实际上,所谓的门机制,就是一个带激活函数的线性层而已,且激活函数通常会用 sigmoid \text{sigmoid} sigmoid

因为这样能将输出限制在零到一之间,以表示门的打开程度,控制信息流动的程度


好了,下面进入本文的核心,介绍门机制是如何运作的

首先,通过当前输入 X t X_{t} Xt 和先前隐状态 H t − 1 H_{t-1} Ht1,计算得到重置门 R t R_{t} Rt、更新门 Z t Z_{t} Zt

其中, W x r W_{xr} Wxr W h r W_{hr} Whr b r b_{r} br W x z W_{xz} Wxz W h z W_{hz} Whz b z b_{z} bz 是网络参数, σ \sigma σ sigmoid \text{sigmoid} sigmoid 激活函数
R t = σ ( X t W x r + H t − 1 W h r + b r ) Z t = σ ( X t W x z + H t − 1 W h z + b z ) \begin{align*} R_{t} &= \sigma (X_{t} W_{xr} + H_{t-1} W_{hr} + b_{r}) \\ Z_{t} &= \sigma (X_{t} W_{xz} + H_{t-1} W_{hz} + b_{z}) \end{align*} RtZt=σ(XtWxr+Ht1Whr+br)=σ(XtWxz+Ht1Whz+bz)

然后,通过当前输入 X t X_{t} Xt 和先前隐状态 H t − 1 H_{t-1} Ht1,同时集成重置门 R t R_{t} Rt,计算得到候选隐状态 H ~ t \tilde{H}_{t} H~t

其中, ⊙ \odot 表示按元素乘法, tanh \text{tanh} tanh tanh ⁡ \tanh tanh 激活函数,重置门用于控制先前隐状态对当前候选隐状态的影响
H ~ t = tanh ⁡ ( X t W x h + ( R t ⊙ H t − 1 ) W h h + b h ) \tilde{H}_{t} = \tanh (X_{t} W_{xh} + (R_{t} \odot H_{t-1}) W_{hh} + b_{h}) H~t=tanh(XtWxh+(RtHt1)Whh+bh)
最后,更新门 Z t Z_{t} Zt 控制采用多少来自 H t − 1 H_{t-1} Ht1 的旧信息,多少来自 H ~ t \tilde{H}_{t} H~t 的新信息,计算得到当前隐状态 H t H_{t} Ht

其中, ⊙ \odot 表示按元素乘法,更新门对于旧信息和新信息的记忆总是保持“恒定”
H t = Z t ⊙ H t − 1 + ( 1 − Z t ) ⊙ H ~ t H_{t} = Z_{t} \odot H_{t-1} + (1 - Z_{t}) \odot \tilde{H}_{t} Ht=ZtHt1+(1Zt)H~t

上述计算过程对应的计算图如下所示:

门控循环单元结构

最后我们来简单实现一下门控循环单元

作为例子,我们用这个门控循环单元对以下句子进行编码:我在画画

import torch
import torch.nn as nn

# 定义输入数据
# 对于输入句子我在画画,首先用独热编码得到其向量表示

x1 = torch.tensor([1, 0, 0]).float() # 我
x2 = torch.tensor([0, 1, 0]).float() # 在
x3 = torch.tensor([0, 0, 1]).float() # 画
x4 = torch.tensor([0, 0, 1]).float() # 画

h0 = torch.zeros(5) # 初始化隐状态

# 定义模型参数
# 模型的输入是三维向量,这里定义模型的输出是五维向量

W_xr = nn.Parameter(torch.randn(3, 5), requires_grad = True)
W_hr = nn.Parameter(torch.randn(5, 5), requires_grad = True)
b_r  = nn.Parameter(torch.randn(5)   , requires_grad = True)

W_xz = nn.Parameter(torch.randn(3, 5), requires_grad = True)
W_hz = nn.Parameter(torch.randn(5, 5), requires_grad = True)
b_z  = nn.Parameter(torch.randn(5)   , requires_grad = True)

W_xh = nn.Parameter(torch.randn(3, 5), requires_grad = True)
W_hh = nn.Parameter(torch.randn(5, 5), requires_grad = True)
b_h  = nn.Parameter(torch.randn(5)   , requires_grad = True)

# 前向传播
def forward(X, H):
    # 计算各种门机制
    R = torch.sigmoid(torch.matmul(X, W_xr) + torch.matmul(H, W_hr) + b_r) # 重置门
    Z = torch.sigmoid(torch.matmul(X, W_xz) + torch.matmul(H, W_hz) + b_z) # 更新门
    # 计算候选隐状态
    H_tilde = torch.tanh(torch.matmul(X, W_xh) + torch.matmul(R * H, W_hh) + b_h)
    # 计算当前隐状态
    H = Z * H + (1 - Z) * H_tilde
    # 返回结果
    return H

h1 = forward(x1, h0)
h2 = forward(x2, h1)
h3 = forward(x3, h2)
h4 = forward(x4, h3)

# 结果输出

print(h3) # tensor([ 0.7936, -0.9788,  0.8360,  0.2307, -0.9928])
print(h4) # tensor([ 0.8460, -0.9946,  0.9130,  0.0313, -0.9986])

至此本文结束,要点总结如下:

  1. 门控循环单元与长短期记忆网络效果相当,但是其参数更少,且计算速度更快
  2. 门控循环单元通过门机制,仅在隐状态上就能实现对长期记忆的控制

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

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

相关文章

奇舞周刊 476 期:代码在内存中的 “形状”

记得点击文章末尾的“ 阅读原文 ”查看哟~下面先一起看下本期周刊 摘要 吧~奇舞推荐■ ■ ■代码在内存中的 “形状”众所周知,js 的基本数据类型有 number、string、boolean、null、undefined 等。那么问题来了 typeof null 和 typeof undefined 分别是什么呢&…

[附源码]Node.js计算机毕业设计果蔬预约种植管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

[内网渗透]—NTLM网络认证及NTLM-Relay攻击

NTML网络认证 Windows认证分为本地认证和网络认证,当我们开机登录用户账户时,就需要将lsass.exe进程转换的明文密码hash与 sam文件进行比对,这种方式即为——本地认证 而当我们访问同一局域网的一台主机上的SMB共享时,需要提供凭证通过验证才能访问,这个过程就会设计win…

【C++】list 的模拟实现

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉前言&…

Halcon条码和二维码质量评级

现在各行各业的人们都使用条码/二维码从生产阶段到销售点全程追踪他们 的产品。那么怎么验证生产出来的具有可读性,码的质量等级如何呢? 其实ISO行业标准已经给出了如何评估码的质量等级的标准,以下三种主要验证标准用于确定一维条码、二维码…

毕业设计 - 基于Java EE平台项目管理系统的设计与实现【源码+论文】

文章目录前言一、项目设计1. 模块设计2. 实现效果二、部分源码项目工程前言 今天学长向大家分享一个 java web项目: 基于Java EE平台项目管理系统的设计与实现 一、项目设计 1. 模块设计 从管理员角度看: 用户登入系统后,可以修改管理员的密码。同时具有以下功能…

最全的SpringMVC教程,终于让我找到了

1. 为啥要学 SpringMVC&#xff1f; 1.1 SpringMVC 简介 在学习 SpringMVC 之前我们先看看在使用 Servlet 的时候我们是如何处理用户请求的&#xff1a; 配置web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmln…

[附源码]Python计算机毕业设计国际美容会所管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Jetpack Compose中的动画

Jetpack Compose中没有沿用Android原有的View动画和属性动画&#xff0c;而是新创建了一套全新的动画系统API&#xff0c;这是理所当然的&#xff0c;因为旧的动画系统主要是基于View体系的&#xff0c;而Compose中需要针对的是Composable可组合函数进行处理&#xff0c;那么势…

他文献查到凌晨两点,我用Python十分钟搞定!

大家好&#xff0c;我是爱学习的王饱饱。 对于应届毕业生来说&#xff0c;今年一定是难熬的一年。本来找工作、写论文就已经是两座大山了&#xff0c;还要面临论文无指导的额外压力。 这让我想到了去年毕业的表弟&#xff0c;当时他为了完成论文&#xff0c;摔烂了三个鼠标。…

Jsp服装商城包安装调试

(https://img-blog.csdnimg.cn/78351365dac24f6185cb69ee3a804ba1.png)jsp mysql新季服装商城 功能&#xff1a;前台会员中心后台 前台&#xff1a; 1.服装展示 图文列表 新闻列表 详情 2.注册登录 管理登陆 3.加入购物车 会员中心&#xff1a; 1.个人账户 查看 修改个人…

一个新的React项目我们该如何配置

最近组长让我负责一个新的项目&#xff0c;项目的技术栈是React typescript redux and design&#xff0c;一个工龄1年的小白菜只能先去github找开源项目看看他们做了哪些配置&#xff0c;然后去百度这些配置改如何安装。下面就是我记录一个新的React项目配置的过程。 安装…

知识图谱有哪些应用领域?

知识图谱通常应用于自然语言处理和人工智能领域&#xff0c;常用于提高机器学习模型的准确性和效率。它还可以用于数据挖掘、信息检索、问答系统和语义搜索等领域。近年来知识图谱在电子商务、金融、公安、医疗等行业逐步开始落地&#xff0c;在这些行业的渗透、深入中&#xf…

部门还有谁在? 已经没几个人了~

正文大家好&#xff0c;我是bug菌&#xff5e;终于熬过了阳性的第三天&#xff0c;症状相对没之前那么痛苦了&#xff0c;打算要家里面的兄弟帮忙处理点事情&#xff0c;一个电话打过去&#xff0c;没想到整个部门都没几个人了&#xff0c;病毒的毒性是减弱了&#xff0c;这传染…

Linux进程概念(一)

Linux进程概念冯诺依曼体系结构操作系统操作系统是什么操作系统与硬件的关系操作系统如何管理硬件数据操作系统与软件的关系操作系统的安全操作系统的服务系统调用和库函数概念进程的基本概念什么是进程如何查看进程进程常见的调用冯诺依曼体系结构 常见的计算机&#xff08;台…

牛客题霸sql入门篇之条件查询(三)

牛客题霸sql入门篇之条件查询(三) 3 高级操作符 3.1 高级操作符练习(1) 3.1.1 题目内容 3.1.2 示例代码 SELECT device_id,gender,age,university,gpa FROM user_profile WHERE gendermale AND gpa>3.53.1.3 运行结果 3.1.4 考察知识点 AND关键字表示会筛选出符合左右两…

java DDD领域分层架构设计思想

1为什么要分层 高内聚&#xff1a;分层的设计可以简化系统设计&#xff0c;让不同的层专注做某一模块的事低耦合&#xff1a;层与层之间通过接口或API来交互&#xff0c;依赖方不用知道被依赖方的细节复用&#xff1a;分层之后可以做到很高的复用扩展性&#xff1a;分层架构可…

正则表达式总结

React15前的渲染方式 React15以前&#xff0c;React是用全量渲染的方式进行页面渲染&#xff0c;每次更新都需要整个页面重新渲染。全量当数据量大的时候&#xff0c;页面就会掉帧卡顿。 为什么需要React Fiber 为了解决上述React15带来的卡顿问题&#xff0c;我们不能让一个…

PG::PyExp

nmap -Pn -p- -T4 --min-rate1000 192.168.115.118 nmap -Pn -p 1337,3306 -sCV 192.168.115.118 1337端口是ssh服务&#xff0c;3306是数据库&#xff0c;没有web服务&#xff0c;只能尝试进行爆破。 由于不知道ssh用户名&#xff0c;所以尝试root用户爆破3306端口。 hydra …

昆仑万维或将引领国内 AIGC 技术发展

AIGC 发展历程 如果说 2021 年是元宇宙元年&#xff0c;那么 2022 年绝对可以称作 AIGC 元年。自从 Accomplice 于 2021 年 10 月推出 Disco Diffusion 以来&#xff0c;AIGC 受到了前所未有的关注&#xff0c;相关产品和技术更是以井喷之势快速更新迭代。 AIGC&#xff08;A…