循环神经网络(RNN)
循环神经网络(RNN)
zhou循环神经网络
期末复习资料整理
循环神经网络前言(未要求)
循环神经网络的诞生
和卷积神经网络的诞生类似,都是为了解决前馈神经网络无法解决的问题。
前馈神经网络的信息传递是单向的,前馈神经网络每次训练都是独立的,当层网络的输出只依赖当前的输入。但现实生活里,有许多的输出不仅和当前状态的输入相关,还与过去一段时间的输出相关。比如有限自动状态机(可以实现正则表达式匹配)其下一个时刻的状态(输出)不仅仅和当前输入相关,也和当前状态(上一个时刻的输出)相关
前馈神经网络是静态模型,要求输入输出都是固定的,但是视频、语音、文本等时序数据的长度不固定,前馈神经网络就难以作用
循环神经网络简介
循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆
能力的神经网络.在循环神经网络中,神经元不但可以接受其他神经元的信息,也可以接受自身的信息,形成具有环路的网络结构.
循环神经网络有以下特征:
- 时间动态性:RNN能够处理和生成序列数据。它们可以将过去的信息通过隐藏状态传递到未来的计算过程中。
- 内部记忆:RNN具有一种“内部记忆”机制,它能够在处理序列时存储之前的信息,这有助于网络在预测未来事件时考虑到之前的上下文。
- 参数共享:在RNN中,对于序列的每一个时间步,模型参数是共享的。这种参数共享使得RNN能够处理不同长度的序列。
循环神经网络的基本结构是:输入层、循环层、输出层
如何给网络增加记忆功能
老师在课程中通过:前馈神经网络、有限自动状态机和图灵机来进行引入
前馈神经网络
提这个是在说万能近似定理,具有足够数量神经元的单隐层前馈神经网络可以以任意精度近似任何连续函数。这个对应了循环神经网络的函数部分
有限自动状态机(FSA)
老师引入的内容是:如何使用RNN模拟有限自动状态机,这应该是老师参考的文章编程——有限自动机 - 知乎 (zhihu.com)
FSA由一组有限的状态组成,以及在这些状态之间根据输入进行转换的规则。比如,一个简单的FSA可能有两个状态:状态A和状态B。当它读取特定的输入(比如一个字符)时,它会根据这个输入从一个状态转换到另一个状态。RNN有一个“隐藏状态”,这个状态可以捕获过去信息的某种表示。每次接收到新的输入时,RNN都会更新其隐藏状态。这个隐藏状态可以看作是网络的“记忆”。我们可以设计一个有两个单元的隐藏层,每个单元对应一个FSA状态。来实现有限状态自动机的功能
图灵机
(其实我不太理解为什么会提这个)图灵机讲的是可计算问题,可计算问题是指那些能够被计算机程序在有限时间内解决的问题。RNN能处理的诸如文本分类、情感分析、机器翻译等任务都可以被视为可计算问题。可计算问题是图灵机的基础,根据下面的图灵机和有限自动状态机与RNN的联系,可以视可计算问题为RNN的基础。
图灵机的结构:
- 无限长纸带:纸带被划分为离散的单元格,每个单元格可以写入一个符号(如0和1)。纸带是无限长的,理论上可以无限扩展。
- 读写头:一个可以沿着纸带移动的头,能够读取当前单元格的符号,并且可以写入新的符号或擦除原有符号。
- 状态寄存器:存储图灵机当前的状态。图灵机有一组有限的状态,包括一个特殊的开始状态和一个或多个结束状态。
- 转移函数:这是一个定义图灵机如何根据当前状态和读写头读取的符号来改变状态、写入新符号,并移动读写头的规则。
图灵机的工作过程
开始于一个初始状态,读写头位于纸带的某个位置。然后,根据当前状态和读写头下的符号,查找转移函数来决定下一步的操作:写入或擦除符号、移动读写头(左或右移一格)以及转换到下一个状态。这个过程持续进行,直到图灵机达到一个结束状态,此时计算停止。其实这个状态转换很像有限自动状态机。
最后得出的引子是,我们如何给前馈神经网络增加记忆能力?
给网络增加记忆能力有三种方式:延时神经网络、自回归模型、循环神经网络
自回归模型(AR)
自回归模型就是给模型加上记忆能力的一种方式
自回归模型(AutoRegressive Model,AR)是统计学上常用的一类时间序列模型,用一个变量的历史信息来预测自己
其中𝐾 为超参数,为可学习参数,为第个时刻的噪声, 方差和时间无关.
为什么自回归模型叫自回归模型
首先他是个回归模型,需要落实到预测上面去。在时间序列上,它预测的就是未来时间的值。叫自回归,是因为它使用的是滞后值,也就是过去的值来进行预测的。而不是以来与其他数据之间的建模。所以叫自回归模型
有外部输入的非线性自回归模型(NARX)
有外部输入的非线性自回归模型是自回归模型的拓展。在每个时刻𝑡 都有一个外部输入,产生一个输出.NARX通过一个延时器记录最近次的外部输入和最近次的输出,第t个时刻的输出为
其中表示非线性函数,可以是一个前馈神经网络,和为超参数
循环神经网络基本构架
循环神经网络(Recurrent Neural Network,RNN)通过使用带自反馈的神经元,能够处理任意长度的时序数据.循环神经网络也会被翻译为递归神经网络,但实际递归神经网络是(Recursive Neural Network,RecNN)
给定一个输入序列,循环神经网络通过下面公式更新带反馈边的隐藏层的活性值:
其中,是一个非线性函数,可以是一个前馈网络。
接下来的循环神经网络通用近似定理和图灵完备,都是循环神经网络的理论基础
循环神经网络通用近似定理
由于循环神经网络具有短期记忆能力,相当于存储装置,因此其计算能力十分强大.理论上,循环神经网络可以近似任意的非线性动力系统.前馈神经网络可以模拟任何连续函数,而循环神经网络可以模拟任何程序.
动力系统:动力系统是指系统状态按一定的规律随时间变化的系统。这个概念有两个关键点,一个是系统状态,另一个是随时间变化。直接和上面知识点连接起来,将循环神经网络用动力系统描述也不难理解。
如果按照状态和时间变化的角度看待循环神经网络更新带反馈边的隐藏层的活性值这也可以是个动力系统,所以也被叫做状态或者隐状态
而该定理具体内容为:如果一个完全连接的循环神经网络有足够数量的 sigmoid 型隐藏神经元,它可以以任意的准确率去近似任何一个非线性动力系统
其中为每个时刻的隐状态,是外部输入,是可测的状态转换函数,是连续输出函数,并且对状态空间的紧致性没有限制.
至于证明过程暂不深究
图灵完备
图灵完备是指一种数据操作规则,比如一种计算机编程语言,可以实现图灵机(Turing Machine)的所有功能,即解决所有的可计算问题,就被叫做图灵完备。目前的主流编程语言都是图灵完备的。
该定理内容为:所有的图灵机都可以被一个由使用Sigmoid型激活函数的神经元构成的全连接循环网络来进行模拟.
循环神经网络和图灵完备作为理论基础证实了一个完全连接的循环神经网络可以近似解决所有的可计算问题
简单循环网络
这里介绍一个简单循环神经网络:只有一个隐藏层的神经网络
.在一个两层的前馈神经网络中,连接存在相邻的层与层之间,隐藏层的节点之间是无连接的.而简单循环网络增加了从隐藏层到隐藏层的反馈连接。
令向量表示在时刻时网络的输入,表示隐藏层状态(即隐藏层神经元活性值),则不仅和当前时刻的输入相关,也和上一个时刻的隐藏层状态相关.简单循环网络在时刻的更新公式为
也可以直接写为
其中为隐藏层的净输入,为状态-状态权重矩阵,为状态-输入权重矩阵,为偏置向量,是非线性激活函数,通常为Logistic 函数或Tanh函数.
如果我们把每个时刻的状态都看作前馈神经网络的一层,循环神经网络可以看作在时间维度上权值共享的神经网络.
其实简单循环神经网络的重点
就是:每个时间步的隐藏状态由当前时间步的输入和前一时间步的隐藏状态共同决定。
循环神经网络的三种类型
序列到分类
序列到类别模式主要用于序列数据的分类问题:输入为序列,输出为类别.比如在文本分类中,输入数据为单词的序列,输出为该文本的类别.
具体是假设一个样本为一个长度为的序列,输出为一个类别.我们可以将样本按不同时刻输入到循环神经网络中,并得到不同时刻的隐藏状态.我们可以将看作整个序列的最终表示(或特征)
,并输入给分类器进行分类。这个分类器可以是简单线性分类器(逻辑回归)或者更复杂的分类器(多层前馈神经网络)
即
此外,如果把对整个状态进行求平均,并用最后平均结果来表示整个序列的最终表示。即
可以查看这个图理解
同步序列到序列
同步的序列到序列模式主要用于序列标注(Sequence Labeling)任务
,即每一时刻都有输入和输出,输入序列和输出序列的长度相同.比如在词性标注(Part-of-Speech Tagging)中,每一个单词都需要标注其对应的词性标签.
在同步的序列到序列模式中,输入为一个长度为的序列,输出为序列.样本按不同时刻输入到循环神经网络中,并得到不同时刻的隐状态.每个时刻的隐状态代表了当前时刻和历史的信息,并输入给分类器得到当前时刻的标签,即
同步的含义就是输入和输出的规模是一样的
异步序列到序列
异步的序列到序列模式也称为编码器-解码器(Encoder-Decoder)模型,即输入序列和输出序列不需要有严格的对应关系,也不需要保持相同的长度.比如在机器翻译中,输入为源语言的单词序列,输出为目标语言的单词序列
具体的实现是,输入为长度为的序列, 输出为长度为的序列.异步的序列到序列模式一般通过先编码后解码的方式来实现
.
- 先将样本按不同时刻输入到一个循环神经网络(编码器)中,并得到其编码.
- 然后再使用另一个循环神经网络(解码器),得到输出序列.为了建立输出序列之间的依赖关系,在解码器中通常使用非线性的自回归模型.
令和分别为用作编码器和解码器的循环神经网络,则编码器-解码器模型可以写为
其中为分类器,在解码器通常采用自回归模型,每个时刻的输入为上一时刻的预测结果。在下方的图中EOS表示输入序列的结束。还是挺好理解的。
异步的意思就是输入和输出的规模不一定一样
循环神经网络的训练和BP传播
循环神经网络训练的目的无非是调参,用来最小化预测误差。所以问题落在怎么调参上面,调参也就是计算梯度,循环神经网络有两种方法进行计算梯度: 随时间反向传播算法和实时循环学习算法。
随时间反向传播算法
随时间反向传播(BackPropagation Through Time,BPTT)算法的主要思想是通过类似前馈神经网络的错误反向传播
算法来计算梯度
BPTT算法将循环神经网络看作一个展开的多层前馈网络,其中“每一层”对应循环网络中的“每个时刻”。这个思想跟简单循环神经网络是一致的。所以他们的图也都是一样。
这样,循环神经网络就可以按照前馈网络中的反向传播算法计算参数梯度.在“展开”的前馈网络中,所有层的参数是共享的,因此参数的真实梯度是所有“展开层”的参数梯度之和。
接下来尝试讲解一下是怎么反向的吧,应当是不会考的
首先反向传播是在已经进行过输出了,现在要根据输出调整权重参数。调整权重参数一是需要计算损失;二是需要计算梯度,也就是求导。
计算损失
损失函数计算的是,预测值和实际值之间的区别。通常用的损失函数是交叉熵函数和均方误差,看实际情况确定。计算出来的损失值,也就是整个训练中要减少的对象。
给定一个训练样本 (𝒙, 𝒚),其中为长度是的输入序列,是长度为的标签序列.即在每个时刻,都有一个监督信息,我们定义时刻的损失函数为
其中是时刻的输出,为可微分的损失函数
所以整个序列的损失函数为
而在循环神经网络的学习过程中,有两种权重,一是记忆部分的状态-状态的权重;二是当前输入状态的状态-输入的权重,这两种权重都是需要计算的
根据简单循环神经网络的公式
需要求导的部分:
计算梯度
为了方便只讲解的求导过程
因为是反向传播,所以是从输出层开始进行梯度计算,然后通过链式法则反向传播到网络的每个时间步和层,首先还是这个公式,我们回到它的输入
然后计算,在时刻的偏导
剩下内容过于数学,就不推了。最后反向传播的图长这样
最后的三个需要计算的参数的梯度计算为
误差项是第𝑡时刻的损失对第𝑘时刻隐藏神经层的净输入的导数
实时循环学习算法(未要求)
与反向传播的 BPTT 算法不同的是,实时循环学习(Real-Time Recurrent Learning,RTRL)是通过前向传播
的方式来计算梯度
就先不关注数学过程了,好像我们在也提到过前向这个概念。在前馈神经网络的训练里面,得经过前向计算、计算损失、反向传播和更新参数这个过程。为什么前向是在前馈神经网络里面不是调整权重的过程呢?而在循环神经网络里面反而可以用来调参了?
原因很简单,前向指的是一个方向,是从输入到输出还是从输出到输入?它关注的是这个问题,前向计算并没有关注某一个特定的计算过程。而在循环神经网络里面的前向计算,是要求网络在计算隐藏层的同时也计算损失函数,再更新参数
,随着网络由输入到输出,这个计算过程也是前向的
总结
RTRL算法和BPTT算法都是基于梯度下降的算法,分别通过前向模式和反向模式应用链式法则来计算梯度.在循环神经网络中,一般网络输出维度远低于输入维度,因此 BPTT 算法的计算量会更小,但是 BPTT 算法需要保存所有时刻的中间梯度,空间复杂度较高.RTRL算法不需要梯度回传,因此非常适合用于需要在线学习或无限序列的任务中。
其实卷积神经网络也有这部分,不过老师没要求,我也就没写
长程依赖问题
循环神经网络在学习过程中的主要问题是由于梯度消失或爆炸问题,很难建模长时间间隔(Long Range)的状态之间的依赖关系
在上面我们在随时间反向传播(BPTT)算法的推导的最后,提到的误差项,也就是第𝑡时刻的损失对第𝑘时刻隐藏神经层的净输入的导数
将公式展开得到
如果定义一个
那么
梯度爆炸和梯度消失
从上方的公式就能推导出梯度爆炸和梯度消失了
如果,当时,如果很大,梯度就会很大,产生梯度爆炸问题
如果,当时,如果很大,梯度就会很小,产生梯度消失问题
值得注意的是,循环神经网络中的梯度消失,到底指的是哪个参数的梯度的消失
消失的是,而不是
当间隔比较大时,简单神经网络很难建模这种长距离的依赖关系,这就被称为长程依赖问题
梯度爆炸改进方案
为了避免梯度爆炸或消失问题,一种最直接的方式就是选取合适的参数,同时使用非饱和的激活函数,尽量使得
权重衰减/L2正则化
权重衰减是通过给参数增加L2 正则化项来限制参数的取值范围,从而使得
L1正则化主要是促进模型稀疏性在梯度爆炸问题上没用
L2正则化是通过在损失函数中添加权重的平方和项来实现。
在加入L2正则化后,损失函数可以写成
其中,是原始的损失函数,是正则化参数,是模型的权重
L2正则化通过惩罚较大的权重值,鼓励模型学习较小的权重。这意味着网络权重的更新不太可能会有极大的波动,有助于避免梯度爆炸问题
梯度截断
当梯度的模大于一定阈值时,就将它截断成为一个较小的数
梯度消失改进方案
模型改进
比如让,同时令为单位矩阵,即
这样和之间为线性依赖关系,且权重系数为 1,这样就不存在梯度爆炸或消失问题.但是,这种改变也丢失了神经元在反馈边上的非线性激活的性质,因此也降低了模型的表示能力.
为了避免这个缺点,可以使用残差的思想
这样就有线性和非线性的关系的了,但依然会导致两个问题:
-
梯度爆炸问题
-
记忆容量问题.:随着不断累积存储新的输入信息,会发生饱和现象.假设为 Logistic 函数,则随着时间 𝑡 的增长,会变得越来越大,从而导致𝒉变得饱和.也就是说,隐状态可以存储的信息是有限的,随着记忆单元存储的内容越来越多,其丢失的信息也越来越多
为了解决上述问题,可以通过引入门控机制来进一步改进模型
LSTM
目前主流的 LSTM 网络用三个门来动态地控制内部状态应该遗忘多少历史信息,输入多少新信息,以及输出多少信息.我们可以对门控机制进行改进并获得LSTM网络的不同变体.
无遗忘门的LSTM网络
其内部状态更新为
如之前的分析,记忆单元 𝒄 会不断增大.当输入序列的长度非常大时,记忆单元的容量会饱和,从而大大降低LSTM模型的性能
peephole 连接
三个门不但依赖于输入和上一时刻的隐状态,也依赖于上一个时刻的记忆单元
耦合输入门和遗忘门
LSTM 网络中的输入门和遗忘门有些互补关系,因此同时用两个门比较冗余.为了减少LSTM网络的计算复杂度,将这两门合并为一个 门.令,内部状态的更新方式为
GRU
门控循环单元(Gated Recurrent Unit,GRU)网络是一种比LSTM网络更加简单的循环神经网络
GRU 网络引入门控机制来控制信息更新的方式.和 LSTM 不同,GRU 不引入额外的记忆单元,GRU网络引入一个更新门(Update Gate)来控制当前状态需要从历史状态中保留多少信息(不经过非线性变 换),以及需要从候选状态中接受多少新信息,
即,将
修改为
其中为更新门
在LSTM网络中,输入门和遗忘门是互补关系,具有一定的冗余性.GRU网 络直接使用一个门来控制输入和遗忘之间的平衡.当时,当前状态和前一时刻的状态之间为非线性函数关系;当时,和之间为线性函数关系
后面是怎么工作的…就不写了,考到就认输了
堆叠神经网络
一种常见的增加循环神经网络深度的做法是将多个循环网络堆叠起来,称为堆叠循环神经网络。一个堆叠起来的简单循环网络也被称为多层循环感知机,其实也就是,第层网络是第层网络的输出。
其中、和为权重矩阵和偏置向量,.
双向循环神经网络
在有些任务中,一个时刻的输出不但和过去时刻的信息有关,也和后续时刻的信息有关.比如给定一个句子,其中一个词的词性由它的上下文决定,即包含左右两边的信息.因此,在这些任务中,我们可以增加一个按照时间的逆序来传递信息的网络层,来增强网络的能力.
双向循环神经网络(Bidirectional Recurrent Neural Network,Bi-RNN)由两层循环神经网络组成,它们的输入相同,只是信息传递的方向不同.
如果将循环神经网络按时间展开,每个时刻的隐状态看作一个节点,那 么这些节点构成一个链式结构,每个节点 𝑡 都收到其父节点的消息(Message),更新自己的状态,并传递给其子节点.而链式结构是一种特殊的图结构,我们可以比较容易地将这种消息传递(Message Passing)的思想扩展到任意的图结构上.
递归神经网络
递归神经网络(Recursive Neural Network,RecNN)是循环神经网络在有向无循环图上的扩展.递归神经网络的一般结构为树状的层次结构.当递归神经网络的结构退化为线性序列结构时,递归神经网络就等价于简单循环网络.
递归神经网络主要用来建模自然语言句子的语义.给定一个句子的语法结构(一般为树状结构),可以使用递归神经网络来按照句法的组合关系来合成一个句子的语义.句子中每个短语成分又可以分成一些子成分,即每个短语的语义都可以由它的子成分语义组合而来,并进而合成整句的语义.
同样,我们也可以用门控机制来改进递归神经网络中的长距离依赖问题,比如树结构的长短期记忆模型就是将 LSTM 模型的思想应用到树结构的网络中,来实现更灵活的组合函数.
图神经网络
在实际应用中,很多数据是图结构的,比如知识图谱、社交网络、分子网络等.而前馈网络和反馈网络很难处理图结构的数据.图神经网络是将消息传递的思想扩展到图结构数据上的神经网络
对于一个任意的图结构𝐺(𝒱, ℰ),其中𝒱表示节点集合,ℰ表示边集合.每条边表示两个节点之间的依赖关系.节点之间的连接可以是有向的,也可以是无向的.图中每个节点 𝑣 都用一组神经元来表示其状态,初始状态可以为节点 𝑣 的输入特征.每个节点可以收到来自相邻节点的消息,并更新自己的状态