最近手推了一下神经网络梯度更新中的参数偏导,做一个笔记。
模型
我们考虑一个非常简单的神经网络,输入embedding后只通过一个全连接层,然后就softmax输出预测值
先只考虑一个样本X,feature有n个维度。embedding层可以视为一个nxN的矩阵,得到Z1的维度被扩展为N,经过relu激活层后输出。然后连接一层有K个神经元的全连接层,权重w是一个NxK的矩阵,b是一个1xK的向量,输出Z3经过softmax层后得到样本属于K个类中类别 i i i的概率值 Y i Y_i Yi。
计算梯度
模型损失函数取简单的交叉熵损失函数: L = − ∑ i = 1 K y × l n Y {L = - \sum\limits_{i=1}^{K} y \times lnY} L=−i=1∑Ky×lnY
其中y是真实值,Y是预测值, i = 1 , 2 , 3 , . . . , K i = 1,2,3,...,K i=1,2,3,...,K表示K个分类
- 计算全连接层输出 Z 3 i {Z_{3i}} Z3i的梯度
∂ L ∂ Z 3 i = ∂ L ∂ Y × ∂ Y ∂ Z 3 i = ∑ j = 1 K ∂ L ∂ Y j × ∂ Y j ∂ Z 3 i = ∑ j = 1 K − y j × 1 Y j × ∂ Y j ∂ Z 3 i \begin{aligned} \frac{\partial L}{\partial Z_{3i}} = \frac{\partial L}{\partial Y} \times \frac{\partial Y}{\partial Z_{3i}} &= \sum\limits_{j=1}^{K} \frac{\partial L}{\partial Y_j} \times \frac{\partial Y_j}{\partial Z_{3i}} \\ &= \sum\limits_{j=1}^{K} -y_j \times \frac{1}{Y_j} \times \frac{\partial Y_j}{\partial Z_{3i}} \end{aligned} ∂Z3i∂L=∂Y∂L×∂Z3i∂Y=j=1∑K∂Yj∂L×∂Z3i∂Yj=j=1∑K−yj×Yj1×∂Z3i∂Yj
计算softmax导数时需要分 j = i {j = i} j=i和 j ≠ i {j \neq i} j̸=i两种情况考虑,所以这里将L求和中元素令为j,与i加以区分
i = j i = j i=j时
∂ Y j ∂ Z 3 i = ∂ Y i ∂ Z 3 i = ∂ ∂ Z 3 i [ e Z 3 i ∑ k = 1 K e Z 3 k ] = e Z 3 i × ∑ k = 1 K e Z 3 k − e Z 3 i × e Z 3 i ( ∑ k = 1 K e Z 3 k ) 2 = Y i ( 1 − Y i ) \frac{\partial Y_j}{\partial Z_{3i}} = \frac{\partial Y_i}{\partial Z_{3i}} = \frac{\partial }{\partial Z_{3i}} [\frac{e^{Z_{3i}}}{\sum\limits_{k=1}^{K} e^{Z_{3k}}}] = \frac{e^{Z_{3i}} \times \sum\limits_{k=1}^{K} e^{Z_{3k}} - e^{Z_{3i}} \times e^{Z_{3i}}}{(\sum\limits_{k=1}^{K} e^{Z_{3k}})^2} = Y_i(1-Y_i) ∂Z3i∂Yj=∂Z3i∂Yi=