官方文档在​​这里​​。


GRU具体不做介绍了,本篇只做pytorch的API使用介绍.



torch.nn.GRU(*args, **kwargs)


公式

【pytorch】nn.GRU的使用_gru

下面公式忽略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



【pytorch】nn.GRU的使用_.net_02

所以从输入张量和隐藏层张量来说,一共有两组参数(忽略bias参数)


  1. input 组 { Wir Wiz Win}
  2. hidden组 { Wir Whz Whn }

【pytorch】nn.GRU的使用_gru_03

因为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)

【pytorch】nn.GRU的使用_pytorch_04

双向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)

【pytorch】nn.GRU的使用_重置_05

多层的概念