模型效果上限預(yù)估、分類模型Bad Case分析方法

模型效果上限預(yù)估、分類模型Bad Case分析方法

給定訓(xùn)練和測(cè)試數(shù)據(jù)集,訓(xùn)練某個(gè)二分類模型(如,GBDT算法),我們通過交叉驗(yàn)證的方法得到了一組最優(yōu)超參數(shù)以及對(duì)應(yīng)的最優(yōu)模型,但在測(cè)試集上這個(gè)模型仍有一定的誤差率,也就說模型的預(yù)測(cè)結(jié)果存在一定數(shù)量的bad case。那么,目前的模型逼近了效果的上限了嗎? 這些bad case有可能被解決嗎?如果可以,該如何解決呢?

回答這些問題的前提條件是樣本和特征已經(jīng)固定下來,本文不討論那些數(shù)據(jù)集本身還在迭代變化的情況。

一、兩類Bad Case

  1. 標(biāo)簽正確的困難樣本。模型沒有擬合好這類樣本,也就是模型還有進(jìn)步的空間,尚未逼近效果的上界。
  2. 標(biāo)簽錯(cuò)誤的噪聲樣本(outlier)。模型沒有必要去擬合這類樣本,過擬合會(huì)導(dǎo)致模型在真實(shí)使用環(huán)境的效果下降。

需要注意的是,這里說的噪聲樣本不一定是我們收集、加工數(shù)據(jù)的過程中出現(xiàn)了錯(cuò)誤,有可能是樣本對(duì)應(yīng)的真實(shí)世界中的行為就是一個(gè)小概率的行為,這些小概率的異常行為雖然本身有可能真實(shí)存在,但是過度關(guān)注這些行為,會(huì)導(dǎo)致模型擬合正常行為的能力下降,而且并不會(huì)在模型的真實(shí)使用時(shí)帶來增益。

由此可見,我們只要識(shí)別出噪聲樣本的數(shù)量,就能大致估算出模型的效果上界是多少。另外一方面,識(shí)別出標(biāo)簽正確的困難樣本,也有助于我們尋找到模型改進(jìn)的方法。

二、噪聲樣本識(shí)別方法

目前基于帶噪標(biāo)簽數(shù)據(jù)的學(xué)習(xí)方法主要有兩大類,一類是直接訓(xùn)練對(duì)噪聲魯棒的模型(noise-robust models),另一類方法首先識(shí)別出噪聲數(shù)據(jù),然后基于清洗后的數(shù)據(jù)訓(xùn)練模型。

盡管第一類方法已經(jīng)足夠好,但是面對(duì)老板如下的“靈魂拷問”,我們還是要關(guān)注一下第二類方法。

  • 模型的效果上限是多少?
  • 這個(gè)case為什么預(yù)測(cè)錯(cuò)誤?

本文主要關(guān)注第二類方法。

1. 基于K近鄰算法識(shí)別噪聲樣本

假設(shè)我們有一個(gè)樣本相似度模型能夠度量?jī)蓚€(gè)樣本的相似度,那么可以針對(duì)bad case使用K近鄰算法對(duì)其分類,根據(jù)分類結(jié)果識(shí)別其是否是噪聲樣本。這種方法的原理是假設(shè)相似的樣本具有相同的分類標(biāo)簽。

一個(gè)二分類模型的bad case有以下兩種情況:

  • False Negative: 正樣本被錯(cuò)誤地預(yù)測(cè)為負(fù)樣本
  • False Positive: 負(fù)樣本被錯(cuò)誤地預(yù)測(cè)為正樣本

FN) 正樣本被錯(cuò)誤地預(yù)測(cè)為負(fù)樣本

  1. 根據(jù)樣本特征的相似度度量,在訓(xùn)練集上檢索出與目標(biāo)正樣本最相似的K個(gè)鄰居樣本;
  2. 統(tǒng)計(jì)K個(gè)鄰居樣本中正負(fù)樣本的比例分布,假設(shè)K個(gè)鄰居樣本中N個(gè)正樣本,則分類為正樣本的概率 p=\frac{N}{K}
  3. 如果 p 大于某個(gè)設(shè)定的閾值(如,0.6),則判斷該bad case樣本為“標(biāo)簽正確的困難樣本”,后續(xù)的模型迭代要更加關(guān)注這類樣本。
  4. 如果 p 小于某個(gè)設(shè)定的閾值(如,0.6),則判斷該bad case樣本為“標(biāo)簽錯(cuò)誤的噪聲樣本”。該樣本后續(xù)建議從訓(xùn)練集和測(cè)試集中移除。

FP) 負(fù)樣本被錯(cuò)誤地預(yù)測(cè)為正樣本

  1. 根據(jù)樣本特征的相似度度量,在訓(xùn)練集上檢索出與目標(biāo)負(fù)樣本最相似的K個(gè)鄰居樣本;
  2. 統(tǒng)計(jì)K個(gè)鄰居樣本中正負(fù)樣本的比例分布,假設(shè)K個(gè)鄰居樣本中N個(gè)負(fù)樣本,則分類為負(fù)樣本的概率 p=\frac{N}{K}
  3. 如果 p 大于某個(gè)設(shè)定的閾值(如,0.6),則判斷該bad case樣本為“標(biāo)簽正確的困難樣本”,后續(xù)的模型迭代要更加關(guān)注這類樣本。
  4. 如果 p 小于某個(gè)設(shè)定的閾值(如,0.6),則判斷該bad case樣本為“標(biāo)簽錯(cuò)誤的噪聲樣本”。該樣本后續(xù)建議從訓(xùn)練集和測(cè)試集中移除。

如何度量樣本特征的相似度

  1. 建立模型,比如采用“度量學(xué)習(xí)”的方法;優(yōu)點(diǎn)是相似度度量更加精準(zhǔn)。
  2. 使用特征向量的余弦相似度;優(yōu)點(diǎn)是使用門檻低。
  3. 使用特征向量的加權(quán)余弦相似度;優(yōu)點(diǎn)是相比于簡(jiǎn)單的余弦相似度,精度更高。

余弦相似度計(jì)算公式:
sim(x, y) = \frac{x \cdot y}{\lVert x \rVert \lVert y \rVert} = \frac{\sum_{i=1}^n x_i \times y_i}{\sqrt{\sum_{i=1}^n x_i^2} \times \sqrt{\sum_{i=1}^n y_i^2}}

加權(quán)余弦相似度:

weighted\_sim(x, y) = \frac{wx \cdot wy}{\lVert wx \rVert \lVert wy \rVert} = \frac{\sum_{i=1}^n w_ix_i \times w_iy_i}{\sqrt{\sum_{i=1}^n (w_ix_i)^2} \times \sqrt{\sum_{i=1}^n (w_iy_i)^2}}

并不是每個(gè)特征在分類決策中做出的貢獻(xiàn)都是相同的,所以,在有特征重要度權(quán)重的條件下,使用“加權(quán)余弦相似度”會(huì)比基礎(chǔ)的“余弦相似度”度量方法有更好的結(jié)果。

使用GBDT算法,如阿里云平臺(tái)上的 PS_SMART,訓(xùn)練的模型通常都可以輸出每個(gè)特征的重要度分?jǐn)?shù),這些特征重要度分?jǐn)?shù)的量級(jí)差異通常都比較大,在代入到“加權(quán)余弦相似度”計(jì)算公式時(shí),需要先做softmax歸一化,具體公式如下:
normalized\_score(x_i)=\frac{exp(x_i)}{\sum_{j=1}^n exp(x_j)}

如何快速從海量的樣本庫中檢索Top K個(gè)最相似的鄰居樣本

使用向量檢索引擎,比如 faiss, mivus,有一定的使用門檻。

推薦使用阿里云開源的推薦算法訓(xùn)練框架EasyRec中集成的向量檢索算法,可以直接運(yùn)行在MaxCompute上,使用命令如下:

pai -name easy_rec_ext -project algo_public_dev
-Dcmd=vector_retrieve
-Dquery_table=odps://pai_online_project/tables/query_vector_table
-Ddoc_table=odps://pai_online_project/tables/doc_vector_table
-Doutput_table=odps://pai_online_project/tables/result_vector_table
-Dcluster='{"worker" : {"count":3, "cpu":600, "gpu":100, "memory":10000}}'
-Dknn_distance=inner_product
-Dknn_num_neighbours=100
-Dknn_feature_dims=128
-Dknn_index_type=gpu_ivfflat
-Dknn_feature_delimiter=','
-Dbuckets='oss://${oss_bucket}/'
-Darn='acs:ram::${xxxxxxxxxxxxx}:role/AliyunODPSPAIDefaultRole'
-DossHost='oss-cn-hangzhou-internal.aliyuncs.com'

模型參數(shù)說明請(qǐng)查看文檔:https://easyrec.readthedocs.io/en/latest/vector_retrieve.html

2. 基于Confident Learning方法的噪音樣本識(shí)別方法

置信學(xué)習(xí)(Confident Learning)是MIT和Google的研究人員提出一種可以快速地找出錯(cuò)誤標(biāo)簽樣本的迭代模型,并且有開源的工具庫Cleanlab可以使用。

術(shù)語定義:

  • 人工標(biāo)簽 \tilde{y}:樣本中的標(biāo)簽(可能存在錯(cuò)誤,不一定指人手工打上的標(biāo)簽,也可能是業(yè)務(wù)回流數(shù)據(jù)生成的標(biāo)簽)
  • 真實(shí)標(biāo)簽 y^*:樣本對(duì)應(yīng)的真實(shí)標(biāo)簽,是未知的。

條件獨(dú)立假設(shè):每個(gè)樣本被誤標(biāo)注都是條件獨(dú)立的。

第一步:計(jì)算置信度聯(lián)合分布矩陣

置信度聯(lián)合計(jì)數(shù)矩陣 C(有點(diǎn)類似混淆矩陣)的行表示預(yù)測(cè)標(biāo)簽樣本個(gè)數(shù),列表示真實(shí)標(biāo)簽樣本個(gè)數(shù)。每個(gè)單元格C_{ij} 表示真實(shí)標(biāo)簽為 j,人工標(biāo)簽為 i 的樣本個(gè)數(shù)。

對(duì)于一個(gè)樣本,它的人工標(biāo)簽是已知的,即樣本中的標(biāo)簽。

但是該樣本的真實(shí)標(biāo)簽卻是未知的,可以通過如下兩個(gè)條件判斷真實(shí)標(biāo)簽:

  • 該標(biāo)簽的預(yù)測(cè)概率在所有標(biāo)簽概率中最大
  • 該標(biāo)簽的預(yù)測(cè)概率大于計(jì)算得到的閾值,閾值的計(jì)算方法如下:

t_j=\frac{1}{|X_{\tilde{y}=j}|}\sum_{x \in X_{\tilde{y}=j}} \hat{p}(\tilde{y}=j; x, \theta)

對(duì)于二分類問題,真實(shí)標(biāo)簽為正樣本的閾值為 所有預(yù)測(cè)為正樣本的預(yù)測(cè)概率的平均值;負(fù)樣本閾值為 所有預(yù)測(cè)為負(fù)樣本的預(yù)測(cè)概率的平均值。

上述兩個(gè)條件中的第一個(gè)很好滿足,但是第二個(gè)條件不一定滿足,所以并不是所有的樣本都可以找到其真實(shí)標(biāo)簽,這也會(huì)在后續(xù)的步驟中有所體現(xiàn)。

C_{\tilde{y},y^*} y^*=1 y^*=0
\tilde{y}=1 100 40
\tilde{y}=0 50 80

上表例子中的總樣本數(shù)為:N=100+40+50+80=270

置信度聯(lián)合計(jì)數(shù)矩陣 C 的計(jì)算公式如下:

第二步:計(jì)算置信度聯(lián)合概率分布矩陣

在前一步構(gòu)造置信度聯(lián)合計(jì)數(shù)矩陣時(shí),受到概率閾值限制,部分樣本沒有計(jì)算出真實(shí)標(biāo)簽。置信度聯(lián)合計(jì)數(shù)矩陣中的樣本數(shù)<=真實(shí)樣本數(shù)。所以需要對(duì)置信度聯(lián)合計(jì)數(shù)矩陣中的樣本數(shù)量進(jìn)行重新校準(zhǔn),校準(zhǔn)公式如下:
\tilde{C}_{\tilde{y}=i,y^*=j} \leftarrow \frac{C_{\tilde{y}=i,y^*=j}}{\sum_{j \in [m]} C_{\tilde{y}=i,y^*=j}} \cdot \left| X_{\tilde{y}=i} \right|

即針對(duì)C矩陣中的每一行計(jì)算屬于各個(gè)真實(shí)標(biāo)簽的概率值(上述公式右項(xiàng)乘號(hào)前面的子項(xiàng)),再乘以人工標(biāo)簽為 i 的樣本總數(shù)(上述公式右項(xiàng)乘號(hào)后面的子項(xiàng))。

根據(jù)校準(zhǔn)之后的置信度聯(lián)合計(jì)數(shù)矩陣,我們可以通過如下公式計(jì)算置信度聯(lián)合概率分布矩陣Q
\hat{Q}_{\tilde{y}=i,y^*=j} = \frac{\tilde{C}_{\tilde{y}=i,y^*=j}}{\sum_{i \in [m],j \in [m]} \tilde{C}_{\tilde{y}=i,y^*=j}}

舉例如下:

\hat{Q}_{\tilde{y},y^*} y^*=1 y^*=0
\tilde{y}=1 0.37 (=100/270) 0.15 (=40/270)
\tilde{y}=0 0.185 (=50/270) 0.296 (=80/270)

備注:這里省略了計(jì)數(shù)校準(zhǔn)的標(biāo)準(zhǔn)。

第三步:尋找錯(cuò)誤標(biāo)簽樣本

原始論文中提供了四種方法,這里介紹其中兩種。

假設(shè)樣本總數(shù)為n,對(duì)于置信度聯(lián)合概率分布矩陣的每個(gè)非對(duì)角線元素,計(jì)算 n \cdot \hat{Q}_{\tilde{y},y^*} 作為對(duì) |\hat{X}_{\tilde{y}=i,y^*=j}|的預(yù)估。比如,假設(shè)共有100個(gè)樣本,根據(jù)上表中的數(shù)據(jù),判定有15個(gè)標(biāo)注為正樣本的數(shù)據(jù)實(shí)際上屬于負(fù)樣本。

  • Prune by Class

對(duì)于每個(gè)類 i ,選擇n\cdot \sum_{j\in [m]:j \ne i}(\hat{Q}_{\tilde{y}=i,y^*=j}[i]) 個(gè)置信度最低(模型預(yù)測(cè)概率最低)樣本作為“噪聲”樣本。

根據(jù)上表中的數(shù)據(jù),預(yù)測(cè)結(jié)果為正樣本的樣本集合中,15個(gè)預(yù)測(cè)概率最低的樣本被判定為“噪聲”樣本;預(yù)測(cè)結(jié)果為負(fù)樣本的樣本集合中,18個(gè)預(yù)測(cè)概率最低(predict label=1的概率最高)的樣本被判定為“噪聲”樣本。

  • Prune by Noise Rate

對(duì)于置信度聯(lián)合概率分布矩陣的每個(gè)非對(duì)角線元素,計(jì)算 n \cdot \hat{Q}_{\tilde{y},y^*} 個(gè)樣本(x \in X_{\tilde{y}=i})作為“噪聲”樣本,選擇條件是預(yù)測(cè)概率差值(\hat{p}_{x,\tilde{y}=j}-\hat{p}_{x,\tilde{y}=i})最大的那個(gè)子集。

根據(jù)上表中的數(shù)據(jù),預(yù)測(cè)結(jié)果為正樣本的樣本集合中,15個(gè) “預(yù)測(cè)為負(fù)樣本的概率-預(yù)測(cè)為正樣本的概率” 最大的樣本被標(biāo)記為“噪聲”樣本;預(yù)測(cè)結(jié)果為負(fù)樣本的樣本集合中,18個(gè) “預(yù)測(cè)為正樣本的概率-預(yù)測(cè)為負(fù)樣本的概率” 最大的樣本被標(biāo)記為“噪聲”樣本;

3. 深度學(xué)習(xí)模型的噪音樣本識(shí)別方法

a. 基于Forgetting Events識(shí)別錯(cuò)誤標(biāo)簽

在模型訓(xùn)練過程中,某個(gè)樣本已經(jīng)被模型正確分類,隨著模型參數(shù)的更新,該樣本又被錯(cuò)誤分類,這一過程被稱之為該樣本的一次遺忘事件(forgetting event)。根據(jù)論文《AN EMPIRICAL STUDY OF EXAMPLE FORGETTING DURING DEEP NEURAL NETWORK LEARNING》的研究,在模型訓(xùn)練過程中噪聲樣本往往會(huì)比正常樣本經(jīng)歷更多的遺忘事件。基于這一啟發(fā)式規(guī)則,我們可以記錄下每個(gè)樣本經(jīng)歷的遺忘事件總次數(shù),進(jìn)一步辨別出可能的噪聲標(biāo)簽數(shù)據(jù)。

b. 基于訓(xùn)練過程的樣本loss值識(shí)別錯(cuò)誤標(biāo)簽

基于訓(xùn)練過程中樣本的loss值的相對(duì)大小來識(shí)別錯(cuò)誤標(biāo)簽,這一方法是淘系技術(shù)部的同學(xué)在ICCV2019的論文《O2U-Net: A Simple Noisy Label Detection Approach for Deep Neural Networks》中提出的。

大致思路基于以下邏輯:在一次訓(xùn)練中,隨著迭代輪次增加,網(wǎng)絡(luò)逐漸從欠擬合逐漸過渡到過擬合狀態(tài),在訓(xùn)練的初期,模型精度的提升是非常明顯的,因?yàn)榫W(wǎng)絡(luò)很快學(xué)會(huì)了那部分“簡(jiǎn)單的”樣本,因此這類樣本的loss比較小,與之相反,那些“困難的”樣本通常在訓(xùn)練的后期才逐漸被學(xué)會(huì)。觀察訓(xùn)練過程發(fā)現(xiàn),噪聲樣本通常是在訓(xùn)練的后期才被學(xué)會(huì),因而在訓(xùn)練的早期,噪聲樣本的平均loss是遠(yuǎn)大于干凈樣本的,而在訓(xùn)練的后期,因?yàn)榫W(wǎng)絡(luò)逐漸學(xué)會(huì)了所有樣本,兩類樣本的loss區(qū)別不大??v觀整個(gè)訓(xùn)練過程,從欠擬合到過擬合,噪聲樣本loss的均值和方差都比干凈樣本要大。通過循環(huán)學(xué)習(xí)率策略,使網(wǎng)絡(luò)在欠擬合和過擬合之間多次切換,并追蹤不同階段不同參數(shù)的模型對(duì)樣本的loss,通過在時(shí)間維度上捕獲多樣性足夠豐富的模型(類似集成學(xué)習(xí),對(duì)滿足多樣性和準(zhǔn)確性的多個(gè)模型進(jìn)行ensemble),統(tǒng)計(jì)各個(gè)樣本loss的均值和方差,均值和方差越大,樣本屬于噪聲樣本的概率也就越大。

三、如何估算模型效果上界

假設(shè)測(cè)試集樣本數(shù)為 N,其中模型預(yù)測(cè)錯(cuò)誤的樣本數(shù)為 E,這些預(yù)測(cè)錯(cuò)誤的樣本中有 M 條被上述方法識(shí)別為噪聲樣本,那么:

  1. 目前模型的分類正確率為:Accuracy=\frac{N-E}{N}
  2. 估計(jì)的模型正確率上界為:UpperBound=\frac{N-M}{N}

對(duì)于二分類問題,召回率、準(zhǔn)確率的上界計(jì)算方法類似,這里不再贅述。

四、如何改進(jìn)模型,使模型逼近效果上界

借鑒AdaBoost算法原理,通過改變訓(xùn)練數(shù)據(jù)的樣本權(quán)重,迫使模型更加關(guān)注分類錯(cuò)誤的困難樣本,從而得到更加魯棒的模型。

  1. 使用初始模型,得到訓(xùn)練集、測(cè)試集上錯(cuò)誤預(yù)測(cè)bad case集合;
  2. 使用上述噪聲樣本識(shí)別算法,識(shí)別出bad case的類型;
  3. 從數(shù)據(jù)集中移除所有被識(shí)別為“噪聲”的bad case樣本;
  4. 把識(shí)別為“困難”的bad case樣本添加到訓(xùn)練集中,并設(shè)置一個(gè)較高的樣本權(quán)重;減小其余初始模型預(yù)測(cè)正確的樣本的權(quán)重(假設(shè)所有樣本的默認(rèn)初始權(quán)重都為1);
  5. 使用新的帶權(quán)重的數(shù)據(jù)集重新訓(xùn)練模型;
  6. 重復(fù)上述1~6步,直到模型逼近效果上界為止。

參考文章:

  1. 幾種噪聲標(biāo)簽識(shí)別算法簡(jiǎn)介

本文由mdnice多平臺(tái)發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容