深度学习---循环神经网络RNN详解(LSTM)

上一节我们详细讲解了RNN的其中一个学习算法即BPTT,这个算法是基于BP的,只是和BP不同的是在反向传播时,BPTT的需要追溯上一个时间的权值更新,如下图,当前时刻是s(t),但是反向传播时,他需要追溯到上一个时间状态即s(t-1),s(t-2),....直到刚开始的那个时间,但是根据BP我们知道存在一个梯度消失的问题,因此追溯的层数越深,梯度消失的越厉害,基本上追溯到5个时间段时梯度就为0了,另外这里需要再次强调的是每一次追溯上一个时间状态权值更新时是更新所有的u和v的即联动的,因此这里的u和v 的更新是累加的,原因就体现在这里,他每追溯上一层权值更新,其他的层的更新也会跟着变化,简单来说,就是每追溯一层权值就会叠加更新即上一层的叠加。这里需要大家理解,也就是说,虽然RNN实际就三层,但是随着RNN的时序展开机会变得很深,也因此会出现梯度消失的现象,一旦出现梯度消失带来的问题是什么的呢?

深度学习---循环神经网络RNN详解(LSTM)_第1张图片

我们都知道RNN的强项是针对时间序列的进行处理,在自然语言处理中我们判断一句话往往需要上下文件信息进行判断,如果上下文间隔很长,因为RNN存在梯度消失的情况,因此可能很远的上下文就无法起到用处了,怎么办呢?具体如下图:

深度学习---循环神经网络RNN详解(LSTM)_第2张图片

 从上图我们可以看到,随着追溯的时间越长,其梯度消失 的越厉害,直到完全消失,如何解决呢?LSTM可以很好的解决这个问题,下面我们看看到底怎么解决的:

我们知道了BPTT的缺点是梯度消失,他是由什么引起的呢?下面我们详细看看:我们知道引起梯度消失是因为误差反向传播,下面简单的把BPTT的公式拿过来:

                           其中                  

                                                   

                                                 

上面是标准的BP的反向传播误差,最后一个公式是隐层的权值更新,即当前时刻需要下一时刻的误差(这里和上面的表达可能有点冲突,不过道理是一样的,大家需要适应),这样才叫误差反向传播,这里我们看一次的传播:

通过上式我们发现误差信号即梯度取决于三个量即\large f'(\bullet )\large \upsilon\large w,那么梯度的 消失直接由这三个参数决定,消失的原因是每次乘积小于1,从这个公式中如何解决问题呢?

Naive Approach

这里我们知道其中\large \upsilon是后面的时间序列传过来的数,这里无法改变,那么我们能不能让\large f'(\bullet )w做恒等映射的天真想法呢?即如下:

很天真的想法,这样做当然可以了,怎么实现呢?这里\large w_{ii}是隐层的延迟叠加的参数即追溯时间的参数,这里大家别晕了,如何实现呢?我们可以使\large w_{ii}=1,而\large f(x)=x为恒等映射和我们前面的深度残差网络类似的映射,这样才能保证乘积为1,因此这样可行即:           

 带进去上面的式子得到:

                                             

使 \large w_{ii}=1\large f(x)=x会带来什么问题呢?问题很严重,主要表现在两方面即输入权值冲突和输出权值冲突:

1.输入权值冲突:

深度学习---循环神经网络RNN详解(LSTM)_第3张图片

加入上式就是RNN的输入和隐层,\large w_{ij}就是输入到隐层的权值,\large w_{jj}就是隐层延迟一个单元反馈给隐层的权值,这里给恒值为1,同时激活函数为恒等映射即\large f(x)=x,这样做会带来什么问题呢?加入我们输入的是句子,那么当前时刻t的词受到前面的某一个t-a时刻的状态影响,其他时刻的状态和当前时刻没影响,现在我们想要的效果是t-a的那个状态对当前时刻的影响大一点即\large w_{ij}尽量大一点,其他状态的权值尽量的小,这样才能体现之前的时刻影响当前时刻的要求,但是按照我们上的设置,很明显是有冲突的,因为他是恒等映射而且\large w_{ij}=1,也就是说无论前面的哪一个时刻的状态我都让他影响当前时刻输入的状态,这样明显不是我们想要的,因此矛盾就出现了。出现矛盾的原因是我们把权值设置为1了,但是我们设置权值为1的目的是为了解决梯度消失问题,因此第一矛盾就是这样形成的。

2.输出权值冲突:

深度学习---循环神经网络RNN详解(LSTM)_第4张图片

输出和输入是类似的,这里我们需要通过调整\large w_{kj}来调整输出的大小,这样才能筛选输出的大小,然而输出的权值\large w_{kj}取决于隐层的输出的大小进行调节的,这里我们就需要隐层的大小可大可小,这样调整调整的目的就是我们希望相邻时间序列对当前的神影响大一些,很长时间的对其影响小一点,但是想达到这样的效果需要就需要隐层权值\large w_{ij}可变化调整,但是我们设置的是为1,激活函数为恒等映射所有无论什么时间的他都会影响输出的权值,这不是我们想要的,这也是冲突的根源的了。

因此因为上面的两个缺点才导致RNN没有什么具体的使用价值,但是后面出现了LSTM才很好的解决了这个问题,也因此RNN得到了大范围的使用,尤其在时间序列的场合如自然语言处理更是发挥巨大的作用,下面我们就详细的看看LSTM是如何解决这个问题的。

 LSTM(LONG SHORT-TERM MEMORY)

原始LSTM:

这里我们根据原始论文的图进行讲解,虽然现在的LSTM和原先的有所不同,但是它还是在原始的LSTM的基础上进行演变,大家只要深入理解这个原始的LSTM 的原理,在学习新的LSTM就会觉得很简单,上面我们讨论了为了解决RNN的梯度消失问题,我们引入了天真的方法即Naive Approach,但是带来了更多的问题,即无法解决我们想要达到的效果,为了解决这个问题,研究者们又引入了新的解决方法即原始的LSTM,下面我们就来看看到底是如何解决的:

深度学习---循环神经网络RNN详解(LSTM)_第5张图片

这里大家千万别被图吓到了,其实很简单的,这里我会相信的介绍的,上图被正方形覆盖的就是“隐层”了,我们现在从左向又看,首先输入乘上\large W_{c_ji}代表的输入权值(\large c_j表示第j个记忆细胞,就是说上面的方块内是一个记忆细胞),然后输入到激活函数\large g(\bullet ) ,然后输出,此时通过黑点(相乘)即\large gy^{in_j},这里的g大家知道是输入值,而\large y^{in^j}是一个开关即门函数,他输出一个0到1的数,然后和g相乘,作用等会解释。相乘以后就进入了核心区即红线画的地方,这里其实就是我们上面说的天真方法即恒等映射和权值为1(从这一步我们可以看出原始的LSTM还是希望解决梯度消失的问题),经过天真处理后,开始通过隐层的激活函数h然后继续向后传,此时会到达一个黑点(相乘)即\large hy^{out_j},同样的这里的\large y^{out_j}也是一个门函数,稍后解释。通过门函数以后就乘上权值输出了,整体是这样工作的,从上面的工作方式我们可以看到,LSTM是在天真的方法的基础上进行改进的,即还是希望解决梯度消失问题,但是这样做会引入我们上面讨论的两个冲突,为了解决这两个冲突,又引入了们函数即\large y^{in^j}\large y^{out_j},这两个函数有什么用呢?这两个函数主要是决定是否允许数据通过的作用,这里以\large y^{in^j}为例讲解,我们输入的有没有效果取决于\large y^{in^j}的大小,如果\large y^{in^j}=0,则输入完全被断开了即不允许输入进来,如果\large y^{in^j}=1,则输入完全通过,如果取值在0,1之间说明允许部分通过,同理输出\large y^{out_j}也是这样的功能,引入这两个门有什么好处呢?其实大家可以想想,若果RNN的隐层反向传播,此时当前时刻的输入和前一时刻的输入一起进来,通过这里的门就可以控制上一时刻进入的量,这样就解决了我们最初的想法即我希望前某一时刻对当前影响大就让其通过,影响小使其不通过,同时梯度不会消失,很巧妙的解决了难题,同时达到我们想要的效果,这里大家需要好好理解一下,那大家会不会困惑就怎么设置他什么时候打开什么时候关闭呢?这个只需要通过数据训练即可,使其自动调整好,只有怎么训练就是我们下面需要详细说的,这里大家需要先整体理解他的工作原理。

    到这里我们找到了解决方面即设置两个门,控制这两个门的大小就可以完美解决问题,现在的问题是如何设置这两个门?门和什么有关?如何训练呢?

下面先给出上图的数学描述:

先给出两个门的表达式:

这里大家应该都能看懂的,门函数也是需要激活函数的,上图没标明,下面继续:

 上式的求和是什么意思呢?就是说门函数的输入可能来源输入单元、门单元、记忆细胞、还有可能是‘隐层’单元。下面我们具体来看一下他们的输入到底来源哪些:

这就是基于LSTM的神经网络,上面我们说了他们是一个整体即一个记忆细胞,如上图,这里也有输入门和输出门,这里我以in1为例进行讲解他的输入来源哪里(看不清的下面我出论文,大家看原始论文),in1的输入来源输入和in1的输出、out1的输出、以及cell1的输出和cell2的输出,如上面的红线标注。这里大家还有继续看LSTM的图,需要继续讨论:

我们看到:

 这个是什么意思呢?这个就是追溯上一时刻的写法,其实就是累加(上一节讨论了),上一时刻的累加取决于门函数,因此起到控制作用,下面给出详细的公式:

 这个大家应该能看懂了,就不详细解释了,好,上面就是最初的LSTM,我们看看现代版的LSTM:

现代LSTM

深度学习---循环神经网络RNN详解(LSTM)_第6张图片

我们发现和我们上面的很像,不同的是这里多了一个忘记门,这个门是直接对细胞操作的,他有什么作用呢?他是模拟人脑提出的,即短时间的我们记住他,时间太长的我们选择忘记他,应该是根据这个思想吧(我猜的),反正这是后面添加上去的,那我们看看这三个门的输入是那些?我就不详细说了,大家看看就可以了:

深度学习---循环神经网络RNN详解(LSTM)_第7张图片

 上面的输入很类似,不同的是作用的地点不同,至于他们什么时候开什么时候关,就是通过训练他们的权值进行确定了,下面再给出一个训练好的图:

深度学习---循环神经网络RNN详解(LSTM)_第8张图片

下面把学习算法说一下,大家看下面的公式时需要时刻看上面的那个输入输出忘记门是来源哪几个,这里我急不详细介绍了,直接把原始论文的公式搬来了,大家也可以看看原始论文,学习算法是基于梯度的即:

前项传播

输入门:

深度学习---循环神经网络RNN详解(LSTM)_第9张图片

忘记门:

深度学习---循环神经网络RNN详解(LSTM)_第10张图片

细胞:

深度学习---循环神经网络RNN详解(LSTM)_第11张图片

输出门:

深度学习---循环神经网络RNN详解(LSTM)_第12张图片

细胞输出:

 反向传播:

细胞输出:

输出门:

states(状态) :

细胞:

忘记门:

输入门:

 参考论文有:

BackPropagation Through Time、Learning_Long-Term_Dependencies_with_Gradient_Descent_is_Difficult

LONG SHORT-TERM MEMORY、Supervised-Sequence-Labelling-with-Recurrent-Neural-Networks

写吐了,本节结束,深度学习也结束了,下面写写这段时间的总结,然后开始自然语言处理的总结。

 

 

 

 

 

 

 

你可能感兴趣的