小白学习machine learning的第五天

本篇的写作来源依旧是如下这篇优质稿的学习呀!

零基础入门深度学习(6) - 长短时记忆网络(LSTM)_零基础入门深度学习 长短时记忆网络lstm-优快云博客

放个传送门在这里O(∩_∩)O:     小白学习machine learning的第一天-优快云博客

                                                     小白学习machine learning的第二天-优快云博客

                                                     小白学习machine learning的第三天-优快云博客

                                                     小白学习machine learning的第四天-优快云博客

                                                     小白学习machine learning的第五天-优快云博客

                                                     小白学习machine learning的第六天-优快云博客

      欢迎回来!!!咋们已经在deep learning这条路上走了这么深了呢,今天为大家带来的是长短时神经网络的学习!

一、啥是LSTM长短时记忆网络?

(1)首先,LSTM是为了解决梯度爆炸和梯度消失问题而出现的一种网络形式。

由这个式子我们不难看出,当t − k很大时(也就是误差传递很多个时刻时),整个式子的值就会变得极小(当βf​βw​乘积小于1)或者极大(当βf​βw​乘积大于1)。

也就会如下图所示在t - 3时刻后出现得到的梯度不会对最终的梯度值有任何贡献的情况。

(2)而实际上,LSTM就是将普通的隐藏层多加上了一个状态,使其能够保存长时间的状态而不仅仅是短时的状态。如下图所示:

我们把新增的状态c称为单元状态

如上图所示,

LSTM的输入有三个:当前时刻网络的输入值xt​、上一时刻LSTM的输出值h t − 1 、以及上一时刻的单元状态c t − 1 ;

LSTM的输出有两个h t:当前时刻LSTM输出值c t 、和当前时刻的单元状态。

那么,LSTM是怎么控制长期状态c的捏?

第一个开关,负责控制继续保存长期状态c;

第二个开关,负责控制把即时状态输入到长期状态c;

第三个开关,负责控制是否把长期状态c作为当前的LSTM的输出;

二、LSTM的前向传播怎么做呢?

那么,我们该怎么实现开关呢?

        这里我们采用门(gate)来实现,门其实就是一个全连接层。输入向量,然后输出一个0 - 1的值,因为使用的是sigmoid激活函数。

         公式如下啦:

         W是门的权重向量,b是偏置项,σ是sigmoid函数。

                                                      

①遗忘门(forget gate):

定义:决定了上一个时刻c有多少状态会继承到下一个状态。

                                        

这里,我们对原文进行注释:

      [ht−1​,xt​](h是输出,x是输入)表示把两个向量连接成一个更长的向量,bf​是偏置项。如果输入的维度是dx​,隐藏层的维度是dh​,单元状态的维度是dx​(通常dc​=dh​),则遗忘门的权重矩阵Wf​维度是dc​×(dh​+dx​)。事实上,Wf​权重矩阵都是两个矩阵拼接而成的:一个是Wfh​,它对应着输入项ht−1​,其维度为dc​×dh​;一个是Wfx​,它对应着输入项xt​,其维度为dc​×dx​。

公式略微改换形式如下:

                                

下面是图解喔!

        ​​​​​​​        

②输入门(input gate):

定义:决定了当前时刻网络的输入xt​有多少保存到单元状态ct​

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        ​​​​​​​        ​​​​​​​        

这里,我们考虑~ct作为当前输入的单元状态,它取决于上一次的输出ht - 1和当前的输入xt。

公式如下呀!

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

当前时刻的单元状态ct​:

        ​​​​​​​        ​​​​​​​        ​​​​​​​                

这条公式就是上一次的单元状态ct−1​按元素乘以遗忘门ft​,再用当前输入的单元状态c~t​按元素乘以输入门it​,再将两个积加和。

        ​​​​​​​        ​​​​​​​           

上面两条式子千万不要弄混了呀~~

其实是当前的记忆c~t​和长期的记忆ct−1​组合在一起,形成了新的单元状态ct​!

③输出门(output gate):

如下面两个公式呀:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

      如两个公式所示,这里我们依旧是通过一个由输入和上一层输出决定的ot和状态ct来计算得出输出ht,看图我们能更清晰的得到直观感受!

        ​​​​​​​        ​​​​​​​        

补充这2个激活函数:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

三、LSTM的训练咋搞啊?

这里,我们来看看作者所给出的训练办法,我们仍旧采用反向传播算法来进行训练:

可以看到,方法答题步骤是相似的,我们来看看细节吧!

(1)首先,我们来看看有什么是需要学习的:

  • 遗忘门的权重矩阵Wf​和偏置项bf​
  • 输入门的权重矩阵Wi​和偏置项bi​
  • 输出门的权重矩阵Wo​和偏置项bo​
  • 计算单元状态的权重矩阵Wc​和偏置项bc​

需要注意的是,每一个门的权重矩阵W的值应当由两个,因为输入向量和上一次的输出向量所乘的权重并不相同呀!

原文补充了一点线性代数的公式,即乘以矩阵可看作是乘上对角线上的值

(2)误差项的计算

这里,我们给出误差项的计算公式:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

         与之前网络不同的是,我们这里假设误差项是损失函数对输出值的导数,而不是对加权输入net(ti)的导数,因为加权输入net(ti)有4个,而我们需要向上传递一个误差项而不是四个

4个误差项如下:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

(3)误差项沿时间的反向传播

借鉴于原文的数学计算(感兴趣可以参考原文哦!),我们给出计算误差项在各个时间的计算公式呀:

原始计算公式(t - 1时刻):

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

最终结果公式:

      

(4)误差项传递到上一层

原始计算公式:

                                                        

数学计算后的结果公式:

(5)权重梯度的计算

其实有了误差项的各种计算公式,梯度已经算出来了呀!

①W的梯度:

(h上一层输出量相关哦)

将各个时刻的W相加,就得到了W的梯度:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​       

②偏移量(bias)的梯度:

相同的是,各个时刻的B相加,得到B的梯度:

        ​​​​​​​        ​​​​​​​​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​       

③对于W的梯度:

(x输入量相关哦)

仍旧是各个时刻的W相加:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​      

这里奉上原作者在GitHub的源代码: https://github.com/hanbt/learn_dl/blob/master/lstm.py (python2.7)

四、一些LSTM变体——GRU

首先,咋们就来看看图示:

        ​​​​​​​        ​​​​​​​        

我们来瞅瞅哪里做出了改变:

  1. 将输入门、遗忘门、输出门变为两个门:更新门(Update Gate)​和重置门(Reset
    Gate)
  2. 单元状态与输出合并为一个状态:h 。

这是很明显的简化了,但是如图也能完成LSTM的任务!!!

这里给出图示的公式:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​       

       亲爱的读者,到这里就结束啦!现在我们又将一个新的工具——长短时记忆网络装入我们的工具箱中啦!恭喜自己也恭喜你呀!!O(∩_∩)O

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值