首先学习RNN需要一定的基础,即熟悉普通的前馈神经网络,特别是BP神经网络,最好能够手推。
所谓前馈,并不是说信号不能反向传递,而是网络在拓扑结构上不存在回路和环路。
而RNN最大的不同就是存在环路。
为什么需要RNN
普通的神经网络处理的是一个个样本,独立同分布(iid),而现实中很多事情前后是有联系的,
比如理解一个句子,只看句子中的词是无法理解整个句子的,此时普通的神经网络就无能为力了。
RNN就是为处理序列数据而生的。
RNN的结构
首先看一个简单的RNN
x是输入,s o是对应层的输出,u v 是对应层的权重,还有w
可以看到,唯一不同的就是隐藏层多了一个环路。
也就是说,s的值不仅取决于x,而且取决于上次隐藏层的输出,即上个s,而w就是这条传播线路上的权重矩阵。
把上图纵向展开,即 输入-输出
这张图有些看不清,左边那部分其实是 [S1', S2', ... Sm'],对应上一次隐层每个神经元的输出,也就是每次隐层的输出先保存起来,下一次和x一起作为输入
于是有公式
Ot=g(V*St)
St=f(U*Xt+W*St-1)
这个公式写在这里其实并不合适,因为公式中的St 和图中的 S1 S2...很容易混淆,其实并不是一个东西。
再把第一张图横向展开,即样本1-样本2-样本3...
此时我们再来看上面的公式,一目了然。
把上图实例化,更容易理解
1. 预测句子
2. 预测单词hello
把图扩展为 Deep RNN
总结
总体来讲,RNN还是要比CNN容易理解的多,几张图轻松搞定,CNN我就不写了,太多了,CNN有什么问题可以在此处探讨。
在实际场景中,CNN多用于图像识别,RNN多用于语音和视频识别。