官方文档在这里。
GRU具体不做介绍了,本篇只做pytorch的API使用介绍.
torch.nn.GRU(*args, **kwargs)
公式
下面公式忽略bias,由于输入向量的长度和隐藏层特征值长度不一致,所以每个公式的W都按x和h分开。这跟理论公式部分有一些具体的实践上区别。
- reset gate, 重置门
rt=σ(Wirxt+Whrht−1)GRU里的参数是Wir和Wir
- update gate,更新门
zt=σ(Wizxt+Whzht−1)GRU里的参数是Wiz和Wiz
- 更新状态阈值
nt=tanh(Winxt+rt(Whnht−1))GRU里的参数是Win和Win
这里同LSTM里的g ( t ) g(t)g(t)函数,只是多了重置门对h t − 1 的影响
- 更新h t
ht=(1−zt)nt+ztht−1
所以从输入张量和隐藏层张量来说,一共有两组参数(忽略bias参数)
- input 组 { Wir Wiz Win}
- hidden组 { Wir Whz 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)