LSTM记录贴

半世苍凉 提交于 2019-11-27 12:47:14

LSTM记录贴

得平常再做一些任务都会用到LSTM(长短时记忆网络)、GRU以及一些变形的RNN模型,虽然平时用的多,但近来看面经,发现有些问题都忘了,回过头看了又忘,所以准备好好的手推一遍并且记录下来;

先上图

在这里插入图片描述其实如果推理过LSTM的话,基本上这图就没啥用,因为这图说实话画的略显复杂。在真的面试遇到手推LSTM,方法应该是从三个门出发点去反向画图。

先说主人公三个门,分别是遗忘门(f)、输入门(i)、输出门(o)
还有出场的人员包括上个时间步细胞状态(ct-1)、本时刻的输入(xt)、上一时间步的输入(ht-1)、临时细胞状态(c~)
以及lstm每个unit特有的输入框架,相比普通RNN多了一个c而已
那么可以开始推导了
首先要确定,每个lstm会有三个输入(ct-1、ht-1、xt),两个输出(ct、ht)

而ht-1与xt都是向量,在论文中xt与ht-1是直接横向拼接在一起的(可以有不同的结合方式,但是基本是绑定的),因为两个向量都是定长,所以在经过每个门的线性变换矩阵输出也是定长。

那么开始第一个门,决定我们会从细胞状态中丢弃什么信息,所以叫遗忘门,f= sigmoid([xt,ht-1]Wf+bf),输出的是一个概率,遗忘概率。那么遗忘的对象是谁?那必然是上个时刻输入的细胞状态ct-1
那么可以画出图
在这里插入图片描述

输入门(或者更新门)i = sigmoid([xt,ht-1]Wi+bi),它决定更新输入的信息的概率或者说大小,那么更新的对象是谁呢?那必然是临时状态c~,且其也是由[xt,ht-1]作为单位得到的 即可得到如下,注意临时状态的激活函数是tanh(),至于为什么临时状态和本时刻隐藏层输出(与门无关)的激活函数要用tanh而不用sigmoid或者relu?第一目的不同,三个门的输出值希望是0到1的数类似概率来控制信息的去留,而细胞状态激活函数的目的是纯粹为了处理数据,也可以用其他激活函数(但tanh比sigmoid好)

这个单独说
相较而言,在隐藏层,tanh函数要优于sigmoid函数,可以认为是sigmoid的平移版本,优势在于其取值范围介于-1 ~ 1之间,数据的平均值为0,而不像sigmoid为0.5,有类似数据中心化的效果。
  但在输出层,sigmoid也许会优于tanh函数,原因在于你希望输出结果的概率落在0 ~ 1 之间,比如二元分类,sigmoid可作为输出层的激活函数。
  但实际应用中,特别是深层网络在训练时,tanh和sigmoid会在端值趋于饱和,造成训练速度减慢,故深层网络的激活函数默认大多采用relu函数,浅层网络可以采用sigmoid和tanh函数。
所以与C相关的激活函数可以用tanh或者relu,relu收敛还快但实际lstm层数多时容易面临梯度爆炸

所以又可以推出图啦、
在这里插入图片描述上面的Ct标错了应该是C~
最后同样的就是输出门o = sigmoid([xt,ht-1]Wo+bo),按照原来的思路,他要输出的是谁?对象就是ht(本时刻隐藏层的输出)
得到的就是本时刻隐藏层状态ht
那么有

ct = fct-1+ic~ , ht=o*tanh(ct)得到最后两个输出,这不是很简单吗
得到图
在这里插入图片描述
参数计算也可以很明确计算出来,一共三个门也就是有三个线性变换矩阵加一个c就是有四个线性变换矩阵,所以这个c与ct和ct-1不同的是,c~是一个向量,与输出的维度相同,即与ht的维度相同,

附上所有的变量以及参数规格在这里插入图片描述可以看到以上的所有向量的维度都等于LSTM的维度h,W在实际中的shape也为[h,(d+h)],d是数据的映射的长度,因为直接拼接xd与ht-1所以W即为[h,(d+h)];

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!