推导RNN反向传播

目录

1、正向传播:

2、反向传播:

3、总结


注:
前面的部分是反向传播公式的详细推导,如果想直接看反向传播的公式,可以直接跳到第3部分结论。
推导中先考虑一个样本(输入和激活都是向量而不是矩阵)

1、正向传播:

a^{<t>}=g(W_a[a^{<t-1>}, x^{<t>}]+b_a)                       g是激活函数,例如tanh

z^{<t>}=W_ya^{<t>}+b_y

\widehat{y}^{<t>}=softmax(z^{<t>})=\frac{e^{z^{<t>}}}{\sum_{j}^{}e^{z^{<t>}_j}}

\mathcal{L}^{<t>}(\hat{y}^{<t>}, y^{<t>})=-\sum_{j=1}^{n_y}y^{<t>}_jlog(\hat{y}^{<t>}_j)         输出的激活函数是softmax,损失函数是交叉熵

L=\sum_{t=1}^{T_x}\mathcal{L}^{<t>}(\hat{y}^{<t>}, y^{<t>})                                  损失函数对所有时间步求和

以上五个式子就是正向传播中计算输出和损失用到的所有公式,通过对他们链式法则求导,我们也可以推出反向传播的所有公式

2、反向传播:

当输出的激活函数是softmax,损失函数是交叉熵时,损失函数\mathcal{L}^{<t>}对线性输出z^{<t>}的偏导数可以简单的写成:

\frac{\partial \mathcal{L}^{<t>}}{\partial z^{<t>}}=\hat{y}^{<t>}-y^{<t>}        (1)

式(1)左边实际上表示一个向量,其第i个元素对应\frac{\partial \mathcal{L}^{<t>}}{\partial z^{<t>}_i}

下面证明公式(1)

由于

\mathcal{L}^{<t>}(\hat{y}^{<t>}, y^{<t>})=-\sum_{j=1}^{n_y}y^{<t>}_jlog(\hat{y}^{<t>}_j)

可见损失函数\mathcal{L}^{<t>}是向量\hat{y}^{<t>}的函数, \mathcal{L}^{<t>}\hat{y}^{<t>}的“导数”实际上是一个向量(一阶张量),为了方便表述,我们只计算这个向量的第j个元素,即对第j个元素\hat{y}^{<t>}_j求偏导得到 

\frac{\partial \mathcal{L}^{<t>}}{\partial \hat{y}^{<t>}_j}=-y^{<t>}_j\frac{1}{\hat{y}^{<t>}_j}=-\frac{y^{<t>}_j}{\hat{y}^{<t>}_j}        (2)

由于

\widehat{y}^{<t>}=softmax(z^{<t>})=\frac{e^{z^{<t>}}}{\sum_{j}^{}e^{z^{<t>}_j}}

 \hat{y}^{<t>}e^{z^{<t>}}的导数是向量对向量的导数,实际上是一个矩阵(二阶张量),为了方便表述,我们只写出\hat{y}^{<t>}_jz^{<t>}_i求偏导的结果。

 \frac{\partial \hat{y}_j^{<t>}}{\partial z^{<t>}_i}\\ = \frac{\partial }{\partial z^{<t>}_{i}}(\frac{e^{z^{<t>}_j}}{\sum_{k}e^{z^{<t>}_k}})\\ = \frac{(\sum_{k}e^{z^{<t>}_k})e^{z^{<t>}_j}\delta_{ij}-e^{z^{<t>}_i}e^{z^{<t>}_j}}{(\sum_{k}e^{z^{<t>}_k)^2}}\\ =\frac{e^{z^{<t>}_j}}{\sum_{k}e^{z^{<t>}_k}}\delta_{ij}-\frac{e^{z^{<t>}_i}}{\sum_{k}e^{z^{<t>}_k}}\frac{e^{z^{<t>}_j}}{\sum_{k}e^{z^{<t>}_k}}

式中的\delta_{ij}是Kronecker delta符号,在i=j时为1,否则为0. 我们用\hat{y}^{<t>}_j\hat{y}^{<t>}_i替换上式中的对应项,得到

\frac{\partial \hat{y}_j^{<t>}}{\partial z^{<t>}_i}=\hat{y}_j^{<t>}\delta_{ij}-\hat{y}_i^{<t>}\hat{y}_j^{<t>}=-\hat{y}_j^{<t>}(\hat{y}_i^{<t>}-\delta_{ij})                   (3)

现在考虑式(1)中\mathcal{L}^{<t>}z^{<t>}的导数,也只考虑第i项即对z^{<t>}_i的偏导数。由于我们在式(2)中已经得到了\mathcal{L}^{<t>}\hat{y}^{<t>}_j的偏导数,而在(3)中得到了\hat{y}^{<t>}_jz^{<t>}_i的偏导数,根据偏导数的链式法则

 \frac{\partial \mathcal{L}^{<t>}}{\partial z^{<t>}_i}\\ =\sum_j\frac{\partial \mathcal{L}^{<t>}}{\partial \hat{y}^{<t>}_j}\frac{\partial \hat{y}^{<t>}_j}{\partial z^{<t>}_i}\\ =\sum_j(-\frac{y^{<t>}_j}{\hat{y}^{<t>}_j})(-\hat{y}_j^{<t>}(\hat{y}_i^{<t>}-\delta_{ij}))\\ =\sum_jy^{<t>}_j(\hat{y}_i^{<t>}-\delta_{ij})\\ =(\sum_jy^{<t>}_j)\hat{y}_i^{<t>}-y_i^{<t>}\\ =\hat{y}_i^{<t>}-y_i^{<t>} 

即证明了式(1). 上式的推到中用到了\delta_{ij}的性质,以及(\sum_jy^{<t>}_j)=1这一特点(y^{<t>}作为表示分类的one-hot 0-1向量,只有一个元素为1,所以这里的求和为1)。

下面我们继续推导反向传播中的其他公式。

根据公式z^{<t>}=W_ya^{<t>}+b_y,我们可以由\frac{\partial \mathcal{L}^{<t>}}{\partial z^{<t>}}得到参数W_yb_y,以及激活a^{<t>}的导数

先写出结论如(4)-(12):

\frac{\partial \mathcal{L}^{<t>}}{\partial b_y}=\hat{y}^{<t>}-y^{<t>}\Rightarrow\frac{\partial L}{\partial b_y}=\sum_t\hat{y}^{<t>}-y^{<t>}        (4)

\frac{\partial \mathcal{L}^{<t>}}{\partial W_y}=(\hat{y}^{<t>}-y^{<t>})(a^{<t>})^T\Rightarrow\frac{\partial L}{\partial W_y}=\sum_t(\hat{y}^{<t>}-y^{<t>})(a^{<t>})^T        (5)

\frac{\partial \mathcal{L}^{<t>}}{\partial a^{<t>}}=W_y^T(\hat{y}^{<t>}-y^{<t>})        (6)

注意(6)不能直接像(4)(5)那样对t求和推广到L的导数,因为\frac{\partial L}{\partial a^{<t>}}拆看来看,

\frac{\partial L}{\partial a^{<t>}}=\sum_{\tau=1}^{Tx}\frac{\partial \mathcal{L}^{<\tau>}}{\partial a^{<t>}},由于前向传播时a^{<t>}会影响到时间步t之后所有时间步的计算,求和中任何τ>=t的项都不为0,其中τ>t项对导数的贡献由a^{<t+1>}传递给a^{<t>},从而可以从后往前反向传播求出a^{<t>}的导数: 

\frac{\partial L}{\partial a^{<t>}}\\ =\frac{\partial \mathcal{L}^{<t>}}{\partial a^{<t>}}+\frac{\partial L}{\partial a^{<t+1>}}\frac{\partial a^{<t+1>}}{\partial a^{<t>}}\\ =W_y^T(\hat{y}^{<t>}-y^{<t>})+W_{aa}^T(\frac{\partial L}{\partial a^{<t+1>}}.*g^{'}(W_a[a^{<t>},x^{<t+1>}]+b_a))        (7)

(7)中.*表示元素相乘,g^{'}()是激活函数的导数,W_{aa}=W_a[:,1:n_a],是参数矩阵W_a中作用于a上的部分。如果是tanh,利用

tanh^{'}(x)=1-tanh^2(x)

可以写为常见形式

\frac{\partial L}{\partial a^{<t>}}=W_y^T(\hat{y}^{<t>}-y^{<t>})+W_{aa}^T(\frac{\partial L}{\partial a^{<t+1>}}.*(1-(a^{<t+1>})^2))        (8)

通过\frac{\partial L}{\partial a^{<t>}},可以求出与a^{<t>}相关的参数的导数:

\frac{\partial L}{\partial W_a}=\sum_t(\frac{\partial L}{\partial a^{<t>}}.*g^{'}(W_a[a^{<t-1>},x^{<t>}]+b_a))[a^{<t-1>},x^{<t>}]^T        (9)

\frac{\partial L}{\partial b_a}=\sum_t(\frac{\partial L}{\partial a^{<t>}}.*g^{'}(W_a[a^{<t-1>},x^{<t>}]+b_a))                                (10)

对于tanh激活函数,(9)(10)可以写为:

\frac{\partial L}{\partial W_a}=\sum_t(\frac{\partial L}{\partial a^{<t>}}.*(1-(a^{<t>})^2))[a^{<t-1>},x^{<t>}]^T                        (11)

\frac{\partial L}{\partial b_a}=\sum_t\frac{\partial L}{\partial a^{<t>}}.*(1-(a^{<t>})^2)                                                        (12)

下面证明(4)-(12)

(4)(5)(6):

z^{<t>}=W_ya^{<t>}+b_y,用下标表示:

z^{<t>}_i=W_{yij}a^{<t>}_j+b_{yi},故

\frac{\partial \mathcal{L}^{<t>}}{\partial b_{yi}}=\frac{\partial \mathcal{L}^{<t>}}{\partial z_{i}^{<t>}}\frac{\partial z_i^{<t>}}{\partial b_{yi}}=\hat{y}^{<t>}_i-y^{<t>}_i

\frac{\partial \mathcal{L}^{<t>}}{\partial W_{yij}}=\frac{\partial \mathcal{L}^{<t>}}{\partial z_{i}^{<t>}}\frac{\partial z_{i}^{<t>}}{\partial W_{yij}}=(\hat{y}^{<t>}_i-y^{<t>}_i)a^{<t>}_j

\frac{\partial \mathcal{L}^{<t>}}{\partial a_{i}^{<t>}}=\sum_j\frac{\partial \mathcal{L}^{<t>}}{\partial z_{j}^{<t>}}\frac{\partial z_j^{<t>}}{\partial a_{i}^{<t>}}=\sum_j(\hat{y}^{<t>}_j-y^{<t>}_j)W_{yji}

即证明了(4)(5)(6)三个式子

(7)~(12):

a^{<t>}=g(W_a[a^{<t-1>}, x^{<t>}]+b_a)

 用下标表示为:

a^{<t>}_{i}=g(W_{aij}[a^{<t-1>},x^{<t>}]_j+b_{ai})

首先我们知道,对最后一个时间步t=T_x,由于a^{<T_x>}只对最后一个时间步的计算有贡献,没有下一个时间步的误差反向传播过来,

\frac{\partial L}{\partial a^{<T_x>}}=\frac{\partial \mathcal{L}^{<T_x>}}{\partial a^{<T_x>}},可以通过(6)准确的求出来,

现在,假设我们已经知道了\frac{\partial L}{\partial a^{<t+1>}},下面推导出\frac{\partial L}{\partial a^{<t>}}的递推公式:

\frac{\partial L}{\partial a^{<t>}_j}\\ =\frac{\partial \mathcal{L}^{<t>}}{\partial a^{<t>}_j}+\sum_i\frac{\partial L}{\partial a^{<t+1>}_i}\frac{\partial a^{<t+1>}_i}{\partial a^{<t>}_j}\\ =\frac{\partial \mathcal{L}^{<t>}}{\partial a^{<t>}_j}+\sum_i\frac{\partial L}{\partial a^{<t+1>}_i}g^{'}(W_{aij}[a^{<t-1>},x^{<t>}]_j+b_{ai})W_{aij}\\ =\frac{\partial \mathcal{L}^{<t>}}{\partial a^{<t>}_j}+\sum_i[\frac{\partial L}{\partial a^{<t+1>}}g^{'}(W_{a}[a^{<t-1>},x^{<t>}]+b_{a})]_iW_{aij}

即得到了递推关系,并证明了(7)

\frac{\partial L}{\partial W_{aij}}\\ =\sum_t\frac{\partial L}{\partial a^{<t>}_{i}}\frac{\partial a^{<t>}_{i}}{\partial W_{aij}}\\ =\sum_t(\frac{\partial L}{\partial a^{<t>}_{i}}.*g^{'}(W_{aij}[a^{<t-1>},x^{<t>}]_{j}+b_{ai}))[a^{<t-1>},x^{<t>}]_j\\ =\sum_t[\frac{\partial L}{\partial a^{<t>}}.*g^{'}(W_{a}[a^{<t-1>},x^{<t>}]+b_{a})]_i[a^{<t-1>},x^{<t>}]_j

即式(9)

\frac{\partial L}{\partial b_{ai}}\\ =\sum_t\frac{\partial L}{\partial a^{<t>}_{i}}\frac{\partial a^{<t>}_{i}}{\partial b_{ai}}\\ =\sum_t(\frac{\partial L}{\partial a^{<t>}_{i}}.*g^{'}(W_{aij}[a^{<t-1>},x^{<t>}]_{j}+b_{ai}))\\ =\sum_t[\frac{\partial L}{\partial a^{<t>}}.*g^{'}(W_{a}[a^{<t-1>},x^{<t>}]+b_{a})]_i

即式(10)

3、总结

对于正向传播由以下式子给出的rnn:

 a^{<t>}=g(W_a[a^{<t-1>}, x^{<t>}]+b_a)

z^{<t>}=W_ya^{<t>}+b_y

\widehat{y}^{<t>}=softmax(z^{<t>})=\frac{e^{z^{<t>}}}{\sum_{j}^{}e^{z^{<t>}_j}}

\mathcal{L}^{<t>}(\hat{y}^{<t>}, y^{<t>})=-\sum_{j=1}^{n_y}y^{<t>}_jlog(\hat{y}^{<t>}_j)         

L=\sum_{t=1}^{T_x}\mathcal{L}^{<t>}(\hat{y}^{<t>}, y^{<t>})

对于每个时间步t,反向传播的过程如下:

①接收来自上一个时间步<t+1>激活的导数\frac{\partial L}{\partial a^{<t+1>}},(对于最后一个时间步<Tx>,上一步的导数设为0即可)

②计算参数的导数以及当前时间步激活的导数 

\frac{\partial \mathcal{L}^{<t>}}{\partial b_y}=\hat{y}^{<t>}-y^{<t>}\Rightarrow\frac{\partial L}{\partial b_y}=\sum_t\hat{y}^{<t>}-y^{<t>}                                                        (4)

\frac{\partial \mathcal{L}^{<t>}}{\partial W_y}=(\hat{y}^{<t>}-y^{<t>})(a^{<t>})^T\Rightarrow\frac{\partial L}{\partial W_y}=\sum_t(\hat{y}^{<t>}-y^{<t>})(a^{<t>})^T                        (5)

\frac{\partial L}{\partial a^{<t>}}=W_y^T(\hat{y}^{<t>}-y^{<t>})+W_{aa}^T(\frac{\partial L}{\partial a^{<t+1>}}.*g^{'}(W_a[a^{<t>},x^{<t+1>}]+b_a))                (7)

\frac{\partial L}{\partial W_a}=\sum_t(\frac{\partial L}{\partial a^{<t>}}.*g^{'}(W_a[a^{<t-1>},x^{<t>}]+b_a))[a^{<t-1>},x^{<t>}]^T                                (9)

\frac{\partial L}{\partial b_a}=\sum_t(\frac{\partial L}{\partial a^{<t>}}.*g^{'}(W_a[a^{<t-1>},x^{<t>}]+b_a))                                                              (10)

特别的,如果a^{<t>}=g(W_a[a^{<t-1>}, x^{<t>}]+b_a)中的激活函数g是tanh,后三个公式可以表示为:

\frac{\partial L}{\partial a^{<t>}}=W_y^T(\hat{y}^{<t>}-y^{<t>})+W_{aa}^T(\frac{\partial L}{\partial a^{<t+1>}}.*(1-(a^{<t+1>})^2))        (8)

\frac{\partial L}{\partial W_a}=\sum_t(\frac{\partial L}{\partial a^{<t>}}.*(1-(a^{<t>})^2))[a^{<t-1>},x^{<t>}]^T                        (11)

\frac{\partial L}{\partial b_a}=\sum_t\frac{\partial L}{\partial a^{<t>}}.*(1-(a^{<t>})^2)                                                        (12)

 ③把导数\frac{\partial L}{\partial a^{<t>}}传递到下一个时间步<t-1>

向量化:实际计算中,如果x、a等都是矩阵(每一列表示一个样本),只需要在第②步的5个公式的基础上处理(应该不会有太大的改动)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值