一.介绍
在普通的神经网络中,信息的传递是单向的,这种限制虽然使得网络变得更容易学习,单在一定程度上也减弱了神经网络模型的能力。特别是在现实生活中,网络的输出不仅和当前时刻的输入相关,也过去一段时间的输出相关。此外,普通网络难以处理时序任务,比如语言,视频,文本等等,时序数据的长度一般是不固定的,而前馈神经网络要求和输出的维数都是固定的,不能任意改变。所以处理这一类时序相关的问题时,需要一种能力更强的模型
循环神经网络(Recurrent Neural Network,RNN )是一类具有短期记忆的神经网络。在循环神经网络中,神经元不仅可以接收其他神经元的信息,还可以接收自身的信息,形成具有环路的网络结构。
可以看到RNN比传统的审计网络多了一个循环,这个循环表示在下一个时间步上会返回作为输入的一部分,把RNN时间点展开就是:
就是在t_0时刻x_0输入后返回h_0的同时将h_0当成输入和下一个时间点的x_1一起输入,如此反复
或者是:当x_t-1输入后返回的结果h_t-1和x_t一起当作输入后通过tanh计算后输出h_t同时向下一个时间点输入h_t
在不同的时间步中,RNN的输入都与之前的时间状态有关,t_n时刻网络的输出和之前的所有历史共同作用的结果。
图1:固定长度的输入和输出,比如图像分类
图2:序列输入,输入一个数据,逐渐分析结果,比如图像转文字
图3:数列输入,输入一些数据,总结后得出结果,比如文本分类
图4:异步的序列输入和输出,比如文本翻译
图5:同步的序列输入和输出,比如根据视频的每一帧来对视频分类
二.LSTM
1.LSTM的基础介绍
假如现在有一个文本预测,比如天上的云朵漂浮在__,通过间隔不愿的位置可以预测到答案是天上。但是对于有些句子,答案可能在很远的位置,间隔非常大,随着间隔的增大对于RNN来说,效果就不怎么好了。而LSTM(Long Short-Term Memory)可以解决这个问题,LSTM是RNN的一种特殊类型,可以长期依赖信息,而RNN只能短期的依赖。
其中x表示相乘,+表示相加,表示使用某个函数
2.LSYM的核心
LSTM的核心在于单元中的状态,也就是图中最上边那根弦。
如果只要这跟线,那么就不能对信息增加或者删除,所以在LSTM是通过一个叫做门的结构实现的,门可以选择让信息通过或者不通过
这个门主要是通过sigmoid和点乘实现的
sigmoid函数的结果是在0-1之间的,如果结果为0那么就不让这个信息通过,如果是1就全部通过
3.遗忘门
遗忘门是通过sigmoid函数实现的,用来决定哪些信息保留,哪些信息遗忘。
下图就是h_t-1和x_t进行合并后乘上权重和偏置然后通过sigmoid函数,输入一个0-1之间的值,这个值会和前一个细胞输出的状态c_t-1进行点乘,从而决定是遗忘还是保留
4.输入门
i_i是sigmoid函数后,结果在0-1之间,决定哪些信息会被更新,tanh会创造一个新的候选量C_t如果i_i不是0的话可能会添加到细胞中,比如昨天我吃了苹果,今天我想吃梨,通过遗忘门可以遗忘掉苹果,通过输入门可以输入梨。
经过输入门后就可以更新细胞状态了,C_t-1更新为C_t。怎样更新呢
1.旧的细胞状态和遗忘门的结果相乘
2.然后加上输入门和tanh相乘的结果
5.输出门
最后,我们需要决定哪些信息会被输出,和输入门差不多,线通过sigmoid函数结果来决定哪些细胞状态会被输出
1.前一次的输出结果h_t-1和当前时间步输入的x_t组和通过sigmoid函数进行处理后结果
2.在输入门的时候更新过的细胞状态C_t会经过tanh层的处理将数据转换到(-1,1)之间
3.将1和2的结果点乘后得到结果,一个输入结果,一个输入到下一个时间步的结果
三.GPU
GRU(Gated Recurrent Unit),是一种LSTM的变形版本,它将遗忘门和输入门组合成一个"更新门"。它还合并了单元状态和隐藏状态,并进行了一些更改。
1.z_t就是上一次的结果和这一次的数据通过sigmoid函数后的结果
2.r_t和z_t一样
3.h_t一把是r_t和上一次的结果h_t-1点乘后于x_t组合后通过tanh后的结果
4.h_t是z_t通过1-后点乘上一次的结果后加上z_t点乘上h_t一把的结果
r_t到z_t是更新门,而后面的就是输入出门
四.双向LSTM
结合上面的例子,都是对前面的结果进行计算,而一个词语填空有些时候也要看后面的数据。那么就需要有一种计制,能够使模型不仅能够从前面获得记忆,还要从后获得记忆。此时就要用到双向LSTM了。
从图中可以看出,没给x的输入后不仅得到了结果,这个结果还传到了下一个时间步中计算,而且还生成了一个LSTM_b的结果,因为LSTM_0的箭头是从后往前的,所以使得当前这个时步同时拥有了前后的数据。