对比RNN,GRU隐藏层的计算方式有所变化,GRU的更新公式如下: \[ \begin{align*} z_t &= \sigma(W_{zh} \cdot h_{t-1} + W_{zx} \cdot x_t + b_z) \quad \text{(更新门)} \\ r_t &= \sigma(W_{rh} \cdot h_{t-1} + W_{rx} \cdot x_t + b_r) \quad \text{(重置门)} \\ \tilde{h}_t &= \text{tanh}(W_{hh} \cdot (r_t \odot h_{t-1}) + W_{hx} \cdot x_t + b_h) \quad \text{(候选隐藏状态)} \\ h_t &= (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t \quad \text{(最终隐藏状态)} \end{align*} \]
Pytorch的nn.GRU
版本为2.1,pytorch的gru实现中\(\sigma\)选择的sigmoid参考官方文档
\[ sigmoid(x) = \frac{1}{1 + e^{-x}}
\]
为什么是sigmoid? /1.png)
训练模型
1 | import torch |
1 | state = torch.zeros((1,1,64), dtype=torch.float32) |
输出困惑度为2.93而之前RNN实现的困惑都输出为4.21。