經過幾十年的發展,文字分類在學術界已經是一個比較成熟的技術,目前自然語言處理(NLP)的研究熱點已經不在文字分類上面。然而,作為內容安全檢測的一個重要技術手段,文字分類在實際業務中還是有不少的挑戰。
首先,內容安全場景對分類的準確度要求極高,不但要求較低的誤判率,任何一個漏判都有可能給產品方帶來嚴重的後果。其次,眾所周知資料不平衡對分類模型的影響很大,而內容安全場景恰恰存在非常嚴重的資料不平衡問題。本文主要討論文字分類在內容安全應用中遇到的資料不平衡問題以及常用的解決辦法。
資料不平衡問題是分類演算法在實際應用中經常遇到的一個問題,它指的是在訓練語料或真實資料中,各個類別的資料量相差較大,我們知道模型的訓練本質上就是最小化一個損失函式,如果各個類別的樣本規模不一樣,損失函式的值較大部分由大類別貢獻,那麼最終得到的模型分類將偏向於大類別。
舉個例子,假如訓練語料中正樣本數量為100個,負樣本數量為100000個,那麼你很可能得到這麼一個模型:不管輸入什麼樣的資料,分類結果都是負例,這個模型準確率>99.9%看起來相當不錯,可實際上這個模型有跟沒有沒啥區別。上面是一個比較極端的例子,可很不幸的是,內容安全領域的資料不平衡現象就是這麼極端,有害內容佔比一般低於千分之一。
對於資料不平衡問題,目前還未看到比較理想的解決方法,現有的方法按照其著眼點可以分為資料重取樣、修改損失函式、模型改造3大類。其中模型改造這一類的方法都是與某一特定模型緊密耦合的,由於缺少通用性實際應用中使用的較少,本文只對前面兩種方法進行介紹:
一、資料重取樣
資料重取樣是處理資料不平衡問題時首先能想到的方法,既然各個類別數量不平衡,那我們想辦法讓每個類的數量都差不多不就行了嗎?
資料重取樣方法在只有訓練資料的基礎上,對訓練資料進行取樣,從而讓各個類別數量接近,具體分為過取樣和欠取樣兩種思路。需要注意的是,如果你的模型對業務產生的價值較大,並且數量少的類別線上資料並不少,只是缺少標籤,那麼也別想著用技術手段解決不平衡問題了,收集點資料找人去打標才是最佳選擇。
1.過取樣
最簡單的過取樣方法對小類別的樣本進行重複隨機取樣,補充到小類別當中,直到小類別樣本資料量增大到符合要求為止。可以看出這種方法只是單純增加小類別樣本數量,並不能擴大小類別樣本的多樣性。
SMOTE一種近鄰插值方法,它使用下面的公式對小類別的兩個相似樣本進行線性組合:
其中0≤u≤1, x^R是x的5近鄰中的隨機一個。可以看到,SMOTE生成了新的樣本,擴大了小類別樣本的多樣性,同時生成樣本的總體期望值與原來的分佈相同。
由於SMOTE是直接對向量化的資料進行插值,不能直接應用於文字分類任務的離散空間插值。作為替代方案,我們可以在小類別樣本上面進行LDA機率主題模型建模,然後利用LDA模型生成新的樣本。
LDA模型認為文件的主題並不是確定的,而是一個多項式機率分佈,這個機率分佈本身又是根據Dirichlet分佈產生的,Dirichlet分佈的引數可以透過Gibbs Sampling方法從提供的語料上面學習得到。
有了LDA模型以後,文字生成過程如下:對文字中的每個詞,根據Dirichlet分佈隨機生成一個主題分佈,然後根據主題分佈隨機抽樣出具體的詞彙,重複上述過程直到滿足文字長度要求。
改進過取樣小類別樣本多樣性的另一種思路是對小類別樣本使用文字增強方法。文字增強是在NLP低資源任務中經常使用到的一種技術,主要是透過對原文字進行小幅度的修改,使得修改後的文字跟原文字在內容上有一定的差異,同時又與原文字保持相同語義。常用的文字增強方法有詞彙替換、隨機噪聲插入、樣本混合、回譯、句法變換等。
2.欠取樣
與過取樣方法相反,欠取樣對大類別的樣本進行隨機刪減,直到規模與小類別相近為止。欠取樣方法一般運用在大類別樣本規模和多樣性足夠大的場合,否則建議優先嚐試過取樣方法。
原始的欠取樣方法對於大類別的樣本的刪減是無差別的,但在實際應用中大類別內部的樣本分佈本身也是不均衡的,有些樣本分類器很容易就能把它與小類別區分開來,有些樣本則更容易被分類器誤分為小類別。理想的欠取樣方法應該是多刪除那些容易分類的冗餘樣本,儘可能多保留較難分類的樣本。為了達到這樣的效果,我們可以使用迭代預分類方式不斷篩選大類別的樣本。
首先從大類別中隨機挑選少量的樣本作為種子樣本,剩下的作為候選樣本,然後用種子樣本聯合小類別樣本組成訓練集訓練出一個分類模型,分類模型對候選樣本進行分類,從錯分的樣本里面隨機挑選少量的樣本補充到種子樣本當中,重複前面的過程直至類別平衡或者候選樣本不再被錯分為止。透過上面的方法,最終挑選出來的樣本都是對分類貢獻比較大的樣本。
二、修改損失函式
我們在前面提到,資料不平衡對文字分類的影響本質上是由模型訓練過程中最小化損失函式這一目標決定的,因此解決資料不平衡問題的第二種思路就是修改損失函式,減少大類別對損失函式的影響。
特別是在深度學習技術流行以後,由於損失函式的定義與具體模型結構較為解耦,對損失函式進行改進後,可以用於所有的分類模型,因此目前這塊的研究工作還比較活躍,不斷出現較為有代表性的方法。
1.loss類別加權
這是一種比較樸素簡單的方法,在計算每個樣本的loss的時候根據其類別乘以不同的權重,權重係數一般與類別樣本數量成反比。Loss類別加權在本質上跟資料重取樣是相通的,兩者最終對loss的改變是一致的。
2.Focal loss
focal loss不但考慮了類別規模性差異的因素,而且還同時考慮了容易分類樣本和較難分類樣本的差別,假設樣本的真實label為t,focal loss計算公式如下:
其中p_t是模型輸出的label為t的機率,α是類別係數,γ>=0稱作focusing parameter,稱作調製係數。可以看出,當γ=0時focalloss就退化成普通的類別加權loss。當γ>0時,樣本越容易分類,p就越接近1,調製係數就越小,最終loss值就越小,樣本越難以分類,p就越接近0,調製係數就越大,最終loss值就越大,因此,調製係數的引入使得loss的計算偏向於那些較難分類的樣本。
3.GHM loss
Focal loss是在理想情況下考慮對難分類樣本的處理,在現實場景中訓練資料往往是有噪聲的,比如人工打標失誤,這個時候可能模型已經收斂了,focal loss還在死懟這些不能正確分類的噪聲樣本,最終反而用力過度,得到不是最優的模型。
GHM解決了這個問題,它首先提出梯度模長的定義:
p就是模型預測值,p*就是真實值,模長越大,分類錯誤越嚴重。GHM對不同模長的樣本數量做了統計,結果如下:
上面y軸是取了log的結果,左邊那些代表了大部分較容易分類的樣本,右邊很難分類的樣本也不少。Focal loss的做法是忽略左邊那些容易分類樣本,重點關注右邊那些難分類的樣本,GHM的思路卻是右邊這些樣本太難了,應該是異常的,不如先忽略這部分樣本。具體做法就是根據梯度上面的樣本量,樣本數量越多的梯度給的權重越小,公式如下:
其中GD(g)稱作梯度密度,密度越大說明這個梯度區間的樣本量越多。
三、效果評估
常規情況下文字分類模型的開發流程是這樣:
1)從真實業務資料中收集一批資料,如果沒有標籤則進行人工標註。
2)把這些資料分成3份:訓練集、驗證集(或叫開發集)、測試集。
3)演算法人員在訓練集上面訓練模型,在驗證集上面驗證效果,過程中夾雜著選模型、調參、各種魔改等等。
4)最終得到一個比較滿意的模型,在測試集上面跑一下效果,如果ok那就上線,不行那就重來。
上述流程之所以行得通,是因為我們假設訓練集、驗證集、測試集資料分佈都與真實業務資料一致,驗證集和測試集代表了對真實資料的一個取樣,模型在測試集上的表現與在真實場景是一樣的。在內容安全檢測場景,由於極度的資料不平衡問題上面的流程就不適用了:測試集中如果保持正常內容和有害內容比例跟線上一致,要麼需要標註巨量的正常樣本,要麼有害樣本數量太少,得到的召回率可信度不高,如果兩者比例與線上脫軌,那麼得到的準確率、精確度、召回率這些指標必然與線上上資料的表現不一致。
內容安全業務上主要關心誤判和漏判的情況,前面的例子也可以看出準確率在這裡意義不大,所以我們只重點評估模型的精確度和召回率。
模型重新訓練有兩種原因,一種是純粹的技術最佳化,比如換個神經網路或loss,一種是修正線上的誤判漏判badcase,第二種情況訓練集是會補充新樣本的。我們保持一個相對獨立由一些代表性樣本構成的測試集,裡面的正負樣本比較均衡。測試集不會每次都隨訓練集一起維護,只有在出現一些新型別的樣本時才進行維護。
當模型最佳化完成以後,先在測試集跑一遍,計算召回率指標和總體準確率,這個召回率可以認為是接近真實的,準確率就只能作為模型不同版本定性比較的一個參照值了。由於正常內容的範圍實在過於廣大,測試集很難覆蓋所有可能的誤判樣例,並且測試集正負樣本比例並非真實比例,這導致精確度很難估算並且不準確。
在測試集上面根據召回率和準確率評估當前版本模型比上一個版本有改進以後,再使用線上真實資料跑一遍,對命中的資料抽樣人工打標,從而計算出一個比較真實的精確度指標。
四、反向利用
內容安全檢測資料極度不平衡的特點,在給模型效果最佳化帶來挑戰的同時,也給我們最佳化系統整體RT提供了幫助。深度學習模型相比傳統的機器學習模型在精度方面進步很多,但相應的計算量卻也增加更多,比如,CNN模型的檢測時間是SVM的十倍以上。
在全面升級深度學習模型的同時,硬體的成本也急劇增加,硬體資源嚴重限制了NLP最新模型與技術的落地。其實線上資料有害內容的比例是很低的,對於大部分正常內容的檢測理論上是在浪費硬體算力。理想狀態下只要把那些有害內容過一下模型識別出來然後刪除即可。基於這樣的想法,我們提出了預檢-終檢二階段過濾的模式:
在原來的深度學習模型基礎上,使用機器學習模型在重新訓練出一個預檢模型,調整預檢模型的分類閾值使得模型對有害樣本具有非常高的召回。線上資料先過預檢模型,把召回出來的少量可疑資料再用深度學習模型識別。這種模式實際效果非常好,上線後在保持召回基本不變的前提下,RT直接減少75%以上。
五、總結
本文針對內容安全場景中文字分類遇到的資料不平衡問題進行討論,介紹了應對資料不平衡問題的幾種技術方法,包括過取樣、欠取樣、加權loss、focal loss、GHM loss等,同時分析了資料不平衡對模型效果評估的影響以及我們採取的做法,最後分享了我們利用資料不平衡特點進行RT最佳化的經驗。
在網上,我們會閱讀到在各種場景下出現的文字,包括圖片標題、賬戶名稱、影片彈幕、社群評論、簡訊等,這推動著網易易盾不斷結合實際場景推出新的技術解決方案。
除文字檢測之外,易盾的內容安全服務涵蓋圖片檢測、影片檢測、音訊檢測、人工稽核和智慧稽核系統等產品,以及廣告合規、網站內容檢測、文件內容檢測、歷史資料清洗、音影片、社交娛樂、政企、媒體等解決方案。
智慧時代,內容安全與技術的結合更加深刻。今後,在關注相關研究的同時,易盾將繼續根據自己的業務特點進行探索。(作者:網易易盾NLP演算法專家林洋港(菜牛))