1相关资料
- 之前分享过一个博客里面写的,我们大致了解并记住结论的博客:【深度学习】7-矩阵乘法运算的反向传播求梯度_矩阵梯度公式-CSDN博客;
- 这里再分享一下自然语言处理书上关于这部分的推导过程:3-矩阵相乘-梯度反向传播的计算.pdf;
2补充内容
- 矩阵乘法,在深度学习中,如果不考虑mini-batch学习的话,那么就是行向量与一个矩阵相乘得到一个行向量的过程;考虑mini-batch学习时,行向量就成了矩阵了,于是就变成矩阵与矩阵的乘积;
- 所以关键是搞清楚向量与矩阵相乘得到向量的这个过程,然后直接将维度值为
1
的那个维度,从1
变成N
即可。- 书上只描述了对 x x x求梯度的过程,这里补充一下对权重矩阵求梯度的过程。
-
不考虑mini-batch,计算过程如下图所示:
-
现需要对权重矩阵中某个具体值求梯度,有下式:
∂ L ∂ W i j = ∂ L ∂ y j ∂ y j ∂ W i j (1) \frac{\partial L}{\partial W_{ij}}=\frac{\partial L}{\partial y_j}\frac{\partial y_j}{\partial W_{ij}}\tag{1} ∂Wij∂L=∂yj∂L∂Wij∂yj(1)
- 这里与对 x x x求梯度不同,对权重矩阵中某个值求梯度,只取决于某一个 y j y_j yj;因为输入 x x x与权重矩阵的某一列相乘得到输出 y y y中的某一个元素;
-
根据上图,(1)式中 ∂ y j ∂ W i j = x i \frac{\partial y_j}{\partial W_{ij}}=x_i ∂Wij∂yj=xi;所以有下式:
∂ L ∂ W i j = ∂ L ∂ y j x i (2) \frac{\partial L}{\partial W_{ij}}=\frac{\partial L}{\partial y_j}x_i\tag{2} ∂Wij∂L=∂yj∂Lxi(2) -
进一步分析,我们发现,对权重矩阵的第 j j j列的每个元素 W , j W_{,j} W,j求梯度,都只是和输出的 y j y_j yj有关,且 ∂ L ∂ W i j \frac{\partial L}{\partial W_{ij}} ∂Wij∂L与 x i x_i xi对应;因此有下式:
∂ L ∂ W , j = ∂ L ∂ y j ∂ y j ∂ W , j = ∂ L ∂ y j x (3) \frac{\partial L}{\partial W_{,j}}=\frac{\partial L}{\partial y_j}\frac{\partial y_j}{\partial W_{,j}}=\frac{\partial L}{\partial y_j}x\tag{3} ∂W,j∂L=∂yj∂L∂W,j∂yj=∂yj∂Lx(3) -
更进一步,从 W , j W_{,j} W,j扩展到 W W W中的每个元素;式(3)可以理解为:要用 y i y_i yi的梯度乘上输入 x x x中的每个值;那么此时就可以理解为:要用 y y y的梯度乘上输入 x x x中的每个值,且是 y y y的梯度中的每个值都要分别与输入 x x x中的每个值相乘;即此时所有的 ∂ L ∂ y j \frac{\partial L}{\partial y_j} ∂yj∂L都要出马了;因此直接对(3)式进行简单粗暴的改造就会得到下式:
∂ L ∂ W = ∂ L ∂ y x (4) \frac{\partial L}{\partial W}=\frac{\partial L}{\partial y}x\tag{4} ∂W∂L=∂y∂Lx(4) -
但是 y y y的维度是
[1,H]
, x x x的维度是[1,D]
,两者无法直接相乘; -
此时我们分析一下式(4)等号左右两边的维度,既然是相等的,那么维度得符合要求; ∂ L ∂ W \frac{\partial L}{\partial W} ∂W∂L表示对权重矩阵中的每个元素求梯度,那么梯度矩阵的维度与权重矩阵相同,即
[D,H]
;那么式(4)的维度变化应该是:[D,H]=[D,1]x[1,H]
;即需要将 x x x转置,然后放到前面,即下式:
∂ L ∂ W = x T ∂ L ∂ y (5) \frac{\partial L}{\partial W}=x^T\frac{\partial L}{\partial y}\tag{5} ∂W∂L=xT∂y∂L(5) -
式(5)可以用下图来确认一下:
- 权重矩阵的某一列确实只取决于 ∂ L ∂ y j \frac{\partial L}{\partial y_j} ∂yj∂L;权重矩阵一列中的某一个值确实还只取决于某一个 x i x_i xi;
-
以上只是一条数据的过程;考虑mini-batch情况下,变动的就是维度值为1的那个维度;从
1
变成N
; -
数据量的增加不会影响整个过程,因为本来mini-batch个数据也是可以一个个输进去计算的;所以上述过程不会因为数据量多了而有所不同;
-
下图是mini-batch情况下式(5)的情况:
- 权重矩阵的某一列本质上其实还是只取决于 ∂ L ∂ y j \frac{\partial L}{\partial y_j} ∂yj∂L;只不过此时 ∂ L ∂ y j \frac{\partial L}{\partial y_j} ∂yj∂L不是一个值,而是一个列向量;
- [ x i 1 , x i 2 , . . . , x i N ] [x_{i1},x_{i2},...,x_{iN}] [xi1,xi2,...,xiN]与 [ y j 1 , y j 2 , . . . , y j N ] T [y_{j1},y_{j2},...,y_{jN}]^T [yj1,yj2,...,yjN]T对应元素相乘再相加,其实就是mini-batch个数据对 W i j W_{ij} Wij梯度的累加;
3总结
-
理解上述过程之后,我们要知道,我们需要弄清楚的是一条数据的过程,mini-batch的情况只是为了可以一次性处理多条数据,不会影响一条数据的计算过程;而一条数据的推导过程,其实还是去看里面具体的某一个值的梯度是怎么算的,最终就是落到了加法和乘法,落实到我们学过的基本的加法和乘法的偏导数了。
-
最后就是,理解之后,我们直接记住结论即可;在此,贴上书上的结论: