在上一篇的 MXNet对含隐藏状态的循环神经网络(RNN)的实现 文章里面我们熟悉了如何用RNN模型来训练并创作歌词,了解到循环神经网络的一些特点,而对于具体的前向计算与反向传播,有些细节可能不是非常清楚,下面通过图来直观地熟悉模型中参数与变量之间的依赖关系,以及反向传播中的梯度计算。
模型计算图中的依赖关系
根据上面的依赖关系,我们按照箭头所指的反方向依次计算并存储梯度,将使用到链式法则,其中运算符用prod表示
时间t的反向传播我们从最后面的输出开始计算
1、目标函数L关于输出层变量的梯度:αL/αOt
2、目标函数L关于模型参数Wqh的梯度:αL/αWqh [链式法则]
3、目标函数L关于最终时间步T的隐藏状态的梯度:αL/αhT [链式法则]
4、目标函数L关于时间步t(1<=t<=T)的隐藏状态的梯度:αL/αht [链式法则,展开推导出通用公式]
5、目标函数L关于模型参数Whh的梯度:αL/αWhh [链式法则]
6、目标函数L关于模型参数Whx的梯度:αL/αWhx [链式法则]
其中4、L关于时间步t(1<=t<=T)的隐藏状态的梯度,为了更清楚的了解通用公式,我单独做了一张图来推导,如下:
从这张图我们可以看到,指数项在时间步数T较大或时间步t较小时,容易出现梯度爆炸与衰减。前向计算与反向传播是相互依赖的,比如反向传播需要基于正向传播的输出,对于初学者来说,建议参看本人以前的关于反向传播画图的文章(基础很重要):