计算矩阵函数的导数(以 Word2vec 为例)

定义

向量函数是指输入和输出都是向量的函数。向量函数 y=f(x)\mathbf{y} = f(\mathbf{x}) 的导数是著名的雅可比矩阵:

∂y∂x=(∂y1∂x1⋯∂y1∂xn⋮⋱⋮∂ym∂x1⋯∂ym∂xn)\frac{\partial \mathbf{y}}{\partial \mathbf{x}} = \begin{pmatrix} \frac{\partial y_1}{\partial x_{1}} & \cdots & \frac{\partial y_1}{\partial x_n} \\[0.3em] \vdots & \ddots & \vdots \\[0.3em] \frac{\partial y_m}{\partial x_{1}} & \cdots & \frac{\partial y_m}{\partial x_n} \end{pmatrix}

根据定义,y\mathbf{y} 的微小变动等于导数乘 x\mathbf{x} 的微小变动, 此时的乘法是矩阵乘法。

Δy[m×1]=∂y∂x[m×n]⋅Δx[n×1]\underset{[m\times 1]}{\Delta \mathbf{y}} = \underset{[m\times n]}{\frac{\partial \mathbf{y}}{\partial \mathbf{x}}}\cdot\underset{[n\times 1]}{\Delta \mathbf{x}}

矩阵函数是指输入和输出都是矩阵的函数, 矩阵函数 Y=f(X)Y = f(X) 的导数仍然要满足 ΔY=∂Y∂X⋅ΔX\Delta Y= \frac{\partial Y}{\partial X} \cdot\Delta X。 此时,ΔY\Delta Y 是与 YY 大小相同的矩阵,ΔX\Delta X 是与 XX 大小相同的矩阵。那么 ∂Y∂X\frac{\partial Y}{\partial X} 应该是一个张量, 此时的乘法是张量点乘。 假设 YY 的大小是 [M×N][M \times N],XX 的大小是 [I×J][I \times J], 那么这个(广义)雅可比张量的大小是 [M×N×I×J][M \times N \times I \times J]。

很直观地,这个四维张量的每一个元素都对应了一个 YY 中的元素对一个 XX 中的元素的偏导。

(∂Y∂X)m,n,i,j=∂Ym,n∂Xi,j\left( \frac{\partial Y}{\partial X} \right)_{m, n, i, j} = \frac{\partial Y_{m, n}}{\partial X_{i, j}}

在反向传播(Back Propagation)中的应用

神经网络中使用到的矩阵函数几乎都是简单的线性变换,即 Y=wXY=wX。 反向传播时通常也并不需要计算出雅可比张量,而是要把它应用在链式法则中, 与其他的偏导数相乘。比如神经网络最终的损失函数是 LL,更新 XX 时, 只需要知道 ∂L∂X\frac{\partial L}{\partial X}, 也就是 ∂L∂Y∂Y∂X\frac{\partial L}{\partial Y} \frac{\partial Y}{\partial X} 即可。 假如 ∂L∂Y\frac{\partial L}{\partial Y} 已知,那么此时这个乘积其实可以直接用 wT∂L∂Yw^T \frac{\partial L}{\partial Y} 计算。 假设 YY 的大小为 [H×J][H \times J],ww 的大小为 [H×I][H \times I],XX 的大小为 [I×J][I \times J],证明如下:

首先损失函数 LL 是一个标量, 所以 ∂L∂Y\frac{\partial L}{\partial Y} 是一个大小为 [1×(H×J)][1 \times (H \times J)] 的张量, ∂L∂X\frac{\partial L}{\partial X} 是一个大小为 [1×(I×J)][1 \times (I \times J)] 的张量。 对于 XX 的每一个元素:

∂L∂Xi,j[1×1]=∂L∂Y[1×(H×J)]∂Y∂Xi,j[H×J]\underset{[1 \times 1]}{\frac{\partial L}{\partial X_{i, j}}} = \underset{[1 \times (H \times J)]}{\frac{\partial L}{\partial Y}} \underset{[H \times J]}{\frac{\partial Y}{\partial X_{i, j}}} ∂Y∂Xi,j=(∂Y1,1∂Xi,j⋯∂Y1,J∂Xi,j⋮⋱⋮∂YH,1∂Xi,j⋯∂YH,J∂Xi,j)\frac{\partial Y}{\partial X_{i, j}} = \begin{pmatrix} \frac{\partial Y_{1, 1}}{\partial X_{i, j}} & \cdots & \frac{\partial Y_{1, J}}{\partial X_{i, j}} \\[0.3em] \vdots & \ddots & \vdots \\[0.3em] \frac{\partial Y_{H, 1}}{\partial X_{i, j}} & \cdots & \frac{\partial Y_{H, J}}{\partial X_{i, j}} \end{pmatrix}

因为 Y[H×J]=w[H×I]X[I×J]\underset{[H \times J]}{Y} = \underset{[H \times I]}{w} \underset{[I \times J]}{X}, 所以 Yh,nY_{h, n} 是 ww 的第 hh 行与 XX 的第 nn 列对应元素相乘的和, 当 j≠nj \neq n 时,Xi,jX_{i, j} 并不参与 Yh,nY_{h, n} 的计算,对应的偏导数为 00, 也就是说,这个矩阵只有第 jj 列的元素不为 00。

∂Y∂Xi,j=(0⋯∂Y1,j∂Xi,j⋯0⋮⋮⋮0⋯∂YH,j∂Xi,j⋯0)\frac{\partial Y}{\partial X_{i, j}} = \begin{pmatrix} 0 & \cdots & \frac{\partial Y_{1, j}}{\partial X_{i, j}} & \cdots & 0\\[0.3em] \vdots & & \vdots & & \vdots \\[0.3em] 0 & \cdots & \frac{\partial Y_{H, j}}{\partial X_{i, j}} & \cdots & 0 \end{pmatrix}

又因为

Yh,j=wh,1X1,j+wh,2X2,j+...+wh,IXI,jY_{h, j} = w_{h, 1}X_{1, j} + w_{h, 2}X_{2, j} + ... + w_{h, I}X_{I, j}

所以

∂Y∂Xi,j=(0⋯w1,i⋯0⋮⋮⋮0⋯wH,i⋯0)\frac{\partial Y}{\partial X_{i, j}} = \begin{pmatrix} 0 & \cdots & w_{1, i} & \cdots & 0\\[0.3em] \vdots & & \vdots & & \vdots \\[0.3em] 0 & \cdots & w_{H, i} & \cdots & 0 \end{pmatrix}

根据张量乘法的定义

∂L∂Xi,j=∑h∑n(∂L∂Y)h,n(∂Y∂Xi,j)h,n=∑h(∂L∂Y)h,j(∂Y∂Xi,j)h,j=∑h(∂L∂Y)h,jwh,i\begin{aligned} \frac{\partial L}{\partial X_{i, j}} &= \sum_{h}\sum_{n} \left( \frac{\partial L}{\partial Y} \right)_{h, n} \left( \frac{\partial Y}{\partial X_{i, j}} \right)_{h, n} \\ &= \sum_h \left( \frac{\partial L}{\partial Y} \right)_{h, j} \left( \frac{\partial Y}{\partial X_{i, j}} \right)_{h, j} \\ &= \sum_h \left( \frac{\partial L}{\partial Y} \right)_{h, j} w_{h, i} \end{aligned}

自然

∂L∂X[I×J]=wT[I×H]∂L∂Y[H×J]\underset{[I \times J]}{\frac{\partial L}{\partial X}} = \underset{[I \times H]}{w^T} \underset{[H \times J]}{\frac{\partial L}{\partial Y}}

同理

∂L∂w[H×I]=∂L∂Y[H×J]XT[J×I]\underset{[H \times I]}{\frac{\partial L}{\partial w}} = \underset{[H \times J]}{\frac{\partial L}{\partial Y}} \underset{[J \times I]}{X^T}

Word2vec

在最简单的 Word2vec 模型中,我们计算每一个单词周围的一些单词出现的可能性, 把所有这样的可能性乘起来得到整个句子的可能性。最大化这个可能性就是我们的目标。

假定词向量是维度为 NN 的列向量。词表中单词总数为 VV。

y^o=p(o∣c)=euoTvc∑w=1VeuwTvcJ=CE(y,y^)=−∑i=1Vyilog⁡y^i\begin{aligned} \hat{y}_o &= p(o|c) = \frac{e^{u_o^T v_c}}{\sum_{w=1}^V e^{u_w^Tv_c}} \\ J &= CE(y, \hat{y}) = -\sum_{i=1}^{V} y_i \log \hat{y}_i \end{aligned}

为了更新词向量 UU 和 vcv_c,我们需要求出 JJ 对它们的导数。 先定义 θ[V×1]=UT[V×N]vc[N×1]\underset{[V \times 1]}{\theta} = \underset{[V \times N]}{U^T} \underset{[N \times 1]}{v_c}, 那么我们已知,∂J∂θ=y^−y\frac{\partial J}{\partial \theta} = \hat{y} - y。 直接应用上面的结果得到:

∂J∂vc[N×1]=U[N×V](y^−y)[V×1]∂J∂U[N×V]=vc[N×1](y^−y)T[1×V]\begin{aligned} \underset{[N \times 1]}{\frac{\partial J}{\partial v_c}} &= \underset{[N \times V]}{U} \underset{[V \times 1]}{(\hat{y} - y)} \\ \underset{[N \times V]}{\frac{\partial J}{\partial U}} &= \underset{[N \times 1]}{v_c} \underset{[1 \times V]}{(\hat{y} - y)^T} \end{aligned}