實(shí)戰(zhàn)必備!文本分類中的一些經(jīng)驗(yàn)和 tricks
NewBeeNLP公眾號(hào)原創(chuàng)出品
公眾號(hào)專欄作者 @wulc
作者是字節(jié)跳動(dòng)廣告算法工程師,個(gè)人blog: http://wulc.me
最近在總結(jié)之前做的文本分類實(shí)驗(yàn)的一些經(jīng)驗(yàn)和 tricks,同時(shí)也參考了網(wǎng)上的一些相關(guān)資料(見(jiàn)文末),其中有些 tricks 沒(méi)嘗試過(guò),先在這里記下,或者日后能用上。
這里的經(jīng)驗(yàn)和 tricks 大概可分為兩部分:預(yù)處理部分和模型訓(xùn)練部分,下面分別介紹
預(yù)處理
「文本更正」,主要是將文本標(biāo)準(zhǔn)化,包括繁體轉(zhuǎn)簡(jiǎn)體,全角轉(zhuǎn)半角,拼音糾錯(cuò)等
「文本泛化」,如一個(gè)手機(jī)號(hào)碼,因?yàn)橛袔浊f(wàn)的手機(jī)號(hào)碼,不可能為每個(gè)手機(jī)號(hào)碼設(shè)一個(gè)特征,所以最好將手機(jī)號(hào)碼轉(zhuǎn)化為同一個(gè)特征;另外表情符號(hào)、人名、地址、網(wǎng)址、命名實(shí)體等也要考慮這種泛化,泛化的程度這個(gè)視具體的任務(wù),比如說(shuō)地址可以以國(guó)家為粒度,也可以以省份為粒度
規(guī)范文本為統(tǒng)一長(zhǎng)度時(shí),取所有長(zhǎng)度的均值或者中位數(shù),但是別取最大值;截?cái)鄷r(shí)根據(jù)具體任務(wù)考慮從前面階段或從后面截?cái)?/p>
構(gòu)建數(shù)據(jù)集的 vocabulary 時(shí),需要考慮以下幾個(gè)方面
取前N個(gè)高頻詞或者過(guò)濾掉出現(xiàn)次數(shù)小于某個(gè)閾值的詞 根據(jù)具體任務(wù)確定是否需要去掉 stop words 假如采用了預(yù)訓(xùn)練的詞向量,要盡可能讓 vocabulary 中的詞語(yǔ)能找到對(duì)應(yīng)的詞向量(這個(gè)問(wèn)題也涉及到預(yù)訓(xùn)練的詞向量和分詞器的選擇) 詞向量的選擇,當(dāng)數(shù)據(jù)集較小時(shí),直接使用預(yù)訓(xùn)練好的詞向量(如google、facebook開(kāi)源的),且不用微調(diào);當(dāng)訓(xùn)練集比較大的時(shí)候,可隨機(jī)初始化進(jìn)行訓(xùn)練,也可以對(duì)預(yù)訓(xùn)練的詞向量進(jìn)行微調(diào)(微調(diào)收斂得更快,但是結(jié)果差異不大)
分詞時(shí)考慮以下幾個(gè)方面
是否需要分詞,使用 char-level 的方法時(shí)不需要分詞,但是在很多場(chǎng)景下 word-level 的效果都要比 char-level 的要好 分詞時(shí)可以只保留長(zhǎng)度大于1的詞(會(huì)去除很多停止詞),對(duì)結(jié)果精度沒(méi)什么影響,但是可以有效降低特征維度 采用預(yù)訓(xùn)練的詞向量時(shí),要保證分詞后的大部分詞語(yǔ)能夠出現(xiàn)在預(yù)訓(xùn)練的詞向量表中,否則這個(gè)詞語(yǔ)的 embedding 就相當(dāng)于是隨機(jī)初始化,預(yù)訓(xùn)練的詞向量沒(méi)有提供任何信息;具體方法可參考這里 數(shù)據(jù)增強(qiáng)
常見(jiàn)的方法有:drop(隨機(jī)刪掉文本)、shuffle(隨機(jī)改變文本順序)、replace(用近義詞進(jìn)行替換) 數(shù)據(jù)增強(qiáng)對(duì) word-level 的方法有一定的提升,但是對(duì)于 char-level 的方法效果不一定好,甚至?xí)鸬椒醋饔?/section>
模型訓(xùn)練
規(guī)則有時(shí)能解決大部分的問(wèn)題,不一定要用到模型,使用時(shí)要權(quán)衡模型帶來(lái)的收益和復(fù)雜性
傳統(tǒng)的機(jī)器學(xué)習(xí)方法根據(jù)其特征工程的不同可分為三大類
詞袋模型:將出現(xiàn)的詞記為1,否則記為 0,問(wèn)題是維度高且稀疏性嚴(yán)重 向量空間模型:根據(jù)文檔頻率、互信息、信息增益、χ2統(tǒng)計(jì)量等進(jìn)行了特征(詞語(yǔ))的選擇,同時(shí)通過(guò) tfidf 值為每個(gè)詞賦權(quán)重;一定程度上緩解了上面提到的詞袋模型維度高且稀疏性嚴(yán)重的問(wèn)題 主題模型:pLSA/LDA/HDP 等主題模型將文本表示低維實(shí)數(shù)向量,類似于深度學(xué)習(xí)中的 embedding,但是比 embedding 有更好的解釋性 fasttext 簡(jiǎn)單、速度快,是一個(gè)非常不錯(cuò)的 baseline;隨著問(wèn)題復(fù)雜性增加可依次嘗試 CNN -> RNN -> BERT 對(duì)于深度學(xué)習(xí)模型,把模型變得更深更寬更復(fù)雜往往能夠提升效果;但是當(dāng)模型復(fù)雜到一定程度的時(shí)候,提升的效果微乎其微甚至沒(méi)提升
rnn 類模型用雙向一般會(huì)比單向要好
使用 dropout(經(jīng)驗(yàn)值為 0.5) 基本都能提升效果,使用的地方包括:embedding 層后、FC層后
訓(xùn)練震蕩問(wèn)題:增加隨機(jī)采樣因素盡可能使得數(shù)據(jù)分布 iid,默認(rèn) shuffle 機(jī)制能使得訓(xùn)練結(jié)果更穩(wěn)定。如果訓(xùn)練模型仍然很震蕩,可以考慮調(diào)整學(xué)習(xí)率 或 mini_batch_size
采用預(yù)訓(xùn)練的 embedding 并進(jìn)行 finetune 時(shí),在最開(kāi)始 embedding 的學(xué)習(xí)率設(shè)為 0,訓(xùn)練到效果較好時(shí)才開(kāi)始 finetune embedding 層
學(xué)習(xí)率的設(shè)置考慮以下幾個(gè)方面
經(jīng)驗(yàn)值一般為 1、0.1、0.01、0.001, 一般從1開(kāi)始嘗試。很少見(jiàn)學(xué)習(xí)率大于10的 學(xué)習(xí)率一般要隨著訓(xùn)練進(jìn)行衰減,衰減系數(shù)一般是0.5;衰減時(shí)機(jī)可以是驗(yàn)證集準(zhǔn)確率不再上升,或固定訓(xùn)練 N 個(gè) epoch 后 比起自定義的衰減方法,更便捷的方法是使用自適應(yīng)梯度的辦法,例如 adam,adadelta,rmsprop 等,這些一般使用相關(guān)論文提供的默認(rèn)值即可,可以避免再費(fèi)勁調(diào)節(jié)學(xué)習(xí)率 對(duì)RNN來(lái)說(shuō),如果要處理的序列比較長(zhǎng),或者RNN層數(shù)比較多,那么learning rate一般小一些比較好,否則有可能出現(xiàn)結(jié)果不收斂,甚至Nan等問(wèn)題。 超參數(shù)的設(shè)置經(jīng)驗(yàn)可參考 A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification
模型融合時(shí),差異性越大,融合效果越好,具體可參考知乎看山杯奪冠記[1]
本文參考資料
知乎看山杯奪冠記: https://zhuanlan.zhihu.com/p/28923961
[2]在文本分類任務(wù)中,有哪些論文中很少提及卻對(duì)性能有重要影響的tricks?: https://www.zhihu.com/question/265357659
[3]用深度學(xué)習(xí)(CNN RNN Attention)解決大規(guī)模文本分類問(wèn)題 - 綜述和實(shí)踐: https://zhuanlan.zhihu.com/p/25928551
[4]深度學(xué)習(xí)網(wǎng)絡(luò)調(diào)參技巧: https://zhuanlan.zhihu.com/p/24720954
- END -
往期精彩回顧
