循环神经网络

循环神经网络(简称RNN),他有自己的状态,并可以实时根据自己得到的信息改变自己的状态。

ht=fw(h(t-1),xt)
这个函数表示,输入为上一状态与当前处理得出的向量x,fw是一个函数,它有权值w,在每个时间步长都会执行这个fw函数,并且都使用相同的w,这个函数会判断下一步将转换为什么状态。其中一个fw的简单例子为tanh(W(hh)h(t-1)+W(xh)xt)
这里写图片描述

这里写图片描述
这里写图片描述
如上图所示,在每个时长RNN所进行的步骤为:
1.输入向量,即input layer。
2.用W(xh)矩阵对输入向量进行变换得到h向量的一个分量,h向量的值等于前一个hidden layer传递来的向量与当前input layer传递来的向量之和,这便是hidden layer的向量值,在这里的hidden layer到底是什么呢,我的理解是对当前输入向量的数据状态和前一状态的表示。
3.hidden layer 有两个出口,一是通过W(hy)矩阵进行变换,从而得到y向量,即output layer,也就是各个预测分类的分数,在得到分数之后还要通过softmax损失函数得到最后的评分,并得到预测的分类和相应的loss值,这个预测分类将作为下一个input。另一个出口是当前h向量通过W(hh)矩阵变换之后作为下一个hidden layer的h向量的分量。
4.最后便是网络的训练过程了,如下图所示,网络的loss是每个outputlayer的loss之和,再同时以每个output为入口进行反向传播,在反向传播中需要优化的有以下矩阵:W(xh),W(hh) , W(hy) , 值得注意的是,在单次训练或测试中的任意时刻,RNN所使用的W(xh),W(hh) , W(hy)都不会发生变化,还有一点是,在反向传播到hidden layer时,由于h(t)=h+x,其中h=f(w(hh))(h(t-1)),x=f(w(xh))(x(t)),因此h和x应共享梯度,即梯度一样。这里还有个很重要的点是:在我们训练的时候,正向传播和反向传播的时间一样的,即所进行的迭代次数是一样的,但是在实际使用过程中,我们不需要要求正向传播的迭代次数与训练时一样,比如实际使用时可以将时长设为任意长度,而训练时长度只有20,并且即使反向传播序列长度只有20,但它具有很强的拓展能力。

这里写图片描述
这里写图片描述
循环网络的应用:在课程中的例子是构建字符序列模型,训练时可以向网络中输入任意字符集,比如小说,教科书,代码什么的,训练时要设置单次序列长度,比如设为20,那么正向和反向传递的序列长度都为20。在实际使用中,训练好的网络便可以自己生成出字符序列,当然,你可以设定序列长度,例如你设为1000,你只需要给它一个任意长度的头,或给他一个零散的序列,它便可以自己生成出1000长度的序列。