Softmax + Cross-Entropy 损失函数偏导数求导过程

37 阅读1分钟

求Loss对logits(z)的偏导数,即Lzi\frac{\partial L}{\partial z_i}

假设模型输出的logits 为ziz_i

softmax输出为:ai=softmax(z)i=ezikezka_i = \text{softmax}(z)_i = \frac{e^{z_i}}{\sum_{k} e^{z_k}}

Loss: L=kykln(ak)L = - \sum_{k} y_k \ln(a_k)

根据链式法则:

这里的求和符号是softmax分母里面的

Lzi=jLajajzi\frac{\partial L}{\partial z_i} = \sum_{j} \frac{\partial L}{\partial a_j} \cdot \frac{\partial a_j}{\partial z_i}

第一步对:Loss对aja_j的求导,即对corss-Entropy求导

L=kykln(ak)L = - \sum_{k} y_k \ln(a_k)

aja_j 求导非常简单(只有当 k=jk=j 时那一项不为 0):

Laj=yjaj\frac{\partial L}{\partial a_j} = - \frac{y_j}{a_j}

第二步:求 Softmax 对 zz 的偏导 (ajzi\frac{\partial a_j}{\partial z_i})

这是最复杂的一步。回忆 Softmax 公式:aj=ezjkezka_j = \frac{e^{z_j}}{\sum_{k} e^{z_k}}

Σ=kezk\Sigma = \sum_{k} e^{z_k},则 aj=ezjΣa_j = \frac{e^{z_j}}{\Sigma}

开始求导,根据商的求导公式对aj=ezjΣa_j = \frac{e^{z_j}}{\Sigma}求导,注意这里Σ{\Sigma}里面是有 ai{a_i}的,且j可能和i相等,因此分情况讨论:

i = j 时:

aizi=(ezi)Σezi(Σ)Σ2=eziΣezieziΣ2=eziΣΣeziΣ=ai(1ai)\begin{aligned} \frac{\partial a_i}{\partial z_i} &= \frac{(e^{z_i})' \Sigma - e^{z_i} (\Sigma)'}{\Sigma^2} \\ &= \frac{e^{z_i} \Sigma - e^{z_i} e^{z_i}}{\Sigma^2} \\ &= \frac{e^{z_i}}{\Sigma} \cdot \frac{\Sigma - e^{z_i}}{\Sigma} \\ &= a_i (1 - a_i) \end{aligned}

这个是类指数函数,化简想办法往原函数aj=ezjΣa_j = \frac{e^{z_j}}{\Sigma} 上去化简。

i = j 时:

ajzi=0ΣezjeziΣ2=ezjΣeziΣ=ajai\begin{aligned} \frac{\partial a_j}{\partial z_i} &= \frac{0 \cdot \Sigma - e^{z_j} e^{z_i}}{\Sigma^2} \\ &= - \frac{e^{z_j}}{\Sigma} \cdot \frac{e^{z_i}}{\Sigma} \\ &= - a_j a_i \end{aligned}

第三步 合并

Lzi=jLajajzi\frac{\partial L}{\partial z_i} = \sum_{j} \frac{\partial L}{\partial a_j} \frac{\partial a_j}{\partial z_i}

将求和分为 j=ij=ijij \neq i 两部分:

Lzi=Laiaizij=i+jiLajajziji\frac{\partial L}{\partial z_i} = \underbrace{\frac{\partial L}{\partial a_i} \frac{\partial a_i}{\partial z_i}}_{j=i} + \underbrace{\sum_{j \neq i} \frac{\partial L}{\partial a_j} \frac{\partial a_j}{\partial z_i}}_{j \neq i}

代入我们在第一步和第二步得到的结果:

Lzi=(yiai)ai(1ai)+ji(yjaj)(ajai)=yi(1ai)+jiyjai=yi+yiai+aijiyj=yi+ai(yi+jiyj)\begin{aligned} \frac{\partial L}{\partial z_i} &= \left( -\frac{y_i}{a_i} \right) \cdot a_i(1 - a_i) + \sum_{j \neq i} \left( -\frac{y_j}{a_j} \right) \cdot (-a_j a_i) \\ &= -y_i(1 - a_i) + \sum_{j \neq i} y_j a_i \\ &= -y_i + y_i a_i + a_i \sum_{j \neq i} y_j \\ &= -y_i + a_i \left( y_i + \sum_{j \neq i} y_j \right) \end{aligned}

这里有一个关键点:yy 是 One-hot 向量,所有 yy 的和为 1。

(yi+jiyj)=ally=1\left( y_i + \sum_{j \neq i} y_j \right) = \sum_{\text{all}} y = 1

所以最终结果简化为:

Lzi=aiyi\frac{\partial L}{\partial z_i} = a_i - y_i

最终结论

Softmax + Cross Entropy 的反向传播梯度就是:

Gradient=PredictionLabel\text{Gradient} = \text{Prediction} - \text{Label}

或者写作:

Lzi=y^iyi\frac{\partial L}{\partial z_i} = \hat{y}_i - y_i

物理意义:

这个结果非常直观。梯度的方向和大小完全取决于预测值 (y^i\hat{y}_i) 和真实值 (yiy_i) 之间的差。