GRU(门控循环单元)详解

ops/2024/11/20 8:39:17/

1️⃣ GRU介绍

前面介绍的LSTM可以有效缓解RNN的梯度消失问题,但是其内部结构比较复杂,因此衍生出了更加简化的GRU。GRU把输入门遗忘门整合成一个更新门,并且合并了细胞状态和隐藏状态。于2014年被提出


2️⃣ 原理介绍

GRU的结构和最简单的RNN是一样的。当前输入为 x t x_t xt,上一个节点传递下来的隐层状态为 h t − 1 h_{t-1} ht1,这个隐层状态包含了之前节点的相关信息。根据 x t x_t xt h t − 1 h_{t-1} ht1,GRU会得到当前时间步的输出 y t y_t yt和传递给下一个节点的隐层状态 h t h_t ht,实际上 y t y_t yt就是等于 h t h_t ht
在这里插入图片描述
下面介绍详细的原理,下图展示了GRU的详细结构:
在这里插入图片描述

第一步,计算重置门,它的参数是 W r W_r Wr用于控制之前的记忆需要保留多少。该门的输入是前一个隐层状态 h t − 1 h_{t-1} ht1以及当前时间步的输入 x t x_t xt,输出为 r t r_t rt,在0到1之间,:
r t = σ ( W r ⋅ [ h t − 1 , x t ] ) r_{t}=\sigma\left(W_{r}\cdot[h_{t-1},x_{t}]\right) rt=σ(Wr[ht1,xt])其中, σ \sigma σ表示sigmoid激活函数

第二步,我们来看更新门,它的参数为 W z W_z Wz,它将LSTM中的输入门和遗忘门结合,决定当前时间步应该保留多少以前的记忆,多少新信息应该加入。该门的输入也是前一个隐层状态 h t − 1 h_{t-1} ht1以及当前时间步的输入 x t x_t xt,省略了偏置参数 b b b,输出为 z t ,在 0 到 1 之间, z_t,在0到1之间, zt,在01之间,公式具体表达为:
z t = σ ( W z ⋅ [ h t − 1 , x t ] ) z_{t}=\sigma\left(W_{z}\cdot[h_{t-1},x_{t}]\right) zt=σ(Wz[ht1,xt])其中, σ \sigma σ表示sigmoid激活函数

第三步,计算输入值,输入值由前一个隐层状态 h t − 1 h_{t-1} ht1,当前的 x t x_t xt以及重置门 r t r_t rt得到。 r t ∗ h t − 1 r_{t}*h_{t-1} rtht1可以理解为之前的记忆保留多少来学习新的内容 x t x_t xt h ~ t \tilde{h}_{t} h~t相当于利用之前的记忆对新的内容理解的部分
h ~ t = tanh ⁡ ( W ⋅ [ r t ∗ h t − 1 , x t ] ) \tilde{h}_{t}=\operatorname{tanh}\left(W\cdot[r_{t}*h_{t-1},x_{t}]\right) h~t=tanh(W[rtht1,xt])

第四步,计算当前输出 h t h_t ht,由两部分,一部分是之前信息的影响 h t − 1 h_{t-1} ht1,后一部分是当前输入的影响 h ~ t \tilde{h}_t h~t z t z_{t} zt是更新门的输出,取值在0-1之间。给 h t − 1 h_{t-1} ht1赋予 ( 1 − z t ) (1-z_t) (1zt)权重,给 h ~ t \tilde{h}_t h~t赋予 z t z_{t} zt权重:

h t = ( 1 − z t ) ∗ h t − 1 + z t ∗ h ~ t \begin{aligned}h_t=(1-z_t)*h_{t-1}+z_t*\tilde{h}_t\end{aligned} ht=(1zt)ht1+zth~t

我前面写的这篇文章中介绍了为什么RNN会有梯度消失和爆炸:点这里查看

主要原因是反向传播时,梯度中有这一部分:
∏ j = k + 1 3 ∂ s j ∂ s j − 1 = ∏ j = k + 1 3 t a n h ′ W \prod_{j=k+1}^3\frac{\partial s_j}{\partial s_{j-1}}=\prod_{j=k+1}^3tanh^{'}W j=k+13sj1sj=j=k+13tanhW

那么GRU如何缓解RNN的梯度消失问题呢?

在GRU里,隐层的输出换了个符号,从 s s s变成 h h h了。因此我们来分析一下 ∂ h t ∂ h t − 1 \frac{\partial h_t}{\partial h_{t-1}} ht1ht。 我们可以得到:
∂ h t ∂ h t − 1 = ( 1 − z t ) + … \frac{\partial h_t}{\partial h_{t-1}}=(1-z_t)+\ldots ht1ht=(1zt)+

因此我们可以通过控制更新门的输出 z t z_t zt来控制梯度,以缓解梯度消失问题


3️⃣ 总结

  • GRU和LSTM对比:
    在这里插入图片描述

  • GRU通过控制更新门的输出 z t z_t zt来控制梯度,以缓解梯度消失问题


4️⃣ 参考



http://www.ppmy.cn/ops/135189.html

相关文章

Zookeeper的简单使用Centos环境下

目录 前言 一、ZOokeeper是什么? 二、安装Zookeeper 1.进入官网下载 2.解压到服务器 3.配置文件 三.使用Zookeeper 3.1启动相关指令 3.2其他指令 3.3ACL权限 总结 前言 记录下安装zookeeper的一次经历 一、ZOokeeper是什么? ZooKeeper是一…

缓存工具类编写

缓存工具类编写 一般操作 在外面日常开发中&#xff0c;经常会有为了减少数据库压力&#xff0c;而将数据保存到缓存中并设置一个过期时间的操作。日常代码如下&#xff1a; Autowired private RedisTemplate<String, String> redisTemplate;public Object queryDataW…

华为VPN技术

1.启动设备 2.配置IP地址 [FW1]int g1/0/0 [FW1-GigabitEthernet1/0/0]ip add 192.168.1.254 24 [FW1-GigabitEthernet1/0/0]int g1/0/1 [FW1-GigabitEthernet1/0/1]ip add 100.1.1.1 24 [FW1-GigabitEthernet1/0/1]service-manage ping permit [FW2]int g1/0/0 [FW2-Gi…

(二)PyTorch简要教学

文章目录 PyTorch教学一、训练一个神经网络二、用PyTorch是怎么去做的&#xff08;一&#xff09;Dataset & DataLoader&#xff08;二&#xff09;Tensors&#xff08;1&#xff09;Tensor是什么&#xff08;2&#xff09;怎么获得Tensor&#xff08;3&#xff09;Tensor相…

axios 二次封装及 api 解耦【Vue】

文章目录 一、基础知识1. 定义和使用2. 并发请求3. 全局配置4. 封装 axios5. axios 拦截器6. Vue 中封装 axios 二、axios 二次封装三、api 解耦 一、基础知识 1. 定义和使用 axios 是基于 promise 对 ajax 的一种封装&#xff0c;是异步请求的一种工具。 axios 中文文档&am…

java语言特性(持续更新)

1.java里创建的数组默认初始化是0元素&#xff0c;未初始化的基本元素是不可用的,但是在c语言里&#xff0c;全是随机数值。 int a;for(int i0;i<1;i) { //即使局部初始化也不可以a9;}System.out.println(a); //错误示例 int[][] anew int[3][3]; for(int[] i:a)…

机器学习—误差分析

帮助运行诊断的最重要的方法是选择下一步要尝试的内容&#xff0c;提高你的学习算法性能&#xff0c;偏差和方差可能是最重要的想法&#xff0c;然后是错误分析。 假设Mcv500&#xff0c;即有500个交叉验证示例&#xff0c;你的算法错误的分类了100个&#xff0c;错误分析过程…

递归求二项式系数值

时间限制: 1s 类别: 递归->简单 问题描述 根据以下公式&#xff1a; 输入说明 输入两个整数k和n&#xff0c;输入的数据保证其结果在int表示时不会溢出。 输出说明 输出运算结果 #include<iostream> #include<string> #include<algorithm> using na…