上一篇文章我们对于循环神经网络有了一个初步的认识,这一篇文章我们就更进一步看看对于一个神经网络训练和预测至关重要的前向和后向传播。

我们说对于每一次循环的输入都是由两部分构成的,一部分是上一次循环的激励函数的输出a^{<t-1>},以及本次循环的输入x^{<t>}。循环是从t=1开始的。对于第一次循环,我们没有a^{<0>},可以用0向量来代替。

正向传播

同时对于每一次的循环,RNN实际上也有两个输出,一个是本次循环的对外输出\hat{y}^{<t>},另一个是本次循环对下一次循环的内部输出a^{<t>}。所以正向传播我们要计算两个值。
a^{<t>}=g_1(w_{aa}a^{<t-1>}+w_{ax}x^{<t>}+b_a)
\hat{y}^{<t>}=g_2(w_{ya}a^{<t>}+b_y)
值的注意的是,对于\hat{y}^{<t>}的求值,其中用到了a^{<t>}
对于g_1一般使用tanh激活函数。少数情况下也有人使用Relu。
对于g_2会根据你的业务问题来决定,如果是2分类,可能使用sigmoid就可以,如果多分类就使用softmax。

我们可以把a^{<t>}理解成RNN里保存的状态信息,每次循环更新a^{<t>},正如上边计算它的公式,状态的更新由两部分输入,一部分是之前的状态a^{<t-1>},一部分是这次循环的输入。上边的公式把weight值区分成了w_{aa},w_{ax},这是因为把历史状态输入和当前循环输入当做独立两部分来看待,其实也可以把a^{<t-1>},x^{<t>}合并起来当成一个整体输入来看,这样weight值也就可以只用一个表示了:
a^{<t>}=g_1(w_{a}[a^{<t-1>},x^{<t>}]+b_a)

可以根据下边这个图来理解:

反向传播

在你使用向tensorflow这样的深度学习框架时,你只要写下正向传播过程就可以,框架会自动帮你实现反向传播。但是我们这里有一个循环神经网络是怎么反向传播的大致印象就可以了。
反向传播我们先要对每一次循环的输出定义loss function,比如你使用交叉熵loss function。然后把所有循环的loss function加起来构成这一句话整体的loss function。然后对w_{aa},w_{ax},w_{ya},b_a,b_y来求导反向传播。对于第一次循环输出的loss function,对w_{aa},w_{ax},w_{ya},b_a,b_y求导只需要一次。但是对于第n次循环的输入,因为它不光考虑了第n次的输入,还考虑了之前n-1的输入的影响,所以它的链式求导就要求导n次。这也叫做穿越时间求导。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: