为什么需要RNN(循环神经网络)
参考:https://zhuanlan.zhihu.com/p/30844905
神经网络只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。
以nlp的一个最简单词性标注任务来说,将我 吃 苹果 三个单词标注词性为 我/nn 吃/v 苹果/nn。
那么这个任务的输入就是:我 吃 苹果 (已经分词好的句子)
这个任务的输出是:
我/nn 吃/v 苹果/nn(词性标注好的句子)
对于这个任务来说,我们当然可以直接用普通的神经网络来做,但是普通的神经网络的数据输入格式:
我-> 我/nn (单独的单词->词性标注好的单词)
吃->吃/v
苹果->苹果/nn
但是很明显,一个句子中,前一个单词其实对于当前单词的词性预测是有很大影响的,比如预测苹果的时候,由于前面的吃是一个动词,那么很显然苹果作为名词的概率就会远大于动词的概率,因为动词后面接名词很常见,而动词后面接动词很少见。
所以为了解决一些这样类似的问题,能够更好的处理序列的信息,RNN就诞生了。
RNN的结构
转自:https://zhuanlan.zhihu.com/p/30844905
x是一个向量,它表示输入层的值(这里面没有画出来表示神经元节点的圆圈);
s是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同)
U是输入层到隐藏层的权重矩阵,
o也是一个向量,它表示输出层的值;
V是隐藏层到输出层的权重矩阵。
那么W是什么呢?
循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。
从上图就能够很清楚的看到,上一时刻的隐藏层是如何影响当前时刻的隐藏层的。
把上面的图展开,循环神经网络也可以画成下面这个样子:
在时刻t接收到输入Xt之后,隐藏层的值是St,输出值是Ot。关键一点是,St的值不仅仅取决于Xt,还取决于St-1.
反向传播算法(Back Propagation)
转自&