循环神经网络(RNN)、长短时记忆网络(LSTM)及(GRU)模型

循环神经网络(RNN)

image.png
循环神经网络区别于其他神经网络在于循环二字,这里的循环是指隐含的输出(v)重新输入隐含权重参与模型训练,不同时刻的输入(X)也要放入隐含层权重中。隐含权重是循环到不同时间段其参数不一样,但隐含权重是共用的,注意在图中unfold下隐含权重矩阵只是一个矩阵(这里稍后解释:隐含的输出(v)和对应的输入(x)怎样共用一个矩阵),之所以呈现多个是为了对应不同的时刻。

在继续往下叙述之前,有一个优化问题要解决,即共用一个矩阵,这里可以通用一个简单的例子进行说明:
为方便理解,隐含变量为二维,输入的为一维,目的是得到新的隐含输入即二维。
image.png
我们可以发现,权重系数并排综合到一起,得到结果同样。这就提高了并行处理能力。

RNN源代码实现

import torch.nn as nn

class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(RNN, self).__init__()

        self.hidden_size = hidden_size

        self.i2h = nn.Linear(input_size + hidden_size, hidden_size)
        self.i2o = nn.Linear(input_size + hidden_size, output_size)
        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, input, hidden):
        combined = torch.cat((input, hidden), 1)
        hidden = self.i2h(combined)
        output = self.i2o(combined)
        output = self.softmax(output)
        return output, hidden

    def initHidden(self):
        return torch.zeros(1, self.hidden_size)
复制代码

循环神经网络的特点是每次的输入都有上一刻隐含层信息的参与,但也仅仅是上一刻,若神经网络输入不仅仅和上一刻时间的信息有关,换句话说,此刻时间的所需要训练的模型与很久之前信息也有关联,怎么让其参与进来?这就需要引入长短时记忆网络(LSTM),不过在谈论该模型之前,先研究再此基础上改进后发表的paper即GRU模型,该篇相比于LSTM模型更加容易理解。

GRU模型

GRU模型需要注意的是门控的作用,更确定说是在公式中作为权重的体现或者说是mask的效果。话不多说,理解这四个公式就理解了GRU模型,这样在看图就更加容易理解。

Rt=σ(XtWxr+Ht1Whr+br)Zt=σ(XtWxz+Ht1Whz+bz)R_t = \sigma(X_tW_{xr}+H_{t-1}W_{hr}+b_r)\\ Z_t = \sigma(X_tW_{xz}+H_{t-1}W_{hz}+b_z)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享