长短时记忆网络(LSTM)
长短时记忆网络
循环神经网络很难训练的原因导致它的实际应用中很处理长距离的依赖。本文将介绍改进后的循环神经网络:长短时记忆网络(Long Short Term Memory Network, LSTM),
原始RNN的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。那么如果我们再增加一个状态,即c,让它来保存长期的状态,这就是长短时记忆网络。
新增加的状态c,称为单元状态。我们把上图按照时间维度展开:
可以看到在t时刻,LSTM的输入有三个:当前时刻网络的输出值$x_t$、上一时刻LSTM的输出值$h_{t-1}$、以及上一时刻的单元状态$c_{t-1}$;LSTM的输出有两个:当前时刻LSTM输出值$h_t$、和当前时刻的单元状态$x_t$。注意$x、h、c$都是向量。
LSTM的关键,就是怎样控制长期状态c。在这里,LSTM的思路是使用三个控制开关。第一个开关,负责控制继续保存长期状态c;第二个开关,负责控制把即时状态输入到长期状态c;第三个开关,负责控制是否把长期状态c作为当前的LSTM的输出。三个开关的作用如下图所示:
接下来我们要描述一下,输出h和单元状态c的具体计算方法。
长短时记忆网络的前向计算
我们引入“门(gate)”的概念。门实际上就是一层全连接层,它的输入是一个向量,输出是一个0到1之间的实数向量。假设W是门的权重向量,$b$是偏置项,那么门可以表示为:
$$g(x)=\sigma (Wx+b)$$
门的输出是0到1之间的实数向量,用门向量的输出向量按元素乘以我们需要控制的那个向量,当门输出为0时,任何向量与之相乘都会得到0向量,这就相当于啥都不能通过;输出为1时,任何向量与之相乘都不会有任何改变,这就相当于啥都可以通过。因为$\sigma$(也就是sigmoid函数)的值域是(0,1),所以门的状态都是半开半闭的。
LSTM用两个门来控制单元状态c的内容,一个是遗忘门,它决定了上一时刻的单元状态$c_{t-1}$有多少保留到当前时刻$c_t$;另外一个是输出门,他决定了当前时刻网络的输入$x_t$有多少保存到单元状态$c_t$。LSTM用输出门来控制单元状态$c_t$有多少输出到LSTM的当前输出值$h_t$。LSTM用输出门来控制单元状态$c_t$有多少输出到LSTM的当前输出值$h_t$。
遗忘门的表达式是:
$$athbf{f}_t=\sigma(W_f\cdot[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b}_f)\qquad\quad(式1)$$
上式中,$W_f$是遗忘门的权重矩阵,$h_{t-1,x_t}$表示把两个向量连接成一个更长的向量,$b_f$是遗忘门的偏置项,$\sigma$是sigmoid函数。如果输入的维度是$d_x$,隐藏层的维度是$d_h$,单元状态的维度是$d_c$(d_c=d_h),则遗忘门的权重矩阵$W_f$维度是$d_c x (d_h+d_x)$。事实上,权重矩阵$W_f$都是两个矩阵拼接而成的:一个是$W_{fh}$,它对应着输入项$h_{t-1}$,其维度为$d_cxd_h$;一个是$W_{fx}$,它对应着输入项$x_t$,其维度为$d_c x d_x$。$W_f$可以写为:
$$\begin{align}
\begin{bmatrix}W_f\end{bmatrix}\begin{bmatrix}\mathbf{h}_{t-1}\\
\mathbf{x}_t\end{bmatrix}&=
\begin{bmatrix}W_{fh}&W_{fx}\end{bmatrix}\begin{bmatrix}\mathbf{h}_{t-1}\\
\mathbf{x}_t\end{bmatrix}\\
&=W_{fh}\mathbf{h}_{t-1}+W_{fx}\mathbf{x}_t
\end{align}$$
下图显示了遗忘门的计算:
接下来看看输入门:
$$\mathbf{i}_t=\sigma(W_i\cdot[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b}_i)\qquad\quad(式2)$$
上式中,$W_i$是输入门的权重矩阵,$b_i$是输入门的偏置项。下图表示了输入门的计算:
接下来,我们计算用于描述当前输入的单元状态$\tilde{c}_t$,它是根据上一次的输出和本次输入来计算的:
$$\mathbf{\tilde{c}}_t=\tanh(W_c\cdot[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b}_c)\qquad\quad(式3)$$
下图是$\tilde{c}_t$的计算:
现在,我们计算当前时刻的单元状态$c_t$。它是由上一次的单元状态$c_{t-1}$按元素乘以遗忘门$f_t$,再用当前输入的单元状态$\tilde{c}_t$按元素乘以输入门$i_t$,再将两个积加和产生的:
$$\mathbf{c}_t=f_t\circ{\mathbf{c}_{t-1}}+i_t\circ{\mathbf{\tilde{c}}_t}\qquad\quad(式4)$$
符号O表示按元素乘。下图是$c_t$的计算:
这样,我们就把LSTM关于当前的记忆$\tilde{c}_t$和长期的记忆$c_{t-1}$组合在一起,形成了新的单元状态$c_t$。由于遗忘门的控制,它可以保存很久很久之前的信息,由于输入门的控制,它又可以避免当前无关紧要的内容进入记忆。下面,我们要看看输出门,它控制了长期记忆对当前输出的影响:
$$\mathbf{o}_t=\sigma(W_o\cdot[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b}_o)\qquad\quad(式5)$$
下面表示输出门的计算:
LSTM最终的输出,是由输出门和单元状态共同确定的:
$$\mathbf{h}_t=\mathbf{o}_t\circ \tanh(\mathbf{c}_t)\qquad\quad(式6)$$
下图表示LSTM最终输出的计算:
式1到式6就是LSTM前向计算的全部公式。至此,我们就把LSTM前向计算讲完了。
长短时记忆网络的训练
LSTM训练算法框架
LSTM的训练算法仍然是反向传播算法,对于这个算法,我们已经非常熟悉了。主要有下面三个步骤:
1、前向计算每个神经元的输出值,对于LSTM来说,即$f_t$、$i_t$、$c_t$、$o_t$、$h_t$五个向量的值。计算方法已经在上一节中描述过了。
2、反向计算每个神经元的误差项$\delta$值。与循环神经网络一样,LSTM误差项的反向传播也是包括两个方向:一个是沿时间的反向传播,即从当前t时刻开始,计算每个时刻的误差项;一个是将误差项向上一层传播。
3、根据相应的误差项,计算每个权重的梯度。
关于公式和符号的说明
我们设定gate的激活函数为sigmoid函数,输出的激活函数为tanh函数。他们的导数分别为:
长短时记忆网络(LSTM)的更多相关文章
- (转)零基础入门深度学习(6) - 长短时记忆网络(LSTM)
无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...
- 长短时记忆网络LSTM和条件随机场crf
LSTM 原理 CRF 原理 给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型.假设输出随机变量构成马尔科夫随机场(概率无向图模型)在标注问题应用中,简化成线性链条件随机场,对数线性判别 ...
- 零基础入门深度学习(6) - 长短时记忆网络(LSTM)
代码: def forward(self, x): ''' 根据式1-式6进行前向计算 ''' self.times += 1 # 遗忘门 fg = self.calc_gate(x, self.Wf ...
- 机器学习与Tensorflow(5)——循环神经网络、长短时记忆网络
1.循环神经网络的标准模型 前馈神经网络能够用来建立数据之间的映射关系,但是不能用来分析过去信号的时间依赖关系,而且要求输入样本的长度固定 循环神经网络是一种在前馈神经网络中增加了分亏链接的神经网络, ...
- LSTM——长短时记忆网络
LSTM(Long Short-term Memory),长短时记忆网络是1997年Hochreiter和Schmidhuber为了解决预测位置与相关信息之间的间隔增大或者复杂语言场景中,有用信息间隔 ...
- RNN学习笔记(一):长短时记忆网络(LSTM)
一.前言 在图像处理领域,卷积神经网络(Convolution Nerual Network,CNN)凭借其强大的性能取得了广泛的应用.作为一种前馈网络,CNN中各输入之间是相互独立的,每层神经元的信 ...
- 铁通、长宽网络支付时“签名失败”问题分析及解决方案 [88222001]验证签名异常:FAIL[20131101100002-142]
原文地址:http://bbs.tenpay.com/forum.php?mod=viewthread&tid=13723&highlight=%CC%FA%CD%A8 如果你的是铁通 ...
- 长短时记忆神经网络(LSTM)介绍以及简单应用分析
本文分为四个部分,第一部分简要介绍LSTM的应用现状:第二部分介绍LSTM的发展历史,并引出了受众多学者关注的LSTM变体——门控递归单元(GRU):第三部分介绍LSTM的基本结构,由基本循环神经网络 ...
- 序列模型(3)---LSTM(长短时记忆)
摘自https://www.cnblogs.com/pinard/p/6519110.html 一.RNN回顾 略去上面三层,即o,L,y,则RNN的模型可以简化成如下图的形式: 二.LSTM模型结构 ...
随机推荐
- apache的<directory> 语句以及属性的含义
在整完apache和tomcat的之后我觉得有必要把<directory>和它下面的属性捋顺一下 如何访问根目录下的目录http://192.168.1.12/test/ 第一.缺省apa ...
- ACCESS修改密码,更新显示
public partial class 修改用户信息frm : Form { public 修改用户信息frm() { InitializeComponent(); } public string ...
- magento小常识
magento后台设置好产品分类及添加产品后前台没有显示出来:以下几个可能: 1.首先检查网店商城的Root Category 以 及跟目录下面的子目录设置是否有误,具体在目录->管理分类-&g ...
- TypeScript 编译器源码研究(一)
TypeScript (以下简称 TS)是一个非常强大的语言,其编译器源码超过 10000 行. 源码在 Github 可以找到:https://github.com/Microsoft/TypeSc ...
- MyEclipse快捷键及经验总结 绝对的有用 太给力了
Ctrl+Shift+L 显示所有快捷键 Ctrl+K 参照选中的词(Word)快速定位到下一个 Ctrl+Shift+K 参照选中的词(Word)快速定位到上一个 C ...
- EasyTouch基本用法
EasyTouch基本用法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 hierarchy (层次面 ...
- ubuntu journalctl — 检索 systemd 日志
常用: 查看最近1000行log sudo journalctl -f --lines=1000 -u server.$PROJECT_NAME --no-full, --full, -l 如果字段内 ...
- Spring的事件发布机制
一:Spring的事件发布 ApplicationContext提供了针对Bean的事件传播功能,其中的主角是publishEvent()方法,通过这个方法可以将事件通知给系统内的监听器(需实现App ...
- 注解JAVA对象(基于Hibernate4.3)
package com.chauvet.po; import java.util.Date; import javax.persistence.Column; import javax.persist ...
- linux下普通用户无法使用sudo命令问题
今天在新装的linux虚拟机中使用sudo命令时,报错如下 We trust you have received the usual lecture from the local System Adm ...