超好用的自信學習:1行代碼查找標籤錯誤,3行代碼學習噪聲標籤

  • 2019 年 11 月 11 日
  • 筆記

十三 發自 凹非寺 量子位 報道 | 公眾號 QbitAI

你知道嗎?就連ImageNet中也可能至少存在10萬個標籤問題。

在大量的數據集中去描述或查找標籤錯誤本身就是挑戰性超高的任務,多少英雄豪傑為之頭痛不已。

最近,MIT和谷歌的研究人員便提出了一種廣義的自信學習(Confident Learning,CL)方法,可以直接估計給定標籤和未知標籤之間的聯合分佈。

這種廣義的CL,也是一個開源的Clean Lab Python包,在ImageNet和CIFAR上的性能比其他前沿技術高出30%。

這種方法有多厲害?舉個栗子。

上圖是2012年ILSVRC ImageNet訓練集中使用自信學習發現的標籤錯誤示例。研究人員將CL發現的問題分為三類:

1、藍色:圖像中有多個標籤; 2、綠色:數據集中應該包含一個類; 3、紅色:標籤錯誤。

通過自信學習,就可以在任何數據集中使用合適的模型來發現標籤錯誤。下圖是其他三個常見數據集中的例子。

目前存在於Amazon Reviews、MNIST和Quickdraw數據集中的標籤錯誤的例子,這些數據集使用自信學習來識別不同的數據模式和模型。

這麼好的方法,還不速來嘗鮮?

什麼是自信學習?

自信學習已然成為監督學習的一個子領域。

從上圖不難看出,CL需要2個輸入:

1、樣本外預測概率; 2、噪聲標籤;

對於弱監督而言,CL包括三個步驟:

1、估計給定的、有噪聲的標籤和潛在的(未知的)未損壞標籤的聯合分佈,這樣就可以充分描述類條件標籤噪聲; 2、查找並刪除帶有標籤問題的噪聲(noisy)示例; 3、進行消除錯誤的訓練,然後根據估計的潛在先驗重新加權示例。

那麼CL的工作原理又是什麼呢?

我們假設有一個數據集包含狗、狐狸和奶牛的圖像。CL的工作原理就是估計噪聲標籤和真實標籤的聯合分佈(下圖中右側的Q矩陣)。

左:自信計數的示例;右:三類數據集的噪聲標籤和真實標籤的聯合分佈示例。

接下來,CL計數了100張被標記為「狗」的圖像,這些圖像就很可能是「狗」類(class dog),如上圖左側的C矩陣所示。

CL還計數了56張標記為狗,但高概率屬於狐狸的圖像,以及32張標記為狗,但高概率屬於奶牛的圖像。

而後的中心思想就是,當一個樣本的預測概率大於每個類的閾值時,我們就可以自信地認為這個樣本是屬於這個閾值的類。

此外,每個類的閾值是該類中樣本的平均預測概率。

輕鬆上手Clean Lab

剛才也提到,本文所說的廣義CL,其實是一個Clean Lab Python包。而它之所以叫Clean Lab,是因為它能「clean」標籤。

Clean Lab具有以下優勢:

速度快:單次、非迭代、並行算法(例如,不到1秒的時間就可以查找ImageNet中的標籤錯誤); 魯棒性:風險最小化保證,包括不完全概率估計; 通用性:適用於任何概率分類器,包括 PyTorch、Tensorflow、MxNet、Caffe2、scikit-learn等; 獨特性:唯一用於帶有噪聲標籤或查找任何數據集/分類器標籤錯誤的多類學習的軟件包。

1行代碼就查找標籤錯誤!

# Compute psx (n x m matrix of predicted probabilities) on your own, with any classifier.  # Be sure you compute probs in a holdout/out-of-sample manner (e.g. cross-validation)  # Now getting label errors is trivial with cleanlab... its one line of code.  # Label errors are ordered by likelihood of being an error. First index is most likely error.  from cleanlab.pruning import get_noise_indices    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   )

3行代碼學習噪聲標籤!

from cleanlab.classification import LearningWithNoisyLabels  from sklearn.linear_model import LogisticRegression    # Wrap around any classifier. Yup, you can use sklearn/pyTorch/Tensorflow/FastText/etc.  lnl = LearningWithNoisyLabels(clf=LogisticRegression())  lnl.fit(X = X_train_data, s = train_noisy_labels)  # Estimate the predictions you would have gotten by training with *no* label errors.  predicted_test_labels = lnl.predict(X_test)

接下來,是Clean Lab在MNIST上表現。可以在這個數據集上自動識別50個標籤錯誤。

原始MNIST訓練數據集的標籤錯誤使用rankpruning算法進行識別。描述24個最不自信的標籤,從左到右依次排列,自頂向下增加自信(屬於給定標籤的概率),在teal中表示為conf。預測概率最大的標籤是綠色的。明顯的錯誤用紅色表示。

傳送門

項目地址: https://github.com/cgnorthcutt/cleanlab/

自信學習博客: https://l7.curtisnorthcutt.com/confident-learning

Reddit討論: https://www.reddit.com/r/MachineLearning/comments/drhtkl/r_announcing_confident_learning_finding_and/