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)

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐