神经⽹络基础03-深⼊浅出LSTM及其Python代码实现
传统神经⽹络结构的缺陷
从传统的神经⽹络结构我们可以看出,信号流从输⼊层到输出层依次流过,同⼀层级的神经元之间,信号是不会相互传递的。这样就会导致⼀个问题,输出信号只与输⼊信号有关,⽽与输⼊信号的先后顺序⽆关。并且神经元本⾝也不具有存储信息的能⼒,整个⽹络也就没有“记忆”能⼒,当输⼊信号是⼀个跟时间相关的信号时,如果我们想要通过这段信号的“上下⽂”信息来理解⼀段时间序列的意思,传统的神经⽹络结构就显得⽆⼒了。与我们⼈类的理解过程类似,我们听到⼀句话时往往需要通过这句话中词语出现的顺序以及我们之前所学的关于这些词语的意思来理解整段话的意思,⽽不是简单的通过其中的⼏个词语来理解。
例如,在⾃然语⾔处理领域,我们要让神经⽹络理解这样⼀句话:“地球上最⾼的⼭是珠穆朗玛峰”,按照传统的神经⽹络结构,它可能会将这句话拆分为⼏个单独的词(地球、上、最⾼的、⼭、是、珠穆朗玛峰),分别输⼊到模型之中,⽽不管这⼏个词之间的顺序。然⽽,直观上我们可以看到,这⼏个词出现的顺序是与最终这句话要表达的意思是密切相关的,但传统的神经⽹络结构⽆法处理这种情况。
因此,我们需要构建具有“记忆”能⼒的神经⽹络模型,⽤来处理需要理解上下⽂意思的信号,也就是时间序列数据。循环神经⽹络(RNN)就是⽤来处理这类信号的,RNN之所以能够有效的处理时间序列数
王者荣耀如何换头像
据,主要是基于它⽐较特殊的运⾏原理。下⾯将介绍RNN的构建过程和基本运⾏原理,然后引⼊长短期记忆⽹络(LSTM)。
循环神经⽹络RNN
RNN的构造过程关于赛车的电影
RNN是⼀种特殊的神经⽹络结构,其本⾝是包含循环的⽹络,允许信息在神经元之间传递,如下图所⽰:
图⽰是⼀个RNN结构⽰意图,图中的A表⽰神经⽹络模型,Xt表⽰模型的输⼊信号, ht表⽰模型的输出信号,如果没有A的输出信号传递到A的那个箭头, 这个⽹络模型与普通的神经⽹络结构⽆异。那么这个箭头做了什么事情呢?它允许A将信息传递给A ,神经⽹络将⾃⼰的输出作为输⼊了!这怎么理解啊?
关键在于输⼊信号是⼀个时间序列,跟时间t有关。也就是说,在t时刻,输⼊信号 Xt作为神经⽹络A的输⼊, A的输出分流为两部分,⼀部分输出给 ht,⼀部分作为⼀个隐藏的信号流被输⼊到 A中,在下⼀次时刻输⼊信号Xt+1时,这部分隐藏的信号流也作为输⼊信号输⼊到了A中。此时神经⽹络A就同时接收了t时刻和t+1时刻的信号输⼊了,此时的输出信号⼜将被传递到下⼀时刻的A中。如果我们把上⾯那个图根据时间t展开来看,就是:
看到了吗? t=0时刻的信息输出给t=1时刻的模型 A 了,t=1 时刻的信息输出给t=2时刻的模型A了,… 。这样,相当于RNN在时间序列上把⾃⼰复制了很多遍,每个模型都对应⼀个时刻的输⼊,并且当前时刻的输出还作为下⼀时刻的模型的输⼊信号。
这样链式的结构揭⽰了RNN本质上是与序列相关的,是对于时间序列数据最⾃然的神经⽹络架构。并且理论上,RNN可以保留以前任意时刻的信息。RNN在语⾳识别、⾃然语⾔处理、图⽚描述、视频图像处理等领域已经取得了⼀定的成果,⽽且还将更加⼤放异彩。在实际使⽤的时候,⽤得最多的⼀种RNN结构是LSTM,为什么是LSTM呢?我们从普通RNN的局限性说起。
RNN的局限性
RNN利⽤了神经⽹络的“内部循环”来保留时间序列的上下⽂信息,可以使⽤过去的信号数据来推测对当前信号的理解,这是⾮常重要的进步,并且理论上RNN可以保留过去任意时刻的信息。但实际使⽤RNN时往往遇到问题,请看下⾯这个例⼦。
假如我们构造了⼀个语⾔模型,可以通过当前这⼀句话的意思来预测下⼀个词语。现在有这样⼀句话:“我是⼀个中国⼈,出⽣在普通家庭,我最常说汉语,也喜欢写汉字。我喜欢妈妈做的菜”。我们的语⾔模型在预测“我最常说汉语”的“汉语”这个词时,它要预测“我最长说”这后⾯可能跟的是⼀个语⾔,可能是英语,也可能是汉语,那么它需要⽤到第⼀句话的“我是中国⼈”这段话的意思来推测我最
常说汉语,⽽不是英语、法语等。⽽在预测“我喜欢妈妈做的菜”的最后的词“菜”时并不需要“我是中国⼈”这个信息以及其他的信息,它跟我是不是⼀个中国⼈没有必然的关系。
这个例⼦告诉我们,想要精确地处理时间序列,有时候我们只需要⽤到最近的时刻的信息。例如预测“我喜欢妈妈做的菜”最后这个
词“菜”,此时信息传递是这样的:西安大雁塔介绍
“菜”这个词与“我”、“喜欢”、“妈妈”、“做”、“的”这⼏个词关联性⽐较⼤,距离也⽐较近,所以可以直接利⽤这⼏个词进⾏最后那个词语的推测。
⽽有时候我们⼜需要⽤到很早以前时刻的信息,例如预测“我最常说汉语”最后的这个词“汉语”。此时信息传递是这样的:弓箭步跳>再也不相见
此时,我们要预测“汉语”这个词,仅仅依靠“我”、“最”、“常”、“说”这⼏个词还不能得出我说的是汉语,必须要追溯到更早的句⼦“我是⼀个中国⼈”,由“中国⼈”这个词语来推测我最常说的是汉语。因此,这种情况下,我们想要推测“汉语”这个词的时候就⽐前⾯那个预测“菜”这个词所⽤到的信息就处于更早的时刻。
⽽RNN虽然在理论上可以保留所有历史时刻的信息,但在实际使⽤时,信息的传递往往会因为时间间隔太长⽽逐渐衰减,传递⼀段时刻以后其信息的作⽤效果就⼤⼤降低了。因此,普通RNN对于信息的长期依赖问题没有很好的处理办法。
为了克服这个问题,Hochreiter等⼈在1997年改进了RNN,提出了⼀种特殊的RNN模型——LSTM⽹络,可以学习长期依赖信息,在后⾯的20多年被改良和得到了⼴泛的应⽤,并且取得了极⼤的成功。
长短时间记忆⽹络(LSTM)
LSTM与RNN的关系
长短期记忆(Long Short Term Memory,LSTM)⽹络是⼀种特殊的RNN模型,其特殊的结构设计使得它可以避免长期依赖问题,记住很早时刻的信息是LSTM的默认⾏为,⽽不需要专门为此付出很⼤代价。
普通的RNN模型中,其重复神经⽹络模块的链式模型如下图所⽰,这个重复的模块只有⼀个⾮常简单的结构,⼀个单⼀的神经⽹络层(例如tanh层),这样就会导致信息的处理能⼒⽐较低。
⽽LSTM在此基础上将这个结构改进了,不再是单⼀的神经⽹络层,⽽是4个,并且以⼀种特殊的⽅式进⾏交互。
粗看起来,这个结构有点复杂,不过不⽤担⼼,接下来我们会慢慢解释。在解释这个神经⽹络层时我们先来认识⼀些基本的模块表⽰⽅法。图中的模块分为以下⼏种:马齿苋的功效
黄⾊⽅块:表⽰⼀个神经⽹络层(Neural Network Layer);
粉⾊圆圈:表⽰按位操作或逐点操作(pointwi operation),例如向量加和、向量乘积等;
单箭头:表⽰信号传递(向量传递);
合流箭头:表⽰两个信号的连接(向量拼接);
分流箭头:表⽰信号被复制后传递到2个不同的地⽅。
下⾯我们将分别介绍这些模块如何在LSTM中作⽤。
LSTM的基本思想
LSTM的关键是细胞状态(直译:cell state),表⽰为Ct,⽤来保存当前LSTM的状态信息并传递到下⼀时刻的LSTM中,也就是RNN中那根“⾃循环”的箭头。当前的LSTM接收来⾃上⼀个时刻的细胞状态Ct-1,并与当前LSTM接收的信号输⼊xt共同作⽤产⽣当前LSTM的细胞状态Ct,具体的作⽤⽅式下⾯将详细介绍。
在LSTM中,采⽤专门设计的“门”来引⼊或者去除细胞状态Ct中的信息。门是⼀种让信息选择性通过的⽅法。有的门跟信号处理中的滤波器有点类似,允许信号部分通过或者通过时被门加⼯了;有的门也跟数字电路中的逻辑门类似,允许信号通过或者不通过。这⾥所采⽤的门包含⼀个sigmod神经⽹络层和⼀个按位的乘法操作,如下图所⽰:
难忘的一幕
自省是什么意思
其中黄⾊⽅块表⽰sigmod神经⽹络层,粉⾊圆圈表⽰按位乘法操作。sigmod神经⽹络层可以将输⼊信号转换为0到1之间的数值,⽤来描述有多少量的输⼊信号可以通过。 0表⽰“不允许任何量通过”, 1表⽰“允许所有量通过”。sigmod神经⽹络层起到类似下图的函数所⽰的作⽤:
其中,横轴表⽰输⼊信号,纵轴表⽰经过sigmod以后的输出信号。
LSTM主要包括三个不同的门结构:遗忘门、记忆门和输出门。这三个门⽤来控制LSTM的信息保留和传递,最终反映到细胞状态Ct和输出信号ht。如下图所⽰:
图中标⽰了LSTM中各个门的构成情况和相互之间的关系,其中:
遗忘门由⼀个sigmod神经⽹络层和⼀个按位乘操作构成;
记忆门由输⼊门(input gate)与tanh神经⽹络层和⼀个按位乘操作构成;
输出门(output gate)与tanh函数(注意:这⾥不是tanh神经⽹络层)以及按位乘操作共同作⽤将细胞状态和输⼊信号传递到输出端。
遗忘门
顾名思义,遗忘门的作⽤就是⽤来“忘记”信息的。在LSTM的使⽤过程中,有⼀些信息不是必要的,因此遗忘门的作⽤就是⽤来选择这些信息并“忘记”它们。遗忘门决定了细胞状态Ct-1中的哪些信息将被遗忘。那么遗忘门的⼯作原理是什么呢?看下⾯这张图。