国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數(shù)據(jù)類別不均衡問題的分類及解決方式

深度學習自然語言處理 ? 來源:PaperWeekly ? 作者:PaperWeekly ? 2022-07-08 14:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

數(shù)據(jù)類別不均衡問題應該是一個極常見又頭疼的的問題了。最近在工作中也是碰到這個問題,花了些時間梳理并實踐了類別不均衡問題的解決方式,主要實踐了“魔改”loss(focal loss, GHM loss, dice loss 等),整理如下。

所有的 Loss 實踐代碼在這里:

https://github.com/shuxinyin/NLP-Loss-Pytorch

數(shù)據(jù)不均衡問題也可以說是一個長尾問題,但長尾那部分數(shù)據(jù)往往是重要且不能被忽略的,它不僅僅是分類標簽下樣本數(shù)量的不平衡,實質上也是難易樣本的不平衡。

解決不均衡問題一般從兩方面入手:

數(shù)據(jù)層面:重采樣,使得參與迭代計算的數(shù)據(jù)是均衡的;

模型層面:重加權,修改模型的 loss,在 loss 計算上,加大對少樣本的 loss 獎勵。

1. 數(shù)據(jù)層面的重采樣

關于數(shù)據(jù)層面的重采樣,方式都是通過采樣,重新構造數(shù)據(jù)分布,使得數(shù)據(jù)平衡。一般常用的有三種:

欠采樣;

過采樣;

SMOTE

1. 欠采樣:指某類別下數(shù)據(jù)較多,則只采取部分數(shù)據(jù),直接拋棄一些數(shù)據(jù),這種方式太簡單粗暴,擬合出來的模型的偏差大,泛化性能較差;

2. 過采樣:這種方式與欠采樣相反,某類別下數(shù)據(jù)較少,進行重復采樣,達到數(shù)據(jù)平衡。因為這些少的數(shù)據(jù)反復迭代計算,會使得模型產生過擬合的現(xiàn)象。

3. SMOTE:一種近鄰插值,可以降低過擬合風險,但它是適用于回歸預測場景下,而 NLP 任務一般是離散的情況。

這幾種方法單獨使用會或多或少造成數(shù)據(jù)的浪費或重,一般會與 ensemble 方式結合使用,sample 多份數(shù)據(jù),訓練出多個模型,最后綜合。

但以上幾種方式在工程實踐中往往是少用的,一是因為數(shù)真實據(jù)珍貴,二也是 ensemble 的方式部署中資源消耗大,沒法接受。因此,就集中看下重加權 loss 改進的部分。

2. 模型層面的重加權

重加權主要指的是在 loss 計算階段,通過設計 loss,調整類別的權值對 loss 的貢獻。比較經典的 loss 改進應該是 Focal Loss, GHM Loss, Dice Loss。

2.1 Focal Loss

Focal Loss 是一種解決不平衡問題的經典 loss,基本思想就是把注意力集中于那些預測不準的樣本上。

何為預測不準的樣本?比如正樣本的預測值小于 0.5 的,或者負樣本的預測值大于 0.5 的樣本。再簡單點,就是當正樣本預測值》0.5 時,在計算該樣本的 loss 時,給它一個小的權值,反之,正樣本預測值《0.5 時,給它一個大的權值。同理,對負樣本時也是如此。

以二分類為例,一般采用交叉熵作為模型損失。

其中 是真實標簽, 是預測值,在此基礎又出來了一個權重交叉熵,即用一個超參去緩解上述這種影響,也就是下式。

接下來,看下 Focal Loss 是怎么做到集中關注預測不準的樣本?

在交叉熵 loss 基礎上,當正樣本預測值 大于 0.5 時,需要給它的 loss 一個小的權重值 ,使其對總 loss 影響小,反之正樣本預測值 小于 0.5,給它的 loss 一個大的權重值。為滿足以上要求,則 增大時, 應減小,故剛好 可滿足上述要求。

因此加上注意參數(shù) ,得到 Focal Loss 的二分類情況:

加上調節(jié)系數(shù) ,F(xiàn)ocal Loss 推廣到多分類的情況:

其中 為第 t 類預測值,,試驗中效果最佳時,。

代碼的實現(xiàn)也是比較簡潔的。

def __init__(self, num_class, alpha=None, gamma=2, reduction=‘mean’): super(MultiFocalLoss, self).__init__() self.gamma = gamma 。..。..

def forward(self, logit, target): alpha = self.alpha.to(logit.device) prob = F.softmax(logit, dim=1)

ori_shp = target.shape target = target.view(-1, 1)

prob = prob.gather(1, target).view(-1) + self.smooth # avoid nan logpt = torch.log(prob)

alpha_weight = alpha[target.squeeze().long()] loss = -alpha_weight * torch.pow(torch.sub(1.0, prob), self.gamma) * logpt

if self.reduction == ‘mean’: loss = loss.mean()

return loss

2.2 GHM Loss

上面的 Focal Loss 注重了對 hard example 的學習,但不是所有的 hard example 都值得關注,有一些 hard example 很可能是離群點,這種離群點當然是不應該讓模型關注的。

GHM (gradient harmonizing mechanism) 是一種梯度調和機制,GHM Loss 的改進思想有兩點:1)就是在使模型繼續(xù)保持對 hard example 關注的基礎上,使模型不去關注這些離群樣本;2)另外 Focal Loss 中, 的值分別由實驗經驗得出,而一般情況下超參 是互相影響的,應當共同進行實驗得到。

Focal Loss 中通過調節(jié)置信度 ,當正樣本中模型的預測值 較小時,則乘上(1-p),給一個大的 loss 值使得模型關注這種樣本。于是 GHM Loss 在此基礎上,規(guī)定了一個置信度范圍 ,具體一點,就是當正樣本中模型的預測值為 較小時,要看這個 多小,若是 ,這種樣本可能就是離群點,就不注意它了。

于是 GHM Loss 首先規(guī)定了一個梯度模長 :

其中, 是模型預測概率值, 是 ground-truth 的標簽值,這里以二分類為例,取值為 0 或 1。可發(fā)現(xiàn), 表示檢測的難易程度, 越大則檢測難度越大。

GHM Loss 的思想是,不要關注那些容易學的樣本,也不要關注那些離群點特別難分的樣本。所以問題就轉為我們需要尋找一個變量去衡量這個樣本是不是這兩種,這個變量需滿足當 值大時,它要小,從而進行抑制,當 值小時,它也要小,進行抑制。于是文中就引入了梯度密度:

表明了樣本 1~N 中,梯度模長分布在 范圍內的樣本個數(shù), 代表了 區(qū)間的長度,因此梯度密度 GD(g) 的物理含義是:單位梯度模長 部分的樣本個數(shù)。

在此基礎上,還需要一個前提,那就是處于 值小與大的樣本(也就是易分樣本與難分樣本)的數(shù)量遠多于中間值樣本,此時 GD 才可以滿足上述變量的要求。

此時,對于每個樣本,把交叉熵 CE×該樣本梯度密度的倒數(shù),就得到 GHM Loss。

這里附上邏輯的代碼,完整的可以上文章首尾倉庫查看。

class GHM_Loss(nn.Module): def __init__(self, bins, alpha): super(GHM_Loss, self).__init__() self._bins = bins self._alpha = alpha self._last_bin_count = None

def _g2bin(self, g): # split to n bins return torch.floor(g * (self._bins - 0.0001)).long()

def forward(self, x, target): # compute value g g = torch.abs(self._custom_loss_grad(x, target)).detach()

bin_idx = self._g2bin(g)

bin_count = torch.zeros((self._bins)) for i in range(self._bins): # 計算落入bins的梯度模長數(shù)量 bin_count[i] = (bin_idx == i).sum().item()

N = (x.size(0) * x.size(1))

if self._last_bin_count is None: self._last_bin_count = bin_count else: bin_count = self._alpha * self._last_bin_count + (1 - self._alpha) * bin_count self._last_bin_count = bin_count

nonempty_bins = (bin_count 》 0).sum().item()

gd = bin_count * nonempty_bins gd = torch.clamp(gd, min=0.0001) beta = N / gd # 計算好樣本的gd值

# 借由binary_cross_entropy_with_logits,gd值當作參數(shù)傳入 return F.binary_cross_entropy_with_logits(x, target, weight=beta[bin_idx])

2.3 Dice Loss & DSC Loss

Dice Loss 是來自文章 V-Net 提出的,DSC Loss 是香儂科技的 Dice Loss for Data-imbalanced NLP Tasks。

按照上面的邏輯,看一下 Dice Loss 是怎么演變過來的。Dice Loss 主要來自于 dice coefficient,dice coefficient 是一種用于評估兩個樣本的相似性的度量函數(shù)。

定義是這樣的:取值范圍在 0 到 1 之間,值越大表示越相似。若令 X 是所有模型預測為正的樣本的集合,Y 為所有實際上為正類的樣本集合,dice coefficient 可重寫為:

同時,結合 F1 的指標計算公式推一下,可得:

可以動手推一下,就能得到 dice coefficient 是等同 F1 score 的,因此本質上 dice loss 是直接優(yōu)化 F1 指標的。

上述表達式是離散的,需要把上述 DSC 表達式轉化為連續(xù)的版本,需要進行軟化處理。對單個樣本 x,可以直接定義它的 DSC:

但是當樣本為負樣本時,y1=0,loss 就為 0 了,需要加一個平滑項。

上面有說到 dice coefficient 是一種兩個樣本的相似性的度量函數(shù),上式中,假設正樣本 p 越大,dice 值越大,說明模型預測的越準,則應該 loss 值越小,因此 dice loss 的就變成了下式這也就是最終 dice loss 的樣子。

為了能得到 focal loss 同樣的功能,讓 dice loss 集中關注預測不準的樣本,可以與 focal loss 一樣加上一個調節(jié)系數(shù) ,就得到了香儂提出的適用于 NLP 任務的自調節(jié) DSC-Loss。

弄明白了原理,看下代碼的實現(xiàn)。

class DSCLoss(torch.nn.Module):

def __init__(self, alpha: float = 1.0, smooth: float = 1.0, reduction: str = “mean”): super().__init__() self.alpha = alpha self.smooth = smooth self.reduction = reduction

def forward(self, logits, targets): probs = torch.softmax(logits, dim=1) probs = torch.gather(probs, dim=1, index=targets.unsqueeze(1))

probs_with_factor = ((1 - probs) ** self.alpha) * probs loss = 1 - (2 * probs_with_factor + self.smooth) / (probs_with_factor + 1 + self.smooth)

if self.reduction == “mean”: return loss.mean()

總結

本文主要討論了類別不均衡問題的解決辦法,可分為數(shù)據(jù)層面的重采樣及模型 loss 方面的改進,如 focal loss, dice loss 等。最后說一下實踐下來的經驗,由于不同數(shù)據(jù)集的數(shù)據(jù)分布特點各有不同,dice loss 以及 GHM loss 會出現(xiàn)些抖動、不穩(wěn)定的情況。當不想挨個實踐的時候,首推 focal loss,dice loss。

以上所有 Loss 的代碼僅為邏輯參考,完整的代碼及相關參考論文都在:

https://github.com/shuxinyin/NLP-Loss-Pytorch

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)

    關注

    8

    文章

    7335

    瀏覽量

    94778
  • 代碼
    +關注

    關注

    30

    文章

    4968

    瀏覽量

    73988

原文標題:類別不均衡問題之loss大集合:focal loss, GHM loss, dice loss 等等

文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    調用1688開放平臺商品分類API獲取分類數(shù)據(jù)

    ? 在開發(fā)電商系統(tǒng)、進行商品管理或市場分析時,獲取準確、完整的商品分類信息是基礎且關鍵的一環(huán)。1688開放平臺提供了相關的API接口,允許開發(fā)者通過編程方式獲取其龐大的商品分類體系。本文將介紹
    的頭像 發(fā)表于 02-02 16:19 ?305次閱讀
    調用1688開放平臺商品<b class='flag-5'>分類</b>API獲取<b class='flag-5'>分類</b><b class='flag-5'>數(shù)據(jù)</b>

    微電網常見分類:按電源類型、電壓等級、控制模式劃分詳解

    、電壓等級、控制模式劃分是行業(yè)內最主流、最具實踐指導意義的三種分類方式。本文將圍繞這三大核心維度,詳細拆解微電網的常見分類,剖析各類別核心特征、適配場景及技術要點,為微電網的場景化應用
    的頭像 發(fā)表于 01-30 10:59 ?278次閱讀
    微電網常見<b class='flag-5'>分類</b>:按電源類型、電壓等級、控制模式劃分詳解

    電機轉子磁場不均勻的原因有哪些?

    電機轉子是電機的核心部件,其負責將電能轉化為機械能,實現(xiàn)電動機的工作。在電機轉子的運轉過程中,磁場是其較為關鍵的因素之一。然而,由于各種因素的影響,轉子磁場不均勻已成為電機運行中的高頻問題,若未及
    的頭像 發(fā)表于 12-30 08:46 ?383次閱讀

    SD卡讀寫均衡失效問題分析

    一、讀寫均衡失效引發(fā)的核心問題 讀寫均衡(磨損均衡,Wear Leveling)是SD卡固件通過算法將數(shù)據(jù)均勻分配到閃存芯片各單元,避免局部單元過度擦寫的關鍵機制。瀚海微SD卡出現(xiàn)讀寫
    的頭像 發(fā)表于 12-29 15:08 ?391次閱讀
    SD卡讀寫<b class='flag-5'>均衡</b>失效問題分析

    發(fā)布元服務配置應用分類、標簽和資質信息

    分類標簽和資質管理”菜單選擇元服務歸屬的類別和標簽,同時將所需的資質文件提交給華為運營人員審核。資質文件審核通過后,您選擇的標簽才能生效,之后才可選擇生效標簽進行配置。關于資質文件的具體要求,請
    發(fā)表于 10-29 16:47

    串口通信有哪些方式

    串口通信(Serial Communication)是一種通過串行方式逐位傳輸數(shù)據(jù)的通信方式,廣泛應用于嵌入式系統(tǒng)、工業(yè)控制、儀器儀表等領域。其通信方式可根據(jù)不同的
    的頭像 發(fā)表于 09-28 18:02 ?1096次閱讀

    燃料電池負載均衡測試:解鎖高效供能密碼

    整理、繪圖,直觀呈現(xiàn)燃料電池在不同負載下的特性曲線。通過對比不同階段的數(shù)據(jù),精準定位潛在問題所在,為后續(xù)改進提供依據(jù)。 通過這套嚴謹?shù)呢撦d均衡測試方案,能夠全方位評估燃料電池的性能表現(xiàn),及時發(fā)現(xiàn)并解決隱患,助力燃料電池技術邁向新高度,在清潔能源應用中發(fā)揮更大效能。
    發(fā)表于 09-18 13:51

    【新啟航】碳化硅襯底 TTV 厚度不均勻性測量的特殊采樣策略

    質量評估提供更可靠的數(shù)據(jù)支持。 引言 在碳化硅半導體制造領域,晶圓總厚度變化(TTV)不均勻性是影響器件性能和良率的關鍵因素。精確測量 TTV 厚度不均勻性有助于及時發(fā)
    的頭像 發(fā)表于 08-28 14:03 ?674次閱讀
    【新啟航】碳化硅襯底 TTV 厚度<b class='flag-5'>不均</b>勻性測量的特殊采樣策略

    碳化硅襯底 TTV 厚度不均勻性測量的特殊采樣策略

    質量評估提供更可靠的數(shù)據(jù)支持。 引言 在碳化硅半導體制造領域,晶圓總厚度變化(TTV)不均勻性是影響器件性能和良率的關鍵因素。精確測量 TTV 厚度不均勻性有助于及時發(fā)
    的頭像 發(fā)表于 08-27 14:28 ?1145次閱讀
    碳化硅襯底 TTV 厚度<b class='flag-5'>不均</b>勻性測量的特殊采樣策略

    解決零線電流過大過高的原因, 零線電流濾波器 零線電流處理器

    零線電流過大是一個值得注意的問題,深圳勵特電能質量公司 159-8931-3660 一、三相不平衡 ? 三相負載不均衡 ?:在三相四線制供電系統(tǒng)中,三相負載的不均衡會導致三相相電流不等,從而造成零線
    的頭像 發(fā)表于 08-05 14:37 ?2838次閱讀
    解決零線電流過大過高的原因, 零線電流濾波器 零線電流處理器

    太陽光模擬器丨輻照不均勻度的定義和標準

    在材料光電性能表征、新能源器件研發(fā)及空間環(huán)境模擬等前沿領域,太陽光模擬器已成為模擬真實光照環(huán)境的核心工具。輻照不均勻度作為衡量太陽光模擬器性能的關鍵指標,直接影響測試結果的準確性與可靠性。本文將結合
    的頭像 發(fā)表于 07-24 10:23 ?765次閱讀
    太陽光模擬器丨輻照<b class='flag-5'>不均</b>勻度的定義和標準

    超級法拉電容需要接均衡板嗎?

    超級法拉電容均衡板通過被動或主動均衡技術,保障串聯(lián)電容組安全、高效運行,提升循環(huán)壽命與電壓穩(wěn)定性。
    的頭像 發(fā)表于 07-22 09:31 ?2232次閱讀
    超級法拉電容需要接<b class='flag-5'>均衡</b>板嗎?

    Texas Instruments LMH0044SQ/NOPB 自適應電纜均衡器的參數(shù)特性、EDA模型 數(shù)據(jù)手冊分享

    Texas Instruments LMH0044SQ/NOPB 自適應電纜均衡器的參數(shù)特性、EDA模型 數(shù)據(jù)手冊分享
    的頭像 發(fā)表于 06-09 19:14 ?1515次閱讀
    Texas Instruments LMH0044SQ/NOPB 自適應電纜<b class='flag-5'>均衡</b>器的參數(shù)特性、EDA模型 <b class='flag-5'>數(shù)據(jù)</b>手冊分享

    四層和七層負載均衡的核心區(qū)別

    在現(xiàn)代分布式系統(tǒng)和云計算架構中,負載均衡(Load Balancing, LB)是確保高可用性、可擴展性和性能優(yōu)化的關鍵技術。負載均衡器根據(jù)不同的OSI模型層級工作,主要分為四層(L4)和七層(L7)兩種類型。它們各自適用于不同的場景,并在性能、功能和實現(xiàn)
    的頭像 發(fā)表于 05-29 17:42 ?1314次閱讀

    電子元器件的分類方式

    電子元器件可以按照不同的分類標準進行分類,以下是一些常見的分類方式
    的頭像 發(fā)表于 04-16 14:52 ?2996次閱讀