模型訓練——Loss函式
上一篇文章《語音降噪模型歸納彙總》,很意外地收到了點贊和關注,這給了我極大鼓舞,這裡就再梳理了一下loss函式相關的知識,以求方便能作為一份工具性質的文章展現出來。能力一般,水平有限,歡迎大家指正。
乾貨分享:歡迎收藏點贊加關注
目錄
前言
什麼是損失(Loss)?
預測值(估計值)與實際值(預期值、參考值、ground truth)之間會存在差異, “損失”意味著模型因未能產生預期結果而受到的懲罰。
損失函式的作用?
損失函式將透過比較模型的預測輸出和預期輸出來確定模型的效能,進而尋找最佳化方向。如果二者之間的偏差非常大,則損失值會很大;如果偏差很小或值幾乎相同,損失值會非常低。因此,需要使用合適的損失函式,當模型在資料集上進行訓練時,該函式可以適當地懲罰模型。
根據應用場景,損失函式可以分為兩個大類:迴歸問題 和 分類問題。
本文會著重滲透
語音降噪
方向的loss函式,最經常使用
MSE
和
SI-SDR
。
文章最後附有pytorch的官方部分loss函式連結,描述函式的實現和解析。
一、迴歸問題loss
1、MAE(L1 loss)
平均絕對誤差(MAE)損失,也稱L1範數損失,計算實際值和預測值之間絕對差之和的平均值。
適用於迴歸問題,MAE loss對異常值更具魯棒性,尤其是當目標變數的分佈有離群值時(小值或大值與平均值相差很大)。
函式:
torch。nn。L1Loss
2、MSE(L2 loss)
均方誤差(MSE)損失,也稱為L2範數損失,計算實際值和預測值之間平方差的平均值。
平方意味著較大的誤差比較小的誤差會產生更大的懲罰,所以MSE的收斂速度要比L1-loss要快得多。但是,L2 Loss對異常點更敏感,魯棒性差於L1。
對於大多數迴歸問題,一般是使用MSE loss而不是L1-loss。
函式:
torch。nn。MSELoss
3、loss正則化
正則化的基本思想是向損失函式新增一個懲罰項(L1/L2)用於懲罰大的權重
,隱式地減少自由引數的數量。假設
是未加正則項的損失,
是一個超參,用於控制正則化項的大小。
對應的
L1正則
損失函式:
對應的
L2正則
損失函式:
正則化有防止過擬合的作用,為啥呢?
正則化之所以能夠降低過擬合的原因在於,正則化是結構風險最小化的一種策略實現。給loss function加上正則化項,能使得新得到的最佳化目標函式h = f+normal,需要在f和normal中做一個權衡(trade-off),如果還像原來只最佳化f的情況下,那可能得到一組解比較複雜,使得正則項normal比較大,那麼h就不是最優的,因此可以看出加正則項能讓解更加簡單,符合奧卡姆剃刀理論,同時也比較符合在偏差和方差(方差表示模型的複雜度)分析中,透過降低模型複雜度,得到更小的泛化誤差,降低過擬合程度。L1正則化與L2正則化
注:
dropout有防止過擬合的作用。
PyTorch實現:
L2正則項是透過optimizer最佳化器的引數 weight_decay(float, optional) 新增的,用於設定權值衰減率,即正則化中的超參
,預設值為0。
e。g。 optimizer = torch。optim。SGD(model。parameters(),lr=0。01,weight_decay=0。01)
注:
根據公式,新增正則化項,loss值會隨著超參
設定不同程度的變大,而實際pytorch實現過程中卻並未出現如此現象,原因是loss在計算的時候沒有把權重損失算進去。
4、Smooth L1 loss
一般取
。smooth L1和L1-loss函式的區別在於, smooth L1在0點附近使用L2使得它更加平滑, 它同時擁有L2 Loss和L1 Loss的部分優點。
函式:
torch。nn。SmoothL1Loss
5、Huber loss
殘差比較小時,此函式是二次函式;殘差比較大時,此函式是線性函式。殘差,即觀測值和預測值之間的差值。與平方誤差損失相比,Huber損失對資料中的異常值不那麼敏感。使函式二次化的小誤差值是多少取決於“超引數”
,它可以調整。當
時,退化成SmoothL1Loss。
函式:torch。nn。 HuberLoss
6、Log-MSE
7、RMSE
8、SDR
SDR loss在很多論文中也稱作SNR loss。
物理意義和解析過程引自臺灣省臺灣大學李宏毅教授的教材,符號使用有些非常規,注意觀察。
其中,
表示模型推理輸出,
表示 ground truth,
。
從圖中可以看出來
的方向和長度對SDR loss的值都有影響。但是,如果方向不變長度變小的話,SDR loss也可能會變小,似乎存在一些不合理之處。
DTLN
語音降噪網路用的是SDR loss。
開原始碼:
https://
github。com/breizhn/DTLN
/blob/master/DTLN_model。py
9、SI-SDR
SI-SDR loss在很多論文中也稱作SI-SNR loss,是分離降噪論文中最常用的metric。
將模型輸出
投影到ground truth
上得到
分量,垂直分量為
。
結合公式,從圖中可以看出來,SI-SDR表示的是
和
的方向偏差。
和
為同一個向量的一組垂直分量,二者能量比值與原向量的長度無關。
值得注意的是,如果單獨使用SI-SDR,可能會導致模型估計輸出與輸入之間的幅值不穩定,並且如果訓練資料中存在0值時,單獨使用SISDR時會出現問題,公式計算不穩定,SDR的值都會爆炸,所以一般會結合一定尺度的MSE loss一起使用。
Y。 Luo 2017年提出的
Tasnet
模型、2018年提出的
Conv-Tasnet
模型 以及2020DNS第一名
DC-CRN
模型,都使用了SI-SDR loss。
開原始碼
https://
github。com/kaituoxu/Con
v-TasNet/blob/94eac1023eaaf11ca1bf3c8845374f7e4cd0ef4c/src/pit_criterion。py#L27
10、STOI
公式原理參考論文:
《On Loss Functions for Supervised Monaural Time-Domain Speech Enhancement》
開原始碼:
https://
github。com/speechbrain/
speechbrain/blob/develop/speechbrain/nnet/loss/stoi_loss。py
11、PMSQE
對語音質量評估的主要metric,有PESQ(POLQA)、SDR、STOI等,為啥SDR和STOI都有對應的loss函式,PESQ沒有呢 ?
因為成為loss函式的前提是演算法可微可導,PESQ演算法本身不具備。
PMSQE損失函式是用於近似PESQ metric的一種語音質量演算法。經過處理的語音訊號的PESQ分數是1到4。5之間值,其中1表示質量極差,4。5表示完全沒有失真。PMSQE loss函式的設計與PESQ成反比,低PMSQE值對應高PESQ值。PMSQE的定義範圍為3到0,其中0相當於未失真訊號,3相當於極低的質量。
參考論文
《On Loss Functions for Supervised Monaural Time-Domain Speech Enhancement》
開原始碼:
http://
sigmat。ugr。es/PMSQE/PMS
QE。zip
二、技巧性應用Loss
1、wSDR Loss
在語音分離/降噪任務中,將估計語音和clean語音做loss是常規操作,在此基礎上,將噪聲也作為一種估計與noise做loss,構成多工降噪的一個例項。
其中,x是mix的noisy(帶噪)訊號,y是mix前的clean(乾淨語音)訊號,z是mix前的noise(噪聲)訊號;
是估計的語音訊號,
是估計的噪聲訊號。
是clean訊號能量與噪聲能量的組合,取值範圍[0,1]。可以簡單理解為,當混合之前的clean語音能量遠大於噪聲能量,
, 即
比重大;當混合之前的clean語音能量遠小於噪聲能量,
, 即
比重大。這是更符合預期的一種加權方式。
特別是在語音分離過程中,語音段quiet時有更好的效果。
參考論文
《PHASE-AWARE SPEECH ENHANCEMENT WITH DEEP COMPLEX U-NET》
開原始碼
https://
github。com/chanil1218/D
CUnet。pytorch/blob/master/train。py
2、CI-SDR
公式沒看懂,看懂的同學幫忙解釋一下~
參考論文
《CONVOLUTIVE TRANSFER FUNCTION INVARIANT SDR TRAINING CRITERIA FOR MULTI-CHANNEL REVERBERANT SPEECH SEPARATION》
開原始碼
https://
github。com/fgnt/ci_sdr
3、Deep Feature Loss
參考論文
《Speech Denoising with Deep Feature Losses》
開原始碼
https://
github。com/francoisgerm
ain/SpeechDenoisingWithDeepFeatureLosses
4、SA-SDR
參考論文
《SA-SDR: A NOVEL LOSS FUNCTION FOR SEPARATION OF MEETING STYLE DATA》
5、Multi-task learning loss
多工學習loss,上面提到過的wSDR可以看做是多工學習loss的一個案例。
最原始的想法是將多個loss直接相加,如:
但是,由於不同任務loss的量級可能不盡相同,這種直接相加的方式顯然欠妥,導致效果變差。
於是想當然要給每一個任務loss施加一個權重引數:
但是,這種配置方式只能解決初期的收斂,隨著訓練的進行,每個loss的收斂速度和收斂階段也會出現差異,這又引導我們優化出一套隨著時間t動態變化的權重引數:
好了,有興趣了請開啟下面的文章或論文吧~
(important)
《Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics》。 Alex Kendall, Yarin Gal, Roberto Cipolla。 CVPR, 2018。
基本思想
是估計每個任務的不確定度,每個loss的加權與不確定度關聯,如果不確定度大,自動把loss的權重減小。
《Bounding Box Regression with Uncertainty for Accurate Object Detection》。 Yihui He, Chenchen Zhu, Jianren Wang, Marios Savvides, Xiangyu Zhang。 CVPR, 2019。
三、分類問題loss
分類問題loss的解析,可參照文末給出的官方材料。
1、Hinge Loss
測量給定輸入向量y和標籤向量label(包含1或-1)的損耗。這通常用於測量兩個輸入是否相似,通常用於學習非線性嵌入或半監督學習。
函式:torch。nn。HingeEmbeddingLoss
2、NLL Loss
負對數似然損失函式(NLL)僅適用於以softmax函式作為輸出啟用層的模型。用於多分類問題。
函式:torch。nn。NLLLoss
3、Cross Entropy Loss
交叉熵損失函式計算所提供的一組資料或隨機變數的兩個機率分佈之間的差異。
因為交叉熵描述了兩個機率分佈的差異,然而神經網路輸出的是向量,並不是機率分佈的形式。所以需要 softmax啟用函式將一個向量進行“歸一化”成機率分佈的形式,再採用交叉熵損失函式計算 loss。
本質上也是一種對數似然函式,可用於二分類和多分類任務中。
二分類問題
中的loss函式(輸入資料是softmax或者sigmoid函式的輸出):
函式:torch。 nn。BCELoss torch。nn。BCEWithLogitsLoss
多分類問題
中的loss函式(輸入資料通常是softmax函式的輸出):
其中,N是多分類種類數。
函式:torch。nn。CrossEntropyLoss
在nn。CrossEntropyLoss()的程式碼實現中,實際是使用了log_softmax和nll_loss的組合:
return nll_loss(log_softmax(input,1),target,…)
4、KL Divergence Loss
KL散度,用於計算兩個機率分佈之間的差異。輸出兩個機率分佈的接近程度,如果預測的機率分佈與真實的機率分佈差別較大,將導致加大的損失,如果KL散度的值為零,則意味著機率分佈相同。
函式:torch。nn。KLDivLoss
5、CosineEmbeddingLoss
用於測量給定輸入向量x1、x2和向量標籤label(值為1或-1)的損失。這用於使用餘弦距離測量兩個輸入是否相似,通常用於學習非線性嵌入或半監督學習。
餘弦相似度的損失,目的是讓兩個向量儘量相近。注意這兩個向量都是有梯度的。
margin 可以取 [−1,1],推薦取 0~0。5 。
函式:torch。nn。CosineEmbeddingLoss
參考文章
https://
zhuanlan。zhihu。com/p/35
8570091
https://
blog。csdn。net/zhangxb35
/article/details/72464152
pytorch的官方loss函式實現解析連結:
https://
pytorch。org/docs/stable
/nn。html#loss-functions
上一篇:蘇州值得我留下嗎?
下一篇:文君酒1988紀念版