交叉熵
分類問題常用的損失函數為交叉熵(Cross Entropy Loss)。
交叉熵描述了兩個概率分布之間的距離,交叉熵越小說明兩者之間越接近。
原理這篇博客介紹的簡單清晰:
https://blog.csdn.net/xg123321123/article/details/52864830
總結: 熵是信息量的期望值,它是一個隨機變量的確定性的度量。
熵越大,變量的取值越不確定;反之,熵越小,變量取值就越確定。
熵與概率的關系如圖:
盡管交叉熵刻畫的是兩個概率分布之間的距離,但是神經網絡的輸出卻不一定是一個概率分布。為此我們常常用Softmax回歸將神經網絡前向傳播得到的結果變成概率分布。
總之
在分類問題中用交叉熵可以更好的體現loss的同時,使其仍然是個凸函數,這對於梯度下降時的搜索很有用。
反觀平方和函數,經過softmax后使得函數是一個非凸函數。
分類問題用 One Hot Label + Cross Entropy Loss
Training 過程,分類問題用 Cross Entropy Loss,回歸問題用 Mean Squared Error。
validation / testing 過程,使用 Classification Error更直觀,也正是我們最為關注的指標。
代碼
class CrossEntropy2d(nn.Module):
def __init__(self):
super(CrossEntropy2d, self).__init__()
self.criterion = nn.CrossEntropyLoss(weight=None, size_average=True)
def forward(self, out, target):
n, c, h, w = out.size() # n:batch_size, c:class
out = out.view(-1, c) # (n*h*w, c)
target = target.view(-1) # (n*h*w)
# print('out', out.size(), 'target', target.size())
loss = self.criterion(out, target)
return loss
# 調用方式
criterion = loss.CrossEntropy2d()
loss = criterion(out, labels)