Professional Documents
Culture Documents
神经网络中涉及的向量和矩阵求导
神经网络中涉及的向量和矩阵求导
∂y ∂y ∂Y
Scalar ∂x ∂x ∂x
∂y ∂y
Vector ∂x ∂x
∂y
Matrix ∂X
可以仔细阅读上述讲义和其中相关的各种实际线性代数计算例例⼦子。
∂y
其中最核⼼心的是⼀一个vector对另外⼀一个vector求导的 ∂x 的情况。
⎢ ⋮ ⋮ ⋱ ⋮ ⋮ ⎥
⎣ ∂ym ⋯ ∂ym
⋯ ∂ym ⎦
∂x1 ∂xj ∂xn
其他的⼏几种定义的情况都可以据此简单扩展⽽而来:
⼀一个scalar可以当作⼀一个⻓长度为1的vector来处理理。
⼀一个shape为(m × n)的matrix可以先拉⻓长变为⼀一个⻓长度为m × n的 vector来处
理理。只有这样处理理,对matrix的求导才能⽤用于chain rule,否则会出现⽭矛盾(参⻅见⽂文
末的例例⼦子)。
But in prac!ce this is not a very useful way of arranging the gradient. 所以通常根据此
matrix的形状和其中元素的位置来排列列(后⾯面有例例⼦子说明这样排列列可以⽅方便便程序计
算),例例如:
上⾯面定义中的 ∂Y
∂x ,需要将shape为m × n的矩阵Y 拉⻓长当作⼀一个⻓长度为m × n的
vector来处理理,然后将结果按照原来Y 的shape排列列。
∂y
上⾯面定义中的 ∂X ,都需要将shape为m × n的矩阵X拉⻓长当作⼀一个⻓长度为m × n
的vector来处理理,然后将结果按照原来X的tranpose的shape来排列列。
∂y
Leow Wee Kheng讲义中,⼀一个vector y或者matrix Y 对matrix X求导,也就是 ∂X 或者
∂Y ∂y ∂Y
∂X 是没有被定义的。但在实际的neural network中,我们常常会遇到 ∂X 以及 ∂X 的求解
问题。为了了解决这类问题,⼈人们提出了了Generalized Jacobian。Jus!n Johnson在其notes
中给出了了如下介绍:
∂y
Note:Note that we have separated the dimensions of ∂x into two groups: the first
group matches the dimensions of y and the second group matches the dimensions of x.
With this grouping, we can think of the generalized Jacobian as generaliza!on of a
matrix, where each “row” has the same shape as y and each “column” has the same
shape as x. Now if we let i ∈ ZDy and j ∈ ZDx be vectors of integer indices, then we
can write:
∂y ∂yi
( )i,j =
∂x ∂xj
The indicies i and j are not scalars; instead they are vectors of indicies. yi and xj are
∂y
scalars, so the deriva!ve ∂xi is also a scalar.
j
As a concrete example, let’s suppose that f is a linear layer that takes X as input a
minibatch of M vectors, each of dimension Dx , and produces Y a minibatch of M
vectors, each of dimension Dy . Then X is a matrix of shape Dx × M , W is a matrix of
shape Dy × Dx , and Y = f (x, W) = WX is a matrix of shape Dy × M . The
Generalized Jacobian ∂Y
∂X then has shape (Dy × M ) × (Dx × M )。 不不过按照STAT-
157的讲义,更更精确的shape表示应为(Dy × M ) × (M × Dx )。
However it turns out that for most common neural network layers, we can derive
∂L ∂Y
expressions that compute the product ∂Y ∂X without explicitly forming the
Generalized Jacobian ∂Y
∂X .
所以在神经⽹网络设计的计算中,实际我们并不不会⽤用到很占空间的Generalized Jacobian,
但是Generalized Jacobian能帮助我们理理解求导的推导过程。
单个数据点x(k) 的计算
z(k) = Wx(k) + b
其中W是p × n的matrix
x(k) 是n × 1的vector
b是p × 1的vector
z(k) 是p × 1的vector
也就是
⎡z1 ⎤ ⎡w1,1 w1,n ⎤ ⎡x1 ⎤ ⎡b1 ⎤
(k) (k)
⋯ w1,j ⋯
⎢ ⋮ ⎥ ⎢ ⋮ ⎢ ⋮ ⎥ ⎢⋮⎥
⎢ ⎥ ⋮ ⎥ ⎥⎢ ⎥ ⎢ ⎥
⎢ (k) ⎥ ⎢ ⎢ ⎥ ⎢b ⎥
⋮ ⋱ ⋮
⎢zi ⎥ = ⎢ wi,n ⎥
⎥⎢ j ⎥
⎢
⎥ ⎢
(k)
+ ⎢ i⎥
⎢ ⎥
⋯ ⋯
⎥ ⎢ ⎥⎢ ⎥ ⎢ ⎥
wi,1 wi,j x
⎢
⎢ ⋮ ⎥ ⎢ ⋮ ⋮ ⋱ ⋮ ⋮ ⎥ ⎢ ⋮ ⎥ ⎢ ⋮⎥
⎣zp(k) ⎦ ⎣wp,1 ⋯ wp,j ⋯ wp,n ⎦ ⎣x(k)
n
⎦ ⎣bp ⎦
另外
L(k) = f (z(k) )
这⾥里里L(k) 是scalar。
如前所述,对neural network来说,我们可以利利⽤用每⼀一层具有的线性变换的特点来⼤大⼤大简
化计算,⽽而不不需要显式计算出原始Chain rule中的Generalized Jacobian导致的⾼高维度
Tensor。
计算∇W
∂L(k)
根据这个特点,计算W的gradient,也就是 ∂W ,可以先对W中的每个元素单独求导
∂L(k) ∂L(k)
计算 ∂wi,j ,然后再合并排列列起来得到 ∂W 。
⾸首先
∂L(k)
= [ ∂z(k) ⋯ ∂z(k) ⋯ ∂z(k) ]
∂L(k) ∂L(k) ∂L(k)
∂z(k) 1 i p
(k) ∂L(k)
这⾥里里δi = 。
∂z(k)
i
因为z(k) 中的每个元素的计算只和W部分的元素相关,所以
⎡ ∂w1i,j ⎤
∂z(k)
⎡ 0 ⎤
⎢ ⎥
⎢ ⋮ ⎥ ⎢ ⋮ ⎥
⎢ (k) ⎥ ⎢
⎢ ∂zi ⎥ ⎢ (k) ⎥
= ⎢ ∂wi,j ⎥ = ⎢xj ⎥
∂z(k)
⎢ ⎥ ⎢ ⎥
⎢ ⎥ ⎢ ⎥
⎥
∂wi,j
⎢ ⋮ ⎥
⎢ (k) ⎥ ⎣ ⋮
⎦
⎣ ∂zp
⎦ 0
∂wi,j
所以
∂L(k) ∂L(k) ∂z(k)
=
∂wi,j ∂z(k) ∂wi,j
⎡ 0 ⎤
⎢ ⋮ ⎥
⎢ (k) ⎥
⎢x ⎥
[ ∂z(k) (k) ]
⎢ j ⎥
∂L(k) ∂L(k) ∂L(k)
= ⋯ ⋯
⎢ ⎥
(k)
∂zi ∂zp
⎢ ⋮ ⎥
1
⎣ 0 ⎦
⎡ 0 ⎤
⎢ ⋮ ⎥
⎢ ⎥
(k) ⎢ (k) ⎥
= [δ1(k) δp ] ⎢xj ⎥
(k)
⋯ ⋯
⎢ ⎥
δi
⎢ ⋮ ⎥
⎣ 0 ⎦
(k) (k)
= δi xj
但是为计算⽅方便便,其实可以让∇W 按照与W相同的shape来排列列其中的元素。⽽而不不是按
∂L(k)
照 ∂W 的shape来排列列。
Since this matrix has the same shape as W , we could just subtract it (!mes the learning
rate) from W when doing gradient descent. So (in a slight abuse of nota!on) let’s find
this matrix as ∇W instead.
⎡ ∂w1,1 ∂w1,n ⎤
∂L(k) ∂L(k) ∂L(k)
⋯ ∂w1,j ⋯
⎢ ⎥
⎢ ⋮ ⋮ ⎥
⎢ ∂L(k) ⎥
⋮ ⋱ ⋮
) =⎢ ∂L(k) ⎥
(k)
∂L
⎢ ∂wi,1 ∂wi,n ⎥
T ∂L(k)
∇W =( ⋯ ⋯
⎢ ⎥
∂wi,j
∂W
⎢ ⋮ ⋮ ⎥
⎢ ⋮ ⋱ ⋮ ⎥
⎣ ∂L ∂L ⎦
(k) (k) (k)
∂L
∂w p,1
⋯ ∂wp,j ⋯ ∂w p,n
⎡δ1 x1 δ1 xn ⎤
(k) (k) (k) (k) (k) (k)
⋯ δ1 xj ⋯
⎢ ⋮ ⋮ ⎥
⎢ ⎥
⎢ (k) (k) ⎥
⋮ ⋱ ⋮
= ⎢δi(k) x(k) δi xn ⎥
(k) (k)
⎢ ⎥
⋯ δi xj ⋯
⎢ ⎥
1
⎢ ⋮ ⋮ ⋱ ⋮ ⋮ ⎥
⎣δp(k) x(k) ⋯
(k) (k)
δp xj ⋯ δp xn ⎦
(k) (k)
1
⎡δ1 ⎤
(k)
⎢ ⋮ ⎥
⎢ ⎥
⎢ (k) ⎥ (k)
= ⎢δi ⎥ [x1 xn ]
(k) (k)
⎢ ⎥
⋯ xj ⋯
⎢ ⎥
⎢ ⋮ ⎥
⎣δp(k) ⎦
T
= δ (k) x(k)
上⾯面的
⎡δ1 ⎤
(k)
⎢ ⋮ ⎥
⎢ ⎥
⎢ (k) ⎥ ∂L(k) T
δ (k) = ⎢δi ⎥ = ( (k) )
⎢ ⎥
⎢ ⎥
∂z
⎢ ⋮ ⎥
⎣δp(k) ⎦
计算∇b
(k) (k)
类似的,计算b的gradient,也就是 ∂L ∂L
∂b ,可以先对W 中的每个元素单独求导计算 ∂bi
∂L(k)
,然后再合并排列列起来得到 ∂b 。
⎣0⎦
⎡0⎤
⎢⋮⎥
⎢ ⎥
(k) ⎢ ⎥
= [δ1(k) δp ] ⎢1⎥
(k)
⋯ ⋯
⎢ ⎥
δi
⎢⋮⎥
⎣0⎦
(k) (k)
= δi × 1 = δi
⎡ ∂z(k) ⎤
∂L(k)
⎡δ1 ⎤
(k)
⎢ ⎥
1
⎢ ⋮ ⎥ ⎢ ⋮ ⎥
∂L(k) T ⎢ ⎥ ⎢ ⎥
⎢ ∂L(k) ⎥ ⎢ (k) ⎥
) = ⎢ ∂z(k) ⎥ = ⎢δi ⎥ = δ (k)
⎢ i ⎥ ⎢ ⎥
∇b = (
⎢ ⎥ ⎢ ⎥
∂b
⎢ ⋮ ⎥ ⎢ ⋮ ⎥
⎢ (k) ⎥
⎣δp(k) ⎦
⎣ (k) ⎦
∂L
∂zp
[l−1]
对于多层的神经⽹网络,如果把上⾯面的x(k) ,当作前⼀一层的输出a(k) ,在计算
[l−1] (k)
backpropaga!on的时候,当计算前⼀一层的δ (k) ,也就是计算 ∂L
(k) [l−1]
,先要计算
(k) (k)
∂z
∂L ∂L
(k) [l−1] ,也就是这⾥里里的 ∂x(k) 。
∂a
同样根据Chain rule
∂Wx(k)
(k)
=W
∂x
所以
∂L(k) T
∇x(k) = ( (k) ) = WT δ (k)
∂x
m个数据点的计算
可以进⼀一步扩展到每次输⼊入m个数据点的情况:
Z = WX + B
其中Z是p × m的matrix
W依然是p × n的matrix
X是n × m的matrix
B是p × m的matrix,其中每个column都相同,都是由同⼀一个p × 1的vector b通过
broadcast得到的。
也就是
⎡z1 z1 ⎤
(1) (k) (m)
⋯ z1 ⋯
⎢ ⋮ ⋮ ⎥
⎢ ⎥
⎢ (1) (m) ⎥
⋮ ⋱ ⋮
⎢zi zi ⎥
(k)
⎢ ⎥
⋯ zi ⋯
⎢ ⎥
⎢ ⋮ ⋮ ⋱ ⋮ ⋮ ⎥
⎣zp(1) ⋯ zp(k) ⋯ zp ⎦
(m)
另外
m
1
L = F (Z) = ∑ L(k)
m
k=1
根据上图的计算图可知,从L有m条路路径到W。
m
∂L ∂L ∂L(k) ∂z(k)
=∑
∂wi,j ∂L(k) ∂z(k) ∂wi,j
k=1
m
1 ∂L(k) ∂z(k)
= ∑ (k)
m ∂z ∂wi,j
k=1
m
1
= ∑ δi xj
(k) (k)
m
k=1
其中
1 ∑ m
(k)
∂L ∂m k=1 L 1
= =
∂L(k) ∂L(k) m
为计算⽅方便便,其实可以让∇W 按照与W相同的shape来排列列其中的元素。⽽而不不是按照
∂L
∂W 的shape来排列列。
⎡ ∂w1,1 ∂w1,n ⎤
∂L ∂L ∂L
⋯ ∂w1,j ⋯
⎢ ⋮ ⋮ ⎥
∂L T ⎢ ⎢ ∂L ∂L ⎥
⎥
⋮ ⋱ ⋮
) = ⎢ ∂w ∂wi,n ⎥
∂L
⎢ i,1 ⎥
∇W =( ⋯ ⋯
⎢ ⎥
∂wi,j
∂W
⎢ ⋮ ⋮ ⋱ ⋮ ⋮ ⎥
⎣ ∂w
∂L
⋯ ∂L
⋯ ∂L ⎦
p,1 ∂wp,j ∂wp,n
⎡ k=1 1 x1 ∑k=1 δ1 xn ⎤
m (k) (k) m (k) (k) m (k) (k)
∑ δ ⋯ ∑k=1 δ1 xj ⋯
⎢ ⎥
1 ⎢ ⎥
⋱
⎢ (k) (k) ⎥
⋮ ⋮ ⋮ ⋮
= ⎢∑m (k) (k) (k) (k)
∑k=1 δi xn ⎥
m ⎢ k=1 i 1 ⎥
m m
δ x ⋯ ∑k=1 δi xj ⋯
⎢ ⎥
⎢ ⋮ ⋮ ⋱ ⋮ ⋮ ⎥
⎣∑m δp(k) x(k) ⋯
m (k) (k)
∑k=1 δp xj ⋯ ∑k=1 δp xn ⎦
m (k) (k)
k=1 1
⎡δ1 δ1 ⎤ ⎡ x1 xn ⎤
(1) (k) (m) (1) (1) (1)
⋯ δ1 ⋯ ⋯ xj ⋯
⎢ ⋮ ⋮ ⎥ ⎢ ⋮ ⎥
1 ⎢ ⎥⎢ ⋮ ⎥
⋱ ⋱
⎢ (m) ⎥ ⎢ (k) (k) ⎥
⋮ ⋮ ⋮ ⋮
= ⎢δi(1) (k)
δi ⎥ ⎢ x1
(k)
xn ⎥
m⎢ ⎥⎢ ⎥
⋯ δi ⋯ ⋯ xj ⋯
⎢ ⎥⎢ ⎥
⎢ ⋮ ⋮ ⋱ ⋮ ⋮ ⎥⎢ ⋮ ⋮ ⋱ ⋮ ⋮ ⎥
⎣δp(1) ⋯
(k)
δp ⋯ δp ⎦ ⎣x(m)
(m)
⋯
(m)
xj ⋯ xn ⎦
(m)
1
1
= ΔXT
m
其中
⎡ ∂z (1) ∂z1(m) ⎤
∂L(1) ∂L(k) ∂L(m)
⋯ ⋯
∂z1(k)
⎢ ⎥
1
⎢ ⋮ ⋮ ⎥
⎢ (1) ⋮ ⋱ ⋮ ⎥
⎢ ∂L ∂L(m) ⎥
Δ = ⎢ ∂z (1) ⎥
∂L(k)
⎢ i ∂zi(m) ⎥
⋯ ⋯
⎢ ⎥
∂zi(k)
⎢ ⋮ ⋮ ⎥
⎢ (1) ⋮ ⋱ ⋮ ⎥
⎣ ∂L(1) ⋯ ∂L(k)
⋯ (m) ⎦
∂L(m)
∂zp ∂zp(k) ∂zp
⎡δ1 δ1 ⎤
(1) (k) (m)
⋯ δ1 ⋯
⎢ ⋮ ⋮ ⎥
⎢ ⎥
⎢ (m) ⎥
⋮ ⋱ ⋮
= ⎢δi(1) δi ⎥
(k)
⎢ ⎥
⋯ δi ⋯
⎢ ⎥
⎢ ⋮ ⋮ ⋱ ⋮ ⋮ ⎥
⎣δp(1) ⋯
(k)
δp ⋯ δp ⎦
(m)
计算Δ⾮非常重要,是backpropaga!on能够逐层递进的关键计算步骤。
∂L T
Notes: Δ ̸
= ( ∂Z ) ,两者不不是⼀一回事!和单个数据点是有区别的。
类似的,根据上图的计算图可知,从L有m条路路径到b。
m
∂L ∂L ∂L(k) ∂z(k)
=∑
∂bi ∂L(k) ∂z(k) ∂bi
k=1
m
1 ∂L(k) ∂z(k)
= ∑ (k)
m ∂z ∂bi
k=1
m
1 ∂L(k)
= ∑ (k)
m ∂z k=1
m
1
∑ δi
(k)
=
m
k=1
⎡m ⎤
1 m ∂L(k)
∑k=1 δ1 ⎤ ⎡m
∑k=1 1 m (k)
∂z(k)
⎢ ⎥
1
⎢ ⎥ ⎢ ⎥
⎢ ⎥
∂L T ⎢ 1 m ∂L(k) ⎥ ⎢ 1 m (k) ⎥
⋮ ⎢
⎥
⋮ m
) = ⎢ m ∑k=1 ∂z(k) ⎥ = ⎢ m ∑k=1 δi ⎥ =
1
∑ δ (k)
⎢ i ⎥ ⎢ ⎥ m
∇b = (
⎢ ⎥ ⎢ ⎥
∂b
⎢ ⎥ ⎢ ⎥
k=1
⎢ ⎥
⋮ ⋮
⎣ 1 ∑m δp(k) ⎦
⎣ m k=1 (k) ⎦
(k)
1 m ∂L
∑ m k=1
∂zp
上⾯面的步骤实际是将Δ的列列相加再求平均。
对于多层的神经⽹网络,如果把上⾯面的X,当作前⼀一层的输出A[l−1] ,在计算
backpropaga!on的时候,当计算前⼀一层的Δ[l−1] ,也就是
[δ (1) ],实际就是计算
[l−1] [l−1] [l−1]
⋯ δ (k) ⋯ δ (m)
[( ∂L(1)
(1) [l−1] )
T ⋯ ( ∂L(k)
(k) [l−1] )
T ⋯ ( ∂L(m)
(m) [l−1] ) ],则需要先计算:
T
∂z ∂z ∂z
∇X = [( ∂L ∂L(m) T ]
(1)
∂L(k) T
∂x(1) )T ⋯ ( ∂x(k) ) ⋯ ( ∂x(m) )
∂L(k) T
前⾯面已经知道了了如何计算每个数据点的( ∂x(k) ) ,合并在⼀一起很容易易得到结果:
Notes:
求导涉及matrix的情况,如果直接按照Leow Wee Kheng讲义中的定义,是⽆无法使⽤用
Chain rule的,要使⽤用Chain rule之前都必须按照前⾯面Generalized Jacobian的⽅方法把
matrix拉⻓长变为Vector,例例如下⾯面的具体的例例⼦子:
∂L ∂L ∂Z
=
∂wi,j ∂Z ∂wi,j
∂L ∂L
因为 ∂wi,j
显然是⼀一个标量量,⽽而如果按照Leow Wee Kheng讲义, ∂Z 是m × p的matrix,
∂Z ∂L
同时 ∂wi,j
是p × m 的matrix,⽤用Chain rule推导出 ∂wi,j 是m × m的matrix,这显然是⽭矛
盾的。
对求导涉及到Matrix的情况,都要按照前⾯面Generalized Jacobian的⽅方法先把matrix拉⻓长
∂L ∂Z
变为Vector,这时 ∂Z 是1 × (p × m)的matrix, ⽽而 ∂w 是(p × m) × 1的matrix,⽤用
i,j
∂L
Chain rule推导推出的 ∂w 是1 × 1的matrix,也就是标量量,结果是正确的。
i,j
Reference
3. Gradient and Auto Differen!a!on, Alex Smola and Mu Li, STAT 157, Spring
2019, UC Berkeley
Andrew Ng, Notebook: Building your Deep Neural Network: Step by Step in
Neural Network and Deep Learning