目录
1.循环神经网络概述
2. RNN 多结构详解
2.1 one-to-one
2.2 n-to-n
2.3 one-to-n
2.4 n-to-one
2.5 Encoder-Decoder (n-to-m)
3. RNN前向传播
4. RNN反向传播
5. LSTM 长程依赖问题
5.1 为什么提出LSTM
5.2 LSTM 概念与计算过程
5.3 LSTM网络详解(简书博主)
6. 门控循环单元(GRU)网络
7. 深层循环神经网络
8. 双向循环神经网络
为什么提出循环神经网络?
有一类问题DNN和CNN不好解决,就是训练样本输入是连续的序列,且序列的长短不一,比如基于时间的序列:一段段连续的语音,一段段连续的手写文字。这些序列比较长,且长度不一,比较难直接的拆分成一个个独立的样本来通过DNN/CNN进行训练。
全连接神经网络和卷积神经网络都属于前向反馈网络,模型的最终的输出和模型本身没有关联。而循环神经网络模型的前一刻时刻最终输出可以作为下一个时刻的输入从而学习到前面时刻的信息,因此循环神经网络可以很好的学习到时间序列数据中的序列关系,从而在处理时间序列数据的时候往往有很好的效果。
RNN概念
循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络,在循环神经网络中,神经元不但可以接受其他神经元的信息,也可以接受自身的信息,形成具有环路的网络结构。 RNN是一种特殊的神经网络结构, 它是根据"人的认知是基于过往的经验和记忆"这一观点提出的 ,可以专门用来处理时间序列数据。
循环神经网络是一种共享参数的网络:参数在每个时间点上共享。传统的前馈神经网络在每个时间点上分配一个独立的参数,因此网络需要学习每个时间点上的权重。而循环神经网络在每个时间点上共享相同的权重。
RNN的主要应用领域
自然语言处理(NLP),主要有视频处理, 文本生成, 语言模型, 图像处理;语音识别;图像描述生成 ;文本相似度计算。
完全图解RNN、RNN变体、Seq2Seq、Attention机制 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/28054589
最基本的单层网络,输入是x,经过变换Wx+b和激活函数f得到输出y
经典的RNN结构,输入、输出都是等长的序列数据。
令向量表示在时刻t 时网络的输入,表示隐藏层状态(即 隐藏层神经元活性值),则 不仅和当前时刻的输入 相关,也和上一个时刻的 隐藏层状态相关。
每一步使用的参数U、W、b都是一样的,参数在每个时间点上共享
单输入多输出,是把输入信息X作为每个阶段的输入
要处理的问题输入是一个序列,输出是一个单独的值而不是序列,只在最后一个h上进行输出变换
这种结构通常用来处理序列分类问题。如输入一段文字判别它所属的类别,输入一个句子判断其情感倾向,输入一段视频并判断它的类别等等。
输入、输出为不等长的序列。这种结构是Encoder-Decoder,也叫Seq2Seq,是RNN的一个重要变种。原始的n-to-n的RNN要求序列等长,然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。为此,Encoder-Decoder结构先将输入数据编码成一个上下文语义向量c
语义向量c可以有多种表达方式,最简单的方法就是把Encoder的最后一个隐状态赋值给c,还可以对最后的隐状态做一个变换得到c,也可以对所有的隐状态做变换。
拿到c之后,就用另一个RNN网络对其进行解码,这部分RNN网络被称为Decoder。Decoder的RNN可以与Encoder的一样,也可以不一样。具体做法就是将c当做之前的初始状态h0输入到Decoder中
还有一种做法是将c当做每一步的输入:
由于这种Encoder-Decoder结构不限制输入和输出的序列长度,因此应用的范围非常广泛,比如:
(1)代表在序列索引号t时训练样本的输入,同样的,和代表在序列索引号t−1和t+1时训练样本的输入。
(2)代表在序列索引号t时模型的隐藏状态,由x(t)和共同决定。
(3)代表在序列索引号t时模型的输出,只由模型当前的隐藏状态决定。
(4)代表在序列索引号t时模型的损失函数。
(5)代表在序列索引号t时训练样本序列的真实输出。
对于任意一个序列索引号t,我们隐藏状态
σ为RNN的激活函数,一般为tanh,b为线性关系的偏置项。
序列索引号t时模型的输出的表达式比较简单 :
在最终在序列索引号t时我们的预测输出为:
通常由于RNN是识别类的分类模型,所以上面这个激活函数一般是softmax。
过损失函数,比如对数似然损失函数,我们可以量化模型在当前位置的损失,即和的差距。
RNN反向传播算法通过梯度下降法一轮轮的迭代,得到合适的RNN模型参数U,W,V,b,c。由于我们是基于时间反向传播,所以RNN的反向传播有时也叫做BPTT(back-propagation through time)。
所有的U,W,V,b,c在序列的各个位置是共享的,反向传播时更新相同的参数。
BPTT算法将循环神经网络看作一个展开的多层前馈网络,其中“每一层”对应循环网络中的“每个时刻”。循环神经网络就可以按照前馈网络中的反向传播算法计算参数梯度,在“展开”的前馈网络中,所有层的参数是共享的,因此参数的真实梯度是所有“展开层”的参数梯度之和。
关于 RNN 循环神经网络的反向传播求导及Pytorch验证
关于 RNN 循环神经网络的反向传播求导 - 极客锋行 - 博客园 (cnblogs.com)https://www.cnblogs.com/geekfx/p/14264180.html
由于RNN模型如果需要实现长期记忆的话需要将当前的隐含态的计算与前n次的计算挂钩
计算量会呈指数式增长,导致模型训练的时间大幅增加。在神经网络参数更新的时候容易出现梯度消失或者梯度爆炸的情况,这样会导致神经网络不能很好的学习较长序列中的信息,因此RNN神经网络只具有短时的记忆。
相当长的相关信息和位置间隔
长短期记忆网络(Long Short-Term Memory Network,LSTM)是循环神经网络的一个变体,可以有效地解决简单循环神经网络的梯度爆炸或消失问题.
新的内部状态。LSTM网络引入一个新的内部状态(internal state) 专 门进行线性的循环信息传递,同时(非线性地)输出信息给隐藏层的外部状态 。
LSTM 网络引入门控机制(Gating Mechanism)来控制信息传递的路径。 三个“门”分别为输入 门、遗忘门和输出门。
(1) 遗忘门控制上一个时刻的内部状态需要遗忘多少信息
(2) 输入门控制当前时刻的候选状态̃ 有多少信息需要保存
(3) 输出门控制当前时刻的内部状态 有多少信息需要输出给外部状态.
其计算过程为:
1)首先利用上一 时刻的外部状态 和当前时刻的输入,计算出三个门,以及候选状态̃;
2) 结合遗忘门 和输入门 来更新记忆单元;
3)结合输出门 ,将内部状态的 信息传递给外部状态。
理解 LSTM 网络 - 简书 (jianshu.com)https://www.jianshu.com/p/9dc9f41f0b29
所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层
重复的模块拥有一个不同的结构。不同于单一神经网络层,整体上除了h在随时间流动,细胞状态c也在随时间流动,细胞状态c就代表着长期记忆。
逐步理解 LSTM
1. 遗忘门:决定丢弃信息
确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid
层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh
层创建一个新的候选值向量,̃,会被加入到状态中。下一步,我们会讲这两个信息来产生对状态的更新。
2. 输入门: 确定更新的信息
把旧状态与相乘,丢弃掉我们确定需要丢弃的信息。接着加上 。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。
3. 将过去与现在的记忆进行合并
4. 输出门
运行一个 sigmoid
层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh
进行处理(得到一个在-1 到 1 之间的值)并将它和 sigmoid
门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
门控循环单元(Gated Recurrent Unit,GRU)网络,是一种比LSTM网络更加简单的循环神经网络。 GRU 网络引入门控机制来控制信息更新的方式.和 LSTM 不同,GRU 不引 入额外的记忆单元,GRU网络引入一个更新门来控制当前状态需要从历史状态中保留多少信息(不经过非线性变 换),以及需要从候选状态中接受多少新信息。
增加循环神经网络深度的做法是将多个循环网络堆叠起来,称 为堆叠循环神经网络。一个堆 叠的简单循环网络也称为循环多层感知器。
双向循环神经网络(Bidirectional Recurrent Neural Network,Bi-RNN)由 两层循环神经网络组成,它们的输入相同,只是信息传递的方向不同。