LSTM 什么是深度神经网络络输入输出究竟是怎样的

LSTM神经网络输入输出究竟是怎样的? - 知乎689被浏览52569分享邀请回答207 条评论分享收藏感谢收起LSTM是什么
LSTM即Long Short Memory Network,长短时记忆网络。它其实是属于RNN的一种变种,可以说它是为了克服RNN无法很好处理远距离依赖而提出的。
我们说RNN不能处理距离较远的序列是因为训练时很有可能会出现梯度消失,即通过下面的公式训练时很可能会发生指数缩小,让RNN失去了对较远时刻的感知能力。
?E?W=∑t?Et?W=∑tk=0?Et?nett?nett?st(∏tj=k+1?st?sk)?sk?W
RNN梯度消失不应该是由我们学习怎么去避免,而应该通过改良让循环神经网络自己具备避免梯度消失的特性,从而让循环神经网络自身具备处理长期序列依赖的能力。
RNN的状态计算公式为St=f(St-1,xt),根据链式求导法则会导致梯度变为连乘的形式,而sigmoid小于1会让连乘小得很快。为了解决这个问题,科学家采用了累加的形式,St=∑tτ=1ΔSτ,其导数也为累加,从而避免梯度消失。LSTM即是使用了累加形式,但它的实现较复杂,下面进行介绍。
回顾一下RNN的模型,如下图,展开后多个时刻隐层互相连接,而所有循环神经网络都有一个重复的网络模块,RNN的重复网络模块很简单,如下下图,比如只有一个tanh层。
而LSTM的重复网络模块的结构则复杂很多,它实现了三个门计算,即遗忘门、输入门和输出门。每个门负责是事情不一样,遗忘门负责决定保留多少上一时刻的单元状态到当前时刻的单元状态;输入门负责决定保留多少当前时刻的输入到当前时刻的单元状态;输出门负责决定当前时刻的单元状态有多少输出。
每个LSTM包含了三个输入,即上时刻的单元状态、上时刻LSTM的输出和当前时刻输入。
LSTM的机制
根据上图咱们一步一步来看LSTM神经网络是怎么运作的。
首先看遗忘门,用来计算哪些信息需要忘记,通过sigmoid处理后为0到1的值,1表示全部保留,0表示全部忘记,于是有
ft=σ(Wf?[ht-1,xt]+bf)
其中中括号表示两个向量相连合并,Wf是遗忘门的权重矩阵,σ为sigmoid函数,bf为遗忘门的偏置项。设输入层维度为dx,隐藏层维度为dh,上面的状态维度为dc,则Wf的维度为dc×(dh+dx)。
其次看输入门,输入门用来计算哪些信息保存到状态单元中,分两部分,第一部分为
it=σ(Wi?[ht-1,xt]+bi)
该部分可以看成当前输入有多少是需要保存到单元状态的。第二部分为
c~t=tanh(Wc?[ht-1,xt]+bc)
该部分可以看成当前输入产生的新信息来添加到单元状态中。结合这两部分来创建一个新记忆。
而当前时刻的单元状态由遗忘门输入和上一时刻状态的积加上输入门两部分的积,即
ct=ft*ct-1+it*c~t
最后看看输出门,通过sigmoid函数计算需要输出哪些信息,再乘以当前单元状态通过tanh函数的值,得到输出。
ot=σ(Wo?[ht-1,xt]+bo)
ht=ot*tanh(ct)
LSTM的训练
化繁为简,这里只讨论包含一个LSTM层的三层神经网络(如果有多个层则误差项除了沿时间反向传播外,还会向上一层传播),LSTM向前传播时与三个门相关的公式如下,
ft=σ(Wf?[ht-1,xt]+bf)
it=σ(Wi?[ht-1,xt]+bi)
c~t=tanh(Wc?[ht-1,xt]+bc)
ct=ft*ct-1+it*c~t
ot=σ(Wo?[ht-1,xt]+bo)
ht=ot*tanh(ct)
需要学习的参数挺多的,同时也可以看到LSTM的输出ht有四个输入分量加权影响,即三个门相关的ftitc~tot,而且其中权重W都是拼接的,所以在学习时需要分割出来,即
Wf=Wfx+Wfh
Wi=Wix+Wih
Wc~=Wc~x+Wc~h
Wo=Wox+Woh
输出层的输入yit=Wyiht,输出为yot=σ(yit)。
设某时刻的损失函数为Et=12(yd-yot)2,则某样本的损失为
E=∑Tt=1Et
设当前时刻t的误差项δt=?E?ht,那么误差沿着时间反向传递则需要计算t-1时刻的误差项δt-1,则
δt-1=?E?ht-1=?E?ht?ht?ht-1=δt?ht?ht-1
LSTM的输出ht可看成是一个复合函数,f[ft(ht-1),it(ht-1),c~t(ht-1),ot(ht-1)],由全导数公式有,
?ht?ht-1=?ht?ct?ct?ft?ft?netf,t?netf,t?ht-1+?ht?ct?ct?it?it?neti,t?neti,t?ht-1+?ht?ct?ct?c~t?c~t?netc~,t?netc~,t?ht-1+?ht?ot?ot?neto,t?neto,t?ht-1
其中netf,tneti,tnetc~,tneto,t表示对应函数的输入。将上述所有偏导都求出来,
?ht?ct=ot*(1-tanh(ct)2)?ct?ft=ct-1?ft?netf,t=ft*(1-ft)?netf,t?ht-1=Wfh
同样地,其他也可以求出来,最后得到t时刻和t-1时刻之间的关系。再设
δf,t=?E?netf,tδi,t=?E?neti,tδc~,t=?E?netc~,tδo,t=?E?neto,t
δt-1=δf,tWfh+δi,tWih+δc~,tWch+δo,tWoh
接着对某时刻t的所有权重进行求偏导,
?E?Wfh,t=?E?netf,t?netf,t?Wfh,t=δf,tht-1
?E?Wih,t=?E?neti,t?neti,t?Wih,t=δi,tht-1
?E?Wch,t=?E?netc~,t?netc~,t?Wch,t=δc~,tht-1
?E?Woh,t=?E?neto,t?neto,t?Woh,t=δo,tht-1
?E?Wfx=?E?netf,t?netf,t?Wfx=δf,txt
?E?Wix=?E?neti,t?neti,t?Wix=δi,txt
?E?Wcx=?E?netc~,t?netc~,t?Wcx=δc~,txt
?E?Wox=?E?neto,t?neto,t?Wox=δo,txt
?E?bo,t=?E?neto,t?neto,t?bo,t=δo,t
?E?bf,t=?E?netf,t?netf,t?bf,t=δf,t
?E?bi,t=?E?neti,t?neti,t?bi,t=δi,t
?E?bc,t=?E?netc~,t?netc~,t?bc,t=δc~,t
对于整个样本,它的误差是所有时刻的误差之和,而与上个时刻相关的权重的梯度等于所有时刻的梯度之和,其他权重则不必累加,最终得到
?E?Wfh=∑j=1tδf,jhj-1
?E?Wih=∑j=1tδi,jhj-1
?E?Wch=∑j=1tδc~,jhj-1
?E?Woh=∑j=1tδo,jhj-1
?E?bf=∑j=1tδf,j
?E?bi=∑j=1tδi,j
?E?bc=∑j=1tδc~,j
?E?bo=∑j=1tδo,j
?E?Wfx=?E?netf,t?netf,t?Wfx=δf,txt
?E?Wix=?E?neti,t?neti,t?Wix=δi,txt
?E?Wcx=?E?netc~,t?netc~,t?Wcx=δc~,txt
?E?Wox=?E?neto,t?neto,t?Wox=δo,txt
相关阅读:
========广告时间========
鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到
进行预定。感谢各位朋友。
=========================
欢迎关注:
本文已收录于以下专栏:
相关文章推荐
文章链接,http://arxiv.org/abs/
代码链接,/DeepScale/SqueezeNet
目前文章还是第一版,所以内容上不...
深度学习中的Attention,源自于人脑的注意力机制,当人的大脑接受到外部信息,如视觉信息、听觉信息时,往往不会对全部信息进行处理和理解,而只会将注意力集中在部分显著或者感兴趣的信息上,这样有助于滤...
转自:http://blog.csdn.net/zhaocj/article/details/
神经网络(Neural Networks)是一种模仿生物神经系统的机器学习算法...
索尔克研究所发布的数据表明,人脑记忆容量可达到PB级别,相当于整个互联网的数据量,这项研究也揭开了人脑高效节能之谜。发现也将有助于计算机科学家开发超精密的、高效节能的计算机,尤其是那些配置深度学习和人...
http://blog.csdn.net/jiajunlee/article/details/
版权声明:本文为LEE Jiajun原创文章,转载请注明出处。
1.一个Pattern包括了4个部分:pattern name,problem,solution,consequnces
《模式识别与机器学习》PRML第5章介绍了神经网络neural network,是最近非常火的deep learning的基础之一。
题目如下:
多组(不超过 5 组)数据。
每组输入数据分为三行,第一行有两个数字 n,m($0<n,m\leq10000$),分别表示集合 A 和集合 B 的元素个数。后两...
继续前面关于深度学习CNN经典模型的整理,之前介绍了CNN网络Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning(点击查看)的网络结构。本文讲一下最新...
AlphaGo在线对弈过程包括以下5个关键步骤:其核心思想实在蒙特卡洛搜索树(MCTS)中嵌入了深度神经网络来减少搜索空间。AlphaGo并没有具备真正的思维能力。
1. 根据当前盘面已经落子的情况...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)LSTM实现详解
发表于 16:58|
来源Apaszke Github|
作者Adam Paszke
摘要:Long Short Term网络一般叫做 LSTM,是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由 Hochreiter & Schmidhuber (1997) 提出,并在近期被 Alex Graves 进行了改良和推广。究竟如何实现LSTM,由此文带给大家。
前言在很长一段时间里,我一直忙于寻找一个实现LSTM网络的好教程。它们似乎很复杂,而且在此之前我从来没有使用它们做过任何东西。在互联网上快速搜索并没有什么帮助,因为我找到的都是一些幻灯片。幸运地是,我参加了,而且我认为使用LSTM很有意思,最后还理解了它的工作原理。这篇文章基于,使用的是的代码,这也是我强烈推荐给大家的。RNN误区我感觉有一件很重要的事情一直未被大家充分强调过(而且这也是我为什么不能使用RNN做我想做的事情的主要原因)。RNN和前馈神经网络并没有很大不同。最容易实现RNN的一种方法就是像前馈神经网络使用部分输入到隐含层,以及一些来自隐含层的输出。在网络中没有任何神奇的内部状态。它作为输入的一部分。
RNN的整体结构与前馈网络的结构非常相似LSTM回顾本节内容将仅覆盖LSTM的正式定义。有很多其它的好博文,都详细地描述了你该如何设想并思考这些等式。LSTM有多种变换形式,但我们只讲解一个简单的。一个Cell由三个Gate(input、forget、output)和一个cell单元组成。Gate使用一个sigmoid激活函数,而input和cell state通常会使用tanh来转换。LSTM 的cell可以使用下列的等式来定义:Gates:
输入变换:状态更新:使用图片描述类似下图:由于门控机制,Cell可以在工作时保持一段时间的信息,并在训练时保持内部梯度不受不利变化的干扰。Vanilla LSTM 没有forget gate,并在更新期间添加无变化的cell状态(它可以看作是一个恒定的权值为1的递归链接),通常被称为一个Constant Error Carousel(CEC)。这样命名是因为它解决了在RNN训练时一个严重的梯度消失和梯度爆炸问题,从而使得学习长期关系成为可能。建立你自己的LSTM层这篇教程的代码使用的是Torch7。如果你不了解它也不必担心。我会详细解释的,所以你可以使用你喜欢的框架来实现相同的算法。该网络将作为nngraph.gModule模块来实现,基本上表示我们定义的一个由标准nn模块组成的神经网络计算图。我们需要以下几层:nn.Identity() - 传递输入(用来存放输入数据)nn.Dropout(p) - 标准的dropout模块(以1-p的概率丢弃一部分隐层单元)nn.Linear(in, out) - 从in维到out维的一个仿射变换nn.Narrow(dim, start, len) - 在第dim方向上选择一个子向量,下标从start开始,长度为lennn.Sigmoid() - 应用sigmoid智能元素nn.Tanh() - 应用tanh智能元素nn.CMulTable() - 输出张量(tensor)的乘积nn.CAddTable() - 输出张量的总和输入首先,让我们来定义输入形式。在lua中类似数组的对象称为表,这个网络将接受一个类似下面的这个张量表。
local inputs = {}table.insert(inputs, nn.Identity()())& -- network inputtable.insert(inputs, nn.Identity()())& -- c at time t-1table.insert(inputs, nn.Identity()())& -- h at time t-1local input = inputs[1]local prev_c = inputs[2]local prev_h = inputs[3]Identity模块只将我们提供给网络的输入复制到图中。计算gate值为了加快我们的实现,我们会同时运用整个LSTM层转换。locali2h=nn.Linear(input_size,4*rnn_size)(input)-- input to hiddenlocalh2h=nn.Linear(rnn_size,4*rnn_size)(prev_h)-- hidden to hiddenlocalpreactivations=nn.CAddTable()({i2h,h2h})-- i2h + h2h如果你不熟悉nngraph,你也许会觉得奇怪,在上一小节我们建立的inputs属于nn.Module,这里怎么已经用图节点调用一次了。事实上发生的是,第二次调用把nn.Module转换为nngraph.gModule,并且参数指定了该节点在图中的父节点。preactivations输出一个向量,该向量由输入和前隐藏状态的一个线性变换生成。这些都是原始值,用来计算gate 激活函数和cell输出。这个向量被分为四个部分,每一部分的大小为rnn_size。第一部分将用于in gates,第二部分用于forget gate,第三部分用于out gate,而最后一个作为cell input(因此各个gate的下标和cell数量i的输入为{i, rnn_size+i, 2?rnn_size+i, 3?rnn_size+i})。
接下来,我们必须运用非线性,但是尽管所有的gate使用的都是sigmoid,我们仍使用tanh对输入进行预激活处理。正因为这个,我们将会使用两个nn.Narrow模块,这会选择预激活向量中合适的部分。-- gateslocalpre_sigmoid_chunk=nn.Narrow(2,1,3*rnn_size)(preactivations)localall_gates=nn.Sigmoid()(pre_sigmoid_chunk)-- inputlocalin_chunk=nn.Narrow(2,3*rnn_size+1,rnn_size)(preactivations)localin_transform=nn.Tanh()(in_chunk)在非线性操作之后,我们需要增加更多的nn.Narrow,然后我们就完成了gates。localin_gate=nn.Narrow(2,1,rnn_size)(all_gates)localforget_gate=nn.Narrow(2,rnn_size+1,rnn_size)(all_gates)localout_gate=nn.Narrow(2,2*rnn_size+1,rnn_size)(all_gates)Cell和hidden state有了计算好的gate值,接下来我们可以计算当前的Cell状态了。所有的这些需要的是两个nn.CMulTable模块(一个用于,一个用于),并且nn.CAddTable用于把它们加到当前的cell状态上。
-- previous cell state contributionlocalc_forget=nn.CMulTable()({forget_gate,prev_c})-- input contributionlocalc_input=nn.CMulTable()({in_gate,in_transform})-- next cell statelocalnext_c=nn.CAddTable()({&c_forget,&c_input})最后,是时候来实现hidden 状态计算了。这是最简单的部分,因为它仅仅是把tanh应用到当前的cell 状态(nn.Tanh)并乘上output gate(nn.CMulTable)。localc_transform=nn.Tanh()(next_c)localnext_h=nn.CMulTable()({out_gate,c_transform})定义模块现在,如果你想要导出整张图作为一个独立的模块,你可以使用下列代码把它封装起来:
-- module outputsoutputs={}table.insert(outputs,next_c)table.insert(outputs,next_h)-- packs the graph into a convenient module with standard API (:forward(), :backward())returnnn.gModule(inputs,outputs)
实例LSTM layer实现可以在获得。你也可以这样使用它:th& LSTM= require 'LSTM.lua'&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &[0.0224s]th& layer= LSTM.create(3, 2)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &[0.0019s]th& layer:forward({torch.randn(1,3), torch.randn(1,2), torch.randn(1,2)}){ &1 : DoubleTensor - size: 1x2&&2 : DoubleTensor - size: 1x2}&}& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &[0.0005s]为了制作一个多层LSTM网络,你可以在for循环中请求后续层,用上一层的next_h作为下一层的输入。你可以查看。训练
最后,如果你感兴趣,请留个评论吧,我会试着扩展这篇文章!
确实是这样!当你理解怎样处理隐藏层的时候,实现任何RNN都会很容易。仅仅把一个常规MLP层放到顶部,然后连接多个层并且把它和最后一层的隐藏层相连,你就完成了。
如果你有兴趣的话,下面还有几篇关于RNN的好论文:
原文链接:(编译/刘帝伟 审校/赵屹华、朱正贵、李子健 责编/周建丁)译者简介:&刘帝伟,中南大学软件学院在读研究生,关注机器学习、数据挖掘及生物信息领域。链接:1. 加入CSDN人工智能用户微信群,交流人工智能相关技术,加微信号“jianding_zhou”或扫下方二维码,由工作人员加入。请注明个人信息和入群需求,并在入群后按此格式改群名片:机构名-技术方向-姓名/昵称。2. 加入CSDN 人工智能技术交流QQ群,请搜索群号加入:。同上注明信息。3. CSDN高端专家微信群,采取受邀加入方式,不惧高门槛的请加微信号“jianding_zhou”或扫描下方二维码,PS:请务必带上你的BIO。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章后使用快捷导航没有帐号?
查看: 822|回复: 2
深入浅出LSTM神经网络
注册会员, 积分 89, 距离下一级还需 111 积分
论坛徽章:1
摘要:根据三大牛的介绍,LSTM网络已被证明比传统的RNNs更加有效。本文由UCSD研究理论和应用的博士生Zachary Chase Lipton撰写,用浅显的语言解释了卷积网络的基本知识,并介绍长短期记忆(LSTM)模型。
【编者按】使用前馈卷积(convnets)来解决计算机视觉问题,是深度学习最广为人知的成果,但少数公众的注意力已经投入到使用递归神经网络来对时间关系进行建模。而根据深度学习三大牛的阐述,。本文由加州大学圣迭戈分校(UCSD)研究机器学习理论和应用的博士生Zachary Chase Lipton撰写,用浅显的语言解释了卷积网络的基本知识,并介绍长短期记忆(LSTM)模型。鉴于深度学习在现实任务中的广泛适用性,它已经吸引了众多技术专家、投资者和非专业人员的关注。尽管深度学习最著名的成果是使用前馈卷积神经网络(convnets)来解决计算机视觉问题,少数公众的注意力已经投入到使用递归神经网络来对时间关系进行建模。(注:为了帮助你开始体验LSTM递归网络,)在最近的文章《》中,我解释了为什么尽管前馈网络有难以置信的成功,它们受制于无法明确模拟时间关系,以及所有数据点都是由固定长度的向量组成的假设。在那篇文章的结论部分,我承诺写一篇的文章,解释卷积网络的基本知识,并介绍长短期记忆(LSTM)模型。
首先,介绍一下神经网络的基本知识。一个神经网络可以表示为一个人工神经元的图,或者说节点和有向边,用来对突触建模。每个神经元是一个处理单元,它将连接到它的节点的输出作为输入。在发出输出之前,每个神经元会先应用一个非线性激活函数。正是由于这个激活函数,神经网络具有对非线性关系进行建模的能力。现在,考虑这个最近的著名论文,结合convnets和强化学习来训练电脑玩视频游戏。该系统在某些游戏上有超越人类的表现,比如Breakout!,这种游戏在任意时候的合适的策略,都可以通过查看屏幕推断出来。但是,当优化策略是需要在长时间跨度规划时,系统就和人的表现相差甚远,例如太空侵略者(Space Invaders)。因此, 我们引入递归神经网络(RNN),一个赋予神经网络对时间进行显式建模的能力,通过添加跨越时间点的自连接隐藏层。换句话说,隐藏层的反馈,不仅仅进入输出端,而且还进入了下一时间步骤隐藏层。在本文中,我将使用递归网络的一些示意图,从我即将审查的这一主题的文献中摘录。
现在,我们可以通过通过两个时间步来展开这个网络,将连接以无环的形式可视化。注意权重(从输入到隐藏和隐藏到输出)在每个时间步是相同的。递归网络有时被描述为深度网络,其深度不仅仅发生在输入和输出之间,而且还发生在跨时间步,每个时间步可以被认为是一个层。
一旦被展开,这些网络可以使用反向传播,进行端到端的训练。这种跨时间步的反向传播扩展,被称为沿时间反向传播(Backpropagation Through Time)。然而有一个问题,在Yoshua Bengio经常被引用的论文()中提到,那就是消失的梯度。换句话说,后面时间步的错误信号,往往并不能回到足够远的过去,像更早的时间步一样,去影响网络。这使它很难以学习远距离的影响,比如放过的那只小卒会在12步后回来将你。补救这一问题的措施是1997年首先被Sepp Hochreiter和Jurgen Schmidhuber提出的长短期记忆(LSTM)模型。在这个模型中,常规的神经元,即一个将S型激活应用于其输入线性组合的单位,被存储单元所代替。每个存储单元是与一个输入门,一个输出门和一个跨越时间步骤无干扰送入自身的内部状态相关联。
在该模型中,对于每个存储单元,三套权重从输入训练而得,包括先前时间步中完整的隐藏状态。一个馈送到输入节点,在上图的底部。一个馈送到输入门,在最右侧的单元格底部显示。另一个馈送到输出门,在顶部最右侧的显示。每个蓝色节点与一个激活函数相关联,典型情况是S型函数,以及表示乘法的Pi节点。单元中最中央的节点称为内部状态,并且以1的权重跨越时间步,反馈回本身。内部状态的自连接边,被称为恒定误差传送带或CEC。就前传递而言,输入门学习来决定何时让激活传入存储单元,而输出门学习何时让激活传出存储单元。相应的,关于后传递,输出门是在学习何时让错误流入存储单元,而输入门学习何时让它流出存储单元,并传到网络的其余部分。这些模型已被证明在多种多样的手写识别和图像加字幕任务上非常成功。也许得到多一些关爱,它们能在太空侵略者上获胜。作者介绍:Zachary Chase Lipton is a PhD student in the Computer Science department at UCSD. He researches machine learning theory and applications, and is a contributing editor to KDnuggets.
原文链接: (翻译/王玮 责编/周建丁)本文为CSDN编译整理,未经允许不得转载,如需转载请联系market#csdn.net(#换成@)
金牌会员, 积分 1849, 距离下一级还需 1151 积分
论坛徽章:17
先收藏了,谢谢楼主& && && && && && &&&
金牌会员, 积分 1912, 距离下一级还需 1088 积分
论坛徽章:34
谢谢分享,学习了。。。}

我要回帖

更多关于 bp神经网络是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信