RNN(循环神经网络)基础
注:引自知乎一文搞懂RNN(循环神经网络)基础篇和全面理解RNN及其不同架构
神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y,结构图如下:
那么为什么需要RNN呢?
传统神经网络只能单独处理一个个输入,前一个输入与后一个输入之间并没有关系,但是某些任务需要处理序列信息,即前面输入与后面输入存在联系。所以为了解决一些这样类似的问题,能够更好的处理序列的信息,RNN就诞生了。
RNN结构
如图为一个简单的循环神经网络,由输入层X,隐藏层S,输入层O组成。
先不看W,则该网络为普通的全连接网络。X代表一个向量(输入),U则表示输入层到隐藏层的权重矩阵,S代表隐藏层的向量,V则是隐藏层到输出层的权重矩阵,最后的O则代表输出向量。
加上W,我们可以看到循环神经网络的隐藏层S的值不仅仅取决于当下的输入X,还取决于上一次隐藏层的值S。将抽象图具象化如下:
注意:为了简单说明问题,偏置都没有包含在公式里面。
将抽象图展开,则如下图:
在RNN中,每输入一步,每一层各自都共享参数U,V,W。其反映着RNN中的每一步都在做相同的事,只是输入不同,因此大大地降低了网络中需要学习的参数。也就是说RNN的关键之处在于隐藏层,隐藏层能够捕捉序列的信息。
CNN 和RNN的共享参数:
CNN是 在空间上共享参数,RNN是在时间上(顺序上)共享参数
Long-Term依赖问题
在普通RNN训练中,无法解决长时依赖问题(即当前的输出与前面很长的一段序列有关,一般超过十步就无能为力了),因为RNN的反向传播会带来所谓的梯度消失或梯度爆炸问题(the vanishing/exploding gradient problem)。
有时候,我们只需要查看最近的信息来执行现在的任务
但也有一些情况是我们需要更多上下文的。然而随着距离的增大,RNN变得不能够连接信息。
为了解决由于太多层会产生梯度爆炸和弥散的问题,由此引出了LSTM(长短时记忆网络)和GRU(循环门单元,LSTM的变种)
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MemoryNetwork:RNN(循环神经网络)基础 - Python技术站