寫在前面
損失函式是學習的指揮棒。
前段時間有個活,讓我對定義損失函式有了新的認識,遂記錄一下。
這裡隱去具體的背景,只描述問題。
給定一個訓練集(可視為全集的有效取樣)\(X\),\(N\)個樣本,每個樣本\(x_i\)有\(D\)維特徵,樣本已做歸一化處理,現希望將\(D\)維對映成1維,儘量保留樣本原有遠近關係。
PCA投影
一個直接的想法是,最大方差投影,即PCA第一主成分對應的投影向量,
- 投影(內積),將N維對映成1維
- 方差最大,保留儘可能多的資訊
投影后,得到的分佈如下,
分佈特點:單峰、偏斜、陡峭、長尾……
因為一些後處理操作的要求,希望投影得到的分佈儘可能對稱且均勻,能否找到更好的投影方向?
基於偏度與峰度 構建損失函式
如果採用學習的方法,待學習的引數很好定義,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表示越對稱,負值表示長尾在左,正值表示長尾在右,如下圖所示,
-
峰度(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\)來衡量分佈表與標準正態分佈相比是更陡峭還是平坦,如下圖所示,
偏度(Skewness)和峰度(Kurtosis)都無量綱,在這個問題中,恰好可以用它們來構建損失函式,同時考慮方差,將損失定義如下,
自動微分交給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
訓練得到投影方向,投影后的分佈如下,與之前相比,更符合期望。
將訓練得到的投影方向,融入整個處理流程,配合相應的後處理操作,獲得了不錯的效能提升。
小結
回到開篇的那句話,損失函式是學習的指揮棒,在構建損失函式時,要
- 定義清楚你的期望,期望模型達成什麼目標、具有什麼性質
- 找到合適的數學表達,來描述你的期望
- 如果是多目標損失,協調好不同目標間的權重和組合關係
當然,還要調參(微笑)