神經網路基礎部件-損失函數詳解

2023-01-14 06:02:07

一,損失函數概述

大多數深度學習演演算法都會涉及某種形式的優化,所謂優化指的是改變 \(x\) 以最小化或最大化某個函數 \(f(x)\) 的任務,我們通常以最小化 \(f(x)\) 指代大多數最佳化問題。

在機器學習中,損失函數是代價函數的一部分,而代價函數是目標函數的一種型別。

  • 損失函數loss function): 用於定義單個訓練樣本預測值與真實值之間的誤差
  • 代價函數cost function): 用於定義單個批次/整個訓練集樣本預測值與真實值之間的累計誤差。
  • 目標函數objective function): 泛指任意可以被優化的函數。

損失函數定義:損失函數是深度學習模型訓練過程中關鍵的一個組成部分,其通過前言的內容,我們知道深度學習演演算法優化的第一步首先是確定目標函數形式。

損失函數大致可分為兩種:迴歸損失(針對連續型變數)和分類損失(針對離散型變數)。

常用的減少損失函數的優化演演算法是「梯度下降法」(Gradient Descent)。

二,交叉熵函數-分類損失

交叉熵損失(Cross-Entropy Loss) 又稱為對數似然損失(Log-likelihood Loss)、對數損失,二分類時還可稱之為邏輯斯諦迴歸損失(Logistic Loss)。

2.1,交叉熵(Cross-Entropy)的由來

交叉熵損失的由來參考檔案 AI-EDU: 交叉熵損失函數

1,資訊量

資訊理論中,資訊量的表示方式:

《深度學習》(花書)中稱為自資訊(self-information) 。
在本文中,我們總是用 \(\text{log}\) 來表示自然對數,其底數\(e\)

\[I(x_j) = -\log (p(x_j)) \]

  • \(x_j\):表示一個事件
  • \(p(x_j)\):表示事件 \(x_j\) 發生的概率
  • \(I(x_j)\):資訊量,\(x_j\) 越不可能發生時,它一旦發生後的資訊量就越大

2,熵

資訊量只處理單個的輸出。我們可以用熵(也稱夏農熵 Shannon entropy)來對整個概率分佈中的不確定性總量進行量化:

\[H(p) = - \sum_j^n p(x_j) \log (p(x_j)) \]

則上面的問題的熵是:

\[\begin{aligned} H(p)&=-[p(x_1) \ln p(x_1) + p(x_2) \ln p(x_2) + p(x_3) \ln p(x_3)] \\\ &=0.7 \times 0.36 + 0.2 \times 1.61 + 0.1 \times 2.30 \\\ &=0.804 \end{aligned} \]

3,相對熵(KL散度)

相對熵又稱 KL 散度,如果對於同一個隨機變數 \(x\) 有兩個單獨的概率分佈 \(P(x)\)\(Q(x)\),則可以使用 KL 散度(Kullback-Leibler (KL) divergence)來衡量這兩個分佈的差異,這個相當於資訊理論範疇的均方差。

KL散度的計算公式:

\[D_{KL}(p||q)=\sum_{j=1}^m p(x_j) \log {p(x_j) \over q(x_j)} \]

\(m\) 為事件的所有可能性(分類任務中對應類別數目)。\(D\) 的值越小,表示 \(q\) 分佈和 \(p\) 分佈越接近

4,交叉熵

把上述交叉熵公式變形:

\[\begin{aligned} D_{KL}(p||q)&=\sum_{j=1}^m p(x_j) \log {p(x_j)} - \sum_{j=1}^m p(x_j) \log q(x_j) \\\ &=- H(p(x)) + H(p,q) \end{aligned} \]

等式的前一部分恰巧就是 \(p\) 的熵,等式的後一部分,就是交叉熵(機器學習中 \(p\) 表示真實分佈(目標分佈),\(q\) 表示預測分佈):

\[H(p,q) =- \sum_{j=1}^m p(x_j) \log q(x_j) \]

在機器學習中,我們需要評估標籤值 \(y\) 和預測值 \(a\) 之間的差距熵(即兩個概率分佈之間的相似性),使用 KL 散度 \(D_{KL}(y||a)\) 即可,但因為樣本標籤值的分佈通常是固定的,即 \(H(a)\) 不變。因此,為了計算方便,在優化過程中,只需要關注交叉熵就可以了。所以,在機器學習中一般直接用交叉熵做損失函數來評估模型

\[loss = \sum_{j = 1}^{m}y_{j}\text{log}(a_{j}) \]

上式是單個樣本的情況,\(m\) 並不是樣本個數,而是分類個數。所以,對於批次樣本的交叉熵損失計算公式(很重要!)是:

\[J = -\frac{1}{n}\sum_{i=1}^n \sum_{j=1}^{m} y_{ij} \log a_{ij} \]

其中,\(n\) 是樣本數,\(m\) 是分類數。

公式參考文章-AI-EDU: 交叉熵損失函數,但是將樣本數改為 \(n\),類別數改為 \(m\)

有一類特殊問題,就是事件只有兩種情況發生的可能,比如「是狗」和「不是狗」,稱為 \(0/1\) 分類或二分類。對於這類問題,由於 \(m=2,y_1=1-y_2,a_1=1-a_2\),所以二分類問題的單個樣本的交叉熵可以簡化為:

\[loss =-[y \log a + (1-y) \log (1-a)] \]

二分類對於批次樣本的交叉熵計算公式是:

\[J= -\frac{1}{n} \sum_{i=1}^n [y_i \log a_i + (1-y_i) \log (1-a_i)] \]

為什麼交叉熵的代價函數是求均值而不是求和?
Cross entropy loss is defined as the 「expectation」 of the probability distribution of a random variable