Pytorchでよく使われるクロスエントロピー損失関数CrossEntropyLoss()の詳細


出典:AINLPE微信公衆番号(クリックして理解してください)編集:ShuYini校稿:ShuYini時間:2019-12-22
引用する
pytorchの深さ学習フレームワークを使用して、損失関数を計算するときによくこのような関数に戻ります.
nn.CrossEntropyLoss()
この損失関数はn n nを結合した.L o g S o f t m a x ( ) nn.LogSoftmax() nn.LogSoftmax()とn.N L L L o s s ( ) nn.NLLLoss() nn.NLLoss()の2つの関数.分類(具体的にはいくつかのクラス)トレーニングを行うときに便利です.トレーニングの過程で、各クラスに対して重み値を割り当てるには、オプションのパラメータの重み値は1 Dテンソルであるべきです.アンバランスなトレーニングセットがある場合に便利です.この関数については、以下で詳しく説明します.
クロスエントロピーとは?
    クロスエントロピーは、主に実際の出力と所望の出力との近接度を判定するために用いられるが、なぜ、分類の訓練を行う際に、1つのサンプルがKクラスに属する場合、このカテゴリに対応する出力ノードの出力値は1であるべきであり、他のノードの出力は0、すなわち[0,0,1,0,....この配列はサンプルのLabelであり,ニューラルネットワークの最も望ましい出力結果である.すなわち,ネットワークの出力とラベルの違いを測定し,この違いを逆伝播してネットワークパラメータを更新する.
クロスエントロピーの原理?
クロスエントロピーについて話す前に,情報量とエントロピーについて述べる.情報量:**イベントの不確実性を測定するために使用されます.1つのイベントが発生する確率が大きいほど、不確実性が小さくなり、その情報量が小さくなります.Xは離散型ランダム変数であり,その値集合がX,確率分布関数がp(x)=P(X=x),x∈X p(x)=P(X=x),x∈X p(x)=P(x)=P(x)=P(X=x),x∈Xと仮定し,イベントX=x 0 X=x_0 X=x 0の情報量は、I(x 0)=−l o g(p(x 0))I(x 0)=−log(p(x_0))I(x 0)=−log(p(x 0))p(x 0)=1 p(x 0)=1 p(x 0)=1の場合、エントロピーは0に等しくなり、つまり、このイベントの発生によって任意の情報量が増加することはない.
ジルコニウムエントロピー:システムの混乱の程度を測定するために使用され、システム内の情報量の総和を表す.情報量の総和が大きいほど,このシステムの不確実性が大きいことを示した.例を挙げると、明ちゃんと王さんがターゲットを打つと、ターゲットを打つ結果は実は0-1分布で、Xの値は{0:当たって、1:当たらない}があります.ターゲットを打つ前に、明ちゃんと王さんが当たった確率は10%、99.9%だと知っていました.上の情報量の紹介によると、明ちゃんと王さんがターゲットに当たった情報量をそれぞれ得ることができます.しかし,明ちゃんのターゲット結果の不確定度をさらに測定するには,エントロピーの概念を用いる必要がある.では、どのように測定するかは、期待を採用しなければなりません.我々はすべての可能な事象がもたらす情報量について期待し,その結果,明ちゃんターゲットの不確定度:H A(x)=−[p(x A)l o g(p(x A)))+(1−p(x A)))l o g(1−p(x A)]=0.4690 H_A(x)=−[p(x_A)log(p(x_A)))+(1−p(x_A))))log(1−p(x_A)))]=0.4690 HA(x)=−[p(xA)]+(1−p(xA))log(1−p(xA)))=0.4690 HA(x)=0.4690 HA(x)=−[p(xA))]+(1−p(x−p(x A))))]=0.4690に対応する王のエントロピー(ターゲットの不確定度)は,H B(x(x)=−[p(x(x B)l o g(p(x(x(x(x B))))+(p(p(x(x−p(xB))l o g(1−p(xB)]=0.0114 H_B(x)=−[p(x_B)log(p(x_B))+(1−p(x_B))log(1−p(x_B)))]=0.0114 HB(x)=−[p(xB)log(p(xB))+(1−p(xB))log(1−p(xB))))))]=0.0114しかし、王さんはターゲットを打つ結果の不確定度が低く、1000回の射撃で1回しかターゲットを外れず、結果はかなり確定した.
     **クロスエントロピー:**実際の出力(確率)と所望の出力(確率)との距離を主に描いている.つまりクロスエントロピーの値が小さいほど、二つの確率分布が近づく.確率分布pが所望の出力であり、確率分布qが実際の出力であり、H(p,q)H(p,q)H(p,q)H(p,q)がクロスエントロピーであると仮定し、H(p,q)=−Σx(p(x)l o g q(x)+(1−p(x))l o g(1−q(x))H(p,q)=−sum_{x}(p(x)logq(x)+(1−p(x))log(1−q(x))H(p,q)=−xΣ(p(x)logq(x)+(1−p(x))log(1−q(x))))log(1−q(x))H(p,q)=−xΣ(p(x)logq(x)+(1−p(x))log(1−q(x)))log(1−q(x))))))IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIq(0.5,0.2,0.3)q(x)q(x)q(x)x)x)x 1=(0.5,0.2,0.3)q 1=(0.5,0.2,0.3) q 2 = ( 0.8 , 0.1 , 0.1 ) q2=(0.8,0.1,0.1) q2=(0.8,0.1,0.1),では、H(p,q 1)=−(1∗l o g 0.5+0∗l o g 0.2+0∗l o g 0.3+0∗l o g 0.5+1∗l o g 0.8+1∗l o g 0.7)=0.55 H(p,q_1)=−(1*log 0.5+0*log 0.2+0*log 0.3+0*log 0.5+1*log 0.5+1*log 0.5+1*log 0.7)=0.55 H(p,q 1)=−(1∗log+0.5+0+0 8727; log 0.2+0∗log 0.3+0∗log 0.5+1∗log 0.8+1∗log 0.7)=0.55 H(p,q 2)=−(1∗l o g 0.8+0∗l o g 0.1+0∗l o g 0.1+0∗l o g 0.1+0∗l o g 0.2+1∗l o g 0.9+1∗l o g 0.9)= 0.19 H(p,q_2)=-(1*log 0.8+0*log 0.1+0*log 0.1+0*log 0.2+1*log 0.9+ 1*log 0.9+1*log 0.9)=0.19 H(p,q 2)=−(1∗log 0.8+0∗log 0.1+0*log 0.1+0*log 0.1+0*log 0.1+0*log 0.2+0*log 0.2+log 0.9+ 1*log 0.9+ジルコニウムlog 0.1+0ジルコニウムlog 0.2+1ジルコニウムlog 0.9+1ジルコニウムlog 0.9)=0.19以上からq 2がpに近いことが分かる.交差エントロピーも小さい.
PytorchのCrossEntropyLoss()関数
  Pytorchで計算したクロスエントロピーはH(p,q)=−Σx(p(x)l o g q(x)+(1−p(x))l o g(1−q(x))H(p,q)=−sum_{x}(p(x)logq(x)+(1−p(x))log(1−q(x))H(p,q)=−xΣ(p(x)logq(x)+(1−p(x))log(1−q(x))というように計算され、クロスエントロピーの別の方法で計算される:H(p,q)=−Σx p(x)l o g q(x)H(p,q)=−sum_{x}p(x)logq(x)H(p,q)=−xΣp(x)logq(x)クロスエントロピーのもう一つの方法である.PytorchにおけるCrossEntropyLoss()関数は,主にsoftmax−log−LLLossを1つに統合した結果である.    1,Softmax以降の値はいずれも0~1の間であるためln以降の値域は負無限から0である. 次に、私がシミュレーションした例を示します.
import torch.nn as nn
x_input=torch.randn(3,3)#      
print('x_input:
',x_input) y_target=torch.tensor([1,2,0])# print('y_target
',y_target) # softmax, 1 softmax_func=nn.Softmax(dim=1) soft_output=softmax_func(x_input) print('soft_output:
',soft_output) # softmax log log_output=torch.log(soft_output) print('log_output:
',log_output) # softmax log nn.LogSoftmaxloss( ) , 。 logsoftmax_func=nn.LogSoftmax(dim=1) logsoftmax_output=logsoftmax_func(x_input) print('logsoftmax_output:
',logsoftmax_output) #pytorch NLLLoss :reducetion=True、size_average=True nllloss_func=nn.NLLLoss() nlloss_output=nllloss_func(logsoftmax_output,y_target) print('nlloss_output:
',nlloss_output) # pytorch loss_func=nn.CrossEntropyLoss() NLLLoss crossentropyloss=nn.CrossEntropyLoss() crossentropyloss_output=crossentropyloss(x_input,y_target) print('crossentropyloss_output:
',crossentropyloss_output)

最も計算された結果は次のとおりです.
x_input:
 tensor([[ 2.8883,  0.1760,  1.0774],
        [ 1.1216, -0.0562,  0.0660],
        [-1.3939, -0.0967,  0.5853]])
y_target
 tensor([1, 2, 0])
soft_output:
 tensor([[0.8131, 0.0540, 0.1329],
        [0.6039, 0.1860, 0.2102],
        [0.0841, 0.3076, 0.6083]])
log_output:
 tensor([[-0.2069, -2.9192, -2.0178],
        [-0.5044, -1.6822, -1.5599],
        [-2.4762, -1.1790, -0.4970]])
logsoftmax_output:
 tensor([[-0.2069, -2.9192, -2.0178],
        [-0.5044, -1.6822, -1.5599],
        [-2.4762, -1.1790, -0.4970]])
nlloss_output:
 tensor(2.3185)
crossentropyloss_output:
 tensor(2.3185)

以上の結果からpytorchのloss_を直接使用することがわかります.func=nn.CrossEntropyLoss()の計算結果はsoftmax−log−LLLossの計算結果と一致した.
参考文献
[1] https://blog.csdn.net/zwqjoy/article/details/78952087 [2] https://blog.csdn.net/xg123321123/article/details/52864830 [3] https://www.cnblogs.com/JeasonIsCoding/p/10171201.html
より多くの自然言語処理、pytorchに関する知識は、AINLPEの公衆番号に注目してください.極品の乾物はすぐに届きます.