TensorFlow学习手册(四)
0 条评论前言
本节将描述一下循环神经网络与长短期记忆网络两种模型。
循环神经网络(RNN)
循环神经网络主要用于处理和预测序列化数据的。循环神经网络的来源就是为了刻画一个序列当前的输出和之前信息的关系,它的隐藏层之间的结点是有连接的,隐藏层的输入不仅包括输入层的输出,还包括上一时刻隐藏层的输出。
循环神经网络的经典形式
图1展示的是一个典型的循环神经网络,在每一时刻t,循环神经网络会针对该时刻的输入结合当前模型的状态给出一个输出,并更新模型的状态。在每一个时刻,循环神经网络的模块A在读取了x_t和h_{t-1}之后会产生本时刻的输出O_t。由于模块A中的运算和变量在不同时刻是相同的,因此循环神经网络理论上可以被看作是同一神经网络结构被无限复制的结果。循环神经网络是在不同时间位置共享参数,从而能够使用有限的参数处理任意长度的序列。
循环神经网络的展开形式
如果将完整的输入输出序列展开,就可以看到如图2所示的结构。从下图可以看出循环神经网络当前状态h_t和当前的输入x_t共同决定的。在时刻t,状态h_{t-1}浓缩了前面序列x_0,x_1,…,x_{t-1}的信息,用于作为输出o_t的参考。由于序列的长度可以无限延长,维度有限的h状态不可能将序列的全部信息都保存下来,因此模型必须学习只保留与后面任务o_t,o_{t+1},…相关的最重要的信息。
循环神经网络对长度为N的序列展开之后,可以视为一个有N个中间层的前馈神经网络。这个前馈神经网络没有训练链接,可以使用反向传播算法进行训练。循环神经网络要求每一个时刻都有一个输入,但是不一定每个时刻都需要有输出。
在循环神经网络中,被复制多次的结构称为循环体。图3是一个最简单的循环体结构。循环神经网络中的状态是通过一个向量来表示的,这个向量的维度也称为循环神经网络隐藏层的大小,假设其为n。从下图可以看出循环体中的神经网络的输入有两部分,一部分为上一时刻的状态,一部分为当前时刻的输入样本。对于时间序列数据来说,每一时刻的输入样例可以是该时刻的数值或者是单词向量。
循环神经网络唯一的区别在于因为它每个时刻都有一个输出,所以循环神经网络的总损失为所有时刻(或者部分时刻上)的损失总和。
长短期记忆网络(LSTM)
与单一tanh循环体结构不同,LSTM是一种拥有三个“门”结构的特殊网络结构,如图4所示。为了使循环神经网络更有效的保存长期记忆,“遗忘门”和“输入门”至关重要,它们是LSTM结构的核心。“遗忘门”会根据当前的输入x_t和上一时刻输出h_{t-1}决定哪一部分记忆需要被遗忘。“输入门”会根据x_t和h_{t-1}决定哪些信息加入到状态c_{t-1}中生成新的状态c_t。
图5是用流程图形式表示了LSTM单元的细节。
循环神经网络的变种
双向循环神经网络
在之前介绍的经典的循环神经网络中,状态的传输都是从前往后单向的,然而在有些问题中,当前时刻的输出不仅和之前的状态有关,也和之后的状态有关。双向循环神经网络是由两个独立的循环神经网络叠加在一起组成的。输出由这两个循环神经网络的输出拼接而成。如下图所示:
深层循环神经网络
深层循环神经网络是循环神经网络的另外一种变种。为了增强模型的表达能力,可以在网络中设置多个循环层,将每层循环网络的输出传给下一层进行处理。
循环神经网络样例程序
以时序预测为例,利用循环神经网络实现对函数sin x取值的预测。在以下程序中每隔SAMPLE_ITERVAL对sin函数进行一次采样,采样得到的序列就是sin函数离散化之后的结果。
1 | # -*- coding: utf-8 -*- |
- 本文链接:https://netycc.com/2018/11/17/TensorFlow学习手册(四)/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!
分享