深度学习与CNN、RNN(二)

来源:互联网 发布:淘宝代运营被骗 编辑:程序博客网 时间:2024/06/08 12:51
在有了BP算法的基础之后,就可以开始了解RNN了

一、RNN基础知识
RNN的设计目的是尝试了解序列数据,比如你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。但对于普通神经网络,就只能从当前给定的这个词来判断,而RNN就可以结合之前提到的词汇,更科学地判断。

之所以能这么做,关键就是在于,RNN相对于一般的神经网络多了一个时序结构,如下图
深度学习与CNN、RNN(二)
一般神经网络就是简单的从下往上,而RNN则在中间的隐藏层加入了一个回环结构,即输出信号不但传到输出层,还传给了未来的隐藏层。体现在具体计算中,公式如下:
深度学习与CNN、RNN(二)
深度学习与CNN、RNN(二)
可以看到,隐藏层的计算中引入了过去隐藏层输出的信息,综合之后再通过输出层的softmax函数,得到输出信号。另一方面,RNN也可以展开成普通的神经网络,隐藏层之间存在互相连接,如下图:
深度学习与CNN、RNN(二)
这样就能很形象地看到,隐藏层是如何处理各个时刻的输入以及输出。

RNN的主要用途之一,就是在图像处理方面。RNN的训练方法和之前的神经网络一样,也可以使用BP算法,不过有一点区别。如果将RNNs进行网络展开,那么参数W,U,V是共享的,而传统神经网络却不是的。

另一方面,在BP算法使用的类似于梯度下降算法的学习中,每一步的输出不仅依赖当前步的网络,并且还依赖前面若干步网络的状态。比如,在t=4时,我们还需要向后传递三步,而后面的三步都需要加上各种梯度。因此就带来了RNN中的一个隐患。假设在a时刻引入一个输入,而在b时刻的输出中,得到一个残差信号,假设a到b这段时间中所有输入都为0。由于这段时间都没有误差,那么隐藏层回环边上的参数(上图中的W)也就一直不变,那么按照BP算法的规则,b时刻的误差δ会不断的乘以W,以δ*W*W*......*W的形式一直传到a时刻,可以想象经过这样的指数级变化,误差δ要么会变得无比大,要么会接近于0,这就是所谓的梯度爆炸和梯度消失。而为了解决这个问题,就有了现在热门的LSTM。

二、现代RNN的改进算法(LSTM)
正如上面所说,随着时间变长,RNN会无法解决所谓的长时依赖问题,改进的方法有很多,这里说一种主要的方法:LSTM(longshort tern memory)。这段主要参考的博文是:
http://colah.github.io/posts/2015-08-Understanding-LSTMs/

对于一般的RNN,我们可以把隐藏层视为如下形式:
深度学习与CNN、RNN(二)

而LSTM可以视为对RNN的一次改进,是一种进阶版的RNN,如下:

深度学习与CNN、RNN(二)
可以看到,原来RNN的隐藏层,就是一个简单的转化函数,得到隐藏层的输出,而LSTM则要复杂得多。下面逐个分析LSTM的改装部件。

(1)LSTM的核心
LSTM的核心是顶部的那条cell线,它直接穿过各个时刻的隐藏层,并且只会进行简单的变大变小(X号表示乘以一个倍率)以及添加新内容(+号),因此它可以在各个时刻变换中,使信息无损地保留下去。
深度学习与CNN、RNN(二)

(2)清除过时的信息
对于当前时刻,第一个要做的就是要去除掉哪些无用的信息,实现机制如下图:
深度学习与CNN、RNN(二)
通过当前输入x以及上一个时刻的隐藏层输入ht-1,判断要去除哪些信息,通过sigmoid函数输出一个0到1之间的向量,向量中每个元素对应Ct-1状态里的一个信息,如果要完全抹掉,则是0。比如当前输入的是性别,那么在ft()的输出中,与性别相关的那一项就置0,从而把Ct-1传过来的信息中,性别这一项给抹掉。具体抹掉的方法,就是如下图,当Ct-1的状态与sigmoid函数的输出相乘时,对应项就置0了:
深度学习与CNN、RNN(二)

(3)添加新信息
去掉过时的信息之后,就是加入新信息了,如下图:
深度学习与CNN、RNN(二)
同样是用ht-1和x作为输入,首先是一个sigmoid的门,来判断我们需要更新哪些信息。然后再用一个tanh门函数,来表示我们可能要更新信息的数值,两者相乘,得到具体要更新哪些信息,以及他们对应的数值。最后再加入到Ct-1中,得到这些数值之后,我们就能得出当前状态Ct了:
深度学习与CNN、RNN(二)
(4)输出信息
我们得到的Ct可以作为cell线的输出,剩下还有隐藏层和当前时刻的输出需要处理,方法如下:
深度学习与CNN、RNN(二)
首先把Ct的状态,用tanh函数转化为适合隐藏层和当前时刻输出的形式(-1到1),然后根据ht-1和x的消息,选择把哪些输出。比如x输入了一个新的性别消息,比如man,那么相应的我们就需要把该身份信息传递给下一时刻,这样一来,如果下一时刻的输入信息要求推测动词的使用形式,那么根据我们传递过去的man这个信息,就能确定此时应该用第三人称单数作为输出。

总的来说,LSTM是对于RNN的一个改进,在上面那篇博客的结尾还提到更多对于LSTM的改进,这里就不一一说了。
原创粉丝点击