我是靠谱客的博主 殷勤书包,最近开发中收集的这篇文章主要介绍为什么使用 CE + Softmax 作为损失函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

假设

假设有三个分类,模型输出值为 output = model(input),得到如下输出向量
[ o 1 , o 2 , o 3 ] [o_1,o_2,o_3] [o1,o2,o3]
表示每个类别的概率值,然后将该向量进行 softmax 操作,得到 [ S 1 , S 2 , S 3 ] [S_1,S_2,S_3] [S1,S2,S3] S i S_i Si 的计算公式为:
S i = e o i ∑ e o k = e o i e o 0 + e o 1 + e o 2 S_i = frac{e^{o_i}}{sum e^{o_k}} = frac{e^{o_i}}{e^{o_0}+e^{o_1}+e^{o_2}} Si=eokeoi=eo0+eo1+eo2eoi

导数的除法规则

( u v ) ′ = u ′ v − u v ′ v 2 left(frac{u}{v}right)'=frac{u'v-uv'}{v^2} (vu)=v2uvuv

求导

使用链式法则反向传播误差,例如
∂ L ∂ ω = ∂ L ∂ S ∂ S ∂ o ∂ o ∂ ω frac{partial L}{partial omega} = frac{partial L}{partial S} frac{partial S}{partial o} frac{partial o}{partial omega} ωL=SLoSωo

需要求得 S i S_i Si S i S_i Si 是经过 argmax 或者其他方式选出来的 [ S 1 , S 2 , S 3 ] [S_1,S_2,S_3] [S1,S2,S3] 中的某个值)与每个输出值 o i o_i oi 的偏微分,即
∂ S i ∂ o j frac{partial S_i}{partial o_j} ojSi

这里分两种情况,当 i = j i = j i=j 时 ,根据导数的除法规则
∂ S i ∂ o i = ∂ ∂ o j ( e o i ∑ e o k ) = e o i ∑ e o k − e o i e o i ( ∑ e o k ) 2 = S i − S i 2 = S i ( 1 − S i ) begin{aligned} frac{partial S_i}{partial o_i}&=frac{partial}{partial o_j}left( frac{e^{o_i}}{sum e^{o_k}}right)\&=frac{e^{o_i}sum e^{o_k} - e^{o_i}e^{o_i}}{(sum e^{o_k})^2} \ &=S_i-S_i^2 \&=S_i(1-S_i) end{aligned} oiSi=oj(eokeoi)=(eok)2eoieokeoieoi=SiSi2=Si(1Si)

i ≠ j i neq j i=j 时,
∂ S i ∂ o j = ∂ ∂ o j ( e o i ∑ e o k ) = 0 − e o i e o j ( ∑ e o k ) 2 = − S i S j begin{aligned} frac{partial S_i}{partial o_j}&=frac{partial}{partial o_j}left( frac{e^{o_i}}{sum e^{o_k}}right)\&=frac{0- e^{o_i}e^{o_j}}{(sum e^{o_k})^2} \ &=-S_iS_j end{aligned} ojSi=oj(eokeoi)=(eok)20eoieoj=SiSj

CE + Softmax

CE 公式:
L = − ∑ y i log ⁡ S i L = -sum{y_i log{S_i}} L=yilogSi

所以
∂ L ∂ S i = − ∑ y i 1 S i frac{partial L}{partial S_i} = -sum y_i frac{1}{S_i} SiL=yiSi1

所以
∂ L ∂ o j = ∂ L ∂ S i ∂ S i ∂ o j = − ∑ i = j y i 1 S i ( S i ( 1 − S i ) ) + ∑ i ≠ j y i 1 S i ( S i S j ) = − ∑ i = j y i ( 1 − S i ) + ∑ i ≠ j y i S j = − y j + y j S j + ∑ i ≠ j y i S j = − y j + S j ∑ y i begin{aligned} frac{partial L}{partial o_j} = frac{partial L}{partial S_i}frac{partial S_i}{partial o_j} &= -sum_{i=j} y_i frac{1}{S_i}(S_i(1-S_i))+sum_{i neq j}y_i frac{1}{S_i}(S_iS_j) \ &= -sum_{i=j} y_i (1-S_i) + sum_{i neq j} y_iS_j \ &=-y_j+y_jS_j + sum_{ineq j}y_iS_j \ &=-y_j+S_j sum y_i end{aligned} ojL=SiLojSi=i=jyiSi1(Si(1Si))+i=jyiSi1(SiSj)=i=jyi(1Si)+i=jyiSj=yj+yjSj+i=jyiSj=yj+Sjyi

因为 y i y_i yi 是 one hot 编码,或者 label smooth 后的值,所以其求和 ∑ y i = 1 sum y_i =1 yi=1

所以
∂ L ∂ o j = S j − y j frac{partial L}{partial o_j} = S_j-y_j ojL=Sjyj

其中 S j S_j Sj 表示预测为第 j j j 类的概率值。

总结

使用 CE + Softmax ,在反向传播时,可以直接用 S j − y j S_j - y_j Sjyj 作为反向传播的值 进行学习

最后

以上就是殷勤书包为你收集整理的为什么使用 CE + Softmax 作为损失函数的全部内容,希望文章能够帮你解决为什么使用 CE + Softmax 作为损失函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部