一、什么是GRU?

GRU(Gate Recurrent Unit)是循环神经网络(RNN)的一种,可以解决RNN中不能长期记忆和反向传播中的梯度等问题,与LSTM的作用类似,不过比LSTM简单,容易进行训练。

二、GRU详解

GRU模型中有两个门,重置门和更新门,具体作用后面展开说。

先来看一张GRU的图,看不懂没关系,后面慢慢展开说。

gru神经网络代码 python gru神经网络模型_lstm

符号说明:

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_02

:当前时刻输入信息 

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_03

:上一时刻的隐藏状态。隐藏状态充当了神经网络记忆,它包含之前节点所见过的数据的信息

gru神经网络代码 python gru神经网络模型_人工智能_04

:传递到下一时刻的隐藏状态

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_05

:候选隐藏状态

gru神经网络代码 python gru神经网络模型_人工智能_06

:重置门

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_07

:更新门

gru神经网络代码 python gru神经网络模型_lstm_08

:sigmoid函数,通过这个函数可以将数据变为0-1范围的数值。

tanh: tanh函数,通过这个函数可以将数据变为[-1,1]范围的数值

先不看内部具体的复杂关系,将上图简化为下图:

gru神经网络代码 python gru神经网络模型_gru_09

 结合

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_02

 和 

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_03

,GRU会得到当前隐藏节点的输出

gru神经网络代码 python gru神经网络模型_gru_12

和传递给下一个节点的隐藏状态

gru神经网络代码 python gru神经网络模型_人工智能_04

,这个

gru神经网络代码 python gru神经网络模型_人工智能_04

 

的推导是GRU的关键所在,我们看一下GRU所用到的公式:

gru神经网络代码 python gru神经网络模型_人工智能_15

这四个公式互有关联,并不是单独去使用,下面我们详细展开。

1. 重置门

 重置门决定了如何将新的输入信息与前面的记忆相结合,这句话猛的一看也不好理解,我们再继续拆解。

 

gru神经网络代码 python gru神经网络模型_lstm_16

 将这个图片转化为公式就是重置门的公式:

gru神经网络代码 python gru神经网络模型_gru_17

这里

gru神经网络代码 python gru神经网络模型_lstm_18

并不是一个值,而是一个权重矩阵。用这个权重矩阵对

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_02


gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_03

拼接而成的矩阵进行线性变换(两个矩阵相乘)。然后将两个矩阵相乘得到的值投入sigmoide函数,会得到

gru神经网络代码 python gru神经网络模型_人工智能_06

的值,比如:0.6 。这个值会用到候选隐藏状态的公式中,即下面这个公式:

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_22

 为了方便理解,我们将这个公式展开:

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_23

下面便是重点:

gru神经网络代码 python gru神经网络模型_人工智能_06

的值越小,它与

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_03

哈达玛积出来的矩阵数值越小,再与权重矩阵相乘得到的值越小,

gru神经网络代码 python gru神经网络模型_人工智能_26

也就是这个值越小,

说明上一时刻需要遗忘的越多,丢弃的越多。

gru神经网络代码 python gru神经网络模型_人工智能_06

的值越大,

gru神经网络代码 python gru神经网络模型_人工智能_26

 值越大,说明上一时刻需要记住的越多,新的输入信息(也就是当前的输入信息

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_02

)与前面的记忆相结合的越多。

gru神经网络代码 python gru神经网络模型_人工智能_06

的值接近0时,

gru神经网络代码 python gru神经网络模型_gru_31

值也接近为0,说明上一时刻的内容需要全部丢弃,只保留当前时刻的输入,所以可以用来丢弃与预测无关的历史信息。当

gru神经网络代码 python gru神经网络模型_人工智能_06

的值接近1时,

gru神经网络代码 python gru神经网络模型_gru_31

值也接近为1,表示保留上一时刻的隐藏状态。 

这就是重置门的作用,有助于捕捉时间序列里短期的依赖关系。

2.更新门

 更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,也就是更新门帮助模型决定到底要将多少过去的信息传递到未来,简单来说就是用于更新记忆。结合下面两个公式比较好理解:

gru神经网络代码 python gru神经网络模型_gru_34

更新门公式:

 

gru神经网络代码 python gru神经网络模型_gru_35

更新记忆表达式:

gru神经网络代码 python gru神经网络模型_自然语言处理_36

 

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_07

越接近1,代表”记忆“下来的数据越多;而越接近0则代表”遗忘“的越多。 

gru神经网络代码 python gru神经网络模型_lstm_38

:表示对上一时刻隐藏状态进行选择性“遗忘”。忘记

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_03

中一些不重要的信息,把不相关的丢弃。

gru神经网络代码 python gru神经网络模型_lstm_40

:表示对候选隐藏状态的进一步选择性”记忆“。会忘记 

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_05

中的一些不重要的信息。也就是对

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_05

中的某些信息进一步选择。

综上,

gru神经网络代码 python gru神经网络模型_lstm_43

 

gru神经网络代码 python gru神经网络模型_人工智能_04

忘记传递下来的 

gru神经网络代码 python gru神经网络模型_gru神经网络代码 python_03

中的某些信息,并加入当前节点输入的某些信息。这就是最终的记忆。

门控循环单元GRU不会随时间而清除以前的信息,它会保留相关的信息并传递到下一个单元。

参考资料:

人人都能看懂的GRU - 知乎 (zhihu.com)

 GRU学习总结_哔哩哔哩_bilibili