Home Blogs Readings Notes Jupyter Seafile

RNN基本原理和手写实现

22 Mar 2018

Table of Content

RNN(Recurrent Neural Network)的前向和反向推导

前向计算

RNN的前向计算看起来非常简单,但是这里面比较重要的点在于理解到底是什么。并且在这儿的和RNN的隐含层大小 到底有木有关系。在这同样也采用交叉熵作为损失函数。需要注意的是因为整个前向计算其实是分成了t个步骤来算的,所以损失应该是这t步的损失 之和。虽然看起来比较简单,但是因为涉及到状态的迭代,所以求导过程比NN稍微有些复杂。

在RNN中求导的变量是针则是分别U,V,W这三个权重变量的导数。因此目标偏导数主要是:

经典的RNN展开计算过程:

forward

反向推导

先作如下定义方便计算:

1. 计算

2. 计算

接下来的关键是对W求导。但是因为

也是W的函数,所以此时求导类等价于形如的求导过程。

所以:

至此可求得:

可以明显看出其中关键是对的求导:

另:

3. 计算

U的计算过程同样包含了状态函数之间的依赖关系,所以其求导过程和W的基本一样,最后也可得到:

综合以上就是RNN的求导过程。

小结

对RNN的理解关键在于理解这个recurrent是怎么回事。其实网上很多图和文章都是抄来抄去,真正能帮人理解的东西却只有寥寥。 就目前来说,各种试图用所谓简化的方法来解释的文章都不如看懂公式来的直接。可能开始会比较难理解各个符号和表示, 可是这种精简正确的且非常有效的信息却是理解一点就学习一点的。

偏导推导Refs

-->
Fork me on GitHub