rnn - juedaiyuer/researchNote GitHub Wiki
循环神经网络 RNN
RNN可以称得上是深度学习未来最有前景的工具之一。它在时间序列(比如语言文字,股票价格)的处理和预测上具有神功, 你想了解它的威力的根源吗?
为什么RNN会有如此强大的效力? 让我们从基础学起。首先, 要看RNN和对于图像等静态类变量处理立下神功的卷积网络CNN的结构区别来看, “循环”两个字,已经点出了RNN的核心特征, 即系统的输出会保留在网络里, 和系统下一刻的输入一起共同决定下一刻的输出。这就把动力学的本质体现了出来, 循环正对应动力学系统的反馈概念,可以刻画复杂的历史依赖。另一个角度看也符合著名的图灵机原理。 即此刻的状态包含上一刻的历史,又是下一刻变化的依据。 这其实包含了可编程神经网络的核心概念,即, 当你有一个未知的过程,但你可以测量到输入和输出, 你假设当这个过程通过RNN的时候,它是可以自己学会这样的输入输出规律的, 而且因此具有预测能力。 在这点上说, RNN是图灵完备的。
图: 图1即CNN的架构, 图2到5是RNN的几种基本玩法。图2是把单一输入转化为序列输出,例如把图像转化成一行文字。 图三是把序列输入转化为单个输出, 比如情感测试,测量一段话正面或负面的情绪。 图四是把序列转化为序列, 最典型的是机器翻译, 注意输入和输出的“时差”。 图5是无时差的序列到序列转化, 比如给一个录像中的每一帧贴标签。 图片来源 The unreasonable effective RNN。
我们用一段小巧的python代码让你重新理解下上述的原理
def step(self,x):
# update the hidden state
# h hidden variable 即整个网络每个神经元的状态
# W_xh 吸收输入序列x的当下值
# W_hh 网络连接进行内部神经元间的相互作用
self.h = np.tanh(np.dot(self.W_hh,self.h) + np.dot(self.W_xh,x))
#compute the output vector
y=np.dot(self.W_hy,self.h)
return y
那么CNN似乎也有类似的功能? 那么CNN是不是也可以当做RNN来用呢? 答案是否定的,RNN的重要特性是可以处理不定长的输入,得到一定的输出。当你的输入可长可短, 比如训练翻译模型的时候, 你的句子长度都不固定,你是无法像一个训练固定像素的图像那样用CNN搞定的。而利用RNN的循环特性可以轻松搞定。
图, CNN(左)和RNN(右)的结构区别, 注意右图中输出和隐变量网络间的双向箭头不一定存在,往往只有隐变量到输出的箭头。
RNN的本质是一个数据推断(inference)机器, 只要数据足够多,就可以得到从x(t)到y(t)的概率分布函数, 寻找到两个时间序列之间的关联,从而达到推断和预测的目的。 这里我们无疑回想到另一个做时间序列推断的神器- HMM, 隐马尔科夫模型, 在这个模型里, 也有一个输入x和输出y,和一个隐变量h, 而这的h和刚刚的RNN里的h区别是迭代法则, 隐马通过跃迁矩阵把此刻的h和下一刻的h联系在一起。跃迁矩阵随时间变化, 而RNN中没有跃迁矩阵的概念,取而代之的是神经元之间的连接矩阵。 HMM本质是一个贝叶斯网络, 因此每个节点都是有实际含义的,而RNN中的神经元只是信息流动的枢纽而已,并无实际对应含义。两者还是存在千丝万缕的联系, 首先隐马能干的活RNN几乎也是可以做的,比如语言模型,但是就是RNN的维度会更高。在这些任务上RNN事实上是用它的网络表达了隐马的跃迁矩阵。在训练方法上, 隐马可以通过类似EM来自最大后验概率的算法得出隐变量和跃迁矩阵最可能的值。 而RNN可以通过一般的梯度回传算法训练。
出于优化的考虑,目前循环神经网络无法做到真正的无限循环
循环神经网络可以被看成同一神经网络结构在时间序列上被复制多次的结果,这个被复制多次的结构被称之为循环体