一文助你解決數據傾斜問題
在處理文本分類任務時,基準測試流行的自然語言處理架構的性能是建立對可用選項的理解的重要步驟。在這里,本文將深入探討與分類相關的最常見的挑戰之一——數據傾斜。如果你曾經將機器學習(ML)應用于真實世界的分類數據集,那么你可能已經很熟悉這個問題了。
了解數據分類中的不平衡問題
在數據分類中,我們經常關注數據點在不同類別中的分布情況。平衡的數據集在所有類別中的數據點數大致相同,因此更易于處理。然而,現實世界中的數據集往往是不平衡的。
不平衡數據可能會導致問題,因為模型可能會學習用最常見的類來標注所有內容,而忽略實際輸入。如果主要類別非常普遍,以至于模型不會因為將少數類別錯誤分類而受到太多懲罰這種情況。此外,代表性不足的類別可能沒有足夠的數據供模型學習有意義的模式。
不平衡是否需要糾正?不平衡是數據的一個特征,一個很好的問題是,我們是否要對其采取任何措施。有一些技巧可以讓模型的訓練過程變得更容易。我們可以選擇對訓練過程或數據本身進行操作,讓模型知道哪些類對我們來說特別重要,但這應該以業務需求或領域知識為依據。接下來,我們將詳細討論這些技巧和操作。
為了說明解決數據不平衡的不同技術的效果,我們將使用包含747條垃圾短信和4827條正常短信的sms-spam數據集。雖然只有兩類,但為了更好地泛化,我們將把該任務視為多類分類問題。我們將使用roberta-base模型。
【sms-spam數據集】:https://huggingface.co/datasets/sms_spam
請記住,這些技術在其他數據中可能會產生不同的結果。在特定數據集上測試它們至關重要。
在不做任何調整的情況下訓練分類模型時,我們會得到以下分類報告:
圖片
“Safe” 技巧偏置初始化
本文的第一項技術是從一開始就讓模型了解數據分布。我們可以通過相應地初始化最終分類層的偏置來傳播這一知識。Andrej Karpathy在他的《訓練神經網絡的秘訣》(A Recipe for Training Neural Networks)中分享了這一技巧,它有助于模型從知情的角度出發。在我們的多分類案例中,我們使用softmax作為最終激活函數,我們希望模型在初始化時的輸出能夠反映數據分布。為了實現這一目標,我們需要解決以下問題:
【A Recipe for Training Neural Networks】:http://karpathy.github.io/2019/04/25/recipe/#2-set-up-the-end-to-end-trainingevaluation-skeleton--get-dumb-baselines:~:text=Huber%20losses%2C%20etc.-,init%20well.,-Initialize%20the%20final
圖片
作為提醒,
圖片
然后,
圖片
其中,b0和b1分別為負類和正類的偏置,neg和pos分別為負類和正類中元素的數量。
通過這種初始化,所有指標都得到了簡單的改善!
圖片
在貝葉斯術語中,這意味著手動設置先驗,并允許模型在訓練過程中學習調整它們。
下采樣和上加權/上采樣和下加權
這些技術也能有效解決類不平衡問題。二者的概念相似,但執行方式不同。下采樣和上加權涉及減少主要類的規模以平衡分布,同時在訓練過程中為該類的示例分配更大的權重。上加權可確保輸出概率仍然代表觀察到的數據分布。相反,上采樣和下加權則需要增加代表性不足的類別的規模,并按比例降低其權重。
下采樣和上加權的結果:
圖片
上采樣和下加權的結果:
圖片
在這兩種情況下,“垃圾郵件”的召回率都有所下降,這可能是因為“正常郵件”的權重是“垃圾郵件”權重的兩倍。
Focal loss
【Focal loss】:https://arxiv.org/abs/1708.02002
Focal loss是一種“動態縮放交叉熵損失”,是為了解決不平衡數據的訓練問題而引入的。它只適用于二元情況,幸運的是,我們的問題只涉及兩個類別。請看下面的公式:
圖片
在該公式中,p是真實類別的概率,ɑ是加權系數,??控制著根據置信度(概率)對損失的懲罰程度。
這種設計可以確保概率較低的示例獲得指數級更大的權重,從而推動模型學習更具挑戰性的示例。α參數允許不同類別的示例獲得不同的權重。
通過調整α和??的組合,可以找到最佳配置。要消除明確的類別偏好,可將α設為0.5;但是,使用這一平衡因子會有微小的改進。
以下是使用Focal loss方法獲得的最佳結果:
圖片
所有指標都優于基線,但需要調整一些參數。請記住,不一定總是這么順利。
“Not-so-safe”的技巧
眾所周知,存在著方法可以故意改變輸出概率分布,從而給代表性不足的類別帶來優勢。通過使用這些技術,我們明確地向模型發出信號,表明某些類別至關重要,不應被忽視。這通常是由業務需求驅動的,比如檢測金融欺詐或攻擊性評論,這比意外地錯誤標記好的示例更重要。當目標是提高特定類別的召回率時,即使犧牲其他指標也要應用這些技術。
加權
加權法是為不同類別的樣本損失值分配不同的權重。這是一種有效且適應性強的方法,因為它可以讓你指出每個類別對模型的重要性。以下是單個訓練樣本的多類別加權交叉熵損失公式:
圖片
其中,pytrue表示真實類別的概率,wytrue是該類別的權重。
確定權重的一個很好的默認方法是使用類別頻率倒數:
圖片
其中,N是數據集的總條目數,c是類別計數,ni是第i個類別的元素計數
權重計算如下:{'ham': 0.576, 'spam': 3.784}
以下是使用這些權重得出的指標:
圖片
指標超過基線方案。雖然這種情況可能會發生,但并非總是如此。
不過,如果避免特定類的漏檢至關重要,可以考慮增加類別的權重,這樣可能會提高類別的召回率。讓我們嘗試使用權重{"ham": 0.576, "spam": 10.0}來查看結果。
結果如下:
圖片
正如預期的那樣,“垃圾郵件”的召回率提高了,但精確度卻下降了。與使用類別頻率倒數權重相比,F1分數有所下降。這證明了基本損失加權的潛力。即使對于平衡數據,加權也可能有利于召回關鍵類別。
上采樣和下采樣。
雖然與前面討論的方法類似,但它們不包括加權步驟。下采樣可能會導致數據丟失,而上采樣可能會導致過度擬合上采樣類別。雖然這兩種方法都有幫助,但加權通常是更有效、更透明的選擇。
概率比較
本文將用一個很明顯的垃圾郵件示例來評估各種模型版本的可信度:“Call to claim your prize!”,結果見下表。
圖片
正如預期的那樣,與基線相比,加權模型顯示出過度自信,而“下采樣+上加權”模型則信心不足(由于上加權的“正常郵件”)。值得注意的是,偏置初始化會增加模型對“垃圾郵件”類別的可信度,而焦點丟失則會降低模型對“垃圾郵件”類別的可信度。
總結
總之,必要時可以解決數據不平衡問題。請記住,有些技術會有意改變數據分布,只有在必要時才可使用。不平衡是一種特征,而不是錯誤!
雖然本文討論了概率問題,但最終的性能指標才是對業務最重要的指標。如果離線測試表明某個模型能增加價值,那么就在生產中進行測試。
在實驗中,本文使用了Toloka ML平臺。它提供了一系列隨時可用的模型,可以為ML項目提供一個良好的開端。
總的來說,考慮到訓練ML模型的數據分布至關重要。訓練數據必須代表真實世界的分布,模型才能有效工作。如果數據本身不平衡,模型應考慮到這一點,以便在實際場景中表現良好。