日常工作中,因為很多原因,我們面對的問題總不能一下放模型里,就能就得到很好的效果,前面有文章詳細講過可以通過bad case分析定位并解決問題(心法利器[40] | bad case治療術:解決篇,這是最后一篇),今天換個角度,從一個分類任務來看,會有哪些問題,以及有哪些可以考慮的解決方案。
這里,我按照問題作為分類,來給出一些常見的解決方案。
看完這篇文章后,別遇事不決換模型了,別讓老板知道你只會這招(狗頭)。
數據的問題
在現實問題下,有80%以上的效果不好,都是由于數據的問題,這里我來列舉一些常見的數據問題以及解決方案。
數據標注錯誤
人很難不犯錯的,即使是一些比較出名的開源數據集,其實也很難達到全對的水平,很多數據集只要認真做過case,例如做過case分析,就會發現其實有很多的標注錯誤,實際應用中,大部分情況準確率能達到95%就已經是高質量的數據了,一般能達到90-92%這個數據集就基本可用了,而如果模型本身預測的結果準確率就只是在90%上下,其實模型已經很大程度擬合好了這個數據集,再往上的提升很可能只是分數高,擬合了錯誤結果而已,這個是需要首先說明的。
其次,有些數據集,和很多原因有關,無論是訓練集還是測試集,準確率可能都只是在六七十甚至更低,我們其實無法苛求模型能達到更好的水平。對訓練集,如果質量低,這事就和拿了本錯誤的教材一樣,根本學不好,對測試集,再優秀的模型遇到這個測試集,即使預測對了,標注是錯的,體現在指標上也是準確率很低,模型怎么換效果都不好。
這個數據標注問題,往往體現的是這個系統的上限,此時,我們所應該聚焦的,就是提升數據標注的準確性,這里給出大家提一些可以考慮的策略:
仔細修正標注策略(畢竟數據標注除了人工還有很多方法),制定更多規則來優化。
如果數據標注比較困難,可以考慮多人標注,對不一致的部分進行復合,整體質量提升會比較明顯。
配合模型、規則等多個策略進行比對,對不一致的部分進行復標。
利用模型,對模棱兩可(二分類概率在0.5上下)或者明顯錯誤的(正類prob在0.1左右或負類prob在0.9左右),進行復標。
后面幾個策略其實挺“主動學習”的,核心就是通過模糊或者不一致來挖掘很可能有錯的部分進行復合,來提升整體的質量。
數據數量問題
現階段,雖然有無監督之類的很多策略,但是對于特定的任務或者需求,總是離不開訓練數據的,我們需要數據來讓模型知道“遇到這個情況該選哪個”,因此數據數量是需要基本保證的。
首先,很多人很容易想到兩個常見策略:
數據增強。
無監督。
這兩個方案,是可以的,但不是萬能的:
數據增強——在本身數據的覆蓋面已經較充足的情況。例如天氣意圖的分類,其實來回就這么集中情況,列舉完增強就行。但是遇到類似電影、電視劇意圖的分類,分布很難完整覆蓋,只有幾條樣本完全不能通過常規的增強解決。
無監督——如果有自信模型能往特定的方向預測,那這么做其實還行,但是定向這事很困難的,例如都是二分類問題,一個分是否是天氣意圖,一個分是否是電影意圖,都是同一批數據,如何知道訓出的無監督模型朝著那個任務的方向預測?
所以,私以為還是要從人體的根源出發。分幾個情況吧:
整體數據都很少的情況。
整體數據尚可,但是特定類目或者特定情況的數據太少的情況。
對于整體數據都很少的問題,如果是像我前面說的——在本身數據的覆蓋面已經較充足的情況,那其實直接數據增強是可以的,增強之后會讓模型強化對特定意識的了解,直接就能學出來了,但是如果不足,那就要找渠道增加數據了,有用戶數據的,可以撈一些用戶query,根據用戶點擊在整理下,沒有的,結合一些詞典構造一些樣本放入也是可以的,甚至有一些場景是有公開數據的,直接拿來用。
而對于數據樣本不均衡的問題,之前有寫過文章介紹,此處不贅述了(心法利器[44] | 樣本不均衡之我見)。
小補充
只有在數據的數量和質量都比較充足的時候,我們才有資格去談模型,談其他的優化策略,這應該是一名成熟的算法工程師所需要掌握的基礎知識。
模型升級的收益
模型的升級往往帶來的是一個系統級別的提升,這個系統提升是上限的提升,只有到這個系統內部的多個位置都已經有比較高了,這時候換模型才能帶來比較明顯的收益,例如數據已經調教的比較好,沒有什么大問題,這個時候升級模型能很快提分,這里例如fasttext->textcnn,上預訓練模型等,但是確實是要看清切換的時機,畢竟切換是需要成本的,到時候切換完效果不提升,白干活的話KPI很容易崩的(狗頭)。
有關切換時機,大家可以看這篇(心法利器[63] | 預訓練模型的上線時機)。
特定樣本引入打來的提升
常規下,要調整效果,還是要從bad case里出發,理解數據中常見的問題,然后進行優化,其實是日常最常用的方式,這個方式簡單快速,但是也有難點,難的是發現規律并進行解決,這里給大家介紹一些比較常見的問題和主要解決方法。
正負樣本里某些詞的詞頻差距很大,導致模型認為出現的這個詞就是分類標志,導致分類錯誤。
解決方法1,撈日志,這個詞在正類多就找帶這個詞的負類樣本,反之亦然。
解決方法2,刪除樣本,例如這個詞在正類多就干掉一些正樣本。
泛化能力不足,模型只學到了正規的句式,對于泛化、換個說法的樣本可能就預測錯了。
r-dropout,值得推薦。
拼接,和一些無意義、閑聊類的句子進行拼接,維持源類別,放入對應類目的樣本中。
數據增強,尤其關注隨機交叉的這個策略,有收益。
檢索增強,用向量召回最接近的句子,用這批放入對應類目。
因為缺乏特定形式的樣本(模型沒見過),導致模型只能猜還猜不對。
加入特定類型的樣本。(在天氣意圖分類數據里,把“天氣之子”作為負樣本放入訓練集中)
考慮通過別的方式解決,例如用詞典(心法利器[41] | 我常說的詞典匹配到底怎么做)或者以搜代分的方式來處理(心法利器[60] | 以搜代分的生效機理)補充。
當然,還有一些別的策略,這些策略很大程度和自己對業務、數據的理解有關,越是了解提升的幅度會越大。最近的一次實驗,由于用戶query其實都是語音轉文字得到的句子,而由于采音、ASR等問題,得到的用戶query可能不是完整的,不完整意味著可能有關鍵詞但是信息仍舊模糊,這就容易導致誤召回了(模糊或者無意義的句子是會被認為是負類的),因此,我才用的策略是對常見高頻的句子做隨機截斷,然后放入負類中,最終結果是以2%的召回率代價換來了4%的準確率提升,算是收益較大的,漏召回的會根據實際情況再調整即可。
其他策略的引入
一個完整可控的系統,不能光靠模型來解決所有問題,而實際上也是模型并不能解決所有問題,我們需要眾多的支持和輔助,構造成一個系統,才能讓整體效果達到新的高度,這里有一些可以考慮的思路。
對于簡單、高頻的問題,其實不太認為需要模型,處理用一些詞典和規則能更加穩定可控地解決。
如果問題的尾巴比較長,長尾問題的樣本比較難獲取,占比較低,此時模型并不能學得好,與其考慮增強和挖掘,不如交給檢索的方式做更加高效,別考慮增加特定樣本了(以搜代分:心法利器[26] | 以搜代分:文本多分類新思路)。
模型附帶后處理,解決模棱兩可,或者比較邊界的問題,舉個例子:
閾值大于0.7的才是正類,0.5-0.7的部分需要依賴別的因素做進一步判斷才準入。
多個分類模塊組合,最終用加入rank層進行多結果的排序,解決復雜多變的分類場景。
多個二分類,不讓模型處理混淆問題,最終rank層再來擇優。
類目體系更新頻繁,重訓模型對其他類目影響大。
多個分類場景差異大,數據不好平衡。
審核編輯:劉清
-
數據集
+關注
關注
4文章
1223瀏覽量
25284
原文標題:文本分類日常提點技巧
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
常見xgboost錯誤及解決方案
常見換熱器故障及解決方案
常見OTDR故障及解決方案
DFT的常見誤區與解決方案
SSM開發中的常見問題及解決方案
常見的時間繼電器故障及解決方案
常見的GND連接錯誤及解決方案
常見BGA芯片故障及解決方案
TTL電路中的常見問題及解決方案
一些常見的動態電路

aes加密的常見錯誤及解決方案
PID控制的常見問題及解決方案
分享一些常見的電路

評論