在经过了一个周期迭代之后,猛地发现不记录一些东西是真的不行的,只有将知识娓娓道来,把自己当作一个教师的身份整理这些思路,才算真正的掌握了。故,将这一章的知识点整理记录下来,以供自己学习理解,查阅运用。
综述:
在前馈神经网络中,信息的传递是单向的,即网络的输出只依赖于当前的输入。但是在很多现实的任务中,网络的输出不仅和当前的输入有关还和之前的输入(当前的状态),甚至是以后的输入有关, 另外前馈神经网络难以处理时序数据,如视频、语音、文本,这类都是一些不固定长度的数据, 而前馈神经网络输入输出都是固定长度的,故很难去处理这一类时序数据。
而循环神经网络则是一类具有短期记忆功能的神经网络。不但可以接受其他神经元的信息,还可以接受自身的信息。形成环路。循环神经网络的参数学习可以通过随时间反向传播算法来学习。即按照时间的逆序将错误信息一步步的向前传递,但当序列较长时,会存在梯度爆炸和消失问题,这类可成为长程依赖问题,为解决,引入了门控单元。
给网络增加记忆能力:
前馈神经网络是静态网络不具有这类记忆能力,(反观循环网络类似递归一样,可将信息不断地进行筛选迭代处理反馈)。
1.延时神经网络 :
建立一个额外的延时单元,以此记录历史信息(输入输出隐状态)
2.有外部出入的非线性自回归模型:
3.循环神经网络:
通过带自反馈的神经元,能处理任意长度的时序数据。
隐藏层的活性值ht也称为状态或隐状态。
简单循环网络
表示在t时刻网络的输入,表示了隐藏层的状态,(隐藏层神经元活性值),不仅和当前输入有关,也和前一时刻的隐层状态有关。
简单循环神经网络和隐马尔可夫链大致无异,通过U状态-状态转移矩阵,和W状态输入矩阵,
循环网络可以看作是在时间维度上权值共享的神经网络。
应用到机器学习:
根据任务不同的特点可以分为,序列到类别模式、同步的序列到序列模式、异步的序列到序列模式。
-
序列到类别模式:主要用于序列数据的分类问题:
输入为序列,输出为类别,如文本分类中,输入数据为单词的序列,输出数据为文本的类别
将一个样本 ,输出为y={1,2,3,4....C} 将x按照不同时刻输入到循环神经网络中,得到不同时刻的隐状态ht ,ht+1等等, 可以将看作整个序列的最终表示,然后再输入给分类器进行分类。
除了将最后时刻的状态作为整个序列的表示之后,我们还可以对所有序列的状态进行平均,利用这个平均的状态作为整个序列的表示。
-
同步的序列到序列模型:用于序列标注问题
每一个时刻都有输入和输出,且其长度相同。如在词性标注中,每一个单词都需要标注其对应的词性标签。
输入为一个长度T的序列,输出为序列y(1-T) 样本x按不同时刻输入到循环神经网络中,并得到不同时刻的隐状态,每个时刻的都代表了当前时刻xt信息和前一时刻隐状态的历史信息。 (全部的包含信息?与后来的遗忘门f来做比较。)
然后再输入给g分类器 得到序列y。对真是标签y和预测的y_hat进行交叉熵得到损失函数,在进行梯度下降更新参数和梯度。
-
异步的序列到序列模型:
seq2seq中用到此类,也称为编码器-解码器 输入和输出不需要有严格的对应关系,也不需要有一致的长度。 如在机器翻译中,输入源语言序列,输出为目标语言序列,其长度不一定等长。
一般通过先编码后解码的过程来进行,先将输入序列x按不同时刻输入到编码器中得到其编码,然后再使用另外一个循环神经网络(解码器)进行解码得到输出y1_hat, 再将y1_hat和传递下来的隐状态 一起进行f2函数的传递, 采用自回归模型,每个时刻的输入都是上一时刻的预测结果。
参数学习:
- 随时间反向传播:误差项为第t时刻的损失对第k时刻隐藏神经层的净输入z(k) = Uh(k-1)+Wx(k)+b 的导数。
- 实时循环学习算法: 通过前向传播的方式来计算梯度。
两种算法的比较:都是基于梯度下降的算法,分别通过前向模式和反向模式应用链式法则进行计算梯度,循环神经网络中一般输出维度会远远低于输入维度,反向传播计算量小一些,但需要保存所有时刻的中间梯度,因此空间复杂度较高一些。而实时循环不需要梯度回传,非常适合需要在线学习或无限序列的任务中。
长程依赖问题:
由于梯度消失或者爆炸问题很难建立长时间间隔的状态之间的依赖关系。
为什么?
因为在误差项求导公式中,将其展开得到,
当>1时 t-k趋于无穷大 ,梯度也会变得很大 是误差项为第t时刻的损失对第k时刻隐藏神经层的净输入的导数。
造成系统很不稳定所以会有梯度爆炸问题。
而当<1时,梯度会趋向于0, 即间隔t-k(序列长时间间隔)较大时。t是第t时刻 k是第k时刻隐藏层神经元。 出现梯度消失问题。
参数U的更新主要是靠当前时刻t的几个相邻状态h(k)来更新。
- 改进方案:
一种最直接的方法是选取合适的参数,同时使用非饱和的**函数。尽量使得,这样就不出出现<1 ,>1出现梯度爆炸或者消失的问题了。但这种方式需要足够的人工调参经验,同时也限制了模型的广泛应用。
另外一种比较有效的方案是通过改进模型或优化方法来缓解该问题。
-
梯度爆炸: 比较容易解决,使用权重衰减 和 梯度截断 来解决。
权重衰减通过给参数增加L1和L2正则化来限制参数的取值范围。从而使<=1
梯度截断则是,当梯度的模大于一定阈值时,将其截断为一个较小的数。
2. 梯度消失:改变模型,令单位矩阵。
即
其中h(t)和h(t-1)是线性依赖关系 其权重系数为1 不存在爆炸或者消失的问题,大丢失了神经元在反馈边上非线性**的性质。
为避免 改进了策略如下:
这样h(t)和h(t-1)即有线性关系 又有了非线性的关系,可以缓解梯度消失的问题。 但仍然存在两个问题。
1.梯度爆炸问题
2.记忆容量问题 随着ht的不断累积存储新的输入信息,会发生饱和现象,就是说隐状态ht可存储的信息是有限的,随着时间积累,丢失的信息也越来越多。
为解决这两个问题,引入了门控机制。
基于门控的循环神经网络
为改善循环神经网络的长程依赖问题,引入了门控机制来控制信息的积累速度,包括有选择性的加入新的信息,有选择性的遗忘过去的信息, LSTM和GRU
- LSTM
引入了一个新的内部状态ct 专门进行线性的循环信息传递, 同时非线性的输出信息给隐藏层的外部状态ht
内部状态ct通过如下公式计算:
其中是通过非线性函数得到的候选状态。 是上一时刻的记忆单元。
i输入门 f遗忘门 o输出门
遗忘门f控制上一时刻内部状态c_t-1需要遗忘多少信息,
输入门i控制当前时刻的候选状态c~有多少个信息需要保存
输出门o控制当前时刻的内部状态c_t有多少信息需要输出给外部状态h_t
三个门是软门 ,取值在(0~1)之间,表示一定的比例允许信息通过,
其中是logistic函数,控制值域为0~1。
LSTM的计算过程如下:
1.首先利用当前时刻的输入和上一时刻的外部状态计算出三个门出来,以及候选状态。
2.然后结合遗忘门和输入门来更新记忆单元。
3.结合输出门,将内部状态的信息传递给外部状态。
可简单分为两步 一个是最上面线c控制的记忆单元长期内部状态流,另外一个就是外部输出状态h即存储了短期记忆信息,然后通过循环 再次遗忘记忆单元,且通过上一时刻的外部输出状态h_t-1来更新三个门。
记忆:
隐状态h存储了历史信息,可以看作记忆, 在简单的循环神经网络中,隐状态每个时刻都会被重写,因此可以看作一个短期记忆, 在简单的循环神经网络中,长期记忆可以看作是参数,U W B 隐含了从训练学习到的经验 其更新周期会远远吗慢于短期记忆。
而在LSTM中,记忆单元C可以在某个时刻捕捉到某个关键信息,并有能力将其保存一定时间间隔,记忆单元c保存周期要远远长于短期记忆h,但又远远短于长期记忆,因此称之为长短期记忆。 即长的短期记忆。
另,在LSTM中过小的值会使得遗忘门值比较小,因此遗忘门的数值都设置的比较大,其偏置向量bf设置为1或者2
门控循环单元网络:
GRU是一种比Lstm更为简单的循环神经网络,与LSTM相比 不引入额外的记忆单元,GRU也是在
的基础上增加了更新门,来控制当前状态需要从历史状态中保留多少信息,以及从候选状态中接受多少信息。
其中为更新门 [0-1].
在Lstm中输入门i和遗忘门f是互补的关系,具有一定的冗余性,GRU直接使用一个门控制输入和遗忘之间的平衡。
=0时,当前状态h_t和前一时刻状态h_t-1之间为非线性函数关系, 当=1时, 其两者之间为线性函数关系。
其中定义如下:
这里使用了tanh是由于其导数有较大的值域,所以能够缓解梯度消失的问题。
其中表示当前时刻的候选状态,为重置门
用来控制候选状态是否依赖于上一时刻的状态
当=0时,当前候选状态只与当前时刻t输出x_t有关,和历史状态h_t-1无关,
综上所述 GRU的状态更新公式如下:
图
深层循环网络
一方面。如果按时间展开,长时间间隔的状态之间的路径很长,可以很深的。
另一方面,如果同一时刻输入到输出之间的路径 x_t -> y_t之间又是非常浅的。
因此增加循环神经网络的深度从而增强循环神经网络的能力,主要是增加同一时刻,x_t到y_t之间的深度, 增加隐状态h_t到输出y_t,和输入x_t到h_t的深度。
双向循环神经网络:
有一些任务中,一个时刻的输出不但和过去时刻有关,还和后续时刻的信息有关联,如一个词的词性由其上下文来决定。因此我们增加了一个按照时间的逆序来传递信息的网络层,以此来增加网络的能力。
双向循环神经网络Bi-RNN
由两层循环神经网络组成,输入相同只不过是信息传递方向不同
总结如下:
由于梯度爆炸和梯度消失的问题,简单循环神经网络存在长程依赖的问题,为解决这个问题,最有效的方法是加入了门控机制。如LSTM和GRU,当然还有其他的一些方法如时钟循环神经网络,注意力机制等。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:循环神经网络总结整理(RNN、LSTM、GRU) - Python技术站