简单神经网络批处理时梯度计算(标量对矩阵的求导,微分法)
学校的深度学习课程上老师介绍了损失函数在一个training data时对网络参数的求导,比较简单易求。然后介绍了批处理(同时有N个training data时)的求导并给出了结果,但是没给推导过程,当时我自己推了一下发现有些难点(涉及到矩阵微分的知识),值得整理记录一下。
问题介绍: 在如图的一个简单的二层神经网络中,网络的参数为
W
1
W^1
W1和
w
2
⃗
\vec{w^2}
w2。当有N个输入数据时,X的维数为(D+1 x N)。那么各符号维数为:
X
D
+
1
×
N
X_{D+1 \times N}
XD+1×N,
W
K
+
1
×
D
+
1
1
W^1_{K+1 \times D+1}
WK+1×D+11,
H
K
+
1
×
N
H_{K+1 \times N}
HK+1×N,
w
2
⃗
K
+
1
×
1
\vec{w^2}_{K+1 \times 1}
w2K+1×1以及
y
⃗
1
×
N
\vec{y}_{1\times N}
y1×N, 其中
y
⃗
=
w
2
⃗
T
σ
(
W
1
X
)
\vec{y}=\vec{w^2}^{T}\sigma (W^1X)
y=w2Tσ(W1X),
σ
\sigma
σ为sigmoid函数。如果使用mean squared loss, 那么损失函数为
J
=
1
N
∣
∣
y
⃗
−
t
⃗
∣
∣
2
J=\frac{1}{N}||\vec{y}-\vec{t}||^2
J=N1∣∣y−t∣∣2 (t是groundtruth), 问题:请求出J对
W
1
W^1
W1的导数。
先贴答案:
需要的prerequisite knowledge: 1.简单的标量对向量,标量对矩阵求导,可参考https://en.wikipedia.org/wiki/Matrix_calculus中scalar-by-vector和scalar-by-matrix部分。 2. 标量对矩阵求导的微分法,可参考https://www.cnblogs.com/pinard/p/10791506.html。
解: 先把J写成向量相乘的形式,然后化简标量对矩阵的求导,得到
∂
J
∂
A
\frac{\partial J}{\partial A}
∂A∂J,不能继续求导了,需要用微分法求出
∂
J
∂
A
\frac{\partial J}{\partial A}
∂A∂J。最后得出结果。最终结果公式中的X,H(网络中的节点),y,t 的值均已知,于是可以直接用此公式进行梯度下降法进行参数的更新啦O(∩_∩)O~
总结: 在批处理中,输入X以及网络中的节点均由向量升为矩阵,求导比一个training example时更为复杂。为此需要用新的方法:矩阵求导的微分法。