RNN
架构图
话不多说,直接上网络架构
PS:你如果斜着看就和你通常看到的RNN网络架构是一样的了,不过这不影响什么。
剖析
要点如下:
输入:依次输入(x1,x2,…xt)参数:U,V,W,h0。输出:依次输出(o1,o2,…ot)
问题:
能不能同时输入而不是依次输入(x1,x2,…xt)?可以,但是没有必要,因为根据架构图RNN会先处理x1,得到h1,有了h1才能处理x2。能不能同时输出而不是依次输出(o1,o2,…ot)?可以,若现在处于训练阶段则此方式可以认为是一个批量更新参数U,V,W,但是这种方式你需要保存(h1,h2,…ht),然后激活后乘以V得到(o1,o2,…ot),同时输出。若现在处于测试阶段,则只需要依次保存h1,h2,…ht,然后乘以V即可。架构图中所有的U,V,W是一样的吗?是的,权值共享。h0如何设置?随机初始化即可,同样是参数,要进行训练。
数据流
三步要牢记。
h1=Ux1+Wh0h_1=Ux_1+Wh_0h1=Ux1+Wh0
h1′=f(h1)h_1^{'}=f(h_1)h1′=f(h1),其中fff是激活函数
o1=Vh1′o_1=Vh_1^{'}o1=Vh1′
上面只列举了前3步计算,然后h1h_1h1作为“历史信息”继续传递下去和W相乘,可以看网络架构图。
实际应用
背景:基于RNN的语言模型,我们希望这个网络做到:
输入x1=bush的时候,o1输出held。即这个网络可以根据以前的历史信息,猜测下一个词我想要输入的是什么,这不就是你手机的输入法吗?同理,输入x4=talk,希望输出o4=with。
已知:图中输入的那些向量,比如向量(0.2,0.2)代表Bush。
初始化:
U,V,W。
PS:这里的V有个小技巧,可以用输入的那6个向量来构成,那么也是2*6的矩阵。不过我这里随机的。
h0
正向传播
然后套公式( 此处省略)。
h1′=f(h1)h_1^{'}=f(h_1)h1′=f(h1)
o1=Vh1′o_1=Vh_1^{'}o1=Vh1′
可以得到(6,1)的向量o1,假设结果是下面这样(我懒得算)
这不正好对应着我们的6个词吗?
发现第二个维度(对应held)是所有6个数里面最大的,那么说明RNN成功预测了held。
但是如果不是最大的,假设是这样
那么RNN认为Bush后面应该接Bush,预测错误,那么应该使用惩罚函数梯度回传,调整参数U,V,W,h0。因为预测错误,罪魁祸首就是U,V,W,h0。
读完了x1,接着使用x2和h1进入下一轮训练。
优点
RNN的优秀思想是:
可以使得网络的输入神经元可以无限多,试想FNN前馈神经网络就不行,因为输入层的神经元个数是固定的。后面的输出需要依赖ht−1h_{t-1}ht−1,这个ht−1h_{t-1}ht−1包含了历史信息,因为得到ht−1h_{t-1}ht−1需要h0,h1,....h_0,h_1,....h0,h1,....。而历史信息在很多问题中是非常重要的。
RNN或基于RNN的网络是处理含时间序列和有上下文问题的小能手。