神经网络误差和梯度公式推导

151 阅读1分钟

输出误差公式从定义出发的推导过程

首先计算损失 L 对输出层线性组合z(3)\mathbf{z}^{(3)} 的梯度,我们称之为误差 δ(3)δ^{(3)} 根据定义我们写出计算公式如下 δ(3)=∂L∂z3\delta^{(3)} = \frac{∂L}{∂z_{3}},我们要求同解 ∂L∂zk\frac{∂L}{∂z_{k}} ,可按链式法则写为 ∂L∂zk=∑i=1K∂L∂ai∂ai∂zk\frac{∂L}{∂z_{k}}=\sum_{i=1}^{K}\frac{∂L}{∂a_{i}} \frac{∂a_{i}}{∂z_{k}}

因为交叉熵损失为L=−∑i=13tiln⁡(ai)L=−\sum_{i=1}^{3}t_{i}\ln(a_{i}) 根据基本函数导数,第一部分等于 ∂L∂ai=−tiai\frac{∂L}{∂a_{i}}=-\frac{t_{i}}{a_{i}}

接下来需要求出 ∂ai∂zk\frac{\partial a_i}{\partial z_k}(Softmax 的雅可比矩阵),接下来需要求出 ∂ai∂zk\frac{\partial a_i}{\partial z_k}(Softmax 的雅可比矩阵)。其结果为:

∂ai∂zk={ai(1−ai),i=k,−aiak,i≠k.\frac{\partial a_i}{\partial z_k} = \begin{cases} a_i (1 - a_i), & i=k,\\[1mm] - a_i a_k, & i \neq k. \end{cases}

代入链式法则,有

∂L∂zk=∑i=1K(−tiai)∂ai∂zk.\frac{\partial L}{\partial z_k} = \sum_{i=1}^{K} \left(-\frac{t_i}{a_i}\right) \frac{\partial a_i}{\partial z_k}.

将求和拆开,分两种情况讨论 i=ki=k 和 i≠ki \neq k: 当 i=ki=k 时:项1=−tkak ak(1−ak)=−tk(1−ak).\text{项1} = -\frac{t_k}{a_k}\, a_k (1-a_k) = -t_k (1-a_k). 当 i≠ki \neq k 时:项2=∑i≠k−tiai (−aiak)=∑i≠kti ak.\text{项2} = \sum_{i\neq k} -\frac{t_i}{a_i} \,(-a_i a_k) = \sum_{i\neq k} t_i\, a_k. 因为 aka_k与求和无关,因此项2=ak∑i≠kti.\text{项2} = a_k \sum_{i\neq k} t_i.因为 one-hot 编码下,只有某一个分量为 1,其余为 0。假设目标类别为 k∗k^*,那么对于 k=k∗k=k^*有 tk∗=1t_{k^*}=1 和对其他 ii ti=0t_i=0。 因此对于 k=k∗k=k^*(正确类别):

∂L∂zk∗=−1(1−ak∗)+ak∗∑i≠k∗0=ak∗−1.\frac{\partial L}{\partial z_{k^*}} = -1(1-a_{k^*}) + a_{k^*}\sum_{i\neq k^*} 0 = a_{k^*} - 1.

对于 k≠k∗k \neq k^*: ∂L∂zk=−0 (1−ak)+ak (1)=ak.\frac{\partial L}{\partial z_k} = -0\,(1-a_{k}) + a_{k}\, (1) = a_{k}. 因此可以统一写成∂L∂zk=ak−tk,\frac{\partial L}{\partial z_k} = a_k - t_k,

权重梯度公式从定义出发的推导过程

权重W(2)\mathbf{W}^{(2)} 的梯度按照定义其公式∂L∂W(2)\frac{∂L}{∂W^{(2)}} 通过链式法则如下:

∂L∂W(2)=∂L∂z(3)⋅∂z(3)∂W(2)\frac{∂L}{∂W^{(2)}}=\frac{∂L}{∂z^{(3)}}\cdot \frac{∂z^{(3)}}{∂W^{(2)}}

把z(3)=W(2).a(2)+b(2)z^{(3)}=W^{(2)}.a^{(2)}+b^{(2)}展开

zj(3)=∑i=12Wji(2)⋅ai(2)+bj(2)(j=1,2,3)z_{j}^{(3)}=\sum_{i=1}^{2}W_{ji}^{(2)} \cdot a^{(2)}_{i}+b^{(2)}_{j} (j=1,2,3)

对单个元素求导(根据求导规则只有k=i时,Wji(2)W_{ji}^{(2)} 会出现在求和公式中化简如下)

∂zj(3)∂Wji(2)=∂∂Wji(2)(∑k=12Wjk(2)⋅ak(2)+bj(2))=ai(2)\frac{∂z_{j}^{(3)}}{∂W_{ji}^{(2)}}=\frac{∂}{∂W_{ji}^{(2)}} \left( \sum_{k=1}^{2}W_{jk}^{(2)} \cdot a^{(2)}_{k}+b^{(2)}_{j} \right)=a_{i}^{(2)}

其实求偏导的时候不用考虑bj(2)b_{j}^{(2)} ,会变成0,所以我们可以把矩阵乘法∑k=12Wjk(2)⋅ak(2)\sum_{k=1}^{2}W_{jk}^{(2)} \cdot a^{(2)}_{k} 展开

[w11a1+w21a2w12a1+w22a2w13a1+w23a2]\begin{bmatrix} w_{11}a_{1}+ w_{21}a_{2} \\ w_{12}a_{1}+ w_{22}a_{2} \\ w_{13}a_{1}+ w_{23}a_{2} \\ \end{bmatrix}

对W(2)W^{(2)} 任意元素wijw_{ij}求偏导导 为 aja_{j} ,矩阵求偏导具体结果如下:

∂z(3)∂W(2)=[a1a2a1a2a1a2]\frac{∂z^{(3)}}{∂W^{(2)}}=\begin{bmatrix} a_{1} & a_{2} \\ a_{1} & a_{2} \\ a_{1} & a_{2} \\ \end{bmatrix}

这就是一个雅可比矩阵,就是因变量对自变量的一阶偏导数构成的矩阵。因为δ(3)\delta^{(3)} (3x1矩阵)和 ∂z(3)∂W(2)\frac{∂z^{(3)}}{∂W^{(2)}} (3x2矩阵)按照正规矩阵无法相乘,但由于∂z(3)∂W(2)\frac{∂z^{(3)}}{∂W^{(2)}} 每行都相同都是 (a(2))T(\mathbf{a}^{(2)})^T (1x2矩阵),可以用向量与矩阵的逐行加权做"乘法",具体就是把δ(3)\delta^{(3)} 看作3个标量(δ1(3),δ2(3),δ3(3)\delta_{1}^{(3)},\delta_{2}^{(3)},\delta_{3}^{(3)}) , 然后每一个δi(3)\delta_{i}^{(3)} 与 ∂z(3)∂W(2)\frac{∂z^{(3)}}{∂W^{(2)}} 的第i行((a(2))T(\mathbf{a}^{(2)})^T)相乘, 结果按照行堆叠,最终结果和δ(3)⋅(a(2))T\delta^{(3)} \cdot (\mathbf{a}^{(2)})^T 完全等价。所以

∂L∂Wij(2)=δi(3)⋅aj(2)\frac{\partial L}{\partial W_{ij}^{(2)}} = \delta_i^{(3)} \cdot a_j^{(2)}

其中 ii 表示输出层的神经元索引 (1 到 3),jj 表示隐层神经元索引 (1 到 2)。故可写成矩阵形式:

∇W(2)L=δ(3)⋅(a(2))T\nabla_{\mathbf{W}^{(2)}} L = \delta^{(3)} \cdot (\mathbf{a}^{(2)})^T

这个转置是链式法则中的维度匹配,是元素级求导和维度匹配共同的结果,当然也符合反向传递和矩阵乘法逻辑要求。后面这个结论可以直接用。