官方文档在这里。
GRU具体不做介绍了,本篇只做pytorch的API使用介绍.
torch.nn.GRU(*args, **kwargs)
公式
下面公式忽略bias,由于输入向量的长度和隐藏层特征值长度不一致,所以每个公式的W都按x和h分开。这跟理论公式部分有一些具体的实践上区别。
- reset gate, 重置门
r t = σ ( W i r x t + W h r h t − 1 ) r_t = \sigma(W_{ir}x_t+W_{hr}h_{t-1}) rt=σ(Wirxt+Whrht−1) GRU里的参数是 W i r W_{ir} Wir 和 W i r W_{ir} Wir - update gate,更新门
z t = σ ( W i z x t + W h z h t − 1 ) z_t = \sigma(W_{iz}x_t+W_{hz}h_{t-1}) zt=σ(Wizxt+Whzht−1) GRU里的参数是 W i z W_{iz} Wiz 和 W h z W_{hz} Whz - 更新状态阈值
n t = t a n h ( W i n x t + r t ( W h n h t − 1 ) ) n_t = tanh (W_{in}x_t+r_t(W_{hn} h_{t-1})) nt=tanh(Winxt+rt(Whnht−1)) GRU里的参数是 W i n W_{in} Win 和 W h n W_{hn} Whn
这里同LSTM里的 g ( t ) g(t) g(t)函数,只是多了重置门对 h t − 1 h_{t-1} ht−1的影响 - 更新
h
t
h_t
ht
h t = ( 1 − z t ) n t + z t h t − 1 h_t = (1-z_t)n_t + z_t h_{t-1} ht=(1−zt)nt+ztht−1
所以从输入张量和隐藏层张量来说,一共有两组参数(忽略bias参数)
- input 组 { W i r W_{ir} Wir W i z W_{iz} Wiz W i n W_{in} Win}
- hidden组 { W i r W_{ir} Wir W h z W_{hz} Whz W h n W_{hn} Whn }
因为hidden size为隐藏层特征输出长度,所以每个参数第一维度都是hidden size;然后每一组是把3个张量按照第一维度拼接,所以要乘以3
举例代码
from torch import nn
gru = nn.GRU(input_size=3, hidden_size=5, num_layers=1, bias=False)
print('weight_ih_l0.shape = ', gru.weight_ih_l0.shape, ', weight_hh_l0.shape = ' , gru.weight_hh_l0.shape)
双向GRU
如果要实现双向的GRU,只需要增加参数bidirectional=True
但是参数并没有增加。
from torch import nn
gru = nn.GRU(input_size=3, hidden_size=5, num_layers=1, bidirectional=True, bias=False)
print('weight_ih_l0.shape = ', gru.weight_ih_l0.shape, ', weight_ih_l0_reverse.shape = ', gru.weight_ih_l0_reverse.shape,
'\nweight_hh_l0.shape = ' , gru.weight_hh_l0.shape, ', weight_hh_l0_reverse.shape = ', gru.weight_hh_l0_reverse.shape)
多层的概念
可以参考这里 https://blog.youkuaiyun.com/mimiduck/article/details/119975080