深度學習中常見的損失函數

2021-01-14 機器學習初學者

文章來源於AI的那些事兒,作者黃鴻波

2018年我出版了《TensorFlow進階指南 基礎、算法與應用》這本書,今天我把這本書中關於常見的損失函數這一節的內容公開出來,希望能對大家有所幫助。 


在深度學習分類任務中,我們經常會使用到損失函數,今天我們就來總結一下深度學習中常見的損失函數。



在分類問題中,可以使用函數的正負號來進行模式判斷,函數值本身大小並不重要,該函數衡量的是預測值與真實值的符號是否相同,具體形式如下所示:

 


其等價於下述函數:

 


由於0-1損失函數隻取決於正負號,是一個非凸的函數,在求解過程中,存在很多的不足,通常在實際應用中使用其替代函數。



Log損失函數是0-1損失函數的一種替代函數,其形式如下:

 

運用Log損失函數的典型分類器是logistic(邏輯)回歸算法。為什麼邏輯回歸不用平方損失呢?原因在於平方損失函數是線性回歸在假設樣本是高斯分布的條件下推導得到的(為什麼假設高斯分布?其實就是依據中心極限定理)。而邏輯回歸的推導中,它假設樣本服從於伯努利分布(0-1分布),然後求得滿足該分布的似然函數,接著求取對數等(Log損失函數中採用log就是因為求解過中使用了似然函數,為了求解方便而添加log,因為添加log並不改變其單調性)。但邏輯回歸併沒有極大化似然函數,而是轉變為最小化負的似然函數,因此有了上式。

已知邏輯函數(sigmoid函數)為:

 


可以得到邏輯回歸的Log損失函數:

 


上式的含義就是:如果y=1,我們鼓勵趨向於1,趨向於0,如果y=1,我們鼓勵也趨向於0,也趨向於0,即滿足損失函數的第二個條件,因為小於1,為了保證損失函數的非負性,即滿足第一個條件,所以添加負號。此時將其合併可得單個樣本的損失函數:

 


則全體樣本的經驗風險函數為:

該式就是sigmoid函數的交叉熵,這也是上文說的在分類問題上,交叉熵的實質是對數似然函數。在深度學習中更普遍的做法是將softmax作為最後一層,此時常用的仍是對數似然損失函數,如下所示:

其中為真時,否則為0。

該式其實是式(1)的推廣,正如softmax是sigmoid的多類別推廣一樣,在TensorFlow裡面根據最後分類函數softmax和sigmoid就分為softmax交叉熵以及sigmoid的交叉熵,並對這兩個功能進行統一封裝。

先看tf.nn.sigmoid_cross_entropy_with_logits(logits,targets)函數,它的實現和之前的交叉熵算法定義是一樣的,也是TensorFlow最早實現的交叉熵算法。這個函數的輸入是logits和targets,logits就是神經網絡模型中的W*X矩陣,注意不需要經過sigmoid,因為在函數中會對其進行sigmoid激活,而targets的shape和logtis相同,就是正確的label值。其計算過程大致如下:

 


tf.nn.softmax_cross_entropy_with_logits(logits,targets)同樣是將softmax和交叉熵計算放到一起了,但是需要注意的是,每個樣本只能屬於一個類別,即要求分類結果是互斥的,因此該函數隻適合單目標的二分類或多分類問題。補充一點,對於多分類問題,例如我們分為5類,並且將其人工編碼為0,1,2,3,4,因為輸出值是5維的特徵,因此需要人工做onehot enconding,即分別編碼為00001,00010,00100,01000,10000,才能作為該函數的輸入。理論上不做onehot encoding也可以,做成和為1的概率分布也可以,但需要保證和為1,否則TensorFlow會檢查這些參數,提醒用戶更改。

TensorFlow還提供了一個softmax_cross_entropy_with_logits的易用版本,tf.nn.sparse_softmax_cross_entropy_with_logits(),除了輸入參數不同,作用和算法實現都是一樣的。softmax_cross_entropy_with_logits的輸入必須是類似onehot encoding的多維特徵,但像CIFAR-10、ImageNet和大部分分類場景都只有一個分類目標,label值都是從0編碼的整數,每次轉成onehot encoding比較麻煩,TensorFlow為了簡化用戶操作,在該函數內部高效實現類似onehot encoding,第一個輸入函數和前面一樣,shape是[batch_size,num_classes],第二個參數以前必須也是[batch_size,num_classes]否則無法做交叉熵,而這裡將其改為[batch_size],但值必須是從0開始編碼的int32或int64,而且值的範圍是[0,num_class)。如果我們從1開始編碼或者步長大於1,則會導致某些label值超過範圍,代碼會直接報錯退出。其實如果用戶已經做了onehot encoding,那就可以不使用該函數。

還有一個函數tf.nn.weighted_cross_entropy_with_logits(),是sigmoid_cross_entropy_with_logits的拓展版,輸入和實現兩者類似,與後者相比,多支持一個pos_weight參數,目的是可以增加或減小正樣本在算交叉熵時的loss.其計算原理如下:

 


還有一個計算交叉熵的函數,sequence_loss_by_example (logits,targets,weights),用於計算所有examples(假設一句話有n個單詞,一個單詞及單詞所對應的label就是一個example,所有examples就是一句話中所有單詞)的加權交叉熵損失,logits的shape為[batch_size,num_decoder_symbols],返回值是一個1D float類型的tensor,尺寸為batch_size,其中每一個元素代表當前輸入序列example的交叉熵。另外,還有一個與之類似的函數sequence_loss,它對sequence_loss_by_example函數的返回結果進行了一個tf.reduce_sum運算。

值得一提的是,當最後分類函數是sigmoid和softmax時,不採用平方損失函數除上文中提到的樣本假設分布不同外,還有一個原因是如果採用平方損失函數,則模型權重更新非常慢,假設採用平方損失函數如下式所示:

採用梯度下降算法調整參數的話,則有

 


 

可知w和b的梯度跟激活函數的梯度成正比,但是因為sigmoid的性質,導致在z取大部分值時都會很小,這樣導致w和b更新非常慢,如圖所示。

 

而如果採用交叉熵或者說對數損失函數,則參數更新梯度變為:

 

 

可以看到,沒有這一項,權重的更新受誤差影響,誤差越大權重更新越快,誤差越小權重更新就慢,這是一個很好的性質。

為什麼一開始我們說log損失函數也是0-1損失函數的一種替代函數,因為log損失函數其實也等價於如下形式:

 





Hinge損失函數也是0-1函數的替代函數,具體形式如下:

 

對可能的輸出和分類器預測值, 預測值的損失就是上式。運用Hinge損失函數的典型分類器是SVM算法,。可以看出當和y同符號時,意味著hinge loss為0,但是如果它們的符號相反, 則會根據線性增加。



具體形式如下:

這也是0-1函數的一種替代函數,主要用於AdaBoost算法。



這也是0-1函數的一種替代函數,具體形式如下:

運用感知機損失的典型分類器是感知機算法,感知機算法只需對每個樣本判斷其是否分類正確,只記錄分類錯誤的樣本,類似hinge損失,不同之處在於,hinge損失對判定邊界附近的點的懲罰力度較高,而感知損失只要樣本的類別判定正確即可,而不需要其離判別邊界的距離,這樣的變化使得其比hinge損失簡單,但是泛化能力沒有hinge損失強。

這幾種損失函數形式如下,可以看出,除了0-1函數,其他函數都可認為是0-1函數的替代函數,目的在於使函數更平滑,提高計算性,如圖所示。

 




具體形式為:

 

平方損失函數較多應用於回歸任務,它假設樣本和噪聲都是服從高斯分布的,是連續的。它有幾個特點:計算簡單方便;歐式距離是一種很好的相似度度量標準;在不同的表示域變換後特徵性質不變。因此平方損失函數也是一種應用較多的形式。

在TensorFlow中計算平方損失,一般採用tf.pow(x,y),其返回值是x^y。舉例來說:


loss = tf.reduce_mean(tf.pow(y-y_, 2))




具體形式為:

 


絕對值損失函數與平方損失函數類似,不同之處在於平方損失函數更平滑,計算更簡便,因此實際應用中更多地使用平方損失函數。

以上主要講了損失函數的常見形式,在神經網絡中應用較多的是對數損失函數(交叉熵)和平方損失函數。可以看出,損失函數的選擇與模型是密切相關的,如果是square loss,就是最小二乘了,如果是hinge loss,就是SVM了;如果是exp-loss,那就是boosting了;如果是log loss,那就是logistic regression了,等等。不同的loss函數,具有不同的擬合特性,就需要具體問題具體分析。



Tensorflow不僅支持經典的損失函數,還可以優化任意的自定義損失函數。自定義的損失函數原則上滿足上文中講的兩個條件即可。TensorFlow提供了很多計算函數,基本可以滿足自定義損失函數可能會用到的計算操作。舉例來說,預測商品銷量時,假設商品成本為1元,銷售價為10,如果預測少一個,意味著少掙9元,但預測多一個,意味只損失1元,希望利潤最大化,因此損失函數不能採用均方誤差,需要自定義損失函數,定義如下:

 

在TensorFlow中可以這樣定義:其中tf.greater()用於比較輸入兩個張量每個元素的大小,並返回比較結果。Tf.select()會根據第一個輸入是否為true,來選擇第二個參數,還是第三個參數,類似三目運算符。


loss=tf.reduce_sum(tf.select(tf.greater(v1,v2),a*(v1-v2),b*(v2-v1)))

本站qq群1003271085,加入微信群請回復「加群

獲取一折本站知識星球優惠券,複製連結直接打開:

https://t.zsxq.com/yFQV7am

喜歡文章,點個在看



相關焦點

  • 深度人臉識別中不同損失函數的性能對比
    選自arXiv作者:Y Srivastava、V Murali、S R Dubey機器之心編譯參與:路、淑婷人臉識別是當前手機設備中使用最廣泛的生物識別特徵之一。而損失函數在訓練用於人臉識別的 CNN 過程中有重要作用。因此,本文對用於人臉識別的多種損失函數進行了性能對比。
  • 乾貨|不同的損失函數會對深度神經網絡帶來什麼樣的影響?
    二次損失函數會在神經元犯了明顯錯誤的情況下使得網絡學習緩慢,而使用交叉熵損失函數則會在明顯犯錯的時候學的更快。 今天,我們主要來談談不同的損失函數會對深度神經網絡帶來什麼樣的影響?
  • 入門| 機器學習中常用的損失函數你知多少?
    選自towards data science作者:Ravindra Parmar機器之心編譯參與:李詩萌、王淑婷本文作者將常用的損失函數分為了兩大類:分類和回歸。然後又分別對這兩類進行了細分和講解,其中回歸中包含了一種不太常見的損失函數:平均偏差誤差,可以用來確定模型中存在正偏差還是負偏差。
  • 通過對抗損失函數來降低對抗損失函數的效用
    該文將進一步通過對抗損失函數來降低對抗損失函數的效用,並且使用優化ranknet-2模型實現對抗損失函數。同時將softmax函數映射到了循環網絡中,即將損失函數映射到了dnn整體和用戶的得分之間的差值之間的回歸梯度,增強網絡網絡的泛化能力。
  • 【機器學習基礎】常見二分類損失函數、距離度量的 Python 實現
    在二維和三維空間中的歐氏距離就是兩點之間的實際距離。def manhattan(x, y):    return np.sum(np.abs(x - y))3.切比雪夫距離(Chebyshev distance) 在數學中,切比雪夫距離(Chebyshev distance)或是L∞度量,是向量空間中的一種度量
  • 【機器學習基礎】常見二分類損失函數、距離度量的Python實現
    在二維和三維空間中的歐氏距離就是兩點之間的實際距離。def manhattan(x, y):    return np.sum(np.abs(x - y))3.切比雪夫距離(Chebyshev distance) 在數學中,切比雪夫距離(Chebyshev distance)或是L∞度量,是向量空間中的一種度量
  • Facebook 開源 3D 深度學習函數庫 PyTorch3D
    原標題:Facebook開源3D深度學習函數庫PyTorch3D來源:開源中國Facebook近日開源了將PyTorch用於3D深度學習的函數庫PyTorch3D,這是一個高度模塊化且經過優化的庫,具備獨有的功能,旨在通過PyTorch簡化3D深度學習。
  • 深度學習與統計力學(I) :深度學習中的基礎理論問題
    系列預告深度學習統計力學(I) :深度學習中的基礎理論問題深度學習統計力學(IV) :深層網絡的信號傳播和初始化深度學習統計力學(VI) :通過概率模型進行「深度想像」1 介紹深層神經網絡具有多個隱含層[1],在許多領域都取得了顯著的成功,從機器視覺[2]、語音識別[3]、自然語言處理[4]、強化學習[5],到神經科學[6、7]、心理學[8、
  • 機器學習算法中的7個損失函數的詳細指南
    當然是有的,簡而言之,機器學習中損失函數可以解決以上問題。損失函數是我們喜歡使用的機器學習算法的核心。但大多數初學者和愛好者不清楚如何以及在何處使用它們。它們並不難理解,反而可以增強你對機器學習算法的理解。那麼,什麼是損失函數,你如何理解它們的意義?
  • 「深度學習」通過學習勢能函數實現蛋白質的結構預測
    深度神經網絡(DNN)近期在蛋白質結構預測方面展現出了優異的表現,該領域常用的方法包括(1)胺基酸殘基間距預測(參考:AlphaFold開啟了新方向嗎)以及(2)相鄰殘基間的扭轉角預測(參考:最新蛋白結構預測模型-循環幾何網絡RGN),這些方法在往期的推送中都有所涉及。
  • Python機器學習算法中的7個損失函數的詳細指南
    當然是有的,簡而言之,機器學習中損失函數可以解決以上問題。損失函數是我們喜歡使用的機器學習算法的核心。但大多數初學者和愛好者不清楚如何以及在何處使用它們。它們並不難理解,反而可以增強你對機器學習算法的理解。那麼,什麼是損失函數,你如何理解它們的意義?在本文中,我將討論機器學習中使用的7種常見損失函數,並解釋每種函數的使用方法。
  • 在深度學習中對正則化的直觀認識
    這種現象在神經網絡學習中尤為普遍——學習能力越強,記憶的可能性就越大,這取決於我們這些實踐者如何引導深度學習模型來吸收我們的問題,而不是我們的數據。你們中的許多人在過去都曾遇到過這些方法,並且可能已經對不同的正則化方法如何影響結果形成了自己的直觀認識。為你們中那些不知道的人(甚至為那些知道的人!)本文為正則化神經網絡參數的形成提供了直觀的指導。
  • 【機器學習基礎】用Python畫出幾種常見機器學習二分類損失函數
    在二分類的監督學習中,支持向量機、邏輯斯諦回歸與最大熵模型、提升方法各自使用合頁損失函數、邏輯斯諦損失函數、指數損失函數,分別寫為:
  • 深度學習中的NumPy基礎
    由於 NumPy 函數是在 C 中實現的,除了使執行速度更快,還使 NumPy 能夠分解大型作業並並行執行多個作業。深度學習涉及處理大型數據集,當處理大型數據集時,NumPy 數組是一種有效的技術。有幾種不同的方法可以創建 NumPy 數組,一種簡單的方法是使用 array()函數創建它們。
  • 人工智慧系列(六) 深度學習中的神經網絡
    原力君在系列的第五篇《人工智慧系列(五) 深度學習簡介》中提到深度學習可以看作是一種更高級的函數擬合方法;人工神經網絡、激活函數、代價函數、梯度下降、反向傳播是深度學習的幾個關鍵點;常見的深度學習神經網絡結構有多層感知機、DNN、CNN、RNN等。
  • 深入理解深度學習中的激活函數
    導讀數字邏輯電路中的門電路可以讓滿足不同條件的輸入信號輸出開(1)或關(0)輸出。這體現在機器學習中感知機的性質。但我們也知道感知機有個局限性,即無法單層表示非線性變化,而神經網絡往往通過激活函數用來表示非線性變化。即激活函數的作用就是引入非線性。
  • 機器學習中常用的5種回歸損失函數
    「損失函數」是機器學習優化中至關重要的一部分。L1、L2損失函數相信大多數人都早已不陌生。
  • 深度學習變革視覺實例搜索
    這對實例搜索非常有意義,因為目標物體可以伴隨著幾何變換出現圖像中的任何區域。在早期的工作中,很多實例搜索方法採用的是SIFT特徵。2. 特徵編碼。對局部特徵進一步地編碼有兩方面的意義:挖掘這些局部特徵之間的相關信息,增強可判別能力;單一緊湊的特徵向量更易於實現索引,提高搜索速度。
  • 揭秘深度學習成功的數學原因:從全局最優性到學習表徵不變性
    信息瓶頸損失可重寫為交叉熵項的總和,這正是深度學習中最常用的損失,帶有一個額外的正則化項。後者可通過在學習表徵中引入類似自適應 dropout 噪聲的噪聲來實現 [17]。優化訓練神經網絡的經典方法是使用反向傳播最小化(正則化)損失 [19],它是一種專門用於神經網絡的梯度下降方法。反向傳播的現代版本依靠隨機梯度下降(SGD)來高效近似海量數據集的梯度。雖然 SGD 僅用於嚴格分析凸損失函數 [20],但在深度學習中,損失函數是網絡參數的非凸函數,因此無法保證 SGD 能夠找到全局最小值。
  • 人工智慧-深度學習-激活函數ReLU,Sigmoid,TanH,ELU,MaxOut
    激活函數:在多層神經網絡中,上層節點的輸出和下層節點的輸入之間具有一個函數關係,這個函數稱為激活函數(又稱激勵函數)激活函數的本質:激活函數是來向神經網絡中引入非線性因素的,通過激活函數,神經網絡就可以擬合各種曲線。