如何计算神经网络的梯度
Kevin Clark 译:李毓瑞
2019 年 8 月 21 日
目录
1 引言
2 梯度向量化
3 一些有用的性质
3.1 矩阵乘列向量,对列向量求导(z = W x,so ∂z
3.2 行向量乘矩阵,对行向量求导(z = xW ,so ∂z
3.3 向量自对自求导(z = x,so ∂z
3.4 应用了元素级函数的向量,对向量求导(z = f (x),so ∂z
3.5 矩 阵 乘 列 向 量,对 矩 阵 求 导 (z = W x, δ = ∂J
∂x =?)
. . . . . .
∂x =?) . . . . . .
∂x =?) . . . . . . . . . . . . . . .
∂x =?) .
∂z ,so ∂J
∂W =
1
2
2
2
3
3
3
4
5
∂θ ?)
∂z
∂W = δ ∂z
∂J
∂z
∂W ?) . . . . . . . . . . . . . . . . . . . . . . . . .
3.6 行向量乘矩阵对矩阵求导(z = xW, δ = ∂J
∂W ?) .
3.7 交叉熵损失对logits求导(ˆy = sof tmax(θ), J = CE(y, ˆy), so ∂J
∂W = δ ∂z
∂z ,so ∂J
5
4 示例:单隐层神经网络
5
1 引言
本文的目的是介绍如何以向量形式快速计算神经网络的梯度。
1
2 梯度向量化
2
2 梯度向量化
单独计算神经网络中一个参数的梯度是一个很好的练习方式(比如:
权值矩阵中的一个元素),但实际中,这样的计算方式的速度慢得令人发
指。因此,我们需要以向量或矩阵的形式来计算。
梯 度 向 量 化 的 基 础 是 雅 可 比 矩 阵(Jacobian Matrix)。 假 设 有 一 个
函数f : Rn → Rm将长度为n的向量映射成长度为m的向量,即f (x) =
[f1(x1, ..., xn), f2(x1, ..., xn), fm(x1, ..., xn)],则其雅可比矩阵是一个m × n的
矩阵,如下所示:
∂f1
∂x1
...
∂fm
∂x1
···
. . .
···
∂f1
∂xn
...
∂fm
∂xn
∂f
∂x
=
(1)
(2)
(3)
∂x )ij = ∂fi
(正是单个元素上的求偏导)。雅可比矩阵非常有用,可
其中,( ∂f
以通过在雅可比矩阵上的乘实现对向量值函数(vector-valued function)的
链式法则。
∂xj
举个小例子来说明,有一个函数f (x) = [f1(x), f2(x)]将一个标量映射成
一个长度为2的向量,另一个函数g(y) = [g1(y1, y2), g2(y1, y2)]将长度为2的
向量映射成长度为2的向量,代入得g(x) = [g1(f1(x), f2(x)), g2(f1(x), f2(x))]。
由链式法则,计算g对x的偏导:
∂g1(f1(x),f2(x))
∂x
∂g2(f1(x),f2(x))
=
∂x
∂g1
∂f1
∂g2
∂f1
∂g
∂x
=
∂f1
∂x + ∂g1
∂x + ∂g2
∂f2
∂f2
∂f1
∂f2
∂x
∂f2
∂x
容易看出,这其实与两个雅可比矩阵的乘是一致的。
∂g1
∂f1
∂g2
∂f1
∂f1
∂x
∂f2
∂x
∂g1
∂f2
∂g2
∂f2
∂g
∂x
=
∂g
∂f
∂f
∂x
=
3 一些有用的性质
本节的内容是介绍如何计算几个简单函数的雅可比矩阵。 这其中的一
些性质对神经网络的梯度计算很有帮助。
3.1 矩阵乘列向量,对列向量求导(z = W x,so ∂z
∂x =?)
假定W ∈ Rn×m,我们可以认为z是x的函数,其将一个维度为m的向量
3 一些有用的性质
映射到维度为n的向量。故它的雅可比矩阵维度是n × m。注意到,有
m
k=1
zi =
Wikxk
3
(4)
因此,雅可比矩阵中的一个元素( ∂z
∂x )ij是
∂m
(
∂z
∂x
)ij =
∂zi
∂xj
=
k=1 Wikxk
∂xj
m
k=1
=
Wik
∂xk
∂xj
= Wij
(5)
因为, ∂xk
∂xj
= 1仅当k = j时,其余为0.因此,可以得到 ∂z
∂x = W
3.2 行向量乘矩阵,对行向量求导(z = xW ,so ∂z
∂x =?)
计算方式与3.1节类似,最终得到 ∂z
∂x = W T
3.3 向量自对自求导(z = x,so ∂z
∂x =?)
此时,有zi = xi。因此,
(
∂z
∂x
)ij =
∂zi
∂xj
=
∂xi
∂xj
=
1,
0,
if i = j
if otherwise
(6)
易知,雅可比矩阵 ∂z
∂x
单位矩阵: ∂z
是一个对角矩阵,主对角线元素为1,其余为0.这正是
∂x = I。 当应用链式法则,这一项会被消去,因为一个矩阵或
向量与单位矩阵相乘等于它本身。
3.4 应用了元素级函数的向量,对向量求导(z = f (x),so ∂z
∂x =?)
因为函数f 是应用到每个元素的,因此有
f(xi),
0,
(
∂z
∂x
)ij =
∂zi
∂xj
=
∂f (xi)
∂xj
=
if i = j
if otherwise
(7)
易知,雅可比矩阵 ∂z
∂x
的取值,可以写作 ∂z
线元素做元素级的乘法,当应用链式法则时也可以写作◦(f(x))。
是一个对角矩阵,主对角线元素为函数f 的导数在xi处
∂x = diag(f(x))。 因为乘一个对角矩阵等同于对主对角
3 一些有用的性质
4
3.5 矩 阵 乘 列 向 量,对 矩 阵 求 导 (z = W x, δ = ∂J
∂z ,so ∂J
∂W =
∂J
∂z
∂z
∂W = δ ∂z
∂W ?)
这个性质较其他性质更加复杂一些。 标题列出的公式中包含了 ∂J
∂z
这一
项的原因会在之后给出。
首先假设我们有一个损失函数J(标量),计算其对于矩阵W ∈ Rn×m的梯
度。我们可以认为J是W 的函数,其有nm个输入(W 的元素个数),一个输
将是一个1 × nm的向量。 但在实际应用中,这样
出J。 这意味着雅可比 ∂J
∂W
的形式并不适用。理想的形式是类似如下的n ∈ m的矩阵:
∂J
...
∂W11
∂J
∂Wn1
···
. . .
···
∂J
∂W1m
...
∂J
∂Wnm
∂J
∂W
=
因为这个矩阵与W 具有相同的维度,我们可以在梯度下降时仅需按位相减。
因此,我们的目标变成寻找 ∂J
∂W
。
这种方式排列梯度会使计算 ∂z
∂W
的形式, ∂z
∂W
将梯度排列成 ∂J
∂W
是,这种情况可以通过对Wij的求导来避免。 ∂z
∂Wij
此时有,
变得复杂。 z是一个向量,若我们试图
将会是一个n × m × n的张量(tensor)。幸运的
是向量,更加容易处理。
(8)
(9)
(10)
m
m
l=1
l=1
zk =
Wklxl
∂zk
∂Wij
=
xl
∂Wkl
∂Wij
0
...
0
xj
0
...
0
= 1,其他情况为0。 若k = i,则求和式中
注意到当i = k且j = l时, ∂Wkl
∂Wij
的每一项都为0,梯度也就为0,唯一的非零元素是当l = j时,得到xj。 因
此,有 ∂zk
∂Wij
= xj当k = i时,其他情况为0,即有:
∂z
∂Wij
=
← ith element
(11)
4 示例:单隐层神经网络
5
此时,我们可以计算 ∂J
∂Wij
了
∂J
∂Wij
=
∂J
∂z
∂z
∂Wij
= δ
∂z
∂Wij
=
m
k=1
δk
∂z
∂Wij
= δixj
(12)
(ps:和式中唯一的非零项是δi
∂zi
∂Wij
是δixj的矩阵,可以由δ和x两个向量的外积得到,即
。 我们想要的 ∂J
∂W
∂J
∂W
是位置(i,j)的元素
= δT xT
3.6 行 向 量 乘 矩 阵 对 矩 阵 求 导 (z = xW, δ = ∂J
∂z ,so ∂J
∂W =
δ ∂z
∂W ?)
与第5节的计算过程相似,最终得到
∂J
∂W
= xT δ
3.7 交叉熵损失对logits求导(ˆy = sof tmax(θ), J = CE(y, ˆy), so ∂J
∂θ ?)
梯度是
∂J
∂θ
= ˆy − y 或当y是列向量是,梯度为(ˆy − y)T
4 示例:单隐层神经网络
本节提供一个在全连接神经网络上计算梯度的示例。 特别地,我们将
对使用交叉熵做损失函数的单隐层神经网络计算梯度。 前向过程总结如
下:
x = input
z = W x + b1
h = ReLU (z)
θ = U h + b2
ˆy = sof tmax(θ)
J = CE(y, ˆy)
这样的表示形式可以将模型分解成教简单的几个部分,更易理解。 容
易注意到我们定义了z和θ来分离线性计算和激活函数的计算。 模型参数的
维度如下所示:
x ∈ RDx×1, b1 ∈ RDh×1, W ∈ RDh×Dx, b2 ∈ RNc×1, U ∈ RNc×Dh
4 示例:单隐层神经网络
6
其中,Dx是输入的维度,Dh是隐藏层的维度,Nc是类别数目。
在本例中,我们需要计算的梯度有:
∂J
∂U , ∂J
∂b2
, ∂J
∂W , ∂J
∂b1
, ∂J
∂x
首先,我们知道ReLU (x) = max(x, 0),则。
1,
0,
ReLU(x) =
if x > 0
if otherwise
= sgn(ReLU (x))
(13)
其中,sgn是符号函数。 注意到,我们可以根据激活函数本身写出它的导
数。我们根据链式法则写出 ∂J
∂U
的计算式。
和 ∂J
∂b2
∂J
∂U = ∂J
∂ ˆy
= ∂J
∂ ˆy
∂J
∂b2
∂ ˆy
∂θ
∂ ˆy
∂θ
∂θ
∂U
∂θ
∂b2
在两个式子中均出现,因此,为方便计算,我们将多
注意到 ∂J
∂ ˆy
∂ ˆy
∂θ = ∂J
∂θ
次出现的部分单独保存以便使用。令:
δ1 = ∂J
∂θ ,δ2 = ∂J
∂z
其余的计算如下:
δ1 =
∂J
∂z
=
∂J
∂θ
∂J
∂θ
δ2 =
= (ˆy − y)T (见3.7)
∂θ
∂h
(链式法则)
∂h
∂z
(替换)
(14)
= δ1
∂θ
∂h
∂h
∂z
∂h
∂z
= δ1U
(见3.1)
= δ1U ◦ (ReLU(z)) (见3.4)
= δ1U ◦ (sgn(h)) (见之前的计算)
检查正确与否的一种好的方式是:验证雅可比矩阵的维度:
∂J
∂z = δ1 U ◦ (sgn(h))
(1 × Dh) (1 × Nc) (Nc × Dh) (Dh)
易知,所有项的维度是匹配的。
现在我们可以利用δ1和δ2来计算其他的梯度了。
4 示例:单隐层神经网络
7
∂J
∂θ
∂b2
∂J
∂b2
∂θ
∂U = δ1
∂U = ∂J
∂θ
= ∂J
= δ1
∂θ
∂W = ∂J
∂z
∂W = δ2
= ∂J
∂z
= δ2
∂θ
∂b1
∂x = ∂J
∂J
∂b1
∂J
∂θ
∂U = δT
1 hT
∂θ
= δT
1
∂b2
∂z
∂W = δT
2 xT
= δT
2
∂z
∂b1
∂J
∂θ
∂z
∂x = (δ2W )T
∂θ