置信學習:讓樣本中的“髒數據“原形畢露

在實際工作中,你是否遇到過這樣一個問題或痛點:無論是通過哪種方式獲取的標註數據,數據標註質量可能不過關,存在一些錯誤?亦或者是數據標註的標準不統一、存在一些歧義?特別是badcase反饋回來,發現訓練集標註的居然和badcase一樣?如下圖所示,QuickDraw、MNIST和Amazon Reviews數據集中就存在錯誤標註。

爲了快速迭代,大家是不是常常直接人工去清洗這些“髒數據”?(筆者也經常這麼幹~)。但數據規模上來了咋整?有沒有一種方法能夠自動找出哪些錯誤標註的樣本呢?基於此,本文嘗試提供一種可能的解決方案——置信學習

本文的組織架構是:

01

置信學習的定義

那什麼是置信學習呢?這個概念來自一篇由MIT和Google聯合提出的paper:《Confident Learning: Estimating Uncertainty in Dataset Labels[1] 》。論文提出的置信學習(confident learning,CL)是一種新興的、具有原則性的框架,以識別標籤錯誤、表徵標籤噪聲並應用於帶噪學習(noisy label learning)。

筆者注:筆者乍一聽置信學習挺陌生的,但回過頭來想想,好像幹過類似的事情,比如:在某些場景下,對訓練集通過交叉驗證來找出一些可能存在錯誤標註的樣本,然後交給人工去糾正。此外,神經網絡的成功通常建立在大量、乾淨的數據上,標註錯誤過多必然會影響性能表現,帶噪學習可是一個大的topic,有興趣可參考這些文獻:github.com/subeeshvasu/。

廢話不說,首先給出這種置信學習框架的優勢:

  • 最大的優勢:可以用於發現標註錯誤的樣本!

  • 無需迭代,開源了相應的python包,方便快速使用!在ImageNet中查找訓練集的標籤錯誤僅僅需要3分鐘!

  • 可直接估計噪聲標籤與真實標籤的聯合分佈,具有理論合理性。

  • 不需要超參數,只需使用交叉驗證來獲得樣本外的預測概率。

  • 不需要做隨機均勻的標籤噪聲的假設(這種假設在實踐中通常不現實)。

  • 與模型無關,可以使用任意模型,不像衆多帶噪學習與模型和訓練過程強耦合。

筆者注:置信學習找出的「標註錯誤的樣本」,不一定是真實錯誤的樣本,這是一種基於不確定估計的選擇方法。

02

置信學習開源工具:cleanlab

論文最令人驚喜的一點就是作者這個置信學習框架進行了開源,並命名爲cleanlab,我們可以pip install cleanlab使用,具體文檔說明在這裏cleanlab文檔說明。

from cleanlab.pruning import get_noise_indices
# 輸入
# s:噪聲標籤
# psx: n x m 的預測概率概率,通過交叉驗證獲得
ordered_label_errors = get_noise_indices(
    s=numpy_array_of_noisy_labels,
    psx=numpy_array_of_predicted_probabilities,
    sorted_index_method='normalized_margin', # Orders label errors
 )

我們來看看cleanlab在MINIST數據集中找出的錯誤樣本吧,是不是感覺很牛~

如果你不只是想找到錯誤標註的樣本,還想把這些標註噪音clean掉之後重新繼續學習,那3行codes也可以搞定,這時候連交叉驗證都省了~:

from cleanlab.classification import LearningWithNoisyLabels
from sklearn.linear_model import LogisticRegression

# 其實可以封裝任意一個你自定義的模型.
lnl = LearningWithNoisyLabels(clf=LogisticRegression())
lnl.fit(X=X_train_data, s=train_noisy_labels)
# 對真實世界進行驗證.
predicted_test_labels = lnl.predict(X_test)

 

筆者注:上面雖然只給出了CV領域的例子,但置信學習也適用於NLP啊~此外,cleanlab可以封裝任意一個你自定義的模型,以下機器學習框架都適用:scikit-learn, PyTorch, TensorFlow, FastText。

03

置信學習的3個步驟

置信學習開源工具cleanlab操作起來比較容易,但置信學習背後也是有着充分的理論支持的。事實上,一個完整的置信學習框架,需要完成以下三個步驟 ( 如圖1所示 ):

  • Count:估計噪聲標籤和真實標籤的聯合分佈;

  • Clean:找出並過濾掉錯誤樣本;

  • Re-Training:過濾錯誤樣本後,重新調整樣本類別權重,重新訓練;

圖1 置信學習框架

下面對上述3個步驟進行詳細闡述:

1. Count:估計噪聲標籤和真實標籤的聯合分佈

我們定義噪聲標籤爲  ,即經過初始標註(也許是人工標註)、但可能存在錯誤的樣本;定義真實標籤爲 ,但事實上我們並不會獲得真實標籤,通常可通過交叉驗證對真實標籤進行估計。此外,定義樣本總數爲  ,類別總數爲  。

爲了估計聯合分佈,共需要4步:

step 1 : 交叉驗證

  • 首先需要通過對數據集集進行交叉驗證計算第  樣本在第  個類別下的概率  ;

  • 然後計算每個人工標定類別  下的平均概率  作爲置信度閾值;

  • 最後對於樣本  ,其真實標籤  爲  個類別中的最大概率  ,並且  ;

step 2: 

計算計數矩陣  (類似於混淆矩陣),如圖1中的 意味着,人工標記爲dog但實際爲fox的樣本爲40個。具體的操作流程如圖2所示:

圖2 計數矩陣C計算流程

step 3 : 標定計數矩陣

目的就是爲了讓計數總和與人工標記的樣本總數相同。計算公式如下面所示,其中  爲人工標記標籤  的樣本總個數:

 ①

step 4 : 

估計噪聲標籤 和真實標籤的聯合分佈,可通過下式求得:

 ②

看到這裏,也許你會問爲什麼要估計這個聯合分佈呢?其實這主要是爲了下一步方便我們去clean噪聲數據。此外,這個聯合分佈其實能充分反映真實世界中噪聲 ( 錯誤 ) 標籤和真實標籤的分佈,隨着數據規模的擴大,這種估計方法與真實分佈越接近 ( 原論文中有着嚴謹的證明,由於公式推導繁雜這裏不再贅述,有興趣的同學可以詳細閱讀原文~,後文的圖7也有相關實驗進行證明 )。

看到這裏,也許你還感覺公式好麻煩,那下面我們通過一個具體的例子來展示上述計算過程:

step 1 : 通過交叉驗證獲取第  樣本在第  個類別下的概率  ;爲說明問題,這裏假設共10個樣本、2個類別,每個類別有5個樣本。經過計算每個人工標籤類別  下的平均概率  分別爲:  .

圖3 P[i][j]和t[j]計算

step2:根據圖2的計算流程,我們得到計數矩陣  爲:

圖4 計數矩陣C計算

step3:標定後的計數矩陣 爲 ( 計數總和與人工標記的樣本總數相同 ),將原來的樣本總數進行加權即可,以  爲例,根據公式①,其計算爲  ):

step4:聯合分佈 爲:( 根據公式②直接進行概率歸一化即可 )

圖5 聯合分佈Q計算

2. Clean:找出並過濾掉錯誤樣本

在得到噪聲標籤和真實標籤的聯合分佈  ,論文共提出了5種方法過濾錯誤樣本。

Method 1:,選取  的樣本進行過濾,即選取  最大概率對應的下標  與人工標籤不一致的樣本。

Method 2:,選取構造計數矩陣  過程中、進入非對角單元的樣本進行過濾。

Method 3:Prune by Class ( PBC ),即對於人工標記的每一個類別  ,選取  個樣本過濾,並按照最低概率  排序。

Method 4:Prune by Noise Rate ( PBNR ),對於計數矩陣 的非對角單元,選取  個樣本進行過濾,並按照最大間隔  排序。

Method 5:C+NR,同時採用Method 3和Method 4。

我們仍然以圖3給出的示例進行說明:

Method 1:過濾掉i=2,3,4,8,9共5個樣本;

Method 2:進入到計數矩陣非對角單元的樣本分別爲i=3,4,9,將這3個樣本過濾;

Method 3:對於類別0,選取  個樣本過濾,按照最低概率排序,選取i=2,3,4;對於類別1,選取  個樣本過濾,按照最低概率排序選取i=9;綜上,共過濾i=2,3,4,9共4個樣本;

Method 4:對於非對角單元  選取i=2,3,4過濾,對  選取i=9過濾。

上述這些過濾樣本的方法在cleanlab也有提供,我們只要提供2個輸入、1行code即可clean錯誤樣本:

import cleanlab
# 輸入
# s:噪聲標籤
# psx: n x m 的預測概率概率,通過交叉驗證獲得
# Method 3:Prune by Class (PBC)
baseline_cl_pbc = cleanlab.pruning.get_noise_indices(s, psx, prune_method='prune_by_class',n_jobs=1)
# Method 4:Prune by Noise Rate (PBNR)
baseline_cl_pbnr = cleanlab.pruning.get_noise_indices(s, psx, prune_method='prune_by_noise_rate',n_jobs=1)
# Method 5:C+NR
baseline_cl_both = cleanlab.pruning.get_noise_indices(s, psx, prune_method='both',n_jobs=1)

3. Re-Training:過濾錯誤樣本後,重新訓練

在過濾掉錯誤樣本後,根據聯合分佈  將每個類別i下的損失權重修正爲:  ,其中  .然後採取Co-Teaching[2]框架進行。

圖6 Co-teaching

如圖6所示,Co-teaching的基本假設是認爲noisy label的loss要比clean label的要大,於是它並行地訓練了兩個神經網絡A和B,在每一個Mini-batch訓練的過程中,每一個神經網絡把它認爲loss比較小的樣本,送給它其另外一個網絡,這樣不斷進行迭代訓練。

04

實驗結果

上面我們介紹完成置信學習的3個步驟,本小節我們來看看這種置信學習框架在實踐中效果如何?在正式介紹之前,我們首先對稀疏率進行定義:稀疏率爲聯合分佈矩陣、非對角單元中0所佔的比率,這意味着真實世界中,總有一些樣本不會被輕易錯標爲某些類別,如老虎圖片不會被輕易錯標爲汽車。

圖7 真實聯合分佈和估計聯合分佈

圖7給出了CIFAR-10中,噪聲率爲40%和稀疏率爲60%情況下,真實聯合分佈和估計聯合分佈之間的比較,可以看出二者之間很接近,可見論文提出的置信學習框架用來估計聯合分佈的有效性。

圖8 不同置信學習方法的比較

上圖給出了CIFAR-10中不同噪聲情況和稀疏性情況下,置信學習與其他SOTA方法的比較。例如在40%的噪聲率下,置信學習比之前SOTA方法Mentornet的準確率平均提高34%。

圖9 置信學習發現的 ImageNet標籤問題

論文還將提出置信學習框架應用於真實世界的ImageNet數據集,利用CL:PBNR找出的TOP32標籤問題如圖9所示,置信學習除了可以找出標註錯誤的樣本 ( 紅色部分 ),也可以發現多標籤問題 ( 藍色部分,圖像可以有多個標籤 ),以及本體論問題:綠色部分,包括"是" ( 比如:將浴缸標記爲桶 ) 或"有" ( 比如:示波器標記爲CRT屏幕 ) 兩種關係。

圖10 不同置信學習方法和隨機去除的對比

圖10給出了分別去除20%,40%…,100%估計錯誤標註的樣本後訓練的準確性,最多移除200K個樣本。可以看出,當移除小於100K個訓練樣本時,置信學習框架使得準確率明顯提升,並優於隨機去除。

05

總結

本文介紹了一種用來刻畫noisy label、找出錯誤標註樣本的方法——置信學習,是弱監督學習和帶噪學習的一個分支。

置信學習直接估計噪聲標籤和真實標籤的聯合分佈,而不是修復噪聲標籤或者修改損失權重。

置信學習開源包cleanlab可以很快速的幫你找出那些錯誤樣本!可在分鐘級別之內找出錯誤標註的樣本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章