GRU

在神经网络发展的过程中,几乎所有关于LSTM的文章中对于LSTM的结构都会做出一些变动,也称为LSTM的变体。其中变动较大的是门控循环单元(Gated Recurrent Units),也就是较为流行的GRU。GRU是2014年由Cho, et al在文章《Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation》中提出的,某种程度上GRU也是对于LSTM结构复杂性的优化。LSTM能够解决循环神经网络因长期依赖带来的梯度消失和梯度爆炸问题,但是LSTM有三个不同的门,参数较多,训练起来比较困难。GRU只含有两个门控结构,且在超参数全部调优的情况下,二者性能相当,但是GRU结构更为简单,训练样本较少,易实现。

GRU

GRU在LSTM的基础上主要做出了两点改变 :

(1)GRU只有两个门。GRU将LSTM中的输入门和遗忘门合二为一,称为更新门(update gate),上图中的z t ,控制前边记忆信息能够继续保留到当前时刻的数据量,或者说决定有多少前一时间步的信息和当前时间步的信息要被继续传递到未来;GRU的另一个门称为重置门(reset gate),上图中的r t ,控制要遗忘多少过去的信息。

(2)取消进行线性自更新的记忆单元(memory cell),而是直接在隐藏单元中利用门控直接进行线性自更新。GRU的逻辑图如上图所示。

GRU的公式化表达如下:

[{z_t} = \sigma ({W_z} \cdot [{h_{t – 1}},{x_t}])]

[{r_t} = \sigma ({W_r} \cdot [{h_{t – 1}},{x_t}])]

[\tilde h = tanh(W \cdot [{r_t} \odot {h_{t – 1}},{x_t}])]

[{h_t} = (1 – {z_t}) \odot {h_{t – 1}} + {z_t} \odot {\tilde h_{t – 1}}]

下面我们将分步介绍GRU的单元传递过程,公式也会在接下来的章节进行详细的介绍:

GRU

上图是带有门控循环单元的循环神经网络。

1.更新门

在时间步 t,我们首先需要使用以下公式计算更新门

[{z_t} = \sigma ({W_z} \cdot [{h_{t – 1}},{x_t}])]

其中 x t 为第 t 个时间步的输入向量,即输入序列 X 的第 t 个分量,它会经过一个线性变换(与权重矩阵W z 相乘)。h t −1 保存的是前一个时间步 t-1 的信息,它同样也会经过一个线性变换。更新门将这两部分信息相加并投入到 Sigmoid 激活函数中,因此将激活结果压缩到 0 到 1 之间。以下是更新门在整个单元的位置与表示方法。

GRU

更新门帮助模型决定到底要将多少过去的信息传递到未来,或到底前一时间步和当前时间步的信息有多少是需要继续传递的。这一点非常强大,因为模型能决定从过去复制所有的信息以减少梯度消失的风险。

2.重置门

本质上来说,重置门主要决定了到底有多少过去的信息需要遗忘,我们可以使用以下表达式计算:[{r_t} = \sigma ({W_r} \cdot [{h_{t – 1}},{x_t}])]

$ 该表达式与更新门的表达式是一样的,只不过线性变换的参数和用处不一样而已。下图展示了该运算过程的表示方法。

GRU

如前面更新门所述,h t −1 和 x t 先经过一个线性变换,再相加投入 Sigmoid 激活函数以输出激活值。

3. 当前记忆内容

现在我们具体讨论一下这些门控到底如何影响最终的输出。在重置门的使用中,新的记忆内容将使用重置门储存过去相关的信息,它的计算表达式为: [\tilde h = tanh(W \cdot [{r_t} \odot {h_{t – 1}},{x_t}])]

输入x t 与上一时间步信息 h t −1 先经过一个线性变换,即分别右乘矩阵 W。

计算重置门 r t 与h t −1 的 Hadamard 乘积,即 r t 与h t −1 的对应元素乘积。因为前面计算的重置门是一个由 0 到 1 组成的向量,它会衡量门控开启的大小。例如某个元素对应的门控值为 0,那么它就代表这个元素的信息完全被遗忘掉。该 Hadamard 乘积将确定所要保留与遗忘的以前信息。

将这两部分的计算结果相加再投入双曲正切激活函数中。该计算过程可表示为:

GRU

4. 当前时间步的最终记忆

在最后一步,网络需要计算 h t ht,该向量将保留当前单元的信息并传递到下一个单元中。在这个过程中,我们需要使用更新门,它决定了当前记忆内容 h ~h~和前一时间步 h t −1 中需要收集的信息是什么。这一过程可以表示为:

[{h_t} = (1 – {z_t}) \odot {h_{t – 1}} + {z_t} \odot {\tilde h_{t – 1}}]

z t 为更新门的激活结果,它同样以门控的形式控制了信息的流入。1 −z t 与h t −1 的 Hadamard 乘积表示前一时间步保留到最终记忆的信息,该信息加上当前记忆保留至最终记忆的信息(z t 与h ~t −1 的 Hadamard 乘积)就等于最终门控循环单元输出的内容。

门控循环单元不会随时间而清除以前的信息,它会保留相关的信息并传递到下一个单元,因此它利用全部信息而避免了梯度消失问题。

参考文献

Chung, J., Gulcehre, C., Cho, K., & Bengio, Y. (2014). Empirical evaluation of gated recurrent neural networks on sequence modeling. arXiv preprint arXiv:1412.3555. 链接

Original: https://www.cnblogs.com/beyoncewxm/p/16626705.html
Author: xiaomin_beyonce
Title: GRU

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/684038/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • AJAX 简介

    AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 您应当具备的基础知识 在继续学习之前,您需要对下面的知识有基本的了解: HTML / XHTML CSS …

    技术杂谈 2023年5月31日
    0129
  • 面向对象ooDay1

    如何创建类?如何创建对象?如何访问成员? package ooday01; //学生类 public class Student { //成员变量—-对象的属性 String …

    技术杂谈 2023年7月11日
    076
  • day3

    链表的定义 class ListNode: def __init__(self, val, next=None): self.val = val self.next = next …

    技术杂谈 2023年7月10日
    075
  • 用于排队叫号系统的redis工具类

    分析 排队叫号系统的队列数据变化很频繁,因此可以考虑使用redis的list结构存储某一队列的数据,与前端采用websocekt连接,后端主动推送数据给前端,避免频繁轮询造成资源浪…

    技术杂谈 2023年7月23日
    076
  • 一种简洁的Spring Bean选择器模式

    在日常开发中,我们常常会遇到一个接口有多个实现类时,需要选择合适的实现类的情况。 最简单的方法是写一个选择器,用if-else来判断使用哪个实现类的实例,比如: if(条件1){ …

    技术杂谈 2023年7月11日
    070
  • 【转】iOS NFC

    概述 iOS 在 iOS11(iPhone7/iPhone7 Plus) 之后开放 NFC 主动扫描功能 并且在 iOS13(iPhoneXS/iPhoneXR) 后开放 NFC …

    技术杂谈 2023年6月1日
    095
  • 湘潭大学新生匿名问答网站——解湘 项目总结

    一.开发进度 温馨提示:左下角有音乐播放器 项目首页 大一暑假过半,7月29日建立本地工程文件 其中项目在github上经历七次push(第八次为修改配置文件,防止数据库泄露),但…

    技术杂谈 2023年7月11日
    085
  • 复杂逻辑题目的好帮手:注释和断言

    前言 最近在刷题的时候,遇到一些逻辑比较复杂的题,往往会遇到困难,经常写不出来。即使在有debug帮助的时候,也往往会出现思虑不周,导致一错再错的情况,即好不容易debug通过一个…

    技术杂谈 2023年7月25日
    083
  • 钓鱼邮件

    最近收到的一些 钓鱼邮件,分享一下 备案钓鱼邮件 财务部钓鱼邮件: 补贴页面有二维码 ,扫描后需要输入 银行卡账号&密码 OA邮箱升级钓鱼 这些邮件大多是,为了骗取你的账号…

    技术杂谈 2023年5月31日
    091
  • 一文看懂Power Platform 和 Teams的整合

    大家知道,Microsoft Teams 正在飞速增长,目前每天的活跃商业用户大约在1.5亿左右,各地用户通过Teams开会的时间,每天超过50亿分钟;另外一方面,全球财富500强…

    技术杂谈 2023年5月31日
    0100
  • 基于ArcGIS Engine + C#实现用户自定义动态电力符号

    转自 华立电网北京研发中心 阿文 ArcGIS Engine 二次开发一般需要通过桌面产品来制作这些符号,然后通过专门的转换工具转换以后供AE 使用。电力GIS 应用当中,电力设备…

    技术杂谈 2023年5月31日
    094
  • 阿里云有奖体验:块存储快速入门

    实验简介 场景将提供一台配置了CentOS 7.7版本的ECS实例(云服务器)和两块高效云盘的数据盘。通过本教程的操作,您可以通过阿里云控制台和Linux操作系统,快速入门块存储。…

    技术杂谈 2023年7月11日
    064
  • C++ 虚基类与虚继承 (菱形继承问题)

    C++ 是支持多继承的语言, 但是实际项目开发中非必要不要使用多继承以降低代码逻辑的复杂性,当然 C++ 多继承的特性带来一些问题即 菱形继承。 当一个类继承了两个来自同父类的子类…

    技术杂谈 2023年6月21日
    097
  • Jenkins pipeline 流水线部署 并自定义 buildName 和 buildDescription 显示信息

    安装 Pipeline 插件 安装 Groovy Postbuild 插件 安装 build user vars 插件 安装 Build Name and Description …

    技术杂谈 2023年5月31日
    0121
  • Clouda聊天室实践

    1、Clouda说明Clouda是简单,可依赖的实时Javascript框架。对一个想开发移动webapp的开发者来说,可以使用clouda开发框架,实现一个功能和体验与nativ…

    技术杂谈 2023年5月31日
    096
  • YAML注释

    既然对YAML的语法和基础知识感到满意,那么进一步了解它的细节。在本章中,将了解如何在YAML中使用注释。 YAML支持单行注释。 下面借助一个例子来解释其结构 – Y…

    技术杂谈 2023年5月31日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球