前言
在有些博客推导神经网络的BP时,涉及到多次矩阵求导运算,尤其是反向传播时候,求的梯度结果被转置了,比如假设最后一层的输出为
y=σ(w⋅x+b)
那么
∂y∂w∂y∂x=σ′(w⋅x+b)⋅xT=σ′(w⋅x+b)⋅wT
这两个式子到底正确不正确,这个就涉及到矩阵求导了,转没转置这个对推导细节也是蛮重要的,接下来就看看我个人认为比较重要的矩阵求导式子,不定期更新。最后再证明这两个式子的正确性。其实先说一下结论,如果你强抠矩阵求导法则来证明这两个式子,它们是完全错误的。
【PS】我现在怀疑这个与CNN中的卷积核翻转有关系,但是一个是转置,一个是翻转,貌似运算结果也不一样,下一篇博客更新为什么CNN正传和反传的时候卷积核必须有一个翻转,另一个没翻转。
部分关键结论列举
行向量对列向量求导
设
Y
是n维行向量,
X
是p维列向量,则
∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1∂x1⋮∂y1∂xp⋯⋱⋯∂yn∂x1⋮∂yn∂xp⎤⎦⎥⎥⎥⎥⎥⎥⎥
列向量对行向量求导
设
Y
是m维列向量,X是
q
维行向量,则
∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1∂x1⋮∂ym∂x1⋯⋱⋯∂y1∂xq⋮∂ym∂xq⎤⎦⎥⎥⎥⎥⎥⎥⎥
行向量对行向量求导
设
Y
是m维的行向量,
X
是q维的行向量,则
∂Y∂X=[∂Y∂x1⋯∂Y∂xq]
列向量对列向量求导
设
Y
是m维的列向量,
X
是q维的列向量,则
∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢∂y1∂X⋮∂ym∂X⎤⎦⎥⎥⎥⎥⎥⎥
元素对矩阵的求导
设
y
是一个元素,X的一个p×q的矩阵,那么
∂y∂X=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y∂x11⋮∂y∂xp1⋯⋱⋯∂y∂x1q⋮∂y∂xpq⎤⎦⎥⎥⎥⎥⎥⎥⎥
矩阵对行向量求导
设
Y
是m×n的矩阵,
X
是q维行向量,那么
∂Y∂X=[∂Y∂xi∂Y∂x2⋯∂Y∂xq]
意思就是矩阵对向量中的每个元素单独求导,涉及矩阵对元素的求导
矩阵对列向量求导
设
Y
是m×n的矩阵,
X
是q维列向量,那么
∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢∂y11∂X⋮∂ym1∂X⋯⋱⋯∂y1n∂X⋮∂ymn∂X⎤⎦⎥⎥⎥⎥⎥⎥
涉及到元素对矩阵的求导
行向量对矩阵的求导
设
Y
是n维行向量,
X
是p×q的矩阵,那么
∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂Y∂x11⋮∂Y∂xp1⋯⋱⋯∂Y∂x1q⋮∂Y∂xpq⎤⎦⎥⎥⎥⎥⎥⎥⎥
列向量对矩阵求导
设
Y
是m维列向量,
X
是p×q的矩阵,那么
∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢∂y1∂X⋮∂ym∂X⎤⎦⎥⎥⎥⎥⎥⎥
矩阵对矩阵求导
设
Y
是m×n的矩阵,
X
是p×q的矩阵,那么
∂Y∂X=[∂Y∂x⋅1⋯∂Y∂x⋅q]=⎡⎣⎢⎢⎢⎢⎢⎢∂y1⋅∂X⋮∂ym⋅∂X⎤⎦⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1⋅∂x⋅1⋮∂ym⋅∂x⋅1⋯⋱⋯∂y1⋅∂x⋅q⋮∂ym⋅∂x⋅q⎤⎦⎥⎥⎥⎥⎥⎥⎥
其实就是转换成向量对矩阵或者矩阵对向量的求导。
两个例子
矩阵对矩阵求导
设
Y=[adbecf]
,
X=⎡⎣⎢uvwxyz⎤⎦⎥
,根据求导法则得到
∂Y∂X=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢∂[abc]∂⎡⎣⎢uvw⎤⎦⎥∂[def]∂⎡⎣⎢uvw⎤⎦⎥∂[abc]∂⎡⎣⎢xyz⎤⎦⎥∂[def]∂⎡⎣⎢xyz⎤⎦⎥⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢∂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=⎡⎣⎢x1x2x3⎤⎦⎥
的
n
维列向量,W=[w11x21w12x22w13x23],假设
F=(W⋅X)T
,求
∂F∂X
F∂F∂X=(W⋅X)T=[w11⋅x1+w12⋅x2+w13⋅x3w21⋅x1+w22⋅x2+w23⋅x3]=[f1f2]=[∂f1∂X∂f2∂X]=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢∂f1∂x1∂f1∂x2∂f1∂x3∂f2∂x1∂f2∂x2∂f2∂x3⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢w11w12w13w21w22w23⎤⎦⎥=WT
神经网络相关两个验证
前言中列了两个公式,关于结果是转置的原因,我们开证,先设置几个条件:
w
是权重矩阵,x是列向量,表示输入样本。
W=[w11w21w12w22w13w23];X=⎡⎣⎢x1x2x3⎤⎦⎥
求证:
∂(W⋅X)∂X=WT;∂(W⋅X)∂W=XT;
第一个证明
设
C=W⋅X=[w11x1+w12x2+w13x3w21x1+w22x2+w23x3]=[c1c2]
利用列向量对列向量的求导法则,可以得到
∂C∂X=⎡⎣⎢⎢∂c1∂X∂c2∂X⎤⎦⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢∂c1∂x1∂c1∂x2∂c1∂x3∂c2∂x1∂c2∂x2∂c2∂x3⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢w11w12w13w21w22w23⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
所以说,第一个式子如果直接按照矩阵求导法则证明,是完全错误的。除非是
∂((W⋅X)T)∂X=WT
第二个证明
不用证明了,如果
W⋅X
结果是向量的话,
∂(W⋅X)∂W=XT
这个结论必定是错的,不论是依据行向量对矩阵求导还是列向量对矩阵求导,其结果矩阵不可能是
X
的维度大小,肯定大很多,不信你按照上面的矩阵运算法则自己推导。
然后我解释一下为什么y=σ(w⋅x+b)能推到
∂y∂w=σ′(w⋅x+b)⋅xT
,以下纯属个人见解:
其实这一部分推导时候不能用矩阵求导方法,而是直接拆分。
注意,权重大小是
j×i
而非
i×j
,表示的是输出到输入的连接权重,而非输入到输出的连接权重,这个从
W×x+b
而非
x×W+b
很容易理解到
随后证明流程如下:
yj∂yj∂wji=σ(∑iwji⋅xi+bj)=σ′(∑iwji⋅xi+bj)⋅xi=σ′j⋅xi
然后我们将多个输出神经元
y
对权重的更新组合成矩阵和向量乘积的形式:
∂y∂W=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1∂w11⋮∂y1∂wm1⋯⋱⋯∂yn∂w1n⋮∂yn∂wmn⎤⎦⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢σ′1⋅x1⋮σ′m⋅x1⋯⋱⋯σ′1⋅xn⋮σ′m⋅xn⎤⎦⎥⎥=⎡⎣⎢⎢σ′1⋮σ′m⎤⎦⎥⎥⋅[x1⋯xn]=σ′⋅XT
个人觉得用矩阵求导证明BP有很多漏洞不好做,所以最好的方法是拆分开,按下标证明,即证
∂E∂Wji
而非直接证明
∂E∂W