矩阵乘向量求导推导
起因
我想玩RNN,但不知道如何对矩阵乘向量进行求导.
经过
推了一会,我会了.
设
A
b
=
c
Ab=c
Ab=c
展开写
[
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
⋮
⋮
⋱
⋮
a
n
1
a
n
2
⋯
a
n
n
]
[
b
1
b
2
⋮
b
n
]
=
[
c
1
c
2
⋮
c
n
]
\begin{bmatrix} a_{11}&a_{12}&\cdots&a_{1n}\\ a_{21}&a_{22}&\cdots&a_{2n}\\ \vdots&\vdots&\ddots&\vdots\\ a_{n1}&a_{n2}&\cdots&a_{nn} \end{bmatrix}\begin{bmatrix} b_1\\b_2\\\vdots\\b_n\end{bmatrix}=\begin{bmatrix} c_1\\c_2\\\vdots\\c_n\end{bmatrix}
⎣⎢⎢⎢⎡a11a21⋮an1a12a22⋮an2⋯⋯⋱⋯a1na2n⋮ann⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡b1b2⋮bn⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡c1c2⋮cn⎦⎥⎥⎥⎤
其中
c
i
=
∑
j
=
1
n
a
i
j
b
j
c_i=\sum\limits_{j=1}^na_{ij}b_j
ci=j=1∑naijbj,
j假若c就表示自己的梯度,将矩阵的每个元素的梯度写在矩阵的对应位置则
g
r
a
d
A
=
[
b
1
c
1
b
2
c
1
⋯
b
n
c
1
b
1
c
2
b
2
c
2
⋯
b
c
c
2
⋮
⋮
⋱
⋮
b
1
c
n
b
2
c
n
⋯
b
n
c
n
]
g
r
a
d
b
=
[
a
11
c
1
+
a
21
c
2
+
⋯
+
a
n
1
c
n
a
12
c
1
+
a
22
c
2
+
⋯
+
a
n
2
c
n
⋮
a
1
n
c
1
+
a
2
n
c
2
+
⋯
+
a
n
n
c
n
]
grad_A=\begin{bmatrix} b_1c_1&b_2c_1&\cdots&b_nc_1\\ b_1c_2&b_2c_2&\cdots&b_cc_2\\ \vdots&\vdots&\ddots&\vdots\\ b_1c_n&b_2c_n&\cdots&b_nc_n \end{bmatrix}\\ grad_b=\begin{bmatrix} a_{11}c_1+a_{21}c_2+\cdots+a_{n1}c_n\\ a_{12}c_1+a_{22}c_2+\cdots+a_{n2}c_n\\ \vdots\\ a_{1n}c_1+a_{2n}c_2+\cdots+a_{nn}c_n \end{bmatrix}
gradA=⎣⎢⎢⎢⎡b1c1b1c2⋮b1cnb2c1b2c2⋮b2cn⋯⋯⋱⋯bnc1bcc2⋮bncn⎦⎥⎥⎥⎤gradb=⎣⎢⎢⎢⎡a11c1+a21c2+⋯+an1cna12c1+a22c2+⋯+an2cn⋮a1nc1+a2nc2+⋯+anncn⎦⎥⎥⎥⎤
观察可得梯度传递的过程从矩阵乘法的角度来看是这样的
∂
c
∂
A
=
b
T
\dfrac{\partial c}{\partial A}=b^T
∂A∂c=bT
∂ c ∂ b = A T \dfrac{\partial c}{\partial b}=A^T ∂b∂c=AT
梯度传递相乘时要注意顺序:
g
r
a
d
A
=
g
r
a
d
c
b
T
grad_A=grad_cb^T
gradA=gradcbT
g
r
a
d
b
=
A
T
g
r
a
d
c
grad_b=A^Tgrad_c
gradb=ATgradc
结果
结果,梯度就下降了.