机器学习笔记(13.1): GRU & LSTM
可能更好的阅读体验 Jeefy's Blog: LSTM
GRU(Gate Recurrent Unit)是一种 RNN,LSTM 也是一种 RNN,这两者都是为了解决 RNN 长程问题中的记忆衰减问题。一般来说,GRU \(\approx\) LSTM,但是 GRU 的计算损耗更低,所以 GRU > LSTM。
LSTM
核心就是,如何去记忆重要的关键词,并且需要适当的遗忘。

那么我们就可以引入三个组件以及一个新的记忆变量 \(C_t \in {\mathbb R}^h\),这里设 \(x_t \in {\mathbb R}^d\):
非常需要注意一下,我这里没有考虑行列向量的问题,默认来说,\(x_t, h_t\) 都应该是列向量,所以 \([h_{t-1}, x_t]\) 严格应该写为 \([h_{t-1}^T, x_t^T]^T\),但是很丑陋且麻烦,所以简写了。原文中用的是 \(W \cdot [h_{t-1}, x_t]\) 的写法,我不是很明白,
- 遗忘门
- 首先计算需要怎么去遗忘:\(f_t = \sigma(W_f [h_{t - 1}, x_t] + b_f) \in {\mathbb R}^h\)
- 其中 \(W_f \in {\mathbb R}^{h \times (h + d)}\)
- 这里利用 sigmoid 函数去激活,\(1 \to keep, 0 \to forget\)
- 记忆门
- 接下来我们需要计算需要新加入什么记忆:\(\tilde c_t = {\rm tanh}(W_c [h_{t - 1}, x_t] + b_c) \in {\mathbb R}^h\)
- 但同时,也需要衡量其重要性(magnitude):\(m_t = {\rm sigmoid}(W_m[h_{t - 1}, x_t] + b_c) \in {\mathbb R}^h\)
- 其中 \(W_c, W_m \in {\mathbb R}^{h \times (h + d)}\)
- 那么于是,记忆就可以更新为:\(c_t = c_{t - 1} \odot f_t + \tilde c_t \odot m_t\)
- 输出门
- 根据记忆和状态输出即可:
- \(h_t = \sigma(W_h [h_{t - 1}, x_t] + b_h) \odot {\rm tanh} (c_t)\)
- 其中 \(W_h \in {\mathbb R}^{h \times (h + d)}\)
非常的简单,但是确实有点计算复杂。
GRU
我们为什么不能把 \(h_t\) 和 \(c_t\) 放一起呢?这样我们只需要两个门了,重置门和更新门:
- 重置门:
- 依旧怎么遗忘起手:\(r_t = \sigma(W_r [h_{t - 1}, x_t] + b_r)\)
- 于是可以得到当前的需求状态是什么:
- \(\tilde h_t = {\rm tanh}(W_h [r_t \odot h_{t - 1}, x_t] + b_h)\)
- 更新门
- 依旧是需要需要多少信息起手:\(z_t = \sigma(W_z [h_{t - 1}, x_t] + b_z)\)
- 于是新的状态自然是:\(h_t = (1 - z_t) \odot h_{t - 1} + z_t\odot \tilde h_t\)
需要注意的是,这两个框架的输出 \(h_t\) 都表示的是隐状态,而不是真实的输出,对于 RNN 任务,还需要进一步使用其他的东西处理。
我在想,如果我只保留 GRU 中的两个门,这样这个结构可以抽象为:
\[\begin{aligned}
\tilde h_t &= f(h_{t - 1}, x_t) \\
z_t &= \sigma(g(h_{t - 1}, x_t)) \\
h_t &= (1 - z_t) \odot h_{t - 1} + z_t\odot \tilde h_t
\end{aligned}
\]
对于 \(f, g\),我能不能换成一个 FC NN 或者 MLP 之类的,甚至在 \(h_t\) 的聚合过程中,再来点 Transformer 的想法,将 \(h_{t - 1}\) 和 \(\tilde h_t\) 通过 QKV 聚合。
简单搜索了一下,有相关的工作了:
- Minimal RNN
- Recurrent Attention
- Transformer-XL、RWKV

浙公网安备 33010602011771号