RNN原理
1.经典RNN结构
RNN全称是Recurrent Neural Networks,即循环神经网络。它是一种对序列型数据进行建模的深度模型。
首先复习一下基本的单层神经网络
单层神经网络的输入是,经过变换和**函数得到输出y。
在实际应用中,还会遇到一些序列数据。
原始的神经网络不太好处理序列数据。为了处理序列建模问题,RNN引入了隐状态
的概念。
可以对序列化的数据提取特征,接着再转换为输出。
图中是参数矩阵,b是偏置项参数,f是**函数,经典RNN中使用tanh。
的计算与类似。需要注意的是每个步骤中的参数都是共享的,这是RNN的重点特点。
依次画出剩下的h。(使用相同的参数U、W、b)
我们目前的RNN还没有输出,得到输出值的方法就是直接通过h进行计算:
这里的V和c是新的参数。对于分类问题,通常使用Softmax函数将其转变为各个类别的概率。
剩下的输出类似进行(使用和y1同样的参数V和c):
这就是最经典的RNN结构。
它的输入是,输出为,也就是说,输入和输出序列必须要是等长的。
由于这个限制,RNN的适用范围比较小。
RNN公式
最后给出RNN结构的严格数学定义:
设输入是,对应的隐状态为,输出为。
经典RNN的运算过程可以表示为
这里均为参数。f表示**函数,通常为tanh函数
LSTM原理
本节介绍RNN的一种改进版LSTM(Long Short Term Memory)。
回顾RNN的公式
从这个公式可以看出
RNN每一层的隐状态都由前一层的隐状态经过变换和**函数得到。反向传播求导时最终得到的导数会包含每一步梯度的连乘,这会引起梯度爆炸或梯度消失。所以RNN很难处理"长程依赖",即无法学到序列中蕴含的间隔较长的规律。
LSTM在隐状态计算的时候以加法代替了这里的迭代变化,可以避免梯度消失的问题,使网络学到长程的依赖。
一个RNN单元的输入由两部分组成:前一步的隐状态和当前步的外部输入。有一个输出。从外观来看,LSTM与RNN的输入输出一模一样。同样是在每一步接收外部的输入和前一阶段的隐状态并输出一个值。
和RNN有所不同,LSTM的隐状态有两部分,一部分是,一部分是.是各个步骤间传递的主要信息。通过加法,可以无障碍地在这条主干道上传递,因此较远的梯度也可以在长程上传播,这就是LSTM的核心思想。
不过,每一步的信息并不是完全照搬前一步的,而是在的基础上"遗忘"一些内容,以及"记住"一些新内容。
遗忘门
LSTM的每一个单元都有一个"遗忘门",用来控制遗忘掉的那些部分。如下图所示:
是Sigmoid**函数,它的输出在0~1之间。最终遗忘门的输出是和相同形状的矩阵,这个矩阵会和逐点相乘,决定要忘记哪些部分。
显然,遗忘门输出中越接近0的部分是要以遗忘的,而接近1的部分是要保留的。遗忘门的输入是(当前时刻的输入)和(上一时刻的隐状态)
记忆门
光遗忘不行,LSTM还需要记住新东西。所以就有了记忆门
记忆门的输入同样是(当前时刻的输入)和(上一时刻的隐状态)。
输出有两项,一项是,同样需要经过Sigmoid函数运算得到,因此值都在0~1之间。另一项是。
最终要记住的部分是和逐点相乘。
遗忘记忆结合
“遗忘”“记忆”的过程如下图所示,是遗忘门的输出( 0~l 之间 ), 而 是要记住的新东西。
这里得到的是在各个RNN中传递的主要信息
输出门
输出门用于计算另一个隐状态的值。真正的输出需要通过做进一步运算得到。
输出门的输入同样是(当前时刻的输入)和(上一时刻的隐状态)。并且需要加上遗忘门和记忆门中得到的
输出是隐状态
总结一下:在LSTM中,每一步的输入是,隐状态是和,最终输出通过进一步变换得到。