深度学习中的矩阵求导基础

深度学习中的矩阵求导基础

December 6, 2023

本文根据合集·深度学习中的数学by齐宪标系列视频整理。

在本文中,用小写字母表示标量,用粗体小写字母表示向量,用粗体大写字母表示矩阵。

导数的定义

在高等数学和数学分析的课程中,我们知道一元函数 y=f(x)y = f(x) 的导数定义为

dydx=limh0f(x+h)f(x)h \frac{\mathrm{d}y}{\mathrm{d}x} = \lim_{h \to 0} \frac{f(x + h) - f(x)}{h}

而对于多元函数,则会引入方向导数和梯度的概念。

梯度与方向导数

给定一个多元函数

y=f(x)=f(x1,x2,,xn)(xRn) y = f(\mathbf{x}) = f(x_1, x_2, \dots, x_n) \quad (\mathbf{x} \in \mathbb{R}^n)

其梯度为 f(x)\nabla f(\mathbf{x}) 定义为

f(x)=[yx1yx2yxn] \nabla f(\mathbf{x}) = \begin{bmatrix} \frac{y}{\partial x_1} \\ \frac{y}{\partial x_2} \\ \vdots \\ \frac{y}{\partial x_n} \end{bmatrix}

简单来说,梯度即为以单位正交向量为基底,yyx\mathbf{x} 各分量的导数的线性组合。对于多元函数而言,其梯度是一个和 x\mathbf{x} 同样维度的向量。

而方向导数是指函数在某一点处,在某一给定方向上的变化率,是一个标量。它定义为

Dvf(x)=f(x)v D_{\mathbf{v}}f(\mathbf{x}) = \nabla f(\mathbf{x})^{\top} \cdot \mathbf{v}

Jacobian 矩阵

对于一簇多元函数(也称为向量函数,即定义域和值域都是向量的集合的函数)

y=f(x)=[f1(x)f2(x)fm(x)](xRn,yRm) \mathbf{y} = f(\mathbf{x}) = \begin{bmatrix} f_1(\mathbf{x}) \\ f_2(\mathbf{x}) \\ \vdots \\ f_m(\mathbf{x}) \end{bmatrix} \quad (\mathbf{x} \in \mathbb{R}^n, \mathbf{y} \in \mathbb{R}^m)

其各个函数的梯度组合成一个矩阵,称为 Jacobian 矩阵,记为 J(x)\mathbf{J}(\mathbf{x})。它定义为

J(x)=[y1x1y1x2y1xny2x1y2x2y2xnymx1ymx2ymxn]=[f1(x)f2(x)fm(x)] \begin{aligned} \mathbf{J}(\mathbf{x}) &= \begin{bmatrix} \frac{\partial y_1}{\partial x_1} & \frac{\partial y_1}{\partial x_2} & \cdots & \frac{\partial y_1}{\partial x_n} \\ \frac{\partial y_2}{\partial x_1} & \frac{\partial y_2}{\partial x_2} & \cdots & \frac{\partial y_2}{\partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_m}{\partial x_1} & \frac{\partial y_m}{\partial x_2} & \cdots & \frac{\partial y_m}{\partial x_n} \end{bmatrix} \\ &= \begin{bmatrix} \nabla f_1(\mathbf{x}) & \nabla f_2(\mathbf{x}) & \cdots & \nabla f_m(\mathbf{x}) \end{bmatrix}^{\top} \end{aligned}

是一个 m×nm \times n 的矩阵,其中 mm 是输出的维度,nn 是输入的维度。

⚠️

注意

Jacobian 矩阵的维度是 m×nm \times n,而不是 n×mn \times m。这意味着,Jacobian 矩阵不能用来直接表示向量函数的导数和梯度——Jacobian 矩阵的转置才能表示向量函数的导数和梯度。

实际上,向量函数的求导运算是一种从函数到函数的映射。用形式化的语言表达就是

:RnRmRnRn×m \begin{aligned} \nabla: \mathbb{R}^{n} \to \mathbb{R}^{m} \longrightarrow \mathbb{R}^{n} \to \mathbb{R}^{n \times m} \end{aligned}

Hessian 矩阵

给定一个多元函数

y=f(x)=f(x1,x2,,xn)(xRn) y = f(\mathbf{x}) = f(x_1, x_2, \dots, x_n) \quad (\mathbf{x} \in \mathbb{R}^n)

其 Hessian 矩阵定义为

H(x)=2f(x)=x(yx)=[2yx122yx1x22yx1xn2yx2x12yx222yx2xn2yxnx12yxnx22yxn2] \begin{aligned} \mathbf{H}(\mathbf{x}) &= \nabla^{2} f(\mathbf{x}) \\ &= \frac{\partial}{\partial \mathbf{x}} \left( \frac{\partial y}{\partial \mathbf{x}} \right) \\ &= \begin{bmatrix} \frac{\partial^2 y}{\partial x_1^2} & \frac{\partial^2 y}{\partial x_1 \partial x_2} & \cdots & \frac{\partial^2 y}{\partial x_1 \partial x_n} \\ \frac{\partial^2 y}{\partial x_2 \partial x_1} & \frac{\partial^2 y}{\partial x_2^2} & \cdots & \frac{\partial^2 y}{\partial x_2 \partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2 y}{\partial x_n \partial x_1} & \frac{\partial^2 y}{\partial x_n \partial x_2} & \cdots & \frac{\partial^2 y}{\partial x_n^2} \end{bmatrix} \end{aligned}

导数的链式求导法则

对于复合函数

f(x)=fnfn1f2f1(x)=fn(fn1(f2(f1(x)))) \begin{aligned} f(x) &= f_n \circ f_{n-1} \circ \cdots \circ f_2 \circ f_1(x) \\ &= f_n(f_{n-1}(\cdots f_2(f_1(x)))) \end{aligned}

其链式求导法则为

df(x)dx=df(x)dfn(x)dfn(x)dfn1(x)df2(x)df1(x)df1(x)dx \frac{\mathrm{d}f(x)}{\mathrm{d}x} = \frac{\mathrm{d}f(x)}{\mathrm{d}f_n(x)} \cdot \frac{\mathrm{d}f_n(x)}{\mathrm{d}f_{n-1}(x)} \cdots \frac{\mathrm{d}f_2(x)}{\mathrm{d}f_1(x)} \cdot \frac{\mathrm{d}f_1(x)}{\mathrm{d}x}

不过,如果自变量是一个向量或者矩阵,那么由于矩阵乘法不满足交换律,于是就存在分母表达式和分子表达式两种形式。

分母表达式和分子表达式

这里的分子和分母指的是原微商式中的分子和分母,即 df(x)\mathrm{d}f(x)dx\mathrm{d}x。顾名思义,分母/分子表达式的含义就是先求含分母/分子的那一项,即

df(x)dx=df(x)dfn(x)dfn(x)dfn1(x)df2(x)df1(x)=df1(x)dxdf2(x)df1(x)dfn(x)dfn1(x) \begin{aligned} \frac{\mathrm{d}f(x)}{\mathrm{d}x} &= \frac{\mathrm{d}f(x)}{\mathrm{d}f_n(x)} \cdot \frac{\mathrm{d}f_n(x)}{\mathrm{d}f_{n-1}(x)} \cdots \frac{\mathrm{d}f_2(x)}{\mathrm{d}f_1(x)} \\ &= \frac{\mathrm{d}f_1(x)}{\mathrm{d}x} \cdot \frac{\mathrm{d}f_2(x)}{\mathrm{d}f_1(x)} \cdots \frac{\mathrm{d}f_n(x)}{\mathrm{d}f_{n-1}(x)} \\ \end{aligned}

其中,(1)(1) 式是分子表达式,(2)(2) 是分母表达式。由此可见,分子表达式是先求外层函数,然后逐层深入求导;分母表达式是先求内层函数,然后逐层向外求导。

在深度学习中,为了方便,一般采用分母表达式来表示导数。稍后我们就会看到这种表达方式的方便之处。

多项式向量函数的导数

多项式向量函数是指,每个因变量 y1,y2,,ymy_1, y_2, \cdots, y_m 都是关于自变量 x1,x2,,xnx_1, x_2, \cdots, x_n 和常数的线性函数的函数。本小节主要讨论一次多项式和二次多项式向量函数的导数计算,只需要理解齐次式的导数计算即可。

一次齐次式

y=Wx(xRn,yRm)yx=[y1x1y2x1ymx1y1x2y2x2ymx2y1xny2xnymxn]=W \begin{aligned} \mathbf{y} &= \mathbf{Wx} \quad (\mathbf{x} \in \mathbb{R}^n, \mathbf{y} \in \mathbb{R}^m) \\ \frac{\partial \mathbf{y}}{\partial \mathbf{x}} &= \begin{bmatrix} \frac{\partial y_1}{\partial x_1} & \frac{\partial y_2}{\partial x_1} & \cdots & \frac{\partial y_m}{\partial x_1} \\ \frac{\partial y_1}{\partial x_2} & \frac{\partial y_2}{\partial x_2} & \cdots & \frac{\partial y_m}{\partial x_2} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_1}{\partial x_n} & \frac{\partial y_2}{\partial x_n} & \cdots & \frac{\partial y_m}{\partial x_n} \end{bmatrix} \\ &= \mathbf{W}^{\top} \end{aligned}

注意到,f:RnRmf: \mathbb{R}^n \rightarrow \mathbb{R}^m 是一个将向量从 nn 维映射到 mm 维的向量函数。所以,这里的 WRm×n\mathbf{W} \in \mathbb{R}^{m \times n},恰好是其 Jacobian 矩阵的转置。

ℹ️

常用线性函数求导公式

Wxx=WWxW=x \begin{aligned} \frac{\partial \mathbf{Wx}}{\partial \mathbf{x}} &= \mathbf{W}^{\top} \\ \frac{\partial \mathbf{Wx}}{\partial \mathbf{W}} &= \mathbf{x}^{\top} \end{aligned}

二次齐次式(二次型)

y=xWx(xRn,yR)=[x1x2xn][w11w12w1nw21w22w2nwn1wn2wnn][x1x2xn]=i=1nj=1nwijxixjyx=[x1i=1nj=1nwijxixjx2i=1nj=1nwijxixjxni=1nj=1nwijxixj]=[x1[w11x12+(w12x1x2++w1nx1xn)+(w21x2x1++wn1xnx1)]x2[w22x22+(w21x2x1++w2nx2xn)+(w12x1x2++wn2xnx2)]xn[wnnxn2+(wn1xnx1++wn(n1)xnxn1)+(w1nx1xn++w(n1)nxn1xn)]]=[2w11x1+(w12x2++w1nxn)+(w21x2++wn1xn)2w22x2+(w21x1++w2nxn)+(w12x1++wn2xn)2wnnxn+(wn1x1++wn(n1)xn1)+(w1nx1++w(n1)nxn1)]=[i=1nwi1xii=1nwi2xii=1nwinxi]+[j=1nw1jxjj=1nw2jxjj=1nwnjxj]=[w11w21wn1w12w22wn2w1nw2nwnn][x1x2xn]+[w11w12w1nw21w22w2nwn1wn2wnn][x1x2xn]=(W+W)x \begin{aligned} y &= \mathbf{x}^{\top} \mathbf{W} \mathbf{x} \quad (\mathbf{x} \in \mathbb{R}^n, y \in \mathbb{R}) \\ &= \begin{bmatrix} x_1 & x_2 & \cdots & x_n \end{bmatrix} \begin{bmatrix} w_{11} & w_{12} & \cdots & w_{1n} \\ w_{21} & w_{22} & \cdots & w_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ w_{n1} & w_{n2} & \cdots & w_{nn} \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix} \\ &= \sum_{i=1}^n \sum_{j=1}^n w_{ij} x_i x_j \\ \frac{\partial y}{\partial \mathbf{x}} &= \begin{bmatrix} \frac{\partial}{\partial x_1} \sum_{i=1}^n \sum_{j=1}^n w_{ij} x_i x_j \\ \frac{\partial}{\partial x_2} \sum_{i=1}^n \sum_{j=1}^n w_{ij} x_i x_j \\ \vdots \\ \frac{\partial}{\partial x_n} \sum_{i=1}^n \sum_{j=1}^n w_{ij} x_i x_j \end{bmatrix} \\ &= \begin{bmatrix} \frac{\partial}{\partial x_1} [w_{11}x_1^2 + (w_{12}x_1x_2 + \cdots + w_{1n}x_1x_n) + (w_{21}x_2x_1 + \cdots + w_{n1}x_nx_1)] \\ \frac{\partial}{\partial x_2} [w_{22}x_2^2 + (w_{21}x_2x_1 + \cdots + w_{2n}x_2x_n) + (w_{12}x_1x_2 + \cdots + w_{n2}x_nx_2)] \\ \vdots \\ \frac{\partial}{\partial x_n} [w_{nn}x_n^2 + (w_{n1}x_nx_1 + \cdots + w_{n(n-1)}x_nx_{n-1}) + (w_{1n}x_1x_n + \cdots + w_{(n-1)n}x_{n-1}x_n)] \end{bmatrix} \\ &= \begin{bmatrix} 2w_{11}x_1 + (w_{12}x_2 + \cdots + w_{1n}x_n) + (w_{21}x_2 + \cdots + w_{n1}x_n) \\ 2w_{22}x_2 + (w_{21}x_1 + \cdots + w_{2n}x_n) + (w_{12}x_1 + \cdots + w_{n2}x_n) \\ \vdots \\ 2w_{nn}x_n + (w_{n1}x_1 + \cdots + w_{n(n-1)}x_{n-1}) + (w_{1n}x_1 + \cdots + w_{(n-1)n}x_{n-1}) \end{bmatrix} \\ &= \begin{bmatrix} \sum_{i=1}^{n} w_{i1} x_i \\ \sum_{i=1}^{n} w_{i2} x_i \\ \vdots \\ \sum_{i=1}^{n} w_{in} x_i \end{bmatrix} + \begin{bmatrix} \sum_{j=1}^{n} w_{1j} x_j \\ \sum_{j=1}^{n} w_{2j} x_j \\ \vdots \\ \sum_{j=1}^{n} w_{nj} x_j \end{bmatrix} \\ &= \begin{bmatrix} w_{11} & w_{21} & \cdots & w_{n1} \\ w_{12} & w_{22} & \cdots & w_{n2} \\ \vdots & \vdots & \ddots & \vdots \\ w_{1n} & w_{2n} & \cdots & w_{nn} \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix} + \begin{bmatrix} w_{11} & w_{12} & \cdots & w_{1n} \\ w_{21} & w_{22} & \cdots & w_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ w_{n1} & w_{n2} & \cdots & w_{nn} \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix} \\ &= (\mathbf{W}^{\top} + \mathbf{W}) \mathbf{x} \end{aligned}

常见神经网络层的导数计算

全连接层

一层全连接层的函数表达式为

y=Wx+b(xRn,yRm) \mathbf{y} = \mathbf{W} \mathbf{x} + \mathbf{b} \quad (\mathbf{x} \in \mathbb{R}^n, \mathbf{y} \in \mathbb{R}^m)

它是一个典型的一次多项式向量函数,其导数为

dydx=W \frac{\mathrm{d}\mathbf{y}}{\mathrm{d}\mathbf{x}} = \mathbf{W}^{\top}

一般地,全连接层的参数矩阵 W\mathbf{W} 是可学习的参数,需要通过梯度下降法来更新,就不可避免地需要对其求导数。显然

dydW=x \begin{aligned} \frac{\mathrm{d}\mathbf{y}}{\mathrm{d}\mathbf{W}} = \mathbf{x}^{\top} \end{aligned}

激活函数

以 ReLU 为例,其函数表达式为

ReLU(x)=max(0,x) \mathrm{ReLU}(x) = \max(0, x)

其导函数为

ddxReLU(x)={1x>00x0 \begin{aligned} \frac{\mathrm{d}}{\mathrm{d}x} \mathrm{ReLU}(x) &= \begin{cases} 1 & x > 0 \\ 0 & x \leqslant 0 \end{cases} \end{aligned}

对于一簇多元函数 y=ReLU(x)\mathbf{y} = \mathrm{ReLU} (\mathbf{x}),其 Jacobian 矩阵为

J(x)=diag(x>0) \begin{aligned} \mathbf{J}(\mathbf{x}) &= \mathrm{diag}(\mathbf{x} > \mathbf{0}) \end{aligned}

它是一个对角线上的元素可能为 0011,而其他元素均为 00 的矩阵。

ℹ️

对角矩阵

diag([x1x2xn])=[x1000x2000xn] \begin{aligned} \mathrm{diag}(\begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix}) = \begin{bmatrix} x_1 & 0 & \cdots & 0 \\ 0 & x_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & x_n \end{bmatrix} \end{aligned}

卷积层

待补充。

自注意力层

待补充。

归一化层

不论是 BatchNorm 还是 LayerNorm,其函数形式都相同,都是将任何特征分布转化为均值为 00,方差为 11 的特征分布。

y=xμσ2+εγ+β(xRn,yRn) \mathbf{y} = \frac{\mathbf{x} - \mathbf{\mu}}{\sqrt{\sigma^2 + \varepsilon}} \cdot \gamma + \mathbf{\beta} \quad (\mathbf{x} \in \mathbb{R}^n, \mathbf{y} \in \mathbb{R}^n)

其中,γ,βRn\gamma, \beta \in \mathbb{R}^n 是可学习的参数,都是

分子是用线性代数表示为

xμ=[100010001][x1x2xn][1ni=1nxi1ni=1nxi1ni=1nxi]=[100010001][x1x2xn]1n[111111111][x1x2xn]=Ix1n11x=(I1n11)x(1) \begin{aligned} \mathbf{x} - \mathbf{\mu} &= \begin{bmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix} - \begin{bmatrix} \frac{1}{n} \sum_{i=1}^{n} x_i \\ \frac{1}{n} \sum_{i=1}^{n} x_i \\ \vdots \\ \frac{1}{n} \sum_{i=1}^{n} x_i \end{bmatrix} \\ &= \begin{bmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix} - \frac{1}{n} \begin{bmatrix} 1 & 1 & \cdots & 1 \\ 1 & 1 & \cdots & 1 \\ \vdots & \vdots & \ddots & \vdots \\ 1 & 1 & \cdots & 1 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix} \\ &= \mathbf{I} \mathbf{x} - \frac{1}{n} \mathbf{1} \mathbf{1}^{\top} \mathbf{x} \\ &= \left(\mathbf{I} - \frac{1}{n} \mathbf{1} \mathbf{1}^{\top} \right) \mathbf{x} \tag{1} \end{aligned}

其中,I\mathbf{I} 是单位矩阵,1\mathbf{1} 是元素全为 11 的列向量。

分母的被开方数用线性代数表示为

σ2+ε=xμ22+ε=(xμ)(xμ)+ε=x(I1n11)(I1n11)x+ε=x(I1n11)(I1n11)x+ε=x(I2n11+1n21111)x+ε=x(I2n11+1n11)x+ε=x(I1n11)x+ε(2) \begin{aligned} \sigma^2 + \varepsilon &= \left\| \mathbf{x} - \mathbf{\mu} \right\|_{2}^{2} + \varepsilon \\ &= (\mathbf{x} - \mathbf{\mu})^{\top} (\mathbf{x} - \mathbf{\mu}) + \varepsilon \\ &= \mathbf{x}^{\top} \left(\mathbf{I} - \frac{1}{n} \mathbf{1} \mathbf{1}^{\top} \right)^{\top} \left(\mathbf{I} - \frac{1}{n} \mathbf{1} \mathbf{1}^{\top} \right) \mathbf{x} + \varepsilon \\ &= \mathbf{x}^{\top} \left(\mathbf{I} - \frac{1}{n} \mathbf{1} \mathbf{1}^{\top} \right) \left(\mathbf{I} - \frac{1}{n} \mathbf{1} \mathbf{1}^{\top} \right) \mathbf{x} + \varepsilon \\ &= \mathbf{x}^{\top} \left(\mathbf{I} - \frac{2}{n} \mathbf{1} \mathbf{1}^{\top} + \frac{1}{n^2} \mathbf{1} \mathbf{1}^{\top} \mathbf{1} \mathbf{1}^{\top} \right) \mathbf{x} + \varepsilon \\ &= \mathbf{x}^{\top} \left(\mathbf{I} - \frac{2}{n} \mathbf{1} \mathbf{1}^{\top} + \frac{1}{n} \mathbf{1} \mathbf{1}^{\top} \right) \mathbf{x} + \varepsilon \\ &= \mathbf{x}^{\top} \left(\mathbf{I} - \frac{1}{n} \mathbf{1} \mathbf{1}^{\top} \right) \mathbf{x} + \varepsilon \tag{2} \end{aligned}

其结果其实是一个标量。

(1),(2)(1), (2) 两式的结果可知,原函数解析式可化为

y=I1n11×xxx+εγ+β \begin{aligned} \mathbf{y} &= \sqrt{\mathbf{I} - \frac{1}{n} \mathbf{1} \mathbf{1}^{\top}} \times \frac{\mathbf{x}}{\sqrt{\mathbf{x}^{\top} \mathbf{x} + \varepsilon}} \cdot \gamma + \beta \end{aligned}

因此,其 Jacobian 矩阵为

J(x)=I1n11×[Ixx+ε(xx+εxxx+ε)]×diag(γ)=I1n11×(xx+ε)1x(xx+ε)32×diag(γ) \begin{aligned} \mathbf{J}(\mathbf{x}) &= \sqrt{\mathbf{I} - \frac{1}{n} \mathbf{1} \mathbf{1}^{\top}} \times \left[ \frac{\mathbf{I}}{\mathbf{x}^{\top} \mathbf{x} + \varepsilon} \left( \sqrt{\mathbf{x}^{\top} \mathbf{x} + \varepsilon} - \frac{\mathbf{x}}{\sqrt{\mathbf{x}^{\top} \mathbf{x} + \varepsilon}} \right) \right] \times \mathrm{diag}(\gamma) \\ &= \sqrt{\mathbf{I} - \frac{1}{n} \mathbf{1} \mathbf{1}^{\top}} \times \frac{(\mathbf{x}^{\top} \mathbf{x} + \varepsilon) \mathbf{1} - \mathbf{x}}{(\mathbf{x}^{\top} \mathbf{x} + \varepsilon)^{\frac{3}{2}}} \times \mathrm{diag}(\gamma) \end{aligned}

深度神经网络的导数计算

我们以 Feed Forward 网络为例,其网络结构为

Feed Forward Network

用解析式表示就是

{ g=Winx+bin h=ReLU(g) y=Wouth+bout \left\{ \begin{aligned} & \ \mathbf{g} = \mathbf{W_{in}} \mathbf{x} + \mathbf{b_{in}} \\ & \ \mathbf{h} = \mathrm{ReLU} (\mathbf{g}) \\ & \ \mathbf{y} = \mathbf{W_{out}} \mathbf{h} + \mathbf{b_{out}} \end{aligned} \right.

反向传播算法是从后向前计算导数的。我们可以很容易算出 y\mathbf{y} 对参数矩阵 Wout\mathbf{W_{out}} 的导数为

dydWout=h \begin{aligned} \frac{\mathrm{d} \mathbf{y}}{\mathrm{d} \mathbf{W_{out}}} &= \mathbf{h} \end{aligned}

在 DNN 训练过程中,中间状态是需要存储在显存中的。可以认为,这里的 x,h,g,y\mathbf{x}, \mathbf{h}, \mathbf{g}, \mathbf{y} 都是已知的。参数矩阵从后向前通过梯度下降算法进行更新,即先更新 Wout,bout\mathbf{W_{out}}, \mathbf{b_{out}},再更新 Win,bin\mathbf{W_{in}}, \mathbf{b_{in}}

现在计算 y\mathbf{y} 对参数矩阵 Win\mathbf{W_{in}} 的导数。由求导链式法则的分母表达式,有

dydWin=dgdWin×dhdg×dydh=x×diag(g>0)×Wout \begin{aligned} \frac{\mathrm{d} \mathbf{y}}{\mathrm{d} \mathbf{W_{in}}} &= \frac{\mathrm{d} \mathbf{g}}{\mathrm{d} \mathbf{W_{in}}} \times \frac{\mathrm{d} \mathbf{h}}{\mathrm{d} \mathbf{g}} \times \frac{\mathrm{d} \mathbf{y}}{\mathrm{d} \mathbf{h}} \\ &= \mathbf{x} \times \mathrm{diag}(\mathbf{g} > 0) \times \mathbf{W_{out}} \end{aligned}

对偏置 bin,bout\mathbf{b_{in}}, \mathbf{b_{out}} 的求导是类似的,本文不再赘述。

小结

深度学习中的矩阵求导,主要是利用导数的链式法则,让输出对深度神经网络中的参数矩阵进行求导。在求导过程中,主要涉及两种情况:一是直接对参数矩阵求导,二是对输入中间状态进行求导。采用分母表达式进行求导,可以按照神经网络的顺序进行,较为方便和直观。