关于交织熵公式推导以及明白,可以参考:
信息量、熵、KL散度、交织熵概念明白 通过上面链接中的推导,二分类交织熵丧失函数:
l o s s = − 1 n ∑ i = 1 n ( y i l o g y i ^ + ( 1 − y i ) l o g ( 1 − y i ^ ) ) n 为批量样本 loss=-\frac{1}{n}\sum\limits_{i=1}^n(y_{i}log\hat{y_{i}}+(1-y_{i})log(1-\hat{y_i}))\\ n为批量样本 loss=−n1i=1∑n(yilogyi^+(1−yi)log(1−yi^))n为批量样本 多分类的交织熵丧失函数:
l o s s = − 1 n ∑ i = 1 n ∑ c = 1 m y i c l o g y ^ i c n 为批量样本, m 为分类数 loss=-\frac{1}{n}\sum\limits_{i=1}^n\sum\limits_{c=1}^my_{ic}log\hat{y}_{ic} \\ n为批量样本,m为分类数 loss=−n1i=1∑nc=1∑myiclogy^icn为批量样本,m为分类数
我们上面公式继续化简:
l o s s = − 1 n ∑ i = 1 n ∑ c = 1 m y i c l o g y ^ i c 我们现在只看一个样本: l o s s ( x , c l a s s ) = − ∑ c = 1 m y x c l o g y ^ x c = − [ y x 1 l o g ( y ^ x 1 ) + y x 2 l o g ( y ^ x 2 ) + . . . + y x m l o g ( y ^ x m ) ] 这个样本,只有 c l a s s 处 y x [ c l a s s ] = 1 ,其他地方都为 0 ,因此 l o s s ( x , c l a s s ) = − l o g ( y ^ x [ c l a s s ] ) 需要注意的是,在 p y t o r c h 中 x 需要先进行 s o f t m a x , 因此 l o s s ( x , c l a s s ) = − l o g ( y ^ x [ c l a s s ] ) = − l o g ( e x [ c l a s s ] ∑ j e x [ j ] ) = − x [ c l a s s ] + l o g ( ∑ j e x [ j ] ) 我们举个例子,假设预测三个类别的概率为 [ 0.1 , 0.2 , 0.3 ] ,标签 c l a s s = 1 l o s s ( x , c l a s s ) = − x [ c l a s s ] + l o g ( ∑ j e x [ j ] ) = − 0.2 + l o g ( e x [ 0 ] + e x [ 1 ] + e x [ 2 ] ) = − 0.2 + l o g ( e 0.1 + e 0.2 + e 0.3 ) loss=-\frac{1}{n}\sum\limits_{i=1}^n\sum\limits_{c=1}^my_{ic}log\hat{y}_{ic} \\ 我们现在只看一个样本:\\ loss(x,class)=-\sum\limits_{c=1}^my_{xc}log\hat{y}_{xc}\\ =-[y_{x1}log(\hat{y}_{x1})+ y_{x2}log(\hat{y}_{x2}) + ... + y_{xm}log(\hat{y}_{xm})] \\ 这个样本,只有class处y_{x[class]}=1,其他地方都为0,因此\\ loss(x,class)=-log(\hat{y}_{x[class]}) \\ 需要注意的是,在pytorch中x需要先进行softmax,因此\\ loss(x,class)=-log(\hat{y}_{x[class]})\\ =-log(\frac{e^{x[class]}}{\sum\limits_{j}e^{x[j]}}) \\ =-x[class]+log(\sum\limits_{j}e^{x[j]}) \\ 我们举个例子,假设预测三个类别的概率为[0.1, 0.2, 0.3],标签class=1\\ loss(x,class)=-x[class]+log(\sum\limits_{j}e^{x[j]})\\ =-0.2+log(e^{x[0]}+e^{x[1]}+e^{x[2]})\\ =-0.2 + log(e^{0.1}+e^{0.2}+e^{0.3}) loss=−n1i=1∑nc=1∑myiclogy^ic我们现在只看一个样本:loss(x,class)=−c=1∑myxclogy^xc=−[yx1log(y^x1)+yx2log(y^x2)+...+yxmlog(y^xm)]这个样本,只有class处yx[class]=1,其他地方都为0,因此loss(x,class)=−log(y^x[class])需要注意的是,在pytorch中x需要先进行softmax,因此loss(x,class)=−log(y^x[class])=−log(j∑ex[j]ex[class])=−x[class]+log(j∑ex[j])我们举个例子,假设预测三个类别的概率为[0.1,0.2,0.3],标签class=1loss(x,class)=−x[class]+log(j∑ex[j])=−0.2+log(ex[0]+ex[1]+ex[2])=−0.2+log(e0.1+e0.2+e0.3) 现在得到了化简后的多分类交织熵丧失函数:
对于单个样本 x : l o s s ( x , c l a s s ) = − l o g ( e x [ c l a s s ] ∑ j e x [ j ] ) = − x [ c l a s s ] + l o g ( ∑ j e x [ j ] ) 对于单个样本x:\\ loss(x,class)=-log(\frac{e^{x[class]}}{\sum\limits_{j}e^{x[j]}}) =-x[class]+log(\sum\limits_{j}e^{x[j]}) 对于单个样本x:loss(x,class)=−log(j∑ex[j]ex[class])=−x[class]+log(j∑ex[j])
(1)二分类丧失函数nn.BCELoss()、nn.BCELossWithLogits()
l o s s = − 1 n ∑ i = 1 n ( y i l o g y i ^ + ( 1 − y i ) l o g ( 1 − y i ^ ) ) n 为批量样本 loss=-\frac{1}{n}\sum\limits_{i=1}^n(y_{i}log\hat{y_{i}}+(1-y_{i})log(1-\hat{y_i}))\\ n为批量样本 loss=−n1i=1∑n(yilogyi^+(1−yi)log(1−yi^))n为批量样本
Pytorch链接:BCEWithLogitsLoss
化简后的多分类交织熵丧失函数:
对于单个样本 x : l o s s ( x , c l a s s ) = − l o g ( e x [ c l a s s ] ∑ j e x [ j ] ) = − x [ c l a s s ] + l o g ( ∑ j e x [ j ] ) 对于单个样本x:\\ loss(x,class)=-log(\frac{e^{x[class]}}{\sum\limits_{j}e^{x[j]}}) =-x[class]+log(\sum\limits_{j}e^{x[j]}) 对于单个样本x:loss(x,class)=−log(j∑ex[j]ex[class])=−x[class]+log(j∑ex[j])
Pytorch链接:CrossEntropyLoss