GRU
a.GRU(Gated Recurrent Unit)也称门控循环单元结构,它也是传统RNN的变体。同LSTM一样也可以捕捉长序列之间的语义关联,缓解梯度爆炸或梯度消失现象,但它的结构和计算要比LSTM要简单。但GRU不能完全解决梯度消失的问题,同时其作为RNN的变体,有着RNN结构本身的一大弊端,即不能进行并行计算,这在数据量和模型体量逐步增大的未来,是RNN发展的瓶颈
b.GRU的核心结构可以分为两部分:更新门和重置门
c.GRU的内部结构如下图所示
同之前分析过的LSTM的门控一样,首先要计算更新重置门和更新门的门值,分别为r(t)和z(t),计算方法就是使用h(t-1)和x(t)进行拼接再进行线性变换,再使用sigmoid进行激活。之后更新门门值作用在h(t-1)上代表控制上一时间步传来的信息有多少可以被利用。接着使用更新后的h(t-1)进行基本的RNN计算,即与x(t)拼接进行线性变换,经过tanh激活后得到新的h(t)。最后重置门的门值会作用在新的h(t)上,而1-门值会作用在h(t-1)上,随后将两者结果相加,得到最终的输出状态h(t),这个过程意味着重置门有能力重置之前所有的计算,当门值趋向于1时得到新的h(t),当门值趋向于0时得到上一时间步的h(t-1)。
Bi-GRU
a.即双向GRU,不改变GRU的内部结构,而是将模型在不同方向应用两次,再将两次得到的结果进行拼接作为最后的输出结果。
GRU的使用
a.调用torch.nn.GRU
b.nn.GRU类初始化主要参数解释
input_size:输入张量x中特征维度的大小
hidden_size:隐藏层张量h中特征维度的大小
num_layers:隐含层的数量
bidirectional:是否选择双向GRU,如果为True,则为使用。默认为False
c.nn.GRU类实例化对象的主要参数解释:
input:输入张量
h0:初始化的隐藏层张量h
d.简单的代码调用
import torch
import torch.nn as nn
#定义LSTM参数的含义:(input_size,hidden_size,num_layers)
gru=nn.GRU(5,6,2)
#定义输入张量参数的含义:(squence_length,batch_size,input_size)
input=torch.randn(1,3,5)
#定义隐层初始化张量:(num_layers*num_directions(方向数),batch_size,hidden_size)
h0=torch.randn(2,3,6)
output,hn=gru(input,h0)
print(output)
print(hn)