1. 如何選擇合適的損失函數(shù),請看......

        共 6900字,需瀏覽 14分鐘

         ·

        2022-08-08 19:59


        點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

        重磅干貨,第一時(shí)間送達(dá)

        機(jī)器學(xué)習(xí)中的所有算法都依賴于最小化或最大化某一個(gè)函數(shù),我們稱之為“目標(biāo)函數(shù)”。最小化的這組函數(shù)被稱為“損失函數(shù)”。損失函數(shù)是衡量預(yù)測模型預(yù)測期望結(jié)果表現(xiàn)的指標(biāo)。尋找函數(shù)最小值的最常用方法是“梯度下降”。把損失函數(shù)想象成起伏的山脈,梯度下降就像從山頂滑下,目的是到達(dá)山脈的最低點(diǎn)。


        沒有一個(gè)損失函數(shù)可以適用于所有類型的數(shù)據(jù)。損失函數(shù)的選擇取決于許多因素,包括是否有離群點(diǎn),機(jī)器學(xué)習(xí)算法的選擇,運(yùn)行梯度下降的時(shí)間效率,是否易于找到函數(shù)的導(dǎo)數(shù),以及預(yù)測結(jié)果的置信度。這個(gè)博客的目的是幫助你了解不同的損失函數(shù)


        損失函數(shù)可以大致分為兩類:分類損失(Classification Loss)和回歸損失(Regression Loss)。下面這篇博文,就將重點(diǎn)介紹5種回歸損失。
        ?
        回歸函數(shù)預(yù)測實(shí)數(shù)值,分類函數(shù)預(yù)測標(biāo)簽

         


        ▌回歸損失


        1、均方誤差,二次損失,L2損失(Mean Square Error, Quadratic Loss, L2 Loss)


        均方誤差(MSE)是最常用的回歸損失函數(shù)。MSE是目標(biāo)變量與預(yù)測值之間距離平方之和。
        ??


        下面是一個(gè)MSE函數(shù)的圖,其中真實(shí)目標(biāo)值為100,預(yù)測值在-10,000至10,000之間。預(yù)測值(X軸)= 100時(shí),MSE損失(Y軸)達(dá)到其最小值。損失范圍為0至∞。


        ?
        ?
        MSE損失(Y軸)與預(yù)測值(X軸)關(guān)系圖


        2、平均絕對誤差,L1損失(Mean Absolute Error, L1 Loss)


        平均絕對誤差(MAE)是另一種用于回歸模型的損失函數(shù)。MAE是目標(biāo)變量和預(yù)測變量之間差異絕對值之和。因此,它在一組預(yù)測中衡量誤差的平均大小,而不考慮誤差的方向。(如果我們也考慮方向,那將被稱為平均偏差(Mean Bias Error, MBE),它是殘差或誤差之和)。損失范圍也是0到∞。
        ??
        ?
        ?
        MAE損失(Y軸)與預(yù)測值(X軸)關(guān)系圖


        3、MSE vs MAE (L2損失 vs L1損失)


        簡而言之, 使用平方誤差更容易求解,但使用絕對誤差對離群點(diǎn)更加魯棒。但是,知其然更要知其所以然!


        每當(dāng)我們訓(xùn)練機(jī)器學(xué)習(xí)模型時(shí),我們的目標(biāo)就是找到最小化損失函數(shù)的點(diǎn)。當(dāng)然,當(dāng)預(yù)測值正好等于真實(shí)值時(shí),這兩個(gè)損失函數(shù)都達(dá)到最小值。


        下面讓我們快速過一遍兩個(gè)損失函數(shù)的Python代碼。我們可以編寫自己的函數(shù)或使用sklearn的內(nèi)置度量函數(shù):



        true:真正的目標(biāo)變量數(shù)組
        #pred:預(yù)測數(shù)組
        **
        def mse(true, pred):
           return np.sum(((true – pred)**2))
           **
        def mae(true, pred):
           return np.sum(np.abs(true – pred))
        **
        #也可以在sklearn中使用
        **
        from sklearn.metrics import mean_squared_error
        from sklearn.metrics import mean_absolute_error

        讓我們來看看兩個(gè)例子的MAE值和RMSE值(RMSE,Root Mean Square Error,均方根誤差,它只是MSE的平方根,使其與MAE的數(shù)值范圍相同)。在第一個(gè)例子中,預(yù)測值接近真實(shí)值,觀測值之間誤差的方差較小。第二個(gè)例子中,有一個(gè)異常觀測值,誤差很高。


        左:誤差彼此接近  右:有一個(gè)誤差和其他誤差相差很遠(yuǎn)


        我們從中觀察到什么?我們該如何選擇使用哪種損失函數(shù)?
        ?
        由于MSE對誤差(e)進(jìn)行平方操作(y - y_predicted = e),如果e> 1,誤差的值會增加很多。如果我們的數(shù)據(jù)中有一個(gè)離群點(diǎn),e的值將會很高,將會遠(yuǎn)遠(yuǎn)大于|e|。這將使得和以MAE為損失的模型相比,以MSE為損失的模型會賦予更高的權(quán)重給離群點(diǎn)。在上面的第二個(gè)例子中,以RMSE為損失的模型將被調(diào)整以最小化這個(gè)離群數(shù)據(jù)點(diǎn),但是卻是以犧牲其他正常數(shù)據(jù)點(diǎn)的預(yù)測效果為代價(jià),這最終會降低模型的整體性能。


        MAE損失適用于訓(xùn)練數(shù)據(jù)被離群點(diǎn)損壞的時(shí)候(即,在訓(xùn)練數(shù)據(jù)而非測試數(shù)據(jù)中,我們錯(cuò)誤地獲得了不切實(shí)際的過大正值或負(fù)值)。


        直觀來說,我們可以像這樣考慮:對所有的觀測數(shù)據(jù),如果我們只給一個(gè)預(yù)測結(jié)果來最小化MSE,那么該預(yù)測值應(yīng)該是所有目標(biāo)值的均值。但是如果我們試圖最小化MAE,那么這個(gè)預(yù)測就是所有目標(biāo)值的中位數(shù)。我們知道中位數(shù)對于離群點(diǎn)比平均值更魯棒,這使得MAE比MSE更加魯棒。


        使用MAE損失(特別是對于神經(jīng)網(wǎng)絡(luò))的一個(gè)大問題是它的梯度始終是相同的,這意味著即使對于小的損失值,其梯度也是大的。這對模型的學(xué)習(xí)可不好。為了解決這個(gè)問題,我們可以使用隨著接近最小值而減小的動態(tài)學(xué)習(xí)率。MSE在這種情況下的表現(xiàn)很好,即使采用固定的學(xué)習(xí)率也會收斂。MSE損失的梯度在損失值較高時(shí)會比較大,隨著損失接近0時(shí)而下降,從而使其在訓(xùn)練結(jié)束時(shí)更加精確(參見下圖)。


        ?
        ?


        決定使用哪種損失函數(shù)?


        如果離群點(diǎn)是會影響業(yè)務(wù)、而且是應(yīng)該被檢測到的異常值,那么我們應(yīng)該使用MSE。另一方面,如果我們認(rèn)為離群點(diǎn)僅僅代表數(shù)據(jù)損壞,那么我們應(yīng)該選擇MAE作為損失。


        我建議閱讀下面這篇文章,其中有一項(xiàng)很好的研究,比較了在存在和不存在離群點(diǎn)的情況下使用L1損失和L2損失的回歸模型的性能。請記住,L1和L2損失分別是MAE和MSE的另一個(gè)名稱而已。


        地址:
        http://rishy.github.io/ml/2015/07/28/l1-vs-l2-loss/


        L1損失對異常值更加穩(wěn)健,但其導(dǎo)數(shù)并不連續(xù),因此求解效率很低。L2損失對異常值敏感,但給出了更穩(wěn)定的閉式解(closed form solution)(通過將其導(dǎo)數(shù)設(shè)置為0)


        兩種損失函數(shù)的問題:可能會出現(xiàn)這樣的情況,即任何一種損失函數(shù)都不能給出理想的預(yù)測。例如,如果我們數(shù)據(jù)中90%的觀測數(shù)據(jù)的真實(shí)目標(biāo)值是150,其余10%的真實(shí)目標(biāo)值在0-30之間。那么,一個(gè)以MAE為損失的模型可能對所有觀測數(shù)據(jù)都預(yù)測為150,而忽略10%的離群情況,因?yàn)樗鼤L試去接近中值。同樣地,以MSE為損失的模型會給出許多范圍在0到30的預(yù)測,因?yàn)樗浑x群點(diǎn)弄糊涂了。這兩種結(jié)果在許多業(yè)務(wù)中都是不可取的。


        在這種情況下怎么做?一個(gè)簡單的解決辦法是轉(zhuǎn)換目標(biāo)變量。另一種方法是嘗試不同的損失函數(shù)。這是我們的第三個(gè)損失函數(shù)——Huber Loss——被提出的動機(jī)。


        3、Huber Loss,平滑的平均絕對誤差


        Huber Loss對數(shù)據(jù)離群點(diǎn)的敏感度低于平方誤差損失。它在0處也可導(dǎo)?;旧纤墙^對誤差,當(dāng)誤差很小時(shí),誤差是二次形式的。誤差何時(shí)需要變成二次形式取決于一個(gè)超參數(shù),(delta),該超參數(shù)可以進(jìn)行微調(diào)。當(dāng)  ?? ~ 0時(shí), Huber Loss接近MAE,當(dāng)  ?? ~ ∞(很大的數(shù))時(shí),Huber Loss接近MSE。


        ??
        ?
        ?
        Huber Loss(Y軸)與預(yù)測值(X軸)關(guān)系圖。真值= 0


        delta的選擇非常重要,因?yàn)樗鼪Q定了你認(rèn)為什么數(shù)據(jù)是離群點(diǎn)。大于delta的殘差用L1最小化(對較大的離群點(diǎn)較不敏感),而小于delta的殘差則可以“很合適地”用L2最小化。


        為什么使用Huber Loss?


        使用MAE訓(xùn)練神經(jīng)網(wǎng)絡(luò)的一個(gè)大問題是經(jīng)常會遇到很大的梯度,使用梯度下降時(shí)可能導(dǎo)致訓(xùn)練結(jié)束時(shí)錯(cuò)過最小值。對于MSE,梯度會隨著損失接近最小值而降低,從而使其更加精確。


        在這種情況下,Huber Loss可能會非常有用,因?yàn)樗鼤棺钚≈蹈浇鼜澢瑥亩档吞荻?。另外它比MSE對異常值更魯棒。因此,它結(jié)合了MSE和MAE的優(yōu)良特性。但是,Huber Loss的問題是我們可能需要迭代地訓(xùn)練超參數(shù)delta。


        4、Log-Cosh Loss


        Log-cosh是用于回歸任務(wù)的另一種損失函數(shù),它比L2更加平滑。Log-cosh是預(yù)測誤差的雙曲余弦的對數(shù)。


        ?
        ?
        Log-cosh Loss(Y軸)與預(yù)測值(X軸)關(guān)系圖。真值= 0


        優(yōu)點(diǎn):log(cosh(x))對于小的x來說,其大約等于 (x ** 2) / 2,而對于大的x來說,其大約等于 abs(x) - log(2)。這意味著'logcosh'的作用大部分與均方誤差一樣,但不會受到偶爾出現(xiàn)的極端不正確預(yù)測的強(qiáng)烈影響。它具有Huber Loss的所有優(yōu)點(diǎn),和Huber Loss不同之處在于,其處處二次可導(dǎo)。


        為什么我們需要二階導(dǎo)數(shù)?許多機(jī)器學(xué)習(xí)模型的實(shí)現(xiàn)(如XGBoost)使用牛頓方法來尋找最優(yōu)解,這就是為什么需要二階導(dǎo)數(shù)(Hessian)的原因。對于像XGBoost這樣的機(jī)器學(xué)習(xí)框架,二階可導(dǎo)函數(shù)更有利。
        ?
        ?
        XGBoost中使用的目標(biāo)函數(shù)。注意其對一階和二階導(dǎo)數(shù)的依賴性。


        但Log-chsh Loss并不完美。它仍然存在梯度和Hessian問題,對于誤差很大的預(yù)測,其梯度和hessian是恒定的。因此會導(dǎo)致XGBoost中沒有分裂。


        Huber和Log-cosh損失函數(shù)的Python代碼:


        def sm_mae(true, pred, delta):
           """
           true: array of true values    
           pred: array of predicted values

           returns: smoothed mean absolute error loss
           """

           loss = np.where(np.abs(true-pred) < delta , 0.5*((true-pred)**2), delta*np.abs(true - pred) - 0.5*(delta**2))
           return np.sum(loss)

        def logcosh(true, pred):
           loss = np.log(np.cosh(pred - true))
           return np.sum(loss)


        5、Quantile Loss(分位數(shù)損失)


        在大多數(shù)真實(shí)預(yù)測問題中,我們通常想了解我們預(yù)測的不確定性。了解預(yù)測值的范圍而不僅僅是單一的預(yù)測點(diǎn)可以顯著改善許多業(yè)務(wù)問題的決策過程。


        當(dāng)我們有興趣預(yù)測一個(gè)區(qū)間而不僅僅是預(yù)測一個(gè)點(diǎn)時(shí),Quantile Loss函數(shù)就很有用。最小二乘回歸的預(yù)測區(qū)間是基于這樣一個(gè)假設(shè):殘差(y - y_hat)在獨(dú)立變量的值之間具有不變的方差。我們不能相信線性回歸模型,因?yàn)樗`反了這一假設(shè)。當(dāng)然,我們也不能僅僅認(rèn)為這種情況一般使用非線性函數(shù)或基于樹的模型就可以更好地建模,而簡單地拋棄擬合線性回歸模型作為基線的想法。這時(shí),Quantile Loss就派上用場了。因?yàn)榛赒uantile Loss的回歸模型可以提供合理的預(yù)測區(qū)間,即使是對于具有非常數(shù)方差或非正態(tài)分布的殘差亦是如此。


        讓我們看一個(gè)有效的例子,以更好地理解為什么基于Quantile Loss的回歸模型對異方差數(shù)據(jù)表現(xiàn)良好。


        Quantile 回歸 vs 普通最小二乘(Ordinary Least Square, OLS)回歸


        ?
        ?
        左:線性關(guān)系b/w X1和Y,殘差的方差恒定。右:線性關(guān)系b/w X2和Y,但Y的方差隨著X2增加而變大(異方差)。


        ?
        ?
        橙線表示兩種情況下的OLS估計(jì)


        ?
        ?
        Quantile回歸:虛線表示基于0.05和0.95 分位數(shù)損失函數(shù)的回歸估計(jì)


        如上所示的Quantile回歸代碼在下面這個(gè)notebook中。


        地址:
        https://github.com/groverpr/Machine-Learning/blob/master/notebooks/09_Quantile_Regression.ipynb


        了解Quantile Loss函數(shù)


        基于Quantile回歸的目的是,在給定預(yù)測變量的某些值時(shí),估計(jì)因變量的條件“分位數(shù)”。Quantile Loss實(shí)際上只是MAE的擴(kuò)展形式(當(dāng)分位數(shù)是第50個(gè)百分位時(shí),Quantile Loss退化為MAE)。


        Quantile Loss的思想是根據(jù)我們是打算給正誤差還是負(fù)誤差更多的值來選擇分位數(shù)數(shù)值。損失函數(shù)根據(jù)所選quantile (γ)的值對高估和低估的預(yù)測值給予不同的懲罰值。舉個(gè)例子,γ= 0.25的Quantile Loss函數(shù)給高估的預(yù)測值更多的懲罰,并試圖使預(yù)測值略低于中位數(shù)。


        ??
        γ 是給定的分位數(shù),其值介于0和1之間。


        Quantile Loss(Y軸)與預(yù)測值(X軸)關(guān)系圖。真值為Y= 0


        我們也可以使用這個(gè)損失函數(shù)來計(jì)算神經(jīng)網(wǎng)絡(luò)或基于樹的模型的預(yù)測區(qū)間。下圖是sklearn實(shí)現(xiàn)的梯度提升樹回歸。
        ?
        ?
        使用Quantile Loss的預(yù)測區(qū)間(梯度提升回歸)


        上圖顯示的是sklearn庫的GradientBoostingRegression中的quantile loss函數(shù)計(jì)算的90%預(yù)測區(qū)間。上限的計(jì)算使用了γ = 0.95,下限則是使用了γ = 0.05。


        ▌比較研究


        “Gradient boosting machines, a tutorial”中提供了一個(gè)很好的比較研究。為了演示上述所有的損失函數(shù)的性質(zhì),研究人員創(chuàng)造了一個(gè)人工數(shù)據(jù)集,數(shù)據(jù)集從sinc(x)函數(shù)中采樣,其中加入了兩種人造模擬噪聲:高斯噪聲分量和脈沖噪聲分量。脈沖噪聲項(xiàng)是用來展示結(jié)果的魯棒效果的。以下是使用不同損失函數(shù)來擬合GBM(Gradient Boosting Machine, 梯度提升回歸)的結(jié)果。


        ?
        ?


        連續(xù)損失函數(shù):(A)MSE損失函數(shù); (B)MAE損失函數(shù); (C)Huber損失函數(shù); (D)Quantile損失函數(shù)。用有噪聲的sinc(x)數(shù)據(jù)來擬合平滑GBM的示例:(E)原始sinc(x)函數(shù); (F)以MSE和MAE為損失擬合的平滑GBM; (G)以Huber Loss擬合的平滑GBM, = {4,2,1}; (H)以Quantile Loss擬合的平滑GBM。


        模擬實(shí)驗(yàn)中的一些觀察結(jié)果:


        • 以MAE為損失的模型預(yù)測較少受到脈沖噪聲的影響,而以MSE為損失的模型的預(yù)測由于脈沖噪聲造成的數(shù)據(jù)偏離而略有偏差。

        • 以Huber Loss為損失函數(shù)的模型,其預(yù)測對所選的超參數(shù)不太敏感。

        • Quantile Loss對相應(yīng)的置信水平給出了很好的估計(jì)。


        一張圖畫出所有損失函數(shù)
        ?


        好消息!

        小白學(xué)視覺知識星球

        開始面向外開放啦??????




        下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
        在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

        下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
        小白學(xué)視覺公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

        下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
        小白學(xué)視覺公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

        交流群


        歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


        瀏覽 62
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 国产午夜激情视频 | 成熟少妇精油按摩在线观看 | 国产专区91在线 | 国产农村妇女三级全黄第06集在线观看 | 成人高清无码视频在线播放观看 |