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

19 阅读1分钟

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

首先计算损失 L 对输出层线性组合z(3)\mathbf{z}^{(3)} 的梯度,我们称之为误差 δ(3)δ^{(3)} 根据定义我们写出计算公式如下 δ(3)=Lz3\delta^{(3)} = \frac{∂L}{∂z_{3}},我们要求同解 Lzk\frac{∂L}{∂z_{k}} ,可按链式法则写为 Lzk=i=1KLaiaizk\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}) 根据基本函数导数,第一部分等于 Lai=tiai\frac{∂L}{∂a_{i}}=-\frac{t_{i}}{a_{i}}

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

aizk={ai(1ai),i=k,aiak,ik.\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}

代入链式法则,有

Lzk=i=1K(tiai)aizk.\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=kiki \neq k: 当 i=ki=k 时:项1=tkakak(1ak)=tk(1ak).\text{项1} = -\frac{t_k}{a_k}\, a_k (1-a_k) = -t_k (1-a_k).iki \neq k 时:项2=iktiai(aiak)=iktiak.\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=akikti.\text{项2} = a_k \sum_{i\neq k} t_i.因为 one-hot 编码下,只有某一个分量为 1,其余为 0。假设目标类别为 kk^*,那么对于 k=kk=k^*tk=1t_{k^*}=1 和对其他 ii ti=0t_i=0。 因此对于 k=kk=k^*(正确类别):

Lzk=1(1ak)+akik0=ak1.\frac{\partial L}{\partial z_{k^*}} = -1(1-a_{k^*}) + a_{k^*}\sum_{i\neq k^*} 0 = a_{k^*} - 1.

对于 kkk \neq k^*Lzk=0(1ak)+ak(1)=ak.\frac{\partial L}{\partial z_k} = -0\,(1-a_{k}) + a_{k}\, (1) = a_{k}. 因此可以统一写成Lzk=aktk,\frac{\partial L}{\partial z_k} = a_k - t_k,

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

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

LW(2)=Lz(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 完全等价。所以

LWij(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

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