今天我们主要讨论的循环神经网络,到底循环神经网络能解决什么问题,它的结构是怎样的?有什么优缺点?应该在那些领域上上?本文将跟大家一起探讨。
讲到AI不得不讲深度学习,而讲到深度学习,又不能不讲循环神经网络(Recurrent Neural Network, RNN)。如果把深度学习比作中国的互联网界,那循环神经网络和卷积神经网络就是腾讯和阿里级别的地位。
看这篇文章之前,建议大家先看下我前面写的两篇文章《深度学习到底有多深?》、《入门AI:卷积神经网络》,本文讨论的内容跟前面写的文章有很强的关联性,看完可能更容易理解本文所讨论的内容。
照例,先给个概述图:
为了方便,在下文中我们用RNN来表示循环神经网络。
一、为什么需要RNN?
我们先来看一个订票系统:
假设我们在订票系统中输入一句话“我将在7月20号去深圳”,那么订票系统就会这句话中的词进行分类,专业术语叫填槽(slot filling)。
那订票系统会把这些词分别填到3个槽中:
目的地:深圳
时间:7月20号
其他类型:我、将、在、去
补充下神经网络的知识,要实现这个分类的话,我们可以搭一个网络架构。
当输入“深圳”,经过网络系统后,会判断出“深圳”属于目的地槽的概率是多少,然后决定是否属于目的地槽。
但是,假设我们再输入另外一句话“我将在7月20号离开深圳”,机器能正确处理吗?
对于普通的神经网络,同样的输入,肯定会是同样的输出,因此如果同一个网络输入这两句的“深圳”的话,那机器肯定会把他们归到同一个槽,这样肯定是错了。
那怎么办?假设我们在输入“深圳”的时候,机器根据上下文的词,再输出结果。这样是不是有可能解决问题了,没错,这就是RNN要做的事。
具体RNN怎么工作的,接着往下看。
二、RNN的工作原理
1. RNN的工作原理
RNN的工作原理图:
在神经网络里,每一个神经元的输出,都会被记得绿色的方块里,然后下一次输入的时候,不仅要考虑红色的输入,还要考虑被记在绿色里面的值。
也就是:新的输出是由新的输入和被之前所记下来的值所决定的。
这样的话,我们前面所讨论的问题就可以解决了:
当输入第一句话的“深圳”时,我们记住前面输入的是“去”,然后就把“深圳”归为目的地。
当输入第二句话的“深圳”时,我们记住前面输入的是“离开”,然后就把“深圳”归为出发地。
因此,我们可以看到RNN最主要的两个特点:
新的输出是由新的输入和之前的输出共同决定的。
对于同一个输入,可能会输出不同的结果。
2. RNN的其他架构
如上左图的架构,是每一个神经元的输出都会被记起来。
如上右图的架构,是网络的最终输出的值才会被记起来。
双向RNN:
假设我输入一句 “7月20号,深圳,我来了”,如果用我们之前讨论的网络,就可能有问题。因为之前的网络只能考虑输入在“深圳”之前的内容,没办法考虑在“深圳”之后的内容,而“来”在“深圳之后”,所以网络就不知道“深圳”是目的还是出发地了。
那双向RNN就可以解决这个问题:
双向RNN是把同一句话,按正反两个顺序一起丢到网络里去训练,然后综合考虑正反两个顺序再决定输出结果。因此,双向RNN不仅考虑了前文,还考虑的后文。
到此为止,我们讨论的都都是最简单的RNN,但现实可能存在更加复杂的场景。
我们前面讨论的都是输入“深圳”只会考虑跟它相邻的那个值,如果跟它相距比较远,可能就没办法处理了,比如:我们输入“离开了,7月20号,我美丽的深圳”。
那要怎么解决这样的问题呢?下面我们就来介绍下,RNN中最经典,也是现在最常用的模型:LSTM(Long short-term memory)。
三、 LSTM
结构图:
由四部分组成:输入门、输出门、忘记门、记忆单元
输入门(Input gate):决定外界能不能把数据写入记忆单元,只有输入门打开的时候,才能写入数据;
输出门(Output gate):决定外界能不能从记忆单元里读取数据,只有输出门打开的时候打,才能读取数据;
忘记门(Forget gate):决定什么时候把记忆单元里的数据清除,打开的时候是不清除的,关闭的时候就会清除;
记忆单元(Memory cell):就是存储数据。
每个门什么打开,什么时候关闭?都是机器自己学的。
具体的计算逻辑:
这个是纯数学逻辑了,大家看下就好,看不明白也没关系,入门不必深究。
从上图我们可以看出,LSTM是需要4个输入,才会有一个输出的。
小结:
LSTM最大的特点就是:可以有很长时间或距离的记忆能力,而普通的RNN不能记住间距大的信息。
除此之外,LSTM对还能对梯度消失和梯度爆炸有比较好的处理效果。
备注:对于不知道什么是梯度下降的同学,可以翻下之前的文章。这里简单介绍下什么是梯度消失和梯度爆炸。
梯度消失:误差梯度的值变化得太小,没办法移动了,导致机器停止学习;
梯度爆炸:误差梯度变化非常大,网络参数大幅更新,导致网络不稳定。
四、总结
1. RNN小结
RNN是根据“人的认知是基于过往经验和记忆”这一观点提出的,它不仅考虑当前时刻的输入,还考虑对前面内容记忆。即RNN 对之前发生在数据序列中的事是有一定记忆的,对处理有序列的问题效果比较好。
2. RNN与CNN的不同点
前一输入跟下一输入是否有关联:
CNN :前一个输入和下一个输入之间没有任何关联,因此所有的输出都是独立的。
RNN:前一个输入和下一个输入之间没有任何关联,共同决定新的输出
前馈或反馈网络:
CNN:属于前馈神经网络
RNN:属于反馈神经网络
备注:什么是前馈网络?什么是反馈网络?
前馈网络:每一层中的神经元接收前一层神经元的输出,并输出到下一层神经元,整个网络中的信息是朝着一个方向传播的,没有反向的信息传播;
反馈网络:反馈神经网络中神经元不但可以接收其他神经元的信号,而且可以接收自己的反馈信号。
3. RNN的主要应用领域
用RNN处理需要考虑时间先后顺序的问题,效果都很不错,例如:
自然语言处理(NLP)
语音识别
机器翻译
图像描述生成
文本相识度处理等
好了,到这里就介绍完了RNN。