Tommy Huang
4 min readMar 27, 2020

--

感謝你的留言。
留言寫「然而你文章中寫的是先對每個類別中的不同樣本的概率分佈進行log求和,然後再將每個類別的CE求和得到最終CE-Loss,這樣是不對的」,應該是指下面這段吧

模型一
男生的cross-entropy:
-(1 × log(0.4)+0 × log(0.3)+1 × log(0.5)+0 × log(0.8))=2.322
女生的cross-entropy:
-(0 × log(0.3)+1 × log(0.4)+0 × log(0.2)+0 × log(0.1))= 1.322
其他的cross-entropy:
-(0 × log(0.4)+0 × log(0.3)+0 × log(0.3)+ 1 × log(0.1))= 3.322

模型一的cross-entropy
=男生的cross-entropy+女生的cross-entropy其他的cross-entropy
=2.322+1.322+3.322= 6.966

一般文章在撰寫都是以樣本為主來運算,算完再把樣本的結果算總合得到cross-entropy,但我們如果將cross-entropy的公式列出來看

要以樣本為主或是類別為主應該是沒有差別,最後都是要算出平均的loss(我文章沒有寫出除上樣本數,是失誤,但觀念達到我就沒有修改必要)

雖然很多值都是乘以0(與ground truth不同類別則不用運算),我還是寫出來,第一我只是要強調Cross-Entropy有考慮到每個樣本對其他類的information gain,雖然這個case的information gain其他類別是0(hard-target),但在soft-target其他類的information gain就變很重要,所以我文章應該沒有錯誤。

這個文章的手算範例我在做cross-entropy的步驟有偷懶跳過2個步驟,第一output logits需要做softmax的部分(手算很麻煩),第二結果總和要取平均(當初寫文章忘了做),其他部分都是對的。下面程式碼我針對文章的範例在計算一遍,確認我cross-entropy的觀念和算法是沒有錯誤的(基於pytorch來撰寫)。

import torch
import torch.nn as nn
import numpy as np

data = np.array([[0.4,0.3,0.3],[0.3,0.4,0.3],[0.5,0.2,0.3],[0.8,0.1,0.1]])
target = np.array([0,1,0,2])
data = torch.tensor(data)
target = torch.LongTensor(target)

# softmax
soft_input = torch.nn.Softmax(dim=1)(data)
soft_input = torch.log(soft_input)
input = torch.log2(data)
ls=0
ls_original=0
for i, tmp_target in enumerate(target):
ls+=(-soft_input[i][tmp_target])
ls_original += (-input[i][tmp_target])
ls=ls/(i+1)
print('CE(formula):{}'.format(ls))
print('CE(show in the bolg):{}'.format(ls_original))


entroy=nn.CrossEntropyLoss()
output = entroy(data, target)
print('CE(pytorch):{}'.format(output))

執行結果:

CE(formula):1.098923805428457
CE(show in the bolg):6.965784284662087
CE(pytorch):1.098923805428457

--

--

Tommy Huang
Tommy Huang

Written by Tommy Huang

怕老了忘記這些吃飯的知識,開始寫文章記錄機器/深度學習相關內容。Medium現在有打賞功能(每篇文章最後面都有連結),如果覺得寫的文章不錯,也可以Donate給個Tipping吧。黃志勝 Chih-Sheng Huang (Tommy), mail: chih.sheng.huang821@gmail.com

No responses yet