982 个字词
5 分钟
矩阵向量的梯度
首次发布: 2025-07-20
... 次访问

这里介绍求解矩阵或者向量梯度的一个便捷方法。

符号定义#

为了方便讨论,我们统一采用梯度张量的形式,而不是Jacobian 矩阵的形式,特此说明。

例如,设有函数 y=J(x)\mathbf{y} = \mathbf{J}(\mathbf{x}),其中 yRm×1\mathbf{y} \in \mathbb{R}^{m\times 1}xRn×1\mathbf{x}\in \mathbb{R}^{n\times 1},则其梯度张量定义为:

xy=yx=[y1x1y2x1ymx1y1x2y2x2ymx2y1xny2xnymxn]Rn×m\nabla_\mathbf{x} \mathbf{y} = \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} \\[6pt] \frac{\partial y_1}{\partial x_2} & \frac{\partial y_2}{\partial x_2} & \cdots & \frac{\partial y_m}{\partial x_2} \\[6pt] \vdots & \vdots & \ddots & \vdots \\[6pt] \frac{\partial y_1}{\partial x_n} & \frac{\partial y_2}{\partial x_n} & \cdots & \frac{\partial y_m}{\partial x_n} \end{bmatrix} \in \mathbb{R}^{n \times m}

这个形状的设定是基于对微分的考量, dy=(yx)dxd\mathbf{y} = (\frac{\partial \mathbf{y}}{\partial \mathbf{x}})^\top d\mathbf{x},这个形式更符合矩阵向量的点乘形式,因此梯度张量的形状是 n×mn\times m 才能正好符合这个微分公式。

链式法则#

基于上述梯度张量的定义,我们可以使用链式法则来求解复合函数的梯度。

例如,对于复合函数 y=f(w),w=g(z),z=h(x)\mathbf{y} = \mathbf{f}(\mathbf{w}), \mathbf{w} = \mathbf{g}(\mathbf{z}), \mathbf{z} = \mathbf{h}(\mathbf{x}),有

xy=xz zw wy\nabla_\mathbf{x} \mathbf{y} = \nabla_\mathbf{x} \mathbf{z}\ \nabla_\mathbf{z} \mathbf{w}\ \nabla_\mathbf{w} \mathbf{y}

或者换成”偏导”符号的写法为

yx=zxwzyw\frac{\partial \mathbf{y}}{\partial \mathbf{x}} = \frac{\partial \mathbf{z}}{\partial \mathbf{x}} \frac{\partial \mathbf{w}}{\partial \mathbf{z}} \frac{\partial \mathbf{y}}{\partial \mathbf{w}}

注意,最内层函数的局部梯度要写在最左边。不妨拿个例子验证一下,设 yR2×1\mathbf{y} \in \mathbb{R}^{2\times 1}wR3×1\mathbf{w} \in \mathbb{R}^{3\times 1}zR4×1\mathbf{z} \in \mathbb{R}^{4\times 1}xR5×1\mathbf{x} \in \mathbb{R}^{5\times 1},则

zxR5×4,wzR4×3,ywR3×2\frac{\partial \mathbf{z}}{\partial \mathbf{x}} \in \mathbb{R}^{5\times 4},\quad \frac{\partial \mathbf{w}}{\partial \mathbf{z}} \in \mathbb{R}^{4\times 3},\quad \frac{\partial \mathbf{y}}{\partial \mathbf{w}} \in \mathbb{R}^{3\times 2}

由此 yxR5×2\frac{\partial \mathbf{y}}{\partial \mathbf{x}} \in \mathbb{R}^{5\times 2},符合我们对梯度张量的定义。

如何求矩阵向量梯度张量#

虽然通常的矩阵分析书中都给出了常见的矩阵向量梯度张量的公式,但是对于复杂的函数,直接采用向量形式推导并不是一个好方法,通常会由于不清楚某个向量的导数公式而导致无从下手。因此这里更推荐的方法是,大不了就变成标量形式的导数 yjxi\frac{\partial \mathbf{y}_j}{\partial \mathbf{x}_i},然后根据具体的形状重新排列即可

例如,给定函数

J(θ)=1N[ylogs+(1y)log(1s)]J(\theta) = -\frac{1}{N}\left[y^\top \log s + (1 - y)^\top \log (1 - s)\right]

其中 s,yRN×1,J(θ)Rs, y \in \mathbb{R}^{N \times 1}, J(\theta) \in \mathbb{R}log()\log(\cdot) 是逐元素的对数函数, NN 为标量常数。

我们可以先计算每个元素的导数

Jsi=si[1Ni=1N(yilogsi+(1yi)log(1si))]=1N[yisi1yi1si]=1Nsiyisi(1si)\begin{aligned} \frac{\partial J}{\partial s_i} &= \frac{\partial}{\partial s_i} \left[-\frac{1}{N} \sum_{i=1}^{N} \left(y_i \log s_i + (1 - y_i) \log (1 - s_i)\right)\right] \\ &= -\frac{1}{N} \left[\frac{y_i}{s_i} - \frac{1 - y_i}{1 - s_i}\right] \\ &= \frac{1}{N} \frac{s_i - y_i}{s_i(1 - s_i)} \end{aligned}

然后将其整理成梯度张量的形式。注意到标量导数中并没有涉及到其他下标元素的值,所以这里的运算可以统统用逐元素计算表示

sJ=1Nsys(1s)\nabla_s J = \frac{1}{N} \frac{s - y}{s \odot (1 - s)}

其中 \odot 表示逐元素乘法, 除法也是逐元素的。

例子:Logistic 回归的梯度#

h(x)=σ(θx),x,θRd×1h(x) = \sigma(\theta^\top x), \quad x, \theta \in \mathbb{R}^{d \times 1},假设有数据集 XRN×d,yRN×1X \in \mathbb{R}^{N\times d}, y \in \mathbb{R}^{N \times 1},则交叉熵损失为

J(θ)=1Ni=1N[yilogh(xi)+(1yi)log(1h(xi))]=1N[ylogh(X)+(1y)log(1h(X))]\begin{aligned} J(\theta) &= -\frac{1}{N} \sum_{i=1}^{N} \left[y_i \log h(x_i) + (1 - y_i) \log (1 - h(x_i))\right] \\ &= -\frac{1}{N} \left[y^\top \log h(X) + (1 - y)^\top \log (1 - h(X))\right] \\ \end{aligned}

我们可以先计算每个元素的导数

Jθk=θk[1Ni=1N[yilogh(xi)+(1yi)log(1h(xi))]]=1Ni=1N[yi1h(xi)h(xi)θk(1yi)11h(xi)h(xi)θk]=1Ni=1N[yi1h(xi)h(xi)(1h(xi))xik(1yi)11h(xi)h(xi)(1h(xi))xik]=1Ni=1N[yi(1h(xi))xik(1yi)h(xi)xik]=1Ni=1N[(yih(xi))xik]\begin{align*} \frac{\partial J}{\partial \theta_k} &= \frac{\partial}{\partial \theta_k} \left[-\frac{1}{N} \sum_{i=1}^{N} \left[y_i \log h(x_i) + (1 - y_i) \log (1 - h(x_i))\right]\right] \\ &= -\frac{1}{N} \sum_{i=1}^{N} \left[y_i \frac{1}{h(x_i)} \frac{\partial h(x_i)}{\partial \theta_k} - (1 - y_i) \frac{1}{1 - h(x_i)} \frac{\partial h(x_i)}{\partial \theta_k}\right] \\ &= -\frac{1}{N} \sum_{i=1}^{N} \left[y_i \frac{1}{h(x_i)} h(x_i)(1 - h(x_i)) x_{ik} - (1 - y_i) \frac{1}{1 - h(x_i)} h(x_i)(1 - h(x_i)) x_{ik}\right] \\ &= -\frac{1}{N} \sum_{i=1}^{N} \left[y_i (1 - h(x_i)) x_{ik} - (1 - y_i) h(x_i) x_{ik}\right] \\ &= -\frac{1}{N} \sum_{i=1}^{N} \left[(y_i - h(x_i)) x_{ik}\right] \\ \end{align*}

其中 xi=(X[i,:])x_i = (X[i, :])^\top 是第 ii 个样本的特征向量,xik=X[i,k]x_{ik} = X[i, k] 是第 ii 个样本的第 kk 个特征。

然后将其整理成梯度张量的形式,得到

θJ=1Ni=1N(yih(xi))[xi1xi2xid]=1Ni=1N(yih(xi))(X[i,:])=1NX(yh(X))=1NX(yσ(Xθ))\begin{aligned} \nabla_\theta J &= -\frac{1}{N} \sum_{i=1}^{N} (y_i - h(x_i)) \begin{bmatrix} x_{i1} \\ x_{i2} \\ \vdots \\ x_{id}\end{bmatrix} \\ &= -\frac{1}{N} \sum_{i=1}^{N} (y_i - h(x_i)) (X[i, :])^\top \\ &= -\frac{1}{N} X^\top (y - h(X)) \\ &= -\frac{1}{N} X^\top \left(y - \sigma(X\theta)\right) \end{aligned}

当然,这个结果也可以直接使用链式法则来推导得到,此处不赘述。

矩阵向量的梯度
https://adalovelemon.github.io/blog/posts/content/coursenotes/mathslab/matgrad/
Author
Ada Lovelemon
Published at
2025-07-20

留言板