最新公告
  • 欢迎您光临欧资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 基于实例掌握循环神经网络是如何解决序列化数据的问题的

    一、简介

    前馈神经网络不考虑数据之间的相关性,网络的输出只与当前时刻的网络输入有关。但是在解决很多实际问题的时候,我们发现实际问题中有很多串行数据,比如文本、语音、视频等。这些时序数据往往是时间序列相关的,即网络在某一时刻的输出不仅与当前时刻的输入相关,还与某一时刻或之前几次的输出相关。前馈神经网络不能很好地处理这种相关性,因为它没有记忆能力,所以前一时刻的输出不能传递到后一时刻。

    另外,我们在做语音识别或者机器翻译的时候,输入输出数据的长度是可变的,而前馈神经网络的输入输出数据格式是固定不变的。因此,需要一个更强大的模型来解决这些问题。

    递归神经网络的威力在过去几年中得到了很好的展示,它们在文本处理、语音识别和机器翻译等许多序列问题上取得了显著成果。循环神经网络也越来越多地应用于其他领域。

    二 RNN 知识结构

    本章将从最简单的循环神经网络入手,通过实例来掌握循环神经网络如何解决序列化数据,以及循环神经网络的前向计算和参数优化的过程和方法。在此基础上,我们将介绍几种常见的循环神经网络结构,包括双向循环神经网络、深度循环神经网络和循环神经网络。我们将使用TensorFlow实现循环神经网络,并掌握使用TensorFlow构建简单循环神经网络的方法。

    此外前向和递归神经网络的区别,我们还将学习一类结构更复杂的循环神经网络——门控循环神经网络,包括长短期记忆网络(LSTM)和门控循环单元(GRU),这是目前最常用的两种。循环神经网络架构。最后,我们还会介绍一个注意力模型:Attention-based model,这是近两年的研究热点。在下一章的实际项目中,我们将使用Attention-based模型和前面提到的LSTM等模型来解决一些实际问题。

    本章结构如下:

    图1 本章内容结构

    三个简单的循环神经网络

    简单循环网络(简称SRN),又称Elman网络,由Jeff Elman在1990年提出。Elman在Jordan网络(1986)的基础上进行了创新,并对其结构进行了简化,最终提出了Elman Jordan 网络和 Elman 网络的网络结构如下图所示。

    图 2 Jordan 网络(左)和 Elman 网络(右)

    引用自 ResearchGate 的图片:

    从图2可以直观地看出,两种网络结构的主要区别在于存储单元中存储的内容。Jordan网络的记忆单元保存了整个网络的最终输出,而Elman网络的记忆单元只保存了中间的循环层,所以如果是基于Elman网络的深度循环神经网络,那么就会有每个周期都有一个中间层。对应的内存单元。有兴趣进一步研究的读者可以参考 Elman 和 Jordan 的论文:~elman/Papers/fsit.pdf、~gary/PAPER-SUGGESTIONS/Jordan-TR-8604.pdf。

    Jordan网络和Elman网络都可以扩展到深度学习,但是由于Elman网络的结构更容易扩展(Elman网络的每个循环层相互独立,所以网络结构的设计可以更加灵活。另外,当Jordan网络的输出层和循环层的维度不一致时,需要进行额外的调整,而Elman网络则没有这个问题。),所以目前主流的循环神经网络都是基于Elman网络的,比如我们后面会介绍的LSTM。等待。因此,我们通常所说的循环神经网络(RNN)默认指的是Elman网络结构的循环神经网络。本书中提到的递归神经网络,除非另有说明,

    四个RNN的基本结构

    递归神经网络的基本结构如下图所示(注意:为清楚起见,图中并未画出所有连接线。):

    图3 循环神经网络的基本结构

    循环神经网络的结构有很多不同的图形描述,但表达的含义与图1一致。将循环神经网络的结构与一般的全连接神经网络进行比较,我们会发现循环神经网络只有多了一个记忆单元,这个记忆单元就是循环神经网络的关键。

    从图3可以看出前向和递归神经网络的区别,循环神经网络的记忆单元会保存当前循环层(即图3中的隐藏层)的状态,而此刻记忆单元的内容并且时刻的输入将被提供给循环层。. 为了更直观的表示,我们及时展开循环神经网络,如图 4 所示。

    如图4所示,左边是循环神经网络的简化示意图,右边是整个网络及时扩展的效果。左边是神经网络的输入,是输入层和隐藏层之间的权重矩阵,是记忆单元和隐藏层之间的权重矩阵,是隐藏层和输出之间的权重矩阵层,是隐藏层的输出,也是要存储在记忆单元中和下一刻一起作为输入的,是神经网络的输出。

    从右边展开的部分可以更清楚地看出,RNN隐藏层在每一时刻的输出都会传递到下一个时刻,所以网络每一时刻都会保留一定量的历史信息。前一时刻,结合当前时刻的网络。状态一起传递到下一个时刻。

    图4 循环神经网络及其按时间展开后的效果图,图片来自Nature

    理论上,RNN可以记忆任意长度的序列信息,也就是RNN的记忆单元可以保存之前很长一段时间的网络状态,但在实际使用中,我们发现RNN的记忆容量总是很大有限的。通常只能记住最近时刻的网络状态,在本章的第 4 节中,我们将详细讨论这个问题。

    五、RNN操作流程及参数更新

    1. RNN 的前向运算

    在完全连接的循环神经网络中,假设只有一个隐藏层。在神经网络接收到输入的那一刻,隐藏层的输出为:

    公式1

    上式中,函数为隐藏层的激活函数,TensorFlow中默认为tanh函数。前面介绍了参数U和W,它们分别是输入层和隐藏层之间的权重矩阵和记忆单元和隐藏层之间的权重矩阵,参数是偏置项。神经网络第一次训练时,记忆单元中没有前一时刻的网络状态,此时是一个初始值。

    得到隐藏层的输出后,神经网络的输出为:

    公式 2

    上式中,函数g()为输出层的激活函数。当我们在做分类问题时,通常会选择函数 g() 作为 Softmax 函数。参数V是从隐藏层到输出层的参数矩阵,参数是偏置项。

    我们先来看看TensorFlow源码中RNN隐藏层部分的计算。这部分代码在TensorFlow源码中的位置是:.

    在rnn_cell_impl.py文件中定义了一个抽象类RNNCell,其他实现RNN的类都会继承这个类,比如BasicRNNCell、BasicLSTMCell、GRUCell。我们以 BasicRNNCell 类为例。所有继承 RNNCell 的类都需要实现一个调用方法。BasicRNNCell类中call方法的实现如下:

    def call(self, inputs, state):
     """Most basic RNN: output = new_state
     = act(W * input + U * state + B)."""
     gate_inputs = math_ops.matmul(
     array_ops.concat([inputs, state], 1), self._kernel)
     gate_inputs = nn_ops.bias_add(gate_inputs, self._bias)
     output = self._activation(gate_inputs)
     return output, output
    

    从上面的TensorFlow源码可以看出,TensorFlow隐藏层的计算结果是该层的输出,同时也作为当前时刻的状态和下一时刻的输入。2、3行的注释解释了“call”方法的作用:output = new_state = act(W * input + U * state + B),实际上实现了我们之前给出的公式6.@ > 1. 第 5 行中的“self._kernel”是权重矩阵,第 6 行中的“self._bias”是偏置项。

    这里有一点需要注意。在实现W * input + U * state + B时​​,这段代码并没有分别计算W * input和U * state,然后将它们相加,而是先用“concat”方法将上一时刻的状态“state”与当前输入“inputs”进行拼接,然后将拼接后的矩阵与拼接后的权重矩阵相乘。有些读者第一次看到它时可能不明白。其实效果是一样的。让我们看下面的例子:

    我们有四个矩阵:a、b、c 和 d:

    公式 3

    假设我们要计算,我们有:

    公式 4

    如果我们先将矩阵 a 和 b、c 和 d 拼接在一起,我们得到两个矩阵 e 和 f:

    公式 5

    再次进行计算得到相同的结果:

    公式 6

    下面我们用一段代码来实现循环神经网络中完整的前向计算过程。

    上述代码中使用的RNN结构如下:

    图5 代码中使用的RNN网络结构

    在上面的示例代码中,我们使用了一个简单的递归神经网络,如图 5 所示。网络结构在输入层有两个单元,在隐藏层有两个神经元,在输出层有一个神经元,所有的激活函数都是tanh 函数。第四行代码我们定义了输入数据,一共三个时间步,每个时间步处理一个输入。我们将程序运行过程中各个参数的值和输入输出以表格的形式展示如下(读者可以使用下表中的数据查看RNN的前向运算加深印象):

    2. RNN 参数更新

    在 RNN 中更新参数有两种主要方法:时间反向传播 (BPTT) 和实时循环学习 (RTRL)。两种算法都基于梯度下降。区别在于BPTT算法通过反向传播更新梯度,而RTRL算法使用前向传播更新梯度。目前,在RNN的训练中,BPTT是最常用的参数更新算法。

    BPTT算法和我们在前馈神经网络上使用的BP算法本质上没有区别,只是RNN中的参数在时间上是共享的,所以RNN中的参数在计算梯度时是沿时间反向传播的。. 因此,RNN中参数的梯度是时间扩展后各级参数的梯度之和。

    本文介绍了一个简单的RNN网络的构建原理。在下一篇文章中,我们将以实战的形式介绍如何用TensorFlow实现RNN。

    站内大部分资源收集于网络,若侵犯了您的合法权益,请联系我们删除!
    欧资源网 » 基于实例掌握循环神经网络是如何解决序列化数据的问题的

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    欧资源网
    一个高级程序员模板开发平台

    发表评论