完整的思維導(dǎo)圖關(guān)注包包算法筆記回復(fù)【避坑指南】獲取下載查看鏈接。
公眾號包包算法筆記,包包(包大人)的機(jī)器學(xué)習(xí)筆記吆视,分享算法棚贾,機(jī)器學(xué)習(xí),程序員弯淘,職場等算法工程師話題绿店。
背景
說起文本分類,也算是一個(gè)老掉牙的話題庐橙,之前大家都喜歡琢磨模型假勿。最近從工業(yè)界的視角看一下文本分類,看一些從0到1做一些和文本分類項(xiàng)目态鳖,可能大家都會踩過的坑转培,以及經(jīng)驗(yàn)教訓(xùn),都是一些比較有意思的問題浆竭,主要從問題拆解與數(shù)據(jù)浸须,算法選型與推薦,細(xì)節(jié)策略與實(shí)現(xiàn)補(bǔ)充邦泄。
思維導(dǎo)圖回復(fù)【避坑指南】獲取下載查看鏈接删窒。
目錄
一、問題拆解和數(shù)據(jù)
Q1 構(gòu)建文本分類標(biāo)簽體系有哪些坑顺囊?
Q2 初期監(jiān)督數(shù)據(jù)不夠怎么辦肌索?
Q3 如何高效的積累標(biāo)注數(shù)據(jù)?
Q4 如何發(fā)現(xiàn)新的類別包蓝?擴(kuò)充類別空間驶社?
二企量、算法抽象和選型
Q5 文本分類任務(wù)有哪些難點(diǎn)?
Q6 如何定義一個(gè)文本分類問題的難度亡电?
Q7 文本分類算法選型有何推薦届巩?
Q8 如何確定驗(yàn)證集和評價(jià)方法?
三份乒、細(xì)節(jié)策略和實(shí)現(xiàn)
Q9 如何處理溢出詞表詞恕汇?
Q10 文本分類技術(shù)演進(jìn)的明線和暗線?
Q11 策略和算法如何結(jié)合或辖?
Q12 有哪些可以刷分的技巧瘾英?
Q13 模型inference資源限制條件下,如何挑戰(zhàn)算法選型的天花板
問題拆解與數(shù)據(jù)
Q1 構(gòu)建文本分類標(biāo)簽體系有哪些坑颂暇?
在我們在做真實(shí)的業(yè)務(wù)問題的時(shí)候缺谴,不像給定一個(gè)數(shù)據(jù)集,標(biāo)簽就是定死的耳鸯。如何確定一個(gè)合理的分類標(biāo)簽體現(xiàn)其實(shí)是十分關(guān)鍵的湿蛔。這個(gè)階段一定要做數(shù)據(jù)充分的探索性分析。圖省事吃大虧县爬。
下面幾個(gè)基本的原則:
稀疏程度合理阳啥。一般正常的分類體系都是符合一個(gè)長尾分布,大概可以分為1.主要類A财喳,主要類B察迟,xxx,其他類耳高。softmax based分類模型還是主要解決這部分樣本比較多的問題扎瓶。有個(gè)小技巧,按照業(yè)務(wù)上出現(xiàn)問題的頻度祝高,分類空間最好預(yù)留其他方便迭代栗弟。
類間可分污筷,類內(nèi)聚集工闺。不要搞一些分不開的類,最后發(fā)現(xiàn)學(xué)出來的兩個(gè)結(jié)果瓣蛀,置信度都不高陆蟆,對我們沒有什么意義的。
標(biāo)簽的關(guān)系明確惋增。是多分類問題呢叠殷,還是多類別問題呢,還是層級分類呢诈皿?不同的問題有對應(yīng)不同的方法林束,尤其是層級分類像棘,坑比較多,這里先不展開了壶冒。
Q2 初期監(jiān)督數(shù)據(jù)不夠缕题?
標(biāo)注數(shù)據(jù)總需要一定的時(shí)間,這時(shí)候除了用規(guī)則胖腾,詞典之類的方法外烟零,或者fewshot learnig的一些思路解決問題,大體的思路是兩種咸作。
Fewshot Learning 把分類問題轉(zhuǎn)化為匹配或者相似度學(xué)習(xí)的問題锨阿,減小分類空間學(xué)習(xí)的難度,問一個(gè)小孩這個(gè)水果是啥比记罚,總要比墅诡,選擇一個(gè)最像的水果要簡單。
**遷移學(xué)習(xí) **Bert在小數(shù)據(jù)上表現(xiàn)其實(shí)挺出色的桐智,除了慢一點(diǎn)书斜,似乎沒有其他毛病了。上兩個(gè)階段大概只需要幾千條數(shù)據(jù)就可以跑起來了酵使。
Q3 如何高效地積累標(biāo)注數(shù)據(jù)荐吉?
有了前面起步的baseline,我們至少可以扔到線上把模型跑著了口渔,然后人工標(biāo)注數(shù)據(jù)怎么積累又是一個(gè)問題样屠,不同的樣本對于我們當(dāng)前的價(jià)值是不一樣的,類別空間會擴(kuò)充以及長尾標(biāo)注樣本數(shù)量不足是兩個(gè)最常見的問題缺脉。大體的原則是通過不確定性度量和多樣性度量兩個(gè)角度痪欲,來選取對當(dāng)前模型增量送訓(xùn)樣本最優(yōu)價(jià)值的樣本。
不確定的樣本 典型的特點(diǎn)是模型輸出的置信度不高攻礼,沒有把握判斷是哪一個(gè)類別业踢,這種樣本需要人工給出真實(shí)的類別,指導(dǎo)學(xué)習(xí)礁扮。baseline可以用熵來度量知举。
不一樣的樣本 典型的特點(diǎn)就是一些與積累數(shù)據(jù)分布有差異的,玩比賽的常用的adversrial validation太伊,也是一個(gè)簡單高效的辦法雇锡。學(xué)術(shù)界在度量分布差異的時(shí)候,總喜歡從數(shù)學(xué)的角度提出一些奇奇怪怪的指標(biāo)僚焦,甚至還有結(jié)合ugly的聚類去做锰提。而adversrial validation直接從監(jiān)督學(xué)習(xí)的視角出發(fā),讓模型來自動學(xué)習(xí)給定標(biāo)簽的分布差異,從而有一定的區(qū)分能力立肘。并且边坤,這個(gè)過程中,特征重要性和預(yù)測的置信度兩個(gè)結(jié)果分別完成了特征選擇谅年,樣本粒度的分度度量置信度評價(jià)惩嘉。看一下uber這篇論文Adversarial Validation Approach to Concept Drift Problem in User Targeting Automation Systems at Uber踢故,在concept drift detection里面文黎,這也是一種神器。本質(zhì)原理都是一樣的殿较,只不過concept drift detection里耸峭,我們用的是特征重要性反饋,在分布度量里淋纲,我們用的是結(jié)果的置信度劳闹。
- 圖片
Q4 如何發(fā)現(xiàn)新的類別,擴(kuò)充類別空間洽瞬?
有一些方法還挺不錯(cuò)的本涕,推薦ACL2019的那個(gè)論文** Deep Unknown Intent Detection with Margin Loss **
非常簡潔明了。我們在Kaggle Bengali的比賽里面也用了類似的方法檢測新類別伙窃,不過用的是arcface異曲同工吧菩颖,都是margin softmax,簡單又效果非常好为障。具體可以前情回顧發(fā)表在我知乎上的(無法插入跳轉(zhuǎn)鏈接)
從kaggle看2020的手寫體識別:從MISNIT到Bengali.AI 手寫體識別大賽
https://zhuanlan.zhihu.com/p/114131221
本質(zhì)上都是找出晦闰,與已知類別不相似(分布差異較大)的樣本,其實(shí)用前面的adversrial validation也可以解決鳍怨,實(shí)測margin softmax效果更好一點(diǎn)呻右。
算法抽象和選型
Q5 文本分類任務(wù)有哪些難點(diǎn)?
文本分類的難點(diǎn)也是自然語言的難點(diǎn)鞋喇,其根本原因是自然語言文本各個(gè)層次上廣泛存在的各種各樣的歧義性或多義性(ambiguity)和演化的問題声滥,下面典型的例子:
輸入層面:短文本->長文本和超長文本
標(biāo)簽層面:復(fù)雜語義識別,如陰陽怪氣
時(shí)間演化:川普VS 川普侦香,開車VS開車
上下文:美食論壇蘋果小米黑莓 VS手機(jī)論壇蘋果小米黑莓
Q6 如何定義一個(gè)文本分類問題的難度落塑?
典型難度排序:主題分類-情感分類-意圖識別-細(xì)粒度情感識別-復(fù)雜語義識別(如陰陽怪氣)
數(shù)據(jù)量 典型的例子:one/zero shot VS 海量
非線性 典型的例子 :陰陽怪氣 VS 垃圾郵件
類間距離 典型的例子:細(xì)粒度的情感分類 VS 正負(fù)情感傾向
Q7 文本分類的算法選型推薦?
算法選型的出發(fā)點(diǎn)就是權(quán)衡各種約束鄙皇,考慮模型的天花板能力芜赌,選擇合適的模型仰挣。一般對應(yīng)任務(wù)的難度伴逸,權(quán)衡計(jì)算時(shí)效,選擇合適的模型膘壶。除了忽略一些比千分點(diǎn)的場景错蝴,比如競賽和論文洲愤,一般這塊在確定算法選型后,就沒啥油水了顷锰,建議少花精力柬赐。有經(jīng)驗(yàn)的算法工程師,一定能人腦搜索出一個(gè)當(dāng)前選型下的最優(yōu)結(jié)構(gòu)官紫。一個(gè)特別經(jīng)典的建議大家試一下肛宋,concat_emb-> spartial dropout(0.2)->LSTM ->LSTM->concat(maxpool,meanpool)->FC。
結(jié)合前面的任務(wù)難度定義束世,推薦的算法選型行為
Fasttext(垃圾郵件/主題分類) 特別簡單的任務(wù)酝陈,要求速度
TextCNN(主題分類/領(lǐng)域識別) 比較簡單的任務(wù),類別可能比較多毁涉,要求速度
LSTM(情感分類/意圖識別) 稍微復(fù)雜的任務(wù)
Bert(細(xì)粒度情感/陰陽怪氣/小樣本識別)難任務(wù)
Q8 如何確定驗(yàn)證集和評價(jià)方法沉帮?
這是個(gè)老大難的問題,特別是實(shí)際應(yīng)用中贫堰,由于文本分類符合一個(gè)長尾分布穆壕,常見類別的識別能力其實(shí)一般比較ok,長尾識別的稀爛其屏,如果單純看準(zhǔn)確度的話喇勋,是個(gè)還不錯(cuò)的模型,但你不能說他好吧偎行。對應(yīng)著指標(biāo)就是acc很高茄蚯,macro-f1很低。
確定各類別錯(cuò)分的代價(jià) 特別是在類別較細(xì)或者層級標(biāo)簽的時(shí)候睦优,如果在一顆子樹上的標(biāo)簽渗常,犯錯(cuò)的成本并不高。要是完全截然相反的類別汗盘,犯錯(cuò)的代價(jià)就特別大皱碘。這里建議通過懲罰矩陣的方法,構(gòu)建細(xì)粒度的懲罰代價(jià)隐孽。
合理采樣的驗(yàn)證集 真實(shí)的標(biāo)簽分布可能過于不均衡癌椿,建議掐頭補(bǔ)尾,這樣的驗(yàn)證集評價(jià)往往更有區(qū)分度菱阵。
**語義壓測 **各種花里胡哨的變體輸入踢俄,未糾錯(cuò)的文本都來一套,實(shí)在不行晴及,上adversrial attack 攻擊一下都办。
細(xì)節(jié)策略和實(shí)現(xiàn)
Q9 如何處理溢出詞表詞(OOV)?
這個(gè)在前Bert時(shí)代是一個(gè)挺關(guān)鍵的問題,以前回答過琳钉,還可以參考势木。從數(shù)據(jù)中來到數(shù)據(jù)中去, 要么想辦法還原次干歌懒,找到可以替換的詞向量啦桌。要么從sub-word的層次學(xué)習(xí)出語義,參考Bert BPE的方法及皂。很早很早念書的時(shí)候甫男,還沒有Bert做過一些文本分類的比賽,在一些任務(wù)上搞定OOV提分還是很大的验烧。給之前回答過的一個(gè)前Bert時(shí)代方法的鏈接查剖。
WordEmbedding如何處理未登陸詞?
https://www.zhihu.com/question/308543084/answer/604729983
Q10 文本分類模型演進(jìn)的明線和暗線噪窘?
針對上文提出來的文本分類的難點(diǎn)笋庄,其演進(jìn)路徑大概也是從統(tǒng)計(jì)機(jī)器學(xué)習(xí),詞向量+深度學(xué)習(xí)倔监,預(yù)訓(xùn)練語言模型的發(fā)展直砂。
明線:統(tǒng)計(jì)-機(jī)器學(xué)習(xí)-深度學(xué)習(xí)-更深的深度學(xué)習(xí)
暗線a:簡單表達(dá)-語義表達(dá)-上下文語義表達(dá)
暗線b:特征輸入粒度 從詞到subword
暗線c:預(yù)訓(xùn)練權(quán)重從輸入層擴(kuò)展到網(wǎng)絡(luò)結(jié)構(gòu)內(nèi)部
關(guān)于路線的演進(jìn),這里有個(gè)前幾天畫的思維導(dǎo)圖:部分截圖如
<figcaption style="margin: 0.66667em 0px 0px; padding: 0px 1em; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">思維導(dǎo)圖部分截圖</figcaption>
Q11 策略和算法怎么結(jié)合浩习?
算法工程師不能老鄙視規(guī)則静暂,很難一個(gè)模型搞定所有問題。
串行式 典型的代表是谱秽,規(guī)則捕捉-分類-匹配兜底洽蛀,大概這樣的流程會比較合理,規(guī)則部分負(fù)責(zé)解決高頻疟赊,和bad/hard case,分類負(fù)責(zé)解決長尾中的頭部郊供, 匹配負(fù)責(zé)解決長尾。這樣的優(yōu)點(diǎn)是近哟,效率很高驮审,往往大部分case很快就過完了。
并行式 規(guī)則吉执,分類疯淫,匹配都過,然后進(jìn)行歸一化后的置信度進(jìn)行PK戳玫,有點(diǎn)類似于廣告競價(jià)熙掺,這樣的好處是能充分融合多重策略,結(jié)果更可靠咕宿。
Q12 有哪些可以刷分的奇技淫巧币绩?
可以嘗試的點(diǎn)還蠻多的蜡秽,搜索空間特別大,感興趣的可以試試类浪,不保證都有效载城。這部分的方法大多需要在算法選型敲定后肌似,在模型結(jié)構(gòu)上下功夫费就,需要遍歷一些搜索空間。不建議花太大的精力川队,具體可以參照之前的回答力细,而且有了bert之后,他們越來越不重要了固额,也就沒有補(bǔ)充Bert上面的一些操作了:
在文本分類任務(wù)中眠蚂,有哪些論文中很少提及卻對性能有重要影響的tricks?斗躏?
https://www.zhihu.com/question/265357659/answer/582711744
Q13 模型inference資源限制下逝慧,如何挑戰(zhàn)算法選型的天花板
玩比賽的經(jīng)常遇到過這個(gè)問題,典型的場景Kaggle上要求提交模型啄糙,更換測試數(shù)據(jù)笛臣,只給兩個(gè)小時(shí)的推斷時(shí)間。
除此之外隧饼,我們在工業(yè)界耗時(shí)嚴(yán)格的場景下沈堡,Bert總表示遺憾,效果雖好燕雁,但是臣妾做不到啊诞丽。想要TextCNN的速度,又想要逼近Bert的效果拐格。
這時(shí)候模型蒸餾就派上用場了僧免,模型蒸餾在Kaggle一些線上推斷比賽的top solotion必不可少的。Hinton給的baseline是這樣的捏浊,通過teacher model產(chǎn)出soft-target猬膨。然后student同時(shí)學(xué)習(xí)hard target和teacher model的soft-target。不過要注意的是呛伴,用的時(shí)候不要leak勃痴,先用KFold產(chǎn)出soft-target的oof,然后和GroundTruth一起給student訓(xùn)練热康。在不少開源代碼里看到leak soft-target的情況沛申,用teacher摸過訓(xùn)練標(biāo)簽的樣本給student學(xué)習(xí)。