損失函式是學習的指揮棒——記一次工作實踐

lee發表於2020-07-08

部落格:部落格園 | CSDN | blog

寫在前面

損失函式是學習的指揮棒。

前段時間有個活,讓我對定義損失函式有了新的認識,遂記錄一下。

這裡隱去具體的背景,只描述問題。

給定一個訓練集(可視為全集的有效取樣)\(X\)\(N\)個樣本,每個樣本\(x_i\)\(D\)維特徵,樣本已做歸一化處理,現希望將\(D\)維對映成1維,儘量保留樣本原有遠近關係。

PCA投影

一個直接的想法是,最大方差投影,即PCA第一主成分對應的投影向量,

  • 投影(內積),將N維對映成1維
  • 方差最大,保留儘可能多的資訊

投影后,得到的分佈如下,

方差最大方向上的投影分佈.png

分佈特點:單峰、偏斜、陡峭、長尾……

因為一些後處理操作的要求,希望投影得到的分佈儘可能對稱且均勻,能否找到更好的投影方向?

基於偏度與峰度 構建損失函式

如果採用學習的方法,待學習的引數很好定義,1個D維的投影向量,關鍵是如何構建損失函式。

我們希望投影后的分佈具有如下特點,

  • 對稱
  • 均勻
  • 方差儘可能大

顯然這是個無監督問題,令投影向量為\(p\)\(x_i\)投影后為\(y_i = p\cdot x_i\)\(y_i\)為標量,我們希望\(y_1, y_2, \dots, y_N\)的分佈具有如上特點。

在概率統計中,有兩個指標,偏度(Skewness)峰度(Kurtosis)

  • 偏度(Skewness),用於衡量隨機變數相對於平均值的對稱程度,計算方式為隨機變數的三階標準中心矩,如下,

    \[\operatorname{Skewness}[X]=\mathrm{E}\left[\left(\frac{X-\mu}{\sigma}\right)^{3}\right]=\frac{\mathrm{E}\left[(X-\mu)^{3}\right]}{\left(\mathrm{E}\left[(X-\mu)^{2}\right]\right)^{3 / 2}}=\frac{\mu_{3}}{\sigma^{3}} \]

    其值越接近0表示越對稱,負值表示長尾在左,正值表示長尾在右,如下圖所示,

    Skewness.png

  • 峰度(Kurtosis),用於衡量隨機變數分佈的集中程度,計算方式為隨機變數的四階標準中心矩,如下,

    \[\operatorname{Kurt}[X]=\mathrm{E}\left[\left(\frac{X-\mu}{\sigma}\right)^{4}\right]=\frac{\mathrm{E}\left[(X-\mu)^{4}\right]}{\left(\mathrm{E}\left[(X-\mu)^{2}\right]\right)^{2}}=\frac{\mu_{4}}{\sigma^{4}} \]

    其值越大表示越集中,標準正態分佈的峰度為3,均勻分佈的峰度為1.8。所以可以用\(\operatorname{Kurt}[X]-3\)來衡量分佈表與標準正態分佈相比是更陡峭還是平坦,如下圖所示,

    Kurtosis.png

偏度(Skewness)峰度(Kurtosis)都無量綱,在這個問題中,恰好可以用它們來構建損失函式,同時考慮方差,將損失定義如下,

\[L = \frac{1}{Std[pX]} + \lambda_1(\operatorname{Skewness}[pX])^2 + \lambda_2\operatorname{Kurt}[pX] \]

自動微分交給pytorch,

class My_loss(nn.Module):
    def __init__(self):
        super().__init__()
        
    def forward(self, x, y=None):
        mu = x.mean()
        var = x.var(unbiased=False)
        loss = lambda1 * (x - x.mean()).pow(3).mean().pow(2) / (x.var(unbiased=False).pow(3)) + lambda2 / x.std(unbiased=False) \
             + lambda3 * (x - x.mean()).pow(4).mean() / (x.var(unbiased=False).pow(2))

        return loss

訓練得到投影方向,投影后的分佈如下,與之前相比,更符合期望。

學習得到的投影分佈.png

將訓練得到的投影方向,融入整個處理流程,配合相應的後處理操作,獲得了不錯的效能提升。

小結

回到開篇的那句話,損失函式是學習的指揮棒,在構建損失函式時,要

  • 定義清楚你的期望,期望模型達成什麼目標、具有什麼性質
  • 找到合適的數學表達,來描述你的期望
  • 如果是多目標損失,協調好不同目標間的權重和組合關係

當然,還要調參(微笑)

參考

相關文章