前言
在有些博客推导神经网络的BP时,涉及到多次矩阵求导运算,尤其是反向传播时候,求的梯度结果被转置了,比如假设最后一层的输出为
y = σ ( w ⋅ x + b )
那么
∂ y ∂ w ∂ y ∂ x = σ ′ ( w ⋅ x + b ) ⋅ x T = σ ′ ( w ⋅ x + b ) ⋅ w T
这两个式子到底正确不正确,这个就涉及到矩阵求导了,转没转置这个对推导细节也是蛮重要的,接下来就看看我个人认为比较重要的矩阵求导式子,不定期更新。最后再证明这两个式子的正确性。其实先说一下结论,如果你强抠矩阵求导法则来证明这两个式子,它们是完全错误的。
【PS】我现在怀疑这个与CNN中的卷积核翻转有关系,但是一个是转置,一个是翻转,貌似运算结果也不一样,下一篇博客更新为什么CNN正传和反传的时候卷积核必须有一个翻转,另一个没翻转。
部分关键结论列举
行向量对列向量求导
设Y 是n 维行向量,X 是p 维列向量,则
∂ Y ∂ X = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ y 1 ∂ x 1 ⋮ ∂ y 1 ∂ x p ⋯ ⋱ ⋯ ∂ y n ∂ x 1 ⋮ ∂ y n ∂ x p ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
列向量对行向量求导
设Y 是m 维列向量,X是q 维行向量,则
∂ Y ∂ X = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ y 1 ∂ x 1 ⋮ ∂ y m ∂ x 1 ⋯ ⋱ ⋯ ∂ y 1 ∂ x q ⋮ ∂ y m ∂ x q ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
行向量对行向量求导
设Y 是m 维的行向量,X 是q 维的行向量,则
∂ Y ∂ X = [ ∂ Y ∂ x 1 ⋯ ∂ Y ∂ x q ]
列向量对列向量求导
设Y 是m 维的列向量,X 是q 维的列向量,则
∂ Y ∂ X = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ y 1 ∂ X ⋮ ∂ y m ∂ X ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
元素对矩阵的求导
设y 是一个元素,X的一个p × q 的矩阵,那么
∂ y ∂ X = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ y ∂ x 11 ⋮ ∂ y ∂ x p 1 ⋯ ⋱ ⋯ ∂ y ∂ x 1 q ⋮ ∂ y ∂ x p q ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
矩阵对行向量求导
设Y 是m × n 的矩阵,X 是q 维行向量,那么
∂ Y ∂ X = [ ∂ Y ∂ x i ∂ Y ∂ x 2 ⋯ ∂ Y ∂ x q ]
意思就是矩阵对向量中的每个元素单独求导,涉及矩阵对元素的求导
矩阵对列向量求导
设Y 是m × n 的矩阵,X 是q 维列向量,那么
∂ Y ∂ X = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ y 11 ∂ X ⋮ ∂ y m 1 ∂ X ⋯ ⋱ ⋯ ∂ y 1 n ∂ X ⋮ ∂ y m n ∂ X ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
涉及到元素对矩阵的求导
行向量对矩阵的求导
设Y 是n 维行向量,X 是p × q 的矩阵,那么
∂ Y ∂ X = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ Y ∂ x 11 ⋮ ∂ Y ∂ x p 1 ⋯ ⋱ ⋯ ∂ Y ∂ x 1 q ⋮ ∂ Y ∂ x p q ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
列向量对矩阵求导
设Y 是m 维列向量,X 是p × q 的矩阵,那么
∂ Y ∂ X = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ y 1 ∂ X ⋮ ∂ y m ∂ X ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
矩阵对矩阵求导
设Y 是m × n 的矩阵,X 是p × q 的矩阵,那么
∂ Y ∂ X = [ ∂ Y ∂ x ⋅ 1 ⋯ ∂ Y ∂ x ⋅ q ] = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ y 1 ⋅ ∂ X ⋮ ∂ y m ⋅ ∂ X ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ y 1 ⋅ ∂ x ⋅ 1 ⋮ ∂ y m ⋅ ∂ x ⋅ 1 ⋯ ⋱ ⋯ ∂ y 1 ⋅ ∂ x ⋅ q ⋮ ∂ y m ⋅ ∂ x ⋅ q ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
其实就是转换成向量对矩阵或者矩阵对向量的求导。
两个例子
矩阵对矩阵求导
设Y = [ a d b e c f ] ,X = ⎡ ⎣ ⎢ u v w x y z ⎤ ⎦ ⎥ ,根据求导法则得到
∂ Y ∂ X = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ [ a b c ] ∂ ⎡ ⎣ ⎢ u v w ⎤ ⎦ ⎥ ∂ [ d e f ] ∂ ⎡ ⎣ ⎢ u v w ⎤ ⎦ ⎥ ∂ [ a b c ] ∂ ⎡ ⎣ ⎢ x y z ⎤ ⎦ ⎥ ∂ [ d e f ] ∂ ⎡ ⎣ ⎢ x y z ⎤ ⎦ ⎥ ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ a ∂ u ∂ a ∂ v ∂ a ∂ w ∂ d ∂ u ∂ d ∂ v ∂ d ∂ w ∂ b ∂ u ∂ b ∂ v ∂ b ∂ w ∂ e ∂ u ∂ e ∂ v ∂ e ∂ w ∂ c ∂ u ∂ c ∂ v ∂ c ∂ w ∂ f ∂ u ∂ f ∂ v ∂ f ∂ w ∂ a ∂ x ∂ a ∂ y ∂ a ∂ z ∂ d ∂ x ∂ d ∂ y ∂ d ∂ z ∂ b ∂ x ∂ b ∂ y ∂ b ∂ z ∂ e ∂ x ∂ e ∂ y ∂ e ∂ z ∂ c ∂ x ∂ c ∂ y ∂ c ∂ z ∂ f ∂ x ∂ f ∂ y ∂ f ∂ z ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
表达式对矩阵求导
设X = ⎡ ⎣ ⎢ x 1 x 2 x 3 ⎤ ⎦ ⎥ 的n 维列向量,W = [ w 11 x 21 w 12 x 22 w 13 x 23 ] ,假设F = ( W ⋅ X ) T ,求∂ F ∂ X
F ∂ F ∂ X = ( W ⋅ X ) T = [ w 11 ⋅ x 1 + w 12 ⋅ x 2 + w 13 ⋅ x 3 w 21 ⋅ x 1 + w 22 ⋅ x 2 + w 23 ⋅ x 3 ] = [ f 1 f 2 ] = [ ∂ f 1 ∂ X ∂ f 2 ∂ X ] = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 ∂ f 1 ∂ x 3 ∂ f 2 ∂ x 1 ∂ f 2 ∂ x 2 ∂ f 2 ∂ x 3 ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ = ⎡ ⎣ ⎢ w 11 w 12 w 13 w 21 w 22 w 23 ⎤ ⎦ ⎥ = W T
神经网络相关两个验证
前言中列了两个公式,关于结果是转置的原因,我们开证,先设置几个条件:
w 是权重矩阵,x 是列向量,表示输入样本。
W = [ w 11 w 21 w 12 w 22 w 13 w 23 ] ; X = ⎡ ⎣ ⎢ x 1 x 2 x 3 ⎤ ⎦ ⎥
求证:
∂ ( W ⋅ X ) ∂ X = W T ; ∂ ( W ⋅ X ) ∂ W = X T ;
第一个证明
设
C = W ⋅ X = [ w 11 x 1 + w 12 x 2 + w 13 x 3 w 21 x 1 + w 22 x 2 + w 23 x 3 ] = [ c 1 c 2 ]
利用列向量对列向量的求导法则,可以得到
∂ C ∂ X = ⎡ ⎣ ⎢ ⎢ ∂ c 1 ∂ X ∂ c 2 ∂ X ⎤ ⎦ ⎥ ⎥ = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ c 1 ∂ x 1 ∂ c 1 ∂ x 2 ∂ c 1 ∂ x 3 ∂ c 2 ∂ x 1 ∂ c 2 ∂ x 2 ∂ c 2 ∂ x 3 ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ w 11 w 12 w 13 w 21 w 22 w 23 ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
所以说,第一个式子如果直接按照矩阵求导法则证明,是完全错误的。除非是
∂ ( ( W ⋅ X ) T ) ∂ X = W T
第二个证明
不用证明了,如果W ⋅ X 结果是向量的话,∂ ( W ⋅ X ) ∂ W = X T 这个结论必定是错的,不论是依据行向量对矩阵求导还是列向量对矩阵求导,其结果矩阵不可能是X 的维度大小,肯定大很多,不信你按照上面的矩阵运算法则自己推导。
然后我解释一下为什么y = σ ( w ⋅ x + b ) 能推到∂ y ∂ w = σ ′ ( w ⋅ x + b ) ⋅ x T ,以下纯属个人见解:
其实这一部分推导时候不能用矩阵求导方法,而是直接拆分。
注意,权重大小是 j × i 而非i × j ,表示的是输出到输入的连接权重,而非输入到输出的连接权重,这个从W × x + b 而非x × W + b 很容易理解到
随后证明流程如下:
y j ∂ y j ∂ w j i = σ ( ∑ i w j i ⋅ x i + b j ) = σ ′ ( ∑ i w j i ⋅ x i + b j ) ⋅ x i = σ ′ j ⋅ x i
然后我们将多个输出神经元
y 对权重的更新组合成矩阵和向量乘积的形式:
∂ y ∂ W = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ y 1 ∂ w 11 ⋮ ∂ y 1 ∂ w m 1 ⋯ ⋱ ⋯ ∂ y n ∂ w 1 n ⋮ ∂ y n ∂ w m n ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ = ⎡ ⎣ ⎢ ⎢ σ ′ 1 ⋅ x 1 ⋮ σ ′ m ⋅ x 1 ⋯ ⋱ ⋯ σ ′ 1 ⋅ x n ⋮ σ ′ m ⋅ x n ⎤ ⎦ ⎥ ⎥ = ⎡ ⎣ ⎢ ⎢ σ ′ 1 ⋮ σ ′ m ⎤ ⎦ ⎥ ⎥ ⋅ [ x 1 ⋯ x n ] = σ ′ ⋅ X T
个人觉得用矩阵求导证明BP有很多漏洞不好做,所以最好的方法是拆分开,按下标证明,即证
∂ E ∂ W j i 而非直接证明
∂ E ∂ W