未定义与 struct 类型的输入参数相对应的函数 fetch_引入鲁棒性作为连续参数,这种新损失函数实现了自适应、随时变换...
編輯:陳萍
損失函數是機器學習里最基礎也是最為關鍵的一個要素,其用來評價模型的預測值和真實值不一樣的程度。最為常見的損失函數包括平方損失、指數損失、log 對數損失等損失函數。這里回顧了一種新的損失函數,通過引入魯棒性作為連續參數,該損失函數可以使圍繞最小化損失的算法得以推廣,其中損失的魯棒性在訓練過程中自動自我適應,從而提高了基于學習任務的性能。
這篇文章對 CVPR 2019 的一篇論文《A General and Adaptive Robust Loss Function》進行了回顧性綜述,主要講述了為機器學習問題開發魯棒以及自適應的損失函數。論文作者為谷歌研究院的研究科學家 Jon Barron。
論文地址:https://arxiv.org/pdf/1701.03077.pdf
異常值(Outlier)與魯棒損失
考慮到機器學習問題中最常用的誤差之一——均方誤差(Mean Squared Error, MSE),其形式為:(y-x)2。該損失函數的主要特征之一是:與小誤差相比,對大誤差的敏感性較高。并且,使用 MSE 訓練出的模型將偏向于減少最大誤差。例如,3 個單位的單一誤差與 1 個單位的 9 個誤差同等重要。
下圖為使用 Scikit-Learn 創建的示例,演示了在有 / 無異常值影響的情況下,擬合是如何在一個簡單數據集中變化的。
MSE 以及異常值的影響。
如上圖所示,包含異常值的擬合線(fit line)受到異常值的較大影響,但是優化問題應要求模型受內點(inlier)的影響更大。在這一點上,你可能認為平均絕對誤差(Mean Absolute Error, MAE)會優于 MSE,因為 MAE 對大誤差的敏感性較低。也不盡然。目前有各種類型的魯棒損失(如 MAE),對于特定問題,可能需要測試各種損失。
所以,這篇論文引入一個泛化的損失函數,其魯棒性可以改變,并且可以在訓練網絡的同時訓練這個超參數,以提升網絡性能。與網格搜索(grid-search)交叉驗證尋找最優損失函數相比,這種損失函數花費的時間更少。讓我們從下面的幾個定義開始講解:
魯棒性與自適應損失函數的一般形式:
公式 1:魯棒性損失,其中α為超參數,用來控制魯棒性。
α控制損失函數的魯棒性。c 可以看作是一個尺度參數,在 x=0 鄰域控制彎曲的尺度。由于α作為超參數,我們可以看到,對于不同的α值,損失函數有著相似的形式。
公式 2:不同α值對應不同的自適應性損失。
在α=0 和α=2 時,損失函數是未定義的,但利用極限可以實現近似。從α=2 到α=1,損失函數平穩地從 L2 損失過渡到 L1 損失。對于不同的α值,我們可以繪制不同的損失函數,如下圖 2 所示。
導數對于優化損失函數非常重要。下面研究一下這個損失函數的一階導數,我們知道,梯度優化涉及到導數。對于不同的α值,x 的導數如下所示。下圖 2 還繪制了不同α的導數和損失函數。
公式 3:魯棒損失(表達式 1)對于不同的α的值相對于 x 的導數
自適應損失及其導數
下圖對于理解此損失函數及其導數非常重要。在下圖 2 中,尺度參數 c 固定為 1.1。當 x = 6.6 時,可以將其視為 x = 6×c??梢缘贸鲆韵掠嘘P損失及其導數的推論:
1. 當 x、α和 c>0 時,損失函數是光滑的,因此適合于基于梯度的優化;
2. 損失函數總是在原點為零,并且在 | x |>0 時單調增加。損失的單調性也可以與損失的對數進行比較;
3. 損失也隨著α的增加而單調增加。此屬性對于損失函數的魯棒性很重要,因為可以從較高的α值開始,然后在優化過程中逐漸減小(平滑)以實現魯棒的估計,從而避免局部最小值;
4. 當 | x |
5. 對于α= 2,導數始終與殘差的大小成正比。通常,這是 MSE(L2)損失的特性;
6. 對于α=1(L1 損失),我們看到導數的幅度在 | x |>c 之外飽和至一個常數值(正好是 1/c)。這意味著殘差的影響永遠不會超過一個固定的量;
7. 對于αc 而減小。這意味著當殘差增加時,它對梯度的影響較小,因此異常值在梯度下降過程中的影響較小。
圖 2:損失函數及其導數與α的關系。
圖 3:自適應損失函數(左)及其導數(右)的曲面圖。
魯棒損失的實現:Pytorch 和 Google Colab
關于魯棒損失的理論掌握了,怎么實現呢?使用的代碼在 Jon Barron 的 GitHub 項目「robust_loss_pytorch」中稍加修改。此外還創建了一個動畫來描述隨著迭代次數的增加,自適應損失如何找到最佳擬合線。
GitHub 地址:https://github.com/jonbarron/arom_loss_pytorch
不需要克隆存儲庫,我們可以使用 Colab 中的 pip 在本地安裝它。
此外還創建了一個簡單的線性數據集,包括正態分布的噪聲和異常值。
首先,由于使用了 Pythorch 庫,利用 torch 將 x, y 的 numpy 數組轉換為張量。
其次,使用 pytorch 模塊定義線性回歸類,如下所示:
接下來,用線性回歸模型擬合自創建的線性數據集,首先使用損失函數的一般形式。這里使用一個固定值α(α=2.0),它在整個優化過程中保持不變。正如在α=2.0 時看到的,損失函數等效 L2 損失,這對于包括異常值在內的問題不是最優的。對于優化,使用學習率為 0.01 的 Adam 優化器。
利用魯棒損失函數的一般形式和固定α值,可以得到擬合線。原始數據、真直線(生成數據點時使用的具有相同斜率和偏差的線,排除異常值)和擬合線如下圖 4 所示:
圖 4:一般損失函數
損失函數的一般形式不允許α發生變化,因此必須手動微調α參數或執行網格搜索進行微調。
此外,正如上圖所示,由于使用了 L2 損失,擬合受到異常值的影響。這是一般的情況,但如果使用損失函數的自適應版本,會發生什么呢?調用自適應損失模塊,并初始化α,讓α在每個迭代步驟中自適應。
此外,還有一些額外的代碼使用 celluloid 模塊,見下圖 5。在這里,可以清楚地看到,隨著迭代次數的增加,自適應損失如何找到最佳擬合線。這個結果接近真實的線,對于異常值的影響可以忽略不計。
圖 5:自適應損失函數如何達到最佳擬合的動畫。
總結
以上是生活随笔為你收集整理的未定义与 struct 类型的输入参数相对应的函数 fetch_引入鲁棒性作为连续参数,这种新损失函数实现了自适应、随时变换...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下降通道股票如何做t?
- 下一篇: rect函数_R函数不会写,quot;抄