<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何選擇合適的損失函數(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,誤差的值會(huì)增加很多。如果我們的數(shù)據(jù)中有一個(gè)離群點(diǎn),e的值將會(huì)很高,將會(huì)遠(yuǎn)遠(yuǎn)大于|e|。這將使得和以MAE為損失的模型相比,以MSE為損失的模型會(huì)賦予更高的權(quán)重給離群點(diǎn)。在上面的第二個(gè)例子中,以RMSE為損失的模型將被調(diào)整以最小化這個(gè)離群數(shù)據(jù)點(diǎn),但是卻是以犧牲其他正常數(shù)據(jù)點(diǎn)的預(yù)測效果為代價(jià),這最終會(huì)降低模型的整體性能。


          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è)問題,我們可以使用隨著接近最小值而減小的動(dòng)態(tài)學(xué)習(xí)率。MSE在這種情況下的表現(xiàn)很好,即使采用固定的學(xué)習(xí)率也會(huì)收斂。MSE損失的梯度在損失值較高時(shí)會(huì)比較大,隨著損失接近0時(shí)而下降,從而使其在訓(xùn)練結(jié)束時(shí)更加精確(參見下圖)。


          ?
          ?


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


          如果離群點(diǎn)是會(huì)影響業(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ù)的問題:可能會(huì)出現(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)樗鼤?huì)嘗試去接近中值。同樣地,以MSE為損失的模型會(huì)給出許多范圍在0到30的預(yù)測,因?yàn)樗浑x群點(diǎn)弄糊涂了。這兩種結(jié)果在許多業(yè)務(wù)中都是不可取的。


          在這種情況下怎么做?一個(gè)簡單的解決辦法是轉(zhuǎn)換目標(biāo)變量。另一種方法是嘗試不同的損失函數(shù)。這是我們的第三個(gè)損失函數(shù)——Huber Loss——被提出的動(dòng)機(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)常會(huì)遇到很大的梯度,使用梯度下降時(shí)可能導(dǎo)致訓(xùn)練結(jié)束時(shí)錯(cuò)過最小值。對于MSE,梯度會(huì)隨著損失接近最小值而降低,從而使其更加精確。


          在這種情況下,Huber Loss可能會(huì)非常有用,因?yàn)樗鼤?huì)使最小值附近彎曲,從而降低梯度。另外它比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'的作用大部分與均方誤差一樣,但不會(huì)受到偶爾出現(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是恒定的。因此會(huì)導(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é)視覺知識(shí)星球

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




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

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

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺公眾號后臺(tái)回復(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、三維視覺、傳感器自動(dòng)駕駛、計(jì)算攝影、檢測、分割、識(shí)別、醫(yī)學(xué)影像、GAN算法競賽等微信群(以后會(huì)逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會(huì)請出群,謝謝理解~


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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  翔田千里AV在线 | 久久午夜无码人妻精品蜜桃冫 | 青青草自拍偷拍 | 国产BBB| 影音先锋日韩无码 |