RNN 单元:分析 GRU 方程与 LSTM,以及何时选择 RNN 而不是变压器
一、说明
在上一篇文章中,我们彻底介绍并检查了 LSTM 单元的各个方面。有人可能会争辩说,RNN方法已经过时了,研究它们是没有意义的。的确,最近一类称为变形金刚[5]的方法已经完全确定了自然语言处理领域。然而,深度学习从未停止让我感到惊讶,包括RNN。也许有一天,我们会看到一个巨大的卷土重来。
二、RNN VS 变压器
请记住,在以下情况下,与变形金刚相比,RNN 仍然是最好的选择:
- 序列长度太长。
- 该任务需要实时控制(机器人),否则下一个时间步长无法先验地获得。
- 没有一个巨大的数据集来利用变压器的迁移学习能力。
- 计算机视觉问题是弱监督(动作识别)。是的。混合CNN-RNN方法,以及连接主义时间分类(CTC)损失[6]仍然非常有效。
了解更多关于RNN的其他原因包括混合模型。例如,我最近遇到了一个模型[4],它产生了真实的实值多维医疗数据系列,它结合了递归神经网络和GAN。所以你永远不知道它们在哪里会派上用场。
无论如何,基本原理是要掌握的。这一次,我们将审查并构建门控循环单元(GRU),作为LSTM的自然紧凑变体。最后,我们将根据问题提供有关使用哪个单元格的多个比较见解。
此处提供了随附的笔记本代码。
三、GRU:简化 LSTM 单元
我们已经看到了LSTM如何能够预测顺序数据。最初引入 LSTM 时出现的问题是参数数量过多。让我们首先说,提出的称为 GRU 的 LSTM 变体的动机是简化参数数量和执行的操作。
在我们进入方程之前,让我们澄清一个重要的事实:LSTM和GRU细胞的原理在长期序列建模方面是常见的。首先,我们可以处理任意数量的时间步长,此外,我们试图洗去多余的信息,并合并存储在权重中的内存组件。存储器由隐藏状态向量引入网络,该向量对于每个输入序列都是唯一的,每次从\(t=0\)的零元素向量开始。
现在,让我们看看略有不同的数学!同样,我们将逐步分析它们。我在这里只是将它们作为一个参考点。为:
其中 N 是每个时间步的特征长度,而:
其中 H 是隐藏状态维度,GRU 方程如下:
四、公式1:复位门
该门与 LSTM 单元的遗忘门非常相似。生成的重置向量 r 表示将确定将从先前隐藏的时间步中删除哪些内容的信息。与遗忘门一样,我们通过逐元素乘法应用遗忘运算,由 Hadamard 乘积运算符表示。我们将重置向量计算为当前时间步的输入向量以及先前隐藏状态的线性组合。
这两种运算都是用矩阵乘法 (nn.PyTorch 中的线性)。请注意,对于第一个时间步,隐藏状态通常是用零填充的向量。这意味着没有关于过去的信息。最后,应用非线性激活(即Sigmoid)。此外,通过使用激活函数(sigmoid),结果位于(0,1)范围内,这说明了训练稳定性。
GRU 的输入和输出门在所谓的更新门中的合并就在这里发生。我们计算输入向量 x 和先前隐藏状态的另一种表示,但这次使用不同的可训练矩阵和偏差。向量 z 将表示更新向量。
五、等式3:几乎输出分量
向量 n 由两部分组成;第一个是应用于输入的线性层,类似于 LSTM 中的输入门。第二部分由复位向量 r 组成,应用于先前的隐藏状态。请注意,此处的遗忘/重置向量直接应用于隐藏状态,而不是将其应用于 LSTM 单元的细胞向量 c 的中间表示。
首先,在所描述的方程中,请注意 1 基本上是 0 的向量。由于 z 的值位于 (1,1) 范围内,因此 1-z 也属于同一范围。但是,向量 z 的元素具有互补值。很明显,元素级操作应用于 z 和 (<>-z)。
有时我们通过分析极端情况来理解事物。在极端情况下,假设 z 是 1 的向量。那是什么意思?
简单地说,这意味着输入将被忽略,因此下一个隐藏状态将是前一个状态!在相反的情况下,z 将是零元素向量,这意味着之前的隐藏状态几乎被忽略。重要的是,我使用这个词几乎是因为更新向量 n 在应用重置向量后受到先前隐藏状态的影响。尽管如此,复发几乎就消失了!
直观地,共享向量 z 平衡了先前隐藏状态和更新输入向量 n 的影响。
现在,我为什么选择使用共享的世界作为z变得深刻。以上所有内容都可以在维基百科的下图中说明:

我不是这些图表的忠实粉丝的原因是因为它们可以用标量输入x和h来解释,这至少是误导性的。
第二,不清楚可训练矩阵在哪里。基本上,当你在RNN旅程中考虑这些图表时,试着认为x和h每次使用时都会乘以权重矩阵。
就个人而言,我更喜欢深入研究方程式。幸运的是,数学从不说谎!
简而言之,复位门(r 矢量)确定如何将新输入与以前的存储器融合,而更新门定义剩余多少先前存储器。
这就是您需要知道的全部内容,以便深入了解GRU细胞的工作原理。它们的连接方式(在空间和时间上)与 LSTM 完全相同:
隐藏的输出向量将是下一个 GRU 单元/层的输入向量。
可以通过同时以反向方式处理序列并连接隐藏向量来定义双向。
六、LSTM 与 GRU 细胞:使用哪一个?
GRU单元于2014年引入,而LSTM单元于1997年引入,因此GRU的权衡尚未得到如此彻底的探索。在许多任务中,这两种架构都能产生相当的性能 [1]。通常情况下,超参数的调整可能比选择合适的单元格更重要。但是,最好将它们并排比较。
以下是基本的 5 个讨论点:
- 值得一提的是,这两种架构都是为了解决梯度消失问题而提出的。这两种方法都利用不同的方式将以前的时间步长信息与门融合,以防止梯度消失。然而,LSTM 中的梯度流来自三条不同的路径(门),因此直观地,与 GRU 相比,您会观察到梯度下降的可变性更大。
- 如果您想要更快、更紧凑的模型,GRU 可能是您的选择,因为它们的参数更少。因此,在许多应用程序中,它们可以更快地训练。在序列不太大的小规模数据集中,通常选择GRU细胞,因为数据较少,LSTM的表达能力可能不会暴露出来。从这个角度来看,GRU被认为在更简单的结构方面更有效。
- 另一方面,如果您必须处理大型数据集,LSTM 的更大表达能力可能会带来更好的结果。理论上,LSTM细胞应该记住比GRU更长的序列,并在需要建模长程相关性的任务中优于它们。
- 根据方程,可以观察到GRU单元比LSTM少一个门。准确地说,只是一个复位和更新门,而不是 LSTM 的忘记、输入和输出门。
- 基本上,GRU 单元控制信息流,而不必使用单元存储单元(在 LSTM 方程中表示为 c)。它公开整个内存(与 LSTM 不同),没有任何控制。因此,如果这是有益的,则基于手头的任务。
总而言之,答案在于数据。没有明确的赢家可以说哪一个更好。确定哪一个最适合您的问题的唯一方法是训练两者并分析它们的性能。为此,以灵活的方式构建深度学习项目非常重要。
七、结论
在本文中,我们提供了对 GRU 单元的回顾。我们观察到它的独特特征,我们甚至建立了自己的细胞,用于预测正弦序列。后来,我们比较了LSTM和GRU的侧面。这一次,我们将建议进一步阅读一篇有趣的论文,该论文在自然语言处理的背景下分析GRU和LSTMs[3],由Yin et al. 2017撰写。
我们专注于理解RNN,而不是在更花哨的应用程序中部署它们的实现层。
八、引用
[1] Greff, K., Srivastava, R. K., Koutník, J., Steunebrink, B. R., & Schmidhuber, J. (2016).LSTM:搜索空间之旅。 IEEE Transactions on neural Network and Learning Systems, 28(10), 2222–2232.
[2] Chung, J., Gulcehre, C., Cho, K., & Bengio, Y. (2014).门控递归神经网络在序列建模上的实证评估。arXiv预印本arXiv:1412.3555。
[3] Yin, W., Kann, K., Yu, M., & Schütze, H. (2017).用于自然语言处理的CNN和RNN的比较研究。arXiv预印本arXiv:1702.01923。
[4] Esteban, C., Hyland, S. L., & Rätsch, G. (2017).具有递归条件 GAN 的实值(医学)时间序列生成。arXiv预印本arXiv:1706.02633。
[5] 瓦斯瓦尼, 沙泽尔, 帕尔马, 乌什科雷特, J., 琼斯, L., 戈麦斯, A. N., ...&Polosukhin,I.(2017)。注意力就是你所需要的。神经信息处理系统进展(第5998-6008页)。尼古拉斯·阿达洛格鲁
相关文章:

RNN 单元:分析 GRU 方程与 LSTM,以及何时选择 RNN 而不是变压器
一、说明 深度学习往往感觉像是在雪山上找到自己的道路。拥有坚实的原则会让你对做出决定更有信心。我们都去过那里 在上一篇文章中,我们彻底介绍并检查了 LSTM 单元的各个方面。有人可能会争辩说,RNN方法已经过时了,研究它们是没有意义的。的…...

Linux音频了解
ALPHA I.MX6U 开发板支持音频,板上搭载了音频编解码芯片 WM8960,支持播放以及录音功能! 本章将会讨论如下主题内容。 ⚫ Linux 下 ALSA 框架概述; ⚫ alsa-lib 库介绍; ⚫ alsa-lib 库移植; ⚫ alsa-l…...

精心整理了优秀的GitHub开源项目,包含前端、后端、AI人工智能、游戏、黑客工具、网络工具、AI医疗等等,空闲的时候方便看看提高自己的视野
精心整理了优秀的GitHub开源项目,包含前端、后端、AI人工智能、游戏、黑客工具、网络工具、AI医疗等等,空闲的时候方便看看提高自己的视野。 刚开源就变成新星的 igl,不仅获得了 2k star,也能提高你开发游戏的效率,摆…...

Leetcode54螺旋矩阵
思路:用set记录走过的地方,记下走的方向,根据方向碰壁变换 class Solution:def spiralOrder(self, matrix: list[list[int]]) -> list[int]:max_rows len(matrix)max_cols len(matrix[0])block_nums max_cols * max_rowscount 1i 0j…...
element-plus 表格-方法、事件、属性的使用
记录element-plus 表格的使用。方法、事件、属性的使用。因为是vue3的方式用到了const install getCurrentInstance();才能获取表格的相关信息 没解决怎么获取选中的行的行号,采用自己记的方式实习的。 利用row-class-name"setRowClass"实现样式的简单…...

NVME Linux的查询命令-继续更新
NVME Linux的查询命令 查看NVMe设备 # nvme list 查看nvme controller 支持的一些特性 # nvme id-ctrl /dev/nvme0 查看设备smart log信息 # nvme smart-log /dev/nvme0 查看设备error 信息 # nvme error-log /dev/nvme0 设备的所有命名空间 # nvme list-ns /dev/nvmeX 检…...
pyqt5-自定义文本域1
快捷键支持: CTRL鼠标滚轮实现字体大小调整 支持复制当前行 剪切当前行 # 多行文本框 class TextEdit(QTextEdit):def __init__(self, parentNone):super().__init__(parent)self.setStyleSheet("background-color: #262626;color: #d0d0d0;")self.setFon…...

Go实现LogCollect:海量日志收集系统【上篇——LogAgent实现】
Go实现LogCollect:海量日志收集系统【上篇——LogAgent实现】 下篇:Go实现LogCollect:海量日志收集系统【下篇——开发LogTransfer】 项目架构图: 0 项目背景与方案选择 背景 当公司发展的越来越大,业务越来越复杂…...
MySQL (1)
目录 操作须知 数据类型 1 DDL 1.1 操作库 1.2 操作表 1.3 操作字段(ALTER TABLE 表名) 2 DML 3 DQL(见下章) 操作须知 ※ MySQL在windows环境不区分大小写,但在Linux环境严格区分大小写 ※ 不同的数据库可能存在同名的表,可以给表前加"数据库前缀" //例:…...

MR混合现实汽车维修情景实训教学演示
MR混合现实技术应用于汽车维修课堂中,能够赋予学生更加真实,逼真地学习环境,让学生在情景体验中不断提高自己的专业能力。 MR混合现实汽车维修情景实训教学演示具体体现在: 1. 虚拟维修指导:利用MR技术,可…...
ChatGPT在航空航天工程和太空探索中的潜在应用如何?
ChatGPT在航空航天工程和太空探索领域具有广泛的潜在应用。这些应用可以涵盖从设计和模拟到任务控制和数据分析的多个方面。本文将探讨ChatGPT在航空航天和太空探索中的各种可能应用,包括设计优化、任务规划、智能导航、卫星通信、数据分析和太空探测器运行。 ### …...

算法基础第三章
算法基础第三章 1、dfs(深度搜索)1.1、 递归回溯1.2、递归剪枝(剪枝就是判断接下来的递归都不会满足条件,直接回溯,不再继续往下无意义的递归) 2、bfs(广度搜索)2.1、最优路径(只适合于边权都相等的题) 3、…...
ElementUI浅尝辄止20:Pagination 分页
分页组件常见于管理系统的列表查询页面,数据量巨大时需要分页的操作。 当数据量过多时,使用分页分解数据。 1.如何使用? /*设置layout,表示需要显示的内容,用逗号分隔,布局元素会依次显示。prev表示上一页…...

Docker从认识到实践再到底层原理(二-1)|容器技术发展史+虚拟化容器概念和简介
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…...
什么是大模型?1750亿、700GB的GPT大模型大在哪?
文章目录 什么是大模型?1750亿、700GB的GPT大模型大在哪? 什么是大模型? 在人工智能领域,模型是指一种对数据进行处理和分析的数学结构。模型越复杂,能够处理的数据量和处理的准确性都会得到提高。 随着人工智能技术…...
剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 10- II. 青蛙跳台阶问题 和 剑指 Offer 10- I. 斐波那契数列 很像,改一下初始值就行了。 方法一 class Solution {int mod (int) 1e9 7;public int numWays(int n) {if(n < 1) return 1;int[] dp new int[n 1];dp[1] 1;dp[2] 2;for(int i 3…...
oracle10和11功能说明比较
Oracle 10g/11g的特点和优势 首先,Oracle 10g/11g具有以下几个特点: 1. 可靠性和稳定性:Oracle 10g采用了多种技术来确保数据的可靠性和稳定性,如ACID事务处理和数据备份与恢复机制。它还提供了高可用性的解决方案,如…...

golang-bufio 缓冲写
1. 缓冲写 在阅读这篇博客之前,请先阅读上一篇:golang-bufio 缓冲读 // buffered output// Writer implements buffering for an io.Writer object. // If an error occurs writing to a Writer, no more data will be // accepted and all subsequent…...

Windows修改电脑DNS
访问浏览器出现无法访问此页面,找不到DNS地址,则可以通过如下方式修改DNS 按下windows键R键(两个键一起按) 出现下面窗口 输入control按回车键(Enter键)就会出现下面的窗口 DNS可以填下面这些: 114.114.114.114 和 114.114.115.115 阿里DNS&a…...

Linux驱动之Linux自带的LED灯驱动
目录 一、简介 二、使能Linux自带LED驱动 三、Linux内核自带LED驱动框架 四、设备树节点编写 五、运行测试 一、简介 前面我们都是自己编写 LED 灯驱动,其实像 LED 灯这样非常基础的设备驱动, Linux 内核已经集成了。 Linux 内核的 LED 灯驱动采用 …...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...