日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

别让数据坑了你!用置信学习找出错误标注(附开源实现)

發布時間:2024/7/5 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 别让数据坑了你!用置信学习找出错误标注(附开源实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

星標/置頂小屋,帶你解鎖

最萌最前沿的NLP、搜索與推薦技術

文 |?JayLou婁杰(NLP算法工程師,信息抽取方向)

編 |? 北大小才女小軼

美 | Sonata


1 前言

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

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

本文的組織架構是:

2 ?置信學習

2.1 置信學習的定義

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

原文鏈接:https://arxiv.org/abs/1911.00068 Arxiv訪問慢的小伙伴也可以在訂閱號后臺回復關鍵詞【0630】下載論文PDF。

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

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

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

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

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

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

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

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

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

2.2 置信學習開源工具:cleanlab

論文最令人驚喜的一點就是作者這個置信學習框架進行了開源,并命名為cleanlab,我們可以pip install cleanlab使用。

cleanlab

我們要想找出錯誤標注的樣本,通過使用cleanlab操作十分簡單,我們僅僅需要提供兩個輸入,然后只需要1行code就可以找出標注數據中的錯誤:

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)

這個輸入是啥?很簡單,一個輸入是原始的樣本標簽(由于這些標簽可能存在錯誤,我們稱之為「噪聲標簽」吧~),另一個輸入就是通過對訓練集交叉驗證,來預測的每一個樣本在不同標簽類別下的概率,這是一個nXm的概率矩陣(n為數據集大小,m為標簽類別總數)。

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

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。

2.3 置信學習的3個步驟

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

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

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

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

  • 置信學習框架

    接下來,我們對上述3個步驟進行詳細闡述。

    2.3.1 Count:估計噪聲標簽和真實標簽的聯合分布

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

    為了估計聯合分布,共需要4步:

    • step 1 : 交叉驗證:

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

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

      • 最后對于樣本,其真實標簽為個類別中的最大概率,并且

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

    計數矩陣C計算流程
    • step 3 : 標定計數矩陣:目的就是為了讓計數總和與人工標記的樣本總數相同。計算公式如下面所示,其中?為人工標記標簽的樣本總個數:

    • step 4 : 估計噪聲標簽?和真實標簽的聯合分布,可通過下式求得:

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

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

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

    P[i]和t[j]計算
    • step2: 根據計算流程和上圖結果,我們可以很容易得到計數矩陣??為:

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

    標定計數矩陣
    • step4:聯合分布為:(根據公式(2)直接進行概率歸一化即可)

    聯合分布Q計算

    2.3.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.

    我們仍然以前面給出的示例進行說明:

    • 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)

    2.3.3 Re-Training:過濾錯誤樣本后,重新訓練

    在過濾掉錯誤樣本后,根據聯合分布?將每個類別i下的損失權重修正為:

    其中.然后采取Co-Teaching[2]框架進行。

    Co-teaching

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

    2.4 實驗結果

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

    真實聯合分布和估計聯合分布

    上圖給出了CIFAR-10中,噪聲率為40%和稀疏率為60%情況下,真實聯合分布和估計聯合分布之間的比較,可以看出二者之間很接近,可見論文提出的置信學習框架用來估計聯合分布的有效性;當然,論文也對聯合估計有著嚴謹的推導證明。

    不同置信學習方法的比較

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

    置信學習發現的 ImageNet標簽問題

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

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

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

    3 總結

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

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

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

    接下來,讓我們嘗試將置信學習應用于自己的項目,找出那些“可惡”的數據噪聲吧~

    參考文獻

    [1] Confident Learning: Estimating Uncertainty in Dataset Labels
    [2] Co-teaching: Robust Training of Deep Neural Networks with Extremely Noisy Labels


    萌屋公告

    喜歡本文的小伙伴們,記得掃描下方二維碼關注并星標置頂,我才能來到你面前哦。

    賣萌屋妹子們的原創技術干貨有?ACL2020學術前沿系列、NLP綜述系列、NLP論文清單系列、NLP基礎入門系列、搜索與推薦系列、深度學習初/中/高級煉丹技巧、機器學習入門系列、算法崗offer收割系列等。訂閱號后臺回復【干貨】即可打包帶走。

    賣萌屋里有眾多頂會審稿人、大廠研究員、知乎大V和美麗小姐姐(劃掉?????♀?),我們成立了?自然語言處理 / 知識圖譜 / 深度學習 / 機器學習 / 校招求職?高質量討論群,訂閱號后臺回復入群即可上車。

    夕小瑤的賣萌屋

    _

    關注&星標小夕,帶你解鎖AI秘籍

    訂閱號主頁下方「撩一下」有驚喜哦

    總結

    以上是生活随笔為你收集整理的别让数据坑了你!用置信学习找出错误标注(附开源实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。