本文根据合集·深度学习中的数学by齐宪标系列视频整理。
在本文中,用小写字母表示标量,用粗体小写字母表示向量,用粗体大写字母表示矩阵。
导数的定义
在高等数学和数学分析的课程中,我们知道一元函数 y=f(x) 的导数定义为
dxdy=h→0limhf(x+h)−f(x)而对于多元函数,则会引入方向导数和梯度的概念。
梯度与方向导数
给定一个多元函数
y=f(x)=f(x1,x2,…,xn)(x∈Rn)其梯度为 ∇f(x) 定义为
∇f(x)=∂x1y∂x2y⋮∂xny简单来说,梯度即为以单位正交向量为基底,y 对 x 各分量的导数的线性组合。对于多元函数而言,其梯度是一个和 x 同样维度的向量。
而方向导数是指函数在某一点处,在某一给定方向上的变化率,是一个标量。它定义为
Dvf(x)=∇f(x)⊤⋅vJacobian 矩阵
对于一簇多元函数(也称为向量函数,即定义域和值域都是向量的集合的函数)
y=f(x)=f1(x)f2(x)⋮fm(x)(x∈Rn,y∈Rm)其各个函数的梯度组合成一个矩阵,称为 Jacobian 矩阵,记为 J(x)。它定义为
J(x)=∂x1∂y1∂x1∂y2⋮∂x1∂ym∂x2∂y1∂x2∂y2⋮∂x2∂ym⋯⋯⋱⋯∂xn∂y1∂xn∂y2⋮∂xn∂ym=[∇f1(x)∇f2(x)⋯∇fm(x)]⊤是一个 m×n 的矩阵,其中 m 是输出的维度,n 是输入的维度。
注意
Jacobian 矩阵的维度是 m×n,而不是 n×m。这意味着,Jacobian 矩阵不能用来直接表示向量函数的导数和梯度——Jacobian 矩阵的转置才能表示向量函数的导数和梯度。
实际上,向量函数的求导运算是一种从函数到函数的映射。用形式化的语言表达就是
∇:Rn→Rm⟶Rn→Rn×m
Hessian 矩阵
给定一个多元函数
y=f(x)=f(x1,x2,…,xn)(x∈Rn)其 Hessian 矩阵定义为
H(x)=∇2f(x)=∂x∂(∂x∂y)=∂x12∂2y∂x2∂x1∂2y⋮∂xn∂x1∂2y∂x1∂x2∂2y∂x22∂2y⋮∂xn∂x2∂2y⋯⋯⋱⋯∂x1∂xn∂2y∂x2∂xn∂2y⋮∂xn2∂2y导数的链式求导法则
对于复合函数
f(x)=fn∘fn−1∘⋯∘f2∘f1(x)=fn(fn−1(⋯f2(f1(x))))其链式求导法则为
dxdf(x)=dfn(x)df(x)⋅dfn−1(x)dfn(x)⋯df1(x)df2(x)⋅dxdf1(x)不过,如果自变量是一个向量或者矩阵,那么由于矩阵乘法不满足交换律,于是就存在分母表达式和分子表达式两种形式。
分母表达式和分子表达式
这里的分子和分母指的是原微商式中的分子和分母,即 df(x) 和 dx。顾名思义,分母/分子表达式的含义就是先求含分母/分子的那一项,即
dxdf(x)=dfn(x)df(x)⋅dfn−1(x)dfn(x)⋯df1(x)df2(x)=dxdf1(x)⋅df1(x)df2(x)⋯dfn−1(x)dfn(x)其中,(1) 式是分子表达式,(2) 是分母表达式。由此可见,分子表达式是先求外层函数,然后逐层深入求导;分母表达式是先求内层函数,然后逐层向外求导。
在深度学习中,为了方便,一般采用分母表达式来表示导数。稍后我们就会看到这种表达方式的方便之处。
多项式向量函数的导数
多项式向量函数是指,每个因变量 y1,y2,⋯,ym 都是关于自变量 x1,x2,⋯,xn 和常数的线性函数的函数。本小节主要讨论一次多项式和二次多项式向量函数的导数计算,只需要理解齐次式的导数计算即可。
一次齐次式
y∂x∂y=Wx(x∈Rn,y∈Rm)=∂x1∂y1∂x2∂y1⋮∂xn∂y1∂x1∂y2∂x2∂y2⋮∂xn∂y2⋯⋯⋱⋯∂x1∂ym∂x2∂ym⋮∂xn∂ym=W⊤注意到,f:Rn→Rm 是一个将向量从 n 维映射到 m 维的向量函数。所以,这里的 W∈Rm×n,恰好是其 Jacobian 矩阵的转置。
常用线性函数求导公式
∂x∂Wx∂W∂Wx=W⊤=x⊤
二次齐次式(二次型)
y∂x∂y=x⊤Wx(x∈Rn,y∈R)=[x1x2⋯xn]w11w21⋮wn1w12w22⋮wn2⋯⋯⋱⋯w1nw2n⋮wnnx1x2⋮xn=i=1∑nj=1∑nwijxixj=∂x1∂∑i=1n∑j=1nwijxixj∂x2∂∑i=1n∑j=1nwijxixj⋮∂xn∂∑i=1n∑j=1nwijxixj=∂x1∂[w11x12+(w12x1x2+⋯+w1nx1xn)+(w21x2x1+⋯+wn1xnx1)]∂x2∂[w22x22+(w21x2x1+⋯+w2nx2xn)+(w12x1x2+⋯+wn2xnx2)]⋮∂xn∂[wnnxn2+(wn1xnx1+⋯+wn(n−1)xnxn−1)+(w1nx1xn+⋯+w(n−1)nxn−1xn)]=2w11x1+(w12x2+⋯+w1nxn)+(w21x2+⋯+wn1xn)2w22x2+(w21x1+⋯+w2nxn)+(w12x1+⋯+wn2xn)⋮2wnnxn+(wn1x1+⋯+wn(n−1)xn−1)+(w1nx1+⋯+w(n−1)nxn−1)=∑i=1nwi1xi∑i=1nwi2xi⋮∑i=1nwinxi+∑j=1nw1jxj∑j=1nw2jxj⋮∑j=1nwnjxj=w11w12⋮w1nw21w22⋮w2n⋯⋯⋱⋯wn1wn2⋮wnnx1x2⋮xn+w11w21⋮wn1w12w22⋮wn2⋯⋯⋱⋯w1nw2n⋮wnnx1x2⋮xn=(W⊤+W)x常见神经网络层的导数计算
全连接层
一层全连接层的函数表达式为
y=Wx+b(x∈Rn,y∈Rm)它是一个典型的一次多项式向量函数,其导数为
dxdy=W⊤一般地,全连接层的参数矩阵 W 是可学习的参数,需要通过梯度下降法来更新,就不可避免地需要对其求导数。显然
dWdy=x⊤激活函数
以 ReLU 为例,其函数表达式为
ReLU(x)=max(0,x)其导函数为
dxdReLU(x)={10x>0x⩽0对于一簇多元函数 y=ReLU(x),其 Jacobian 矩阵为
J(x)=diag(x>0)它是一个对角线上的元素可能为 0 或 1,而其他元素均为 0 的矩阵。
对角矩阵
diag(x1x2⋮xn)=x10⋮00x2⋮0⋯⋯⋱⋯00⋮xn
卷积层
待补充。
自注意力层
待补充。
归一化层
不论是 BatchNorm 还是 LayerNorm,其函数形式都相同,都是将任何特征分布转化为均值为 0,方差为 1 的特征分布。
y=σ2+εx−μ⋅γ+β(x∈Rn,y∈Rn)其中,γ,β∈Rn 是可学习的参数,都是
分子是用线性代数表示为
x−μ=10⋮001⋮0⋯⋯⋱⋯00⋮1x1x2⋮xn−n1∑i=1nxin1∑i=1nxi⋮n1∑i=1nxi=10⋮001⋮0⋯⋯⋱⋯00⋮1x1x2⋮xn−n111⋮111⋮1⋯⋯⋱⋯11⋮1x1x2⋮xn=Ix−n111⊤x=(I−n111⊤)x(1)其中,I 是单位矩阵,1 是元素全为 1 的列向量。
分母的被开方数用线性代数表示为
σ2+ε=∥x−μ∥22+ε=(x−μ)⊤(x−μ)+ε=x⊤(I−n111⊤)⊤(I−n111⊤)x+ε=x⊤(I−n111⊤)(I−n111⊤)x+ε=x⊤(I−n211⊤+n2111⊤11⊤)x+ε=x⊤(I−n211⊤+n111⊤)x+ε=x⊤(I−n111⊤)x+ε(2)其结果其实是一个标量。
由 (1),(2) 两式的结果可知,原函数解析式可化为
y=I−n111⊤×x⊤x+εx⋅γ+β因此,其 Jacobian 矩阵为
J(x)=I−n111⊤×[x⊤x+εI(x⊤x+ε−x⊤x+εx)]×diag(γ)=I−n111⊤×(x⊤x+ε)23(x⊤x+ε)1−x×diag(γ)深度神经网络的导数计算
我们以 Feed Forward 网络为例,其网络结构为
Feed Forward Network
用解析式表示就是
⎩⎨⎧ g=Winx+bin h=ReLU(g) y=Wouth+bout反向传播算法是从后向前计算导数的。我们可以很容易算出 y 对参数矩阵 Wout 的导数为
dWoutdy=h在 DNN 训练过程中,中间状态是需要存储在显存中的。可以认为,这里的 x,h,g,y 都是已知的。参数矩阵从后向前通过梯度下降算法进行更新,即先更新 Wout,bout,再更新 Win,bin。
现在计算 y 对参数矩阵 Win 的导数。由求导链式法则的分母表达式,有
dWindy=dWindg×dgdh×dhdy=x×diag(g>0)×Wout对偏置 bin,bout 的求导是类似的,本文不再赘述。
小结
深度学习中的矩阵求导,主要是利用导数的链式法则,让输出对深度神经网络中的参数矩阵进行求导。在求导过程中,主要涉及两种情况:一是直接对参数矩阵求导,二是对输入中间状态进行求导。采用分母表达式进行求导,可以按照神经网络的顺序进行,较为方便和直观。