rnn彷佛更擅长信息的保存和更新,而cnn彷佛更擅长精确的特征提取;rnn输入输出尺寸灵活,而cnn尺寸相对刻板。git
聊到循环神经网络RNN,咱们第一反应多是:时间序列 (time sequence)。github
确实,RNN擅长时间相关的应用(天然语言,视频识别,音频分析)。但为何CNN不容易处理时间序列而RNN能够? 为何咱们以前说过RNN有必定的记忆能力?网络
数学上,若是咱们想要预测一个单词x 的后一个单词y,咱们须要3个主要元素(输入单词x;x的上下文状态h1;经过x和h1输出下一个单词的函数好比softmax):机器学习
来自:http://suriyadeepan.github.io/2017-01-07-unfolding-rnn/
数学计算以下:ide
上面是一个很简单的有向无环图(DAG),可是,这只是一个时刻t 的单词预测,这种简单的预测甚至能够用cnn或者其余简单预测模型替代。函数
然而,cnn对于更新状态或者保存状态却并不擅长,咱们知道,下一个时间点t+1,单词x的上下文(状态)就改变了:学习
所以,RNN的门限结构和CNN卷积结构的不一样(信息保存方式的不一样)也必定程度致使RNN擅长处理时间序列的问题。即便咱们不用门限网络而用其余模型,咱们也须要相似上图的循环结构,把上下文状态在每个时间点进行更新,并保存下来。测试
因此,在时间序列的应用中,更新每一个时间点的状态是如此重要,咱们须要rnn这样的网络:
在每一个时间点,都使用一样的更新函数f 更新上下文状态,每一个时间点t的状态都是基于上一个时间点t-1的状态和本次信号xt的输入:
另外,RNN的门限网络有自然的马尔科夫化的性质,当前的状态S3通过屡次循环已经包含了几个时间点之前的状态信息(其中分号表明用参数θ编码前面状态):
当前的预测只须要根据当前的状态进行预测。这种巨大的保存状态信息的能力彷佛正是RNN门限单元擅长的。(cnn彷佛更擅长精确的特征提取)编码
传统的rnn是每一个时刻t,输入一个单词,生成另外一个单词,而实际状况并不都是这样简单。翻译
最后,咱们看一些变形的RNN结构。
向量到序列(Vector to Sequence)
有一些应用如根据一张图片,输出图片的字幕:
这种问题的RNN,须要输入图片的特征向量x(好比cnn的最后一层隐层),输出是一句话的字幕,可是这句话y 的单词是一个一个生成的。
这就要求rnn从单个向量中,一次性生成一个时间序列:
固然,时间序列的生成遵循了按照时间顺序循环更新内部状态的规则。
机器翻译问题中,好比一句英语句子翻译成法语句子,不必定对应的单词数量是相等的。因此传统的rnn必定须要修改。
常见的作法是用两个rnn,一个rnn用来编码句子(encoder),一个rnn用来解码成想要的语言(decoder):
这里的C 是上下文的信息,和编码好的隐层信息一块儿,送入decoder的输入,进行翻译。
传统的RNN预测一个单词,只是捕捉这个单词以前的上下文状态,而双向RNN还捕捉了这个单词后面的单词环境对该词的影响:
上图的双向RNN其实能够看作两个RNN,一个RNN就是咱们以前提到的传统RNN(只有隐藏状态h那一层);还有一个RNN是捕捉单词以后的单词环境的RNN(隐藏状态g那一层)。
这样的RNN把一个单词向左和向右的上下文环境信息考虑进去,准确率通常会有所提升。
参考:http://suriyadeepan.github.io/2017-01-07-unfolding-rnn/
哈工大SCIR中心推出对话技术平台-DTP(测试版)
【深度学习实战】pytorch中如何处理RNN输入变长序列padding
【机器学习基本理论】详解最大后验几率估计(MAP)的理解
欢迎关注公众号学习交流~