矩阵微积分:Jacobian 与链式法则

分类: 神经网络基础 · 难度: 进阶 · 关联讲座: L03

矩阵微积分:Jacobian 与链式法则

矩阵微积分是理解反向传播的数学基础。当我们从标量求导过渡到向量/矩阵求导时,核心工具是 Jacobian 矩阵——它把”函数在某点的斜率”这一概念从一维推广到多维。本文从 Jacobian 的定义出发,逐步推导线性变换、逐元素非线性和复合函数的梯度规则,并通过完整数值示例验证每一步的形状匹配。

📐 矩阵微积分:Jacobian、链式法则与完整推导

变量定义

  • f:RnRmf: \mathbb{R}^n \to \mathbb{R}^m,Jacobian fxRm×n\frac{\partial f}{\partial x} \in \mathbb{R}^{m \times n}(第 iijj 列为 fixj\frac{\partial f_i}{\partial x_j}
  • WRm×nW \in \mathbb{R}^{m \times n}xRnx \in \mathbb{R}^nuRmu \in \mathbb{R}^mff 为逐元素激活函数,sRs \in \mathbb{R}(标量)
  • h=f(Wx)h = f(Wx)s=uThs = u^T h

规则 1:线性变换的 Jacobianf(x)=Wx+bf(x) = Wx + bf:RnRmf: \mathbb{R}^n \to \mathbb{R}^m

ii 个输出分量:fi=j=1nWijxj+bif_i = \sum_{j=1}^n W_{ij} x_j + b_i

xkx_k 求偏导:fixk=Wik\frac{\partial f_i}{\partial x_k} = W_{ik}

因此 Jacobian 的 (i,k)(i, k) 元素恰好是 WikW_{ik},即: (Wx+b)x=WRm×n\frac{\partial (Wx + b)}{\partial x} = W \in \mathbb{R}^{m \times n}


规则 2:逐元素非线性的 Jacobianh=f(z)h = f(z)f:RmRmf: \mathbb{R}^m \to \mathbb{R}^m(逐元素)

因为 hi=f(zi)h_i = f(z_i) 只依赖 ziz_i(不依赖其他 zjz_j),所以: hizj={f(zi)i=j0ij\frac{\partial h_i}{\partial z_j} = \begin{cases} f'(z_i) & i = j \\ 0 & i \ne j \end{cases}

Jacobian 是对角矩阵hz=diag(f(z))=[f(z1)f(zm)]Rm×m\frac{\partial h}{\partial z} = \text{diag}(f'(z)) = \begin{bmatrix} f'(z_1) & & \\ & \ddots & \\ & & f'(z_m) \end{bmatrix} \in \mathbb{R}^{m \times m}


规则 3:标量对向量的梯度s=uThs = u^T hs:RmRs: \mathbb{R}^m \to \mathbb{R}

s=iuihis = \sum_i u_i h_i,故 shi=ui\frac{\partial s}{\partial h_i} = u_i,即: sh=uTR1×m(行向量,Jacobian 形式)\frac{\partial s}{\partial h} = u^T \in \mathbb{R}^{1 \times m} \quad \text{(行向量,Jacobian 形式)}


链式法则:完整推导 sx\frac{\partial s}{\partial x}(其中 z=Wxz = Wxh=f(z)h = f(z)s=uThs = u^T h

按链式法则: sx=sh1×mhzm×mzxm×n=uTdiag(f(z))WR1×n\frac{\partial s}{\partial x} = \underbrace{\frac{\partial s}{\partial h}}_{1 \times m} \cdot \underbrace{\frac{\partial h}{\partial z}}_{m \times m} \cdot \underbrace{\frac{\partial z}{\partial x}}_{m \times n} = u^T \cdot \text{diag}(f'(z)) \cdot W \in \mathbb{R}^{1 \times n}

形状检查(1×m)(m×m)(m×n)=(1×n)(1 \times m) \cdot (m \times m) \cdot (m \times n) = (1 \times n)

转置变为列向量(形状约定:梯度与参数同形): xs=WTdiag(f(z))uRn\nabla_x s = W^T \cdot \text{diag}(f'(z)) \cdot u \in \mathbb{R}^n

形状检查(n×m)(m×m)(m)=(n)(n \times m) \cdot (m \times m) \cdot (m) = (n)

🔢 数值计算示例

设定

W=[1234]R2×2,x=[0.50.5],u=[11],f=tanhW = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} \in \mathbb{R}^{2 \times 2}, \quad x = \begin{bmatrix} 0.5 \\ 0.5 \end{bmatrix}, \quad u = \begin{bmatrix} 1 \\ -1 \end{bmatrix}, \quad f = \tanh

前向计算

  1. z=Wx=[1(0.5)+2(0.5)3(0.5)+4(0.5)]=[1.53.5]z = Wx = \begin{bmatrix} 1(0.5)+2(0.5) \\ 3(0.5)+4(0.5) \end{bmatrix} = \begin{bmatrix} 1.5 \\ 3.5 \end{bmatrix}

  2. h=tanh(z)=[tanh(1.5)tanh(3.5)][0.9050.998]h = \tanh(z) = \begin{bmatrix} \tanh(1.5) \\ \tanh(3.5) \end{bmatrix} \approx \begin{bmatrix} 0.905 \\ 0.998 \end{bmatrix}

  3. s=uTh=1(0.905)+(1)(0.998)=0.093s = u^T h = 1(0.905) + (-1)(0.998) = -0.093

反向计算 xs\nabla_x s

  1. f(z)=1tanh2(z)f'(z) = 1 - \tanh^2(z),计算对角矩阵: diag(f(z))=[10.90520010.9982][0.181000.004]\text{diag}(f'(z)) = \begin{bmatrix} 1 - 0.905^2 & 0 \\ 0 & 1 - 0.998^2 \end{bmatrix} \approx \begin{bmatrix} 0.181 & 0 \\ 0 & 0.004 \end{bmatrix}

  2. 链式法则(右到左): δ=diag(f(z))u=[0.1810.004][11]=[0.1810.004]\delta = \text{diag}(f'(z)) \cdot u = \begin{bmatrix} 0.181 \\ 0.004 \end{bmatrix} \odot \begin{bmatrix} 1 \\ -1 \end{bmatrix} = \begin{bmatrix} 0.181 \\ -0.004 \end{bmatrix}

  3. xs=WTδ=[1324][0.1810.004]=[0.1810.0120.3620.016][0.1690.346]\nabla_x s = W^T \delta = \begin{bmatrix} 1 & 3 \\ 2 & 4 \end{bmatrix} \begin{bmatrix} 0.181 \\ -0.004 \end{bmatrix} = \begin{bmatrix} 0.181 - 0.012 \\ 0.362 - 0.016 \end{bmatrix} \approx \begin{bmatrix} 0.169 \\ 0.346 \end{bmatrix}

验证形状xsR2\nabla_x s \in \mathbb{R}^2,与 xR2x \in \mathbb{R}^2 同形 ✓

💡 为什么链式法则可以矩阵形式表达?

链式法则的本质是”复合函数的局部斜率相乘”。在标量情形:dsdx=dsdhdhdzdzdx\frac{ds}{dx} = \frac{ds}{dh} \cdot \frac{dh}{dz} \cdot \frac{dz}{dx}

向量化后,每个”斜率”变成 Jacobian 矩阵,乘法变成矩阵乘法。关键洞察:只要形状能对上(矩阵乘法的维度匹配),推导就一定正确

不需要死记公式,只要记住:每个节点贡献一个 Jacobian,从右到左(从输出到输入)连乘

⚠️ 常见误区

  1. 转置陷阱(Wx)x=W\frac{\partial (Wx)}{\partial x} = W(Jacobian 形式),但梯度(列向量)是 WTδW^T \delta。两者不矛盾:Jacobian 是 WW,但把梯度从 hh 空间”拉回”到 xx 空间时需要 WTW^T(正向是 WWRn\mathbb{R}^n 映射到 Rm\mathbb{R}^m,反向自然是 WTW^TRm\mathbb{R}^m 映射回 Rn\mathbb{R}^n)。
  2. 形状混淆sh\frac{\partial s}{\partial h}ss 是标量,hh 是向量)得到行向量 uTu^T(Jacobian 约定),不是列向量。如果你用”梯度形状与参数相同”约定,则写 uu(列向量)——同一个东西,两种写法,不要混用。
  3. 不要记公式,记形状推导:写出左手边的形状,确保右手边矩阵乘法能得到相同形状,这是最可靠的检验。如 xsRn\nabla_x s \in \mathbb{R}^n,右边 (n×m)(m)=(n)(n \times m) \cdot (m) = (n) 才对。