为什么需要RNN

初学RNN(循环神经网络)神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y。将神经网络模型训练好之后,在输入层给定一个x,通过网络之后就能够在输出层得到特定的y。
其他神经网络前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。通常用在自然语言处理领域中,为了解决一些这样类似的问题,能够更好的处理序列的信息,RNN就诞生了。

RNN结构

初学RNN(循环神经网络)
一个简单的循环神经网络如,它由输入层、一个隐藏层和一个输出层组成。
如果把上面有W的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络。x是一个向量,它表示输入层的值(这里面没有画出来表示神经元节点的圆圈);s是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同);
U是输入层到隐藏层的权重矩阵,o也是一个向量,它表示输出层的值;V是隐藏层到输出层的权重矩阵。
初学RNN(循环神经网络)
循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵W就是隐藏层上一次的值作为这一次的输入的权重。
初学RNN(循环神经网络)
初学RNN(循环神经网络)
式1是输出层的计算公式,输出层是一个全连接层,也就是它的每个节点都和隐藏层的每个节点相连。V是输出层的权重矩阵,g是**函数。式2是隐藏层的计算公式,它是循环层。U是输入x的权重矩阵,W是上一次的值作为这一次的输入的权重矩阵,f是**函数。
如果反复把式2带入到式1,我们将得到
初学RNN(循环神经网络)

双向循环神经网络

对于语言模型来说,很多时候光看前面的词是不够的,比如下面这句话:

我的手机坏了,我打算____一部新手机。

可以想象,如果我们只看横线前面的词,手机坏了,那么我是打算修一修?换一部新的?还是大哭一场?这些都是无法确定的。但如果我们也看到了横线后面的词是『一部新手机』,那么,横线上的词填『买』的概率就大得多了。

在上一小节中的基本循环神经网络是无法对此进行建模的,因此,我们需要双向循环神经网络,如下图所示:
初学RNN(循环神经网络)
当遇到这种从未来穿越回来的场景时,难免处于懵逼的状态。不过我们还是可以用屡试不爽的老办法:先分析一个特殊场景,然后再总结一般规律。我们先考虑上图中y2的计算。

从上图可以看出,双向卷积神经网络的隐藏层要保存两个值,一个A参与正向计算,另一个值A’参与反向计算。最终的输出值y2取决于A2和A’2。其计算方法为:
初学RNN(循环神经网络)
A2和A’2则分别计算:
初学RNN(循环神经网络)
现在,我们已经可以看出一般的规律:正向计算时,隐藏层的值st与st-1有关;反向计算时,隐藏层的值s’t与s’t+1有关;最终的输出取决于正向和反向计算的加和。现在,我们仿照式1和式2,写出双向循环神经网络的计算方法:
初学RNN(循环神经网络)
从上面三个公式我们可以看到,正向计算和反向计算不共享权重,也就是说U和U’、W和W’、V和V’都是不同的权重矩阵。

深度循环神经网络

前面我们介绍的循环神经网络只有一个隐藏层,我们当然也可以堆叠两个以上的隐藏层,这样就得到了深度循环神经网络。如下图所示:
初学RNN(循环神经网络)
深度循环神经网络的计算方式可以表示为:
初学RNN(循环神经网络)

参考1: 知乎:一文搞懂RNN(循环神经网络)基础篇https://zhuanlan.zhihu.com/p/30844905
参考1: https://zybuluo.com/hanbingtao/note/541458