深度學習之損失函數小結


在深度學習中,損失函數扮演着至關重要的角色。通過對最小化損失函數,使模型達到收斂狀態,減少模型預測值的誤差。因此,不同的損失函數,對模型的影響是重大的。接下來,總結一下,在工作中經常用到的損失函數:

  • 圖像分類:交叉熵
  • 目標檢測:Focal loss,L1/L2損失函數,IOU Loss,GIOU ,DIOU,CIOU
  • 圖像識別:Triplet Loss,Center Loss,Sphereface,Cosface,Arcface

圖像分類

交叉熵

在圖像分類中,經常使用softmax+交叉熵作為損失函數,具體的推導可以參考我以前的博客

$$Cross Entropy=-\sum_{i=1}^{n}p(x_i)ln(q(x_i))$$

其中,$p(x)$表示真實概率分布,$q(x)$表示預測概率分布。交叉熵損失函數通過縮小兩個概率分布的差異,來使預測概率分布盡可能達到真實概率分布。

后來,谷歌在交叉熵的基礎上,提出了label smoothing(標簽平滑),具體介紹,可以參考這篇博客

在實際中,需要用預測概率去擬合真實概率,而擬合one-hot的真實概率函數會帶來兩個問題:

  1. 無法保證模型的泛化能力,容易造成過擬合;
  2. 全概率和0概率鼓勵所屬類別和其他類別之間的差距盡可能加大,而由梯度有界可知,這種情況很難adapt,會造成模型過於相信預測的類別。

因此,為了減少這種過於自信,同時減緩人為標注的誤差帶來的影響,需要對$p(x)$進行變化:

$$p'{(x)}=(1-\epsilon )\delta _{(k,y)}+\epsilon u(k)$$

其中,$\delta _{(k,y)}$為Dirac函數,$u(k)$為均勻分布。簡單而言,降低標簽y的置信度,提高其余類別的置信度。從而,交叉熵變成了:

$$H(p',q)=-\sum_{i=1}^{n}p'(x_i)ln(q(x_i))=(1-\epsilon )H(p,q)+\epsilon H(p,u)$$

 


目標檢測

最近,看到一篇很好的博文,是介紹目標檢測中的損失函數的,可以參考一下:https://mp.weixin.qq.com/s/ZbryNlV3EnODofKs2d01RA

在目標檢測中,損失函數一般由兩部分組成,classification loss和bounding box regression loss。calssification loss的目的是使類別分類盡可能正確;bounding box regression loss的目的是使預測框盡可能與GT框匹對上。

Focal loss

該Focal loss損失函數出自於論文《Focal Loss for Dense Object Detection》,主要是解決正負樣本之間的不平衡問題。通過降低easy example中的損失值,間接提高了hard example中損失值的權重。Focal loss是基於交叉熵進行改進的:

$$Focal loss=-\alpha _t(1-p_t)^\gamma log(p_t)$$

可以看到,在交叉熵前增加了$(1-p_t)^\gamma $,當圖片被錯分時,$p_t$會很小,$(1-p_t)$接近於1,所以損失受到的影響不大;而增加參數$\gamma $是為了平滑降低esay example的權重。當$\gamma =0$時,Focal loss退化成交叉熵。對於不同的$\gamma $,其影響如下圖所示。

 

 L1,L2,smooth L1損失函數

利用L1,L2或者smooth L1損失函數,來對4個坐標值進行回歸。smooth L1損失函數是在Fast R-CNN中提出的。三個損失函數,如下所示:

$$L1=\left | x \right |$$

$$L2=x^{2}$$

$$smoothL1=\left\{\begin{matrix} 0.5x^2\qquad if\left |x \right |<1\\  \left |x \right |-0.5 \qquad otherwise \end{matrix}\right.$$

從損失函數對x的導數可知:$L1$損失函數對x的導數為常數,在訓練后期,x很小時,如果learning rate 不變,損失函數會在穩定值附近波動,很難收斂到更高的精度。$L2$損失函數對x的導數在x值很大時,其導數也非常大,在訓練初期不穩定。smooth L1完美的避開了$L1$和$L2$損失的缺點。

 在一般的目標檢測中,通常是計算4個坐標值與GT框之間的差異,然后將這4個loss進行相加,構成regression loss。

但使用上述的3個損失函數,會存在以下的不足:

  • 上面的三種Loss用於計算目標檢測的Bounding Box Loss時,獨立的求出4個點的Loss,然后進行相加得到最終的Bounding Box Loss,這種做法的假設是4個點是相互獨立的,實際是有一定相關性的;
  • 實際評價框檢測的指標是使用IOU,這兩者是不等價的,多個檢測框可能有相同大小的Loss,但IOU可能差異很大,為了解決這個問題就引入了IOU LOSS

 IOU Loss

該IOU Loss是曠視在2016年提出的《UnitBox: An Advanced Object Detection Network》。該論文的主要觀點之一是:

  • 使用基於歐式距離的L-n損失函數,其前提是假設4個坐標變量都是獨立的,但實際上,這些坐標變量是具有一定的關聯性。
  • 評價指標使用了IOU,而回歸坐標框又使用4個坐標變量,這兩者是不等價的。
  • 具有相同的歐式距離的框,其IOU值卻不是唯一的。

所以,提出了IOU loss,直接使用IOU作為損失函數:

$$Loss_{IOU}=-ln(IOU)$$

同時,也會有人使用的是:

$$Loss_{IOU}=1-IOU$$

GIOU

該GIOU Loss損失函數是斯坦福於2019年提出的《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression》。在上面的IOU Loss中,無法對兩個不重疊的框進行優化,而且IOU Loss無法反映出兩個框到底距離有多遠。為了解決這個問題,作者提了GIOU來作為損失函數:

$$GIOU=IOU-\frac{C-(A\bigcup B)}{C}$$

其中,$C$表示兩個框的最小外接矩陣面積。即先求出兩個框的IOU,然后求出外接矩陣C的面積,減去A與B的面積。最終得到GIOU的值。

 

GIOU具有以下的性質:

  • GIOU可以作為一種衡量距離的方式,$Loss_{GIOU}=1-GIOU$
  • GIOU具有尺度不變性
  • GIOU是IOU的下限,$GIOU(A,B)\leq IOU(A,B)$。當矩形框A、B類似時,$\lim_{A\rightarrow B}GIOU(A,B)=IOU(A,B)$
  • 當矩形框A、B重疊時,$GIOU(A,B)=IOU(A,B)$
  • 當矩形框A、B不相交時,$GIOU(A,B)=-1$

總的來說,GIOU包含了IOU所有的優點,同時克服了IOU的不足。

DIOU和CIOU

DIOU和CIOU是天津大學於2019年提出的《Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression》。為了解決GIOU收斂慢和提高回歸精度,提出DIOU來加速收斂。同時考慮到框回歸的3個幾何因素(重疊區域,中心點距離,寬高比),基於DIOU,再次提出CIOU,進一步提高收斂速度和回歸精度。另外,可以將DIOU結合NMS組成DIOU-NMS,來對預測框進行后處理。

當出現下圖的情況(GT框完全包含預測框)時,IOU與GIOU的值相同,此時GIOU會退化成IOU,無法區分其相對位置關系。同時由於嚴重依賴於IOU項,GIOU會致使收斂慢。

 基於上述問題,作者提出兩個問題

 

  1. 直接最小化預測框與目標框之間的歸一化距離是否可行,以達到更快的收斂速度。
  2. 如何使回歸在與目標框有重疊甚至包含時更准確、更快

好的目標框回歸損失應該考慮三個重要的幾何因素:重疊面積,中心點距離,長寬比。基於問題一,作者提出了DIoU Loss,相對於GIoU Loss收斂速度更快,該Loss考慮了重疊面積和中心點距離,但沒有考慮到長寬比;針對問題二,作者提出了CIoU Loss,其收斂的精度更高,以上三個因素都考慮到了。

 

首先,定義一下基於IOU Loss的損失函數:

$$Loss=1-IOU+R(B,B^{gt})$$

其中,$R(B,B^{gt})$表示預測框與GT框的懲罰項。在IOU Loss中,$R(B,B^{gt})=0$;在GIOU中,$R(B,B^{gt})=\frac{C-A\bigcup B}{C}$。

而在DIOU中,該懲罰項$R(B,B^{GT})=\frac{\rho ^2(b,b^{gt})}{c^2}$,其中$b$和$b^{gt}$表示預測框與GT框的中心點,$\rho ()$表示歐式距離,$c$表示預測框$B$與GT框$B^{gt}$的最小外接矩陣的對角線距離,如下圖所示。

因此,$Loss_{DIOU}$定義為:

$$Loss_{GIOU}=1-IOU+\frac{\rho ^2(b,b^{gt})}{c^2}$$

所以,$Loss_{DIOU}$具有如下性質:

  1. DIOU依然具有尺度不變性;
  2. DIOU直接最小化兩個框的距離,因此收斂會更快;
  3. 對於目標框包裹預測框的這種情況,DIoU Loss可以收斂的很快,而GIoU Loss此時退化為IoU Loss收斂速度較慢

DIOU同時考慮了重疊面積和中心點之間的距離,但是沒有考慮到寬高比。進一步提出了CIOU,同時考慮了這3個因素,在DIOU的懲罰項中加入了$\alpha \upsilon $:

$$R(B,B^{gt})=R_{CIOU}=\frac{\rho ^2(b,b^{gt})}{c^2}+\alpha \upsilon $$

其中,$\alpha $表示trade-off參數,$\upsilon $表示寬高比一致性參數。

$$\upsilon =\frac{4}{\pi ^2}\left ( arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h} \right )^2$$

$$\alpha =\frac{\upsilon }{(1-IOU)+\upsilon }$$

這里的$\upsilon $為什么會有$\frac{4}{\pi ^2}$呢?這里$arctan$的范圍是$[0,\frac{\pi }{2})$。

所以,CIOU的損失函數為:

$$Loss_{CIOU}=1-IOU+\frac{\rho ^2(b,b^{gt})}{c^2}+\alpha \upsilon $$

而在實際操作中,$w^2+h^2$是很小的數字,在后向傳播時,容易造成梯度爆炸。通常用1來代替$w^2+h^2$。

另外,提醒一點的是,GIOU、CIOU、DIOU都是衡量方式,在使用時可以代替IOU。但是這里需要考慮的一個問題是,預測框與GT框的匹配規則問題。並不是說anchor一定會去匹配一個不重疊的GT框。類似於SSD中所說,anchor會選擇一個重疊最大的GT框進行預測,而這個重疊最大可以使用IOU、GIOU、CIOU、DIOU來進行衡量。

 


圖像識別

圖像識別問題,包含了行人重識別,人臉識別等問題。此類損失都是通用的,因此放在一起匯總。同樣,也看到一篇很好的博客介紹了大量人臉識別的損失函數:https://mp.weixin.qq.com/s/wJ-JNsUv60vXtGIV-mDrTA

Triplet Loss

該Triplet Loss損失函數提出於2015年的《FaceNet: A Unified Embedding for Face Recognition and Clustering》。該損失函數的主要想法是,拉近同一id之間的距離,擴大不同id之間的距離。如下圖所示,圖中的anchor與positive屬於同一id,即$y_{anchor}=y_{positive}$;而anchor與negative屬於不同的id,即$y_{anchor} \ne y_{negative}$。通過不斷學習后,使得anchor與positive的歐式距離變小,anchor與negative的歐式距離變大。其中,這里的anchor、Positive、negative是圖片的d維嵌入向量(embedding)。

 使用數學公式進行表達,triplet loss想達到的效果是:

$$d(x^a_i,x^p_i)+\alpha \leq d(x^a_i,x^n_i)$$

其中,$d()$表示兩個向量之間的歐氏距離,$\alpha $表示兩個向量之間的margin,防止$d(x^a_i,x^p_i)=d(x^a_i,x^n_i)=0$。因此,可以最小化triplet loss損失函數來達到此目的:

$$triplet\quad loss=[d(x^a_i,x^p_i)-d(x^a_i,x^n_i)+\alpha ]_+$$

在實際中,通常使用在線訓練方式,選擇P的不同的id,每個id包含K張圖片,形成了$batch_size=PK$的mini-batch。從而在這mini-batch種選擇hard/easy example構成loss,具體可以參考這篇博客

Center Loss

該Center Loss損失函數提出於《A Discriminative Feature Learning Approach for Deep Face Recognition》。為了提高特征的區分能力,作者提出了center loss損失函數,不僅能縮小類內差異,而且能擴大類間差異。

作者首先在MNIST數據集上進行試驗,將隱藏層的最后輸出維度改為2,使用softmax+交叉熵作為損失函數,將其結果可視化出來,如下圖所示。可以看出,交叉熵可以使每一類分開,數據分布呈射線形,但卻不夠區分性,即類內差異大。

 

 因此,作者想要在保持數據的可分性前提下,進一步縮小類內之間的差異。為了達到這個目的,提出了center loss損失函數:

$$L_C=\frac{1}{2}\sum_{i=1}^{m}\left \| x_i-c_{y_i} \right \|^2_2$$

其中,$c_{y_i}$表示第$y_i$類的中心。因此,通常將center loss和交叉熵進行結合,構成組合損失函數:

$$L=L_S+\lambda L_C=-\sum_{i=1}^{m}log\frac{e^{W^T_{y_i}x_i+b_{y_i}}}{\sum_{j=1}^{n}e^{W^T_j x_j+b_{y_i}}}+\frac{\lambda }{2}\sum_{i=1}^{m}\left \| x_i-c_{y_i} \right \|^2_2$$

其中,$\lambda $表示center loss的懲罰力度。同樣在MNIST中,其結果如下圖所示。可以看到隨着$\lambda $的增加,約束性更強,每一類會更聚集在類內中心處。

 

在使用Center Loss損失函數時,需要引入兩個超參:$\alpha $和$\lambda $。其中,$\lambda $表示center loss的懲罰力度;而$\alpha $控制類內中心點$c_{y_i}$的學習率。類內中心點$c_{y_i}$應該隨着特征的不同,會產生變化。一般會在每個mini-batch中更新類內中心點$c_{y_i}$:

$$c^{t+1}_j=c^t_j-\alpha \Delta c^t_j$$

Sphereface

該Sphereface提出於《SphereFace: Deep Hypersphere Embedding for Face Recognition》,其也稱A-Softmax損失函數。作者認為,triplet loss需要精心構建三元組,不夠靈活;center loss損失函數只是強調了類內的聚合度,對類間的可分性不夠重視。因此,作者提出了疑問:基於歐式距離的損失函數是否適合模型學習到具有區分性的特征呢?

首先,重新看一下softmax loss損失函數(即softmax+交叉熵):

$$Loss_i=-log\left ( \frac{e^{W^T_{y_i}x_i+b_{y_i}}}{\sum_{j}e^{W^T_jx_i+b_j}} \right )=-log\left (\frac{e^{||W_{y_i}|| \; ||x_i||cos(\theta _{y_i,i})+b_{y_i}}}{\sum_je^{||W_j|| \; ||x_i||cos(\theta _{j,i})+b_j}}  \right )$$

其中,$\theta _{j,i} \quad (0 \leq \theta _{j,i}\leq \pi )$表示向量$W_j$和$x_i$的夾角。可以看到,損失函數與$||Wj||$,$\theta _{j,i}$和$b_j$有關,令$||Wj||=1$和$b_j=0$,則可以得到modified-softmax損失函數,更加關注角度信息:

$$L_{modified-softmax}=-log\left (\frac{e^{||x_i||cos(\theta _{y_i,i})}}{\sum_je^{||x_i||cos(\theta _{j,i})}}  \right )$$

雖然使用modified-softmax損失函數可以學習到特征具有角度區分性,但這個區分力度仍然不夠大。因此,在$\theta _{j,i}$上乘以一個大於1的整數,來提高區分度:

$$L_{ang}=-log\left (\frac{e^{||x_i||cos(m\theta _{y_i,i})}}{e^{||x_i||cos(m\theta _{j,i})}+\sum_{j\neq y_i}e^{||x_i||cos(\theta _{j,i})}}  \right )$$

這樣,能擴大類間距離,縮小類內距離。

下圖是論文的實驗結果,從超球面的角度進行解釋,不同的m值的結果。其中,不同顏色的點表示不同的類別。可以看出,使用A-Softmax損失函數,會將學習到的向量特征映射到超球面上,$m=1$表示退化成modified-softmax損失函數,可以看出,每個類別雖然有明顯的分布,但區分性不夠明顯。隨着$m$的增大,區分性會越來越大,但也越來越難訓練。

 

最后,給出該損失函數的實現方式,請參考這篇博客

Cosface

該Cosface損失函數是由騰訊在2018年《CosFace: Large Margin Cosine Loss for Deep Face Recognition》中提出的。Cosface損失函數,也稱Large Margin Cosine Loss(LMCL)。從名字可以看出,通過對cos的間隔最大化,來實現擴大類間距離,縮小類內距離。

從softmax出發(與Sphereface類似),作者發現,為了實現有效的特征學習,$||W_j=1||$是十分有必要的,即對權重進行歸一化。同時,在測試階段,測試用的人臉對的得分通常是根據兩個特征向量之間的余弦相似度進行計算的。這表明,$||x||$對得分計算影響不大,因此,在訓練階段將$||x||=s$固定下來(在本論文中,$s=64$):

$$L_{ns}=\frac{1}{N}\sum_{i}-log\frac{e^{s \; cos(\theta _{y_i,i})}}{\sum_{j}e^{s \; cos(\theta _{j,i})}}$$

其中ns表示歸一化版本的softmax loss,$\theta _{j,i}$表示$W_j$和$x$之間的角度。為了加大區分性,類似Sphereface一樣,引入常數m:

$$L_{lmc}=\frac{1}{N}\sum_{i}-log\frac{e^{s \; (cos(\theta _{y_i,i})-m)}}{e^{s \; (cos(\theta _{y_i,i})-m)}+\sum_{j\neq y_i}e^{s \; cos(\theta _{j,i})}}$$

其中,$W=\frac{W^*}{||W^*||},x=\frac{x^*}{||x^*||},cos(\theta _j,i)=W^T_jx_i$。

下圖是作者的解釋圖。第一個表示正常的sotfmax loss,可以看出兩個類別的分類邊界具有重疊性,即區分性不強;第二個表示歸一化版本的softmax loss,此時邊界已經很明顯,相互沒有重疊,但是區分性不足;第三個表示A-softmax,此時橫縱坐標變成了$\theta $,從這個角度解釋,使用兩條線作為區分邊界,作者也提出,該損失函數的缺點是不連續;第四個表示Cosface,在$cos(\theta )$下,使用兩條線作為區分邊界,特征之間沒有交集,隨着m值增大,區分性也會越來越明顯,但訓練難度會加大。

 

 Arcface

該Arcface損失函數提出於《ArcFace: Additive Angular Margin Loss for Deep Face Recognition》。類似於Sphereface和Cosface,Arcface同樣需要令$||W||=1,||x||=s$,同時也引入常數m,但與前面兩者不同的是,這里的m是對$\theta $進行修改:

$$L_{arcface}=\frac{1}{N}\sum_{i}-log\frac{e^{s \; (cos(\theta _{y_i,i}+m))}}{e^{s \; (cos(\theta _{y_i,i}+m))}+\sum_{j\neq y_i}e^{s \; cos(\theta _{j,i})}}$$

下圖是Arcface的計算流程圖,首先對$x$與$W$進行標准化,然后進行相乘得到$cos(\theta _{j,i})$,通過$arccos(cos(\theta _{j,i}))$來得到角度$\theta _{j,i}$,加上常數$m$來加大間距得到$\theta _{j,i}+m$,之后計算$cos(\theta _{j,i}+m)$並乘上常數$s$,最后進行常規的softmax loss就行。

 

通過對Sphereface、Cosface和Arcface進行整合,得到了統一的形式:

$$L=\frac{1}{N}\sum_{i}-log\frac{e^{s \; (cos(m_1\theta _{y_i,i}+m_2)-m_3)}}{e^{s \; (cos(m_1\theta _{y_i,i}+m_2)-m_3)}+\sum_{j\neq y_i}e^{s \; cos(\theta _{j,i})}}$$

此時,就可以對該損失函數進行魔改了,作者實驗得到,對於部分數據集,$m_1=1,m_2=0.3,m_3=0.2$和$m_1=0.9,m_2=0.4,m_3=0.15$的效果較好。

同時,作者也嘗試將Arcface融入Triplet loss中,但效果不太明顯。


 

至此,我在工作中常用到的損失函數介紹完成了。后續繼續跟進和補充該文章,感謝閱讀。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM