logo资料库

如何计算神经网络的梯度.pdf

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
如何计算神经网络的梯度 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 ∂θ
分享到:
收藏