GRU

GRU(Gated Recurrent Unit)是一种用于深度学习中的循环神经网络(RNN)的门控机制。它由Cho等人在2014年提出,旨在解决标准循环神经网络训练过程中的梯度消失问题,比1997年的LSTM晚。GRU通过引入更新门(update gate)和重置门(reset gate)来控制信息的流动,这样可以更好地捕捉到数据中的长期依赖关系。 相比LSTM,使用GRU能够达到相当的效果,并且相比之下更容易进行训练,能够很大程度上提高训练效率,因此很多时候会更倾向于使用GRU。

基本原理

更新门(Update Gate):决定了前一时刻的状态有多少信息需要保留到当前时刻。 重置门(Reset Gate):决定了如何结合新的输入信息和前一时刻的状态信息,以便更新当前状态。

假设我们有一个序列输入 $ x_1, x_2, …, x_t $,GRU单元会对每个时间步$t$ 更新其隐藏状态 $h_t $。以下是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}t = \tanh(W \cdot [r_t * h{t-1}, x_t]) $$(这公式被解析丢了,看下图吧)

最终隐藏状态:

$$ h_t = (1 - z_t) * h_{t-1} + z_t * \tilde{h}_t $$ 其中,$W_z,W_r$ 和 $W$ 是权重矩阵,$ \sigma $是sigmoid激活函数,$ \tanh$ 是双曲正切激活函数,$*$ 表示逐元素乘法。

下面是一个简化的Python代码示例,展示了如何从头开始实现一个GRU单元。请注意,这个例子是为了教学目的而简化的,并没有包括诸如偏置项、层正规化、dropout等实际应用中常见的细节。

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def tanh(x):
    return np.tanh(x)

class GRUCell:
    def __init__(self, input_size, hidden_size):
        # 初始化权重
        self.Wz = np.random.randn(hidden_size, input_size + hidden_size)
        self.Wr = np.random.randn(hidden_size, input_size + hidden_size)
        self.W = np.random.randn(hidden_size, input_size + hidden_size)
        self.hidden_size = hidden_size

    def forward(self, x, h_prev):
        # 拼接输入和前一隐藏状态
        combined = np.concatenate((h_prev, x), axis=1)
        
        # 更新门
        z = sigmoid(np.dot(self.Wz, combined.T))
        
        # 重置门
        r = sigmoid(np.dot(self.Wr, combined.T))
        
        # 候选隐藏状态
        combined_reset = np.concatenate((r * h_prev, x), axis=1)
        h_tilde = tanh(np.dot(self.W, combined_reset.T))
        
        # 最终隐藏状态
        h_next = (1 - z) * h_prev.T + z * h_tilde
        
        return h_next.T

辅助记忆

想象一下,有一个古老的图书馆,里面存放着无数的书籍,这些书籍记录了一个古老王国的历史。图书馆的管理员是一个智慧的守护者,他的名字叫做Gru。Gru的任务是保护这些知识,并在需要时提供给访问者。但是,图书馆的空间有限,Gru不能同时记住所有的书籍内容,所以他必须决定哪些信息是重要的,值得记住,哪些可以暂时忘记。

更新门(Update Gate): Gru有一个特殊的钥匙串,上面挂着许多小钥匙,这些钥匙代表更新门。每当有新的故事(输入)来到图书馆时,Gru会用这些钥匙来决定应该打开哪些书的锁,也就是决定保留哪些旧的故事。如果一个钥匙转动得越多,那本书的内容就被保留得越完整。这样,Gru就可以平衡新旧信息,确保图书馆的知识是最新的,同时也不会丢失重要的历史。

重置门(Reset Gate): Gru还有一块神奇的橡皮,这块橡皮代表重置门。当一个新的故事与图书馆中的某些旧故事冲突时,Gru会用这块橡皮擦掉旧故事的一部分,以便更好地融合新的信息。这就像是他在重新评估旧知识的重要性,决定是否需要重写历史的某些章节。

候选隐藏状态和最终隐藏状态: 每次Gru使用钥匙和橡皮时,他都会在心中构建一个新的故事草稿,这就是候选隐藏状态。然后,他会用更新门上的钥匙来决定,应该保留多少旧的故事,以及应该加入多少新的草稿内容。这个最终的故事就是最终隐藏状态,它是旧知识和新知识的结合,由Gru精心维护和更新。

随着时间的推移,Gru变得越来越熟练,他的图书馆也越来越丰富。每个新来的访问者都能从中获得最相关和最准确的知识,因为Gru总是能够找到完美的平衡,保留重要的历史,同时接受新的故事。

comments powered by Disqus