在 反向传播算法理解 一文中,大体讲了反向传播算法的大体思想和优势,这篇文章拿最简单的RNN网络推导反向传播算法。
计算图和计算公式
我们拿最具代表性的如下RNN网络图简单推导。
上图是一张计算图。为方便公式推导,我们把公式写出来。对于每一步 t ,都是如下的计算过程。
每一步的损失函数,总的损失函数 L 如下:
在每一步 t 中, 是向量形式变量, 是向量形式变量, 是向量形式变量,是向量形式变量, 是向量形式变量;W 是矩阵形式变量,V 是矩阵形式变量,U 是矩阵形式变量(注意下,在每一步 t 中,W、V、U、b、c都是一样的);是一个实数值变量。
每一步的相加得到的最终的 L 是一个实数值变量。
其中:参数矩阵变量是 W、V、U。截距变量是 b 、c。
反向传播算法推导
有了上边的基础,我们就可以开始推导啦,在推导之前,我们先熟悉下涉及到的 tanh函数。
tanh函数:
tanh函数的导数: (对自变量的导数是 1 - 该函数的平方)
下面开始从后往前推导:
1、首先最终的loss L 对每一步 t 中的求导。根据式 10.13 导出。
2、接下来求 L 对每一步 t 中求梯度。由于是一个向量,需求出 L 对向量里的所有实数值变量的导数,根据链式法则可得,其中第一项 ,其中第二项 可根据式10.11 和 由softmax得到的交叉熵损失函数 求导算出来,softmax函数具体可参考多分类问题的softmax函数交叉熵损失函数推导,如果只想看最后结果,直接翻到最后。最后可求得:
3、接下来求L对求梯度,这里的T为最后一步 t 。同一样, 也是一个向量,需求出L对向量里的所有实数值变量的梯度 。我们从计算图中可以看到,的导数只来源于,可由式10.10可比较容易求得:码公式太费劲了,手写了公式如下,我们求得了对每一维的梯度,也整合到了一起算出了对的梯度向量,方便后续计算其他梯度:
在最后一步 T ,在计算出 L 对的梯度时,同时还可以计算出 L 对 V 的梯度,L对c的梯度。虽然每一步中的V,c是相同的,我们仍然可以记最后那步 T 的V为,最后那步 T 的c为。
由式10.10可以推出L 对 V 的梯度:这个写的有点歪,将就着看看吧~
由式10.10可以推出L 对 c 的梯度:
4、计算出 L对的梯度后,就可以计算出 L 对 U 的梯度 和 L 对 W 的梯度 和 L 对 b 的梯度, 虽然每一步中的U,W,b是相同的,我们仍然可以记最后那步 T 的U、W、b为,,。
由式10.8 和式10.9 和 tanh 函数导数 可以推出L 对 U 的梯度:
计算L对W 的梯度 与L对U 的梯度的计算完全是一样的,只需要把 改为 即可。
计算L对 b 的梯度与计算 L对U 的梯度 基本一致,只是少了最后一项,如下:
5、算完 L 对最后一步 T 中变量的梯度之后,我们就该往前走,计算 L 对中间每一步中变量的梯度。因为中间每一步的计算过程都是一样的,我们用 t 就代表中间的每一步。
我们可先计算每步 t 中 L 对 的梯度:
这里的的梯度包含两部分,一部分来源于 , 一部分来源于。
6、求完 L 对 的梯度后,就可以求 L 对、、、、 的梯度。与求最后一步 T 步时完全一样。
7、由于在RNN中,每一步 t 中的、、、、 都是同一个向量/矩阵,所以将每一步求出来的梯度相加即可得到最终的梯度,例如 L 对 V 的梯度就是每一步梯度之和 ,其他参数一样。
RNN的反向传播推导就讲到这里啦,欢迎各位大佬评论区留言~