張小為,邵劍飛
(昆明理工大學(xué) 信息工程與自動化學(xué)院,云南 昆明 650031)
互聯(lián)網(wǎng)上的數(shù)字文本日益增多,從應(yīng)用程序到擁有數(shù)百萬數(shù)據(jù)的網(wǎng)站,都存在大量計算機(jī)難以甄別的文本數(shù)據(jù)。由于數(shù)據(jù)量大且文本語義錯綜復(fù)雜,導(dǎo)致文本分類成為一項難題。因此,如何使計算機(jī)對大量文本數(shù)據(jù)進(jìn)行分類,正成為研究者感興趣的話題。一般來說,文本分類任務(wù)只有很少的類。當(dāng)分類任務(wù)有大量的類時,傳統(tǒng)的循環(huán)神經(jīng)網(wǎng)絡(luò)(Rerrent Neural Network,RNN)[1](如 LSTM 和GRU)算法準(zhǔn)確率表現(xiàn)不佳,因此本文引用谷歌大腦發(fā)布的基于transformer的來自變換器的雙向編碼器表征量(Bidirectional Encoder Representations from Transformers,BERT)[2]模型來對中文新聞文本進(jìn)行分類,數(shù)據(jù)集采用新浪新聞RSS訂閱頻道2005年至2011年間的歷史數(shù)據(jù)篩選過濾生成的THUCNews中文文本分類數(shù)據(jù)集,共有金融、房產(chǎn)、股票、教育、科技、社會、時政、體育、游戲及娛樂10個類別。
深度神經(jīng)網(wǎng)絡(luò)由于其強(qiáng)大的表達(dá)能力和較少的實(shí)用技術(shù)要求,正成為文本分類的常用任務(wù)。盡管神經(jīng)文本識別模型很有吸引力,但在許多應(yīng)用中,神經(jīng)文本識別模型缺乏訓(xùn)練數(shù)據(jù)。近年來,人們提出了多種中文文本分類方法。由于中文文本本身的特點(diǎn),與英語等其他語言相比,中文文本分類比較困難。為了提高中文文本分類的質(zhì)量,Liu等人[3]提出了一種分層模型結(jié)構(gòu),可以從中文文本中按順序提取上下文和信息,這種方法是LSTM和時間卷積網(wǎng)絡(luò)的組合。而LSTM用于提取文檔的上下文和序列特征。Shao等人[4]提出了一種大規(guī)模多標(biāo)簽文本分類的新方法。首先將文本轉(zhuǎn)換為圖形結(jié)構(gòu),然后使用注意機(jī)制來表示文本的全部功能。他們還使用卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行特征提取。與最新的方法相比,該方法顯示了良好的結(jié)果,并且使用了4個數(shù)據(jù)集進(jìn)行實(shí)驗(yàn)。在CRTEXT數(shù)據(jù)集上進(jìn)行的結(jié)果表明,與其他數(shù)據(jù)集相比,他們的模型取得了最好的結(jié)果。本文利用BERT自注意力的優(yōu)點(diǎn),將BERT當(dāng)做embedding[5]層接入到其他主流模型,并在同一個新聞數(shù)據(jù)集進(jìn)行訓(xùn)練和驗(yàn)證。最后將各個模型與BERT拼接的模型進(jìn)行比較。
2.1.1 BERT的基礎(chǔ)架構(gòu)
BERT使用的是transformer的encoder的部分,是由多個encoder堆疊在一起的。6個encoder組成編碼端,6個decoder組成解碼端。一個encoder具有輸入、注意力機(jī)制以及前饋神經(jīng)網(wǎng)絡(luò)3個部分。BERT的基礎(chǔ)結(jié)構(gòu)如圖1所示。
圖1 BERT的基礎(chǔ)結(jié)構(gòu)
BERT編碼器需要一個token序列。處理和轉(zhuǎn)換token的過程如圖2所示。[CLS]是插入在第一句開頭的特殊標(biāo)記。[SEP]插入在每個句子的末尾。通過添加“A”或“B”區(qū)分句子來創(chuàng)建embedding。另一方面,還在序列中添加每個標(biāo)記的位置來進(jìn)行位置嵌入。
圖2中,3個embedding的總和就是BERT編碼器的最終輸入。當(dāng)一個輸入序列輸入到BERT時,它會一直向上移動堆棧。在每一個塊中,它會首先通過一個自我注意層再到一個前饋神經(jīng)網(wǎng)絡(luò)之后再被傳遞到下一個編碼器。最后,每個位置將輸出一個大小為hidden_size(BERT_Base=768)的向量。
圖2 token轉(zhuǎn)換過程
2.1.2 掩碼語言模型(Masked Language Model,MLM)
在新聞文本序列中,通過標(biāo)記[MASK]來替換它們隨機(jī)屏蔽一定百分比的單詞。在本文中屏蔽了15%的輸入詞,然后訓(xùn)練剩下的輸入詞,最后讓解碼器來預(yù)測被屏蔽的輸入詞。例如:
調(diào)查顯示:29.5%的人不滿意當(dāng)年所選高考專業(yè)
調(diào)查顯示:29.5%的人不滿意當(dāng)年所選[MASK]專業(yè)
這里的一個問題是預(yù)訓(xùn)練模型將會有15%的掩碼標(biāo)記,但是當(dāng)微調(diào)預(yù)訓(xùn)練模型并傳遞輸入時,不會傳遞掩碼標(biāo)記。為了解決這個問題,將用于屏蔽的15%的token中的80%替換為token[MASK],然后將10%的時間token替換為隨機(jī)token,其余的保持不變。
由于BERT在預(yù)訓(xùn)練的時候使用的是大量無標(biāo)注的語料,因此要使用無監(jiān)督(無標(biāo)簽)的方法,本文采用的無監(jiān)督目標(biāo)函數(shù)是AE自編碼模型。它可以從損壞的輸入數(shù)據(jù)進(jìn)行預(yù)測并重建原始數(shù)據(jù),也就是利用上下文信息的特點(diǎn)來進(jìn)行重組。另外一種無監(jiān)督目標(biāo)函數(shù)是AR自回歸模型。下面從一個句子(我喜歡小狗)來比較兩種無監(jiān)督模型。
AR:
由式(1)可知,AR自回歸模型只用到了文本的單側(cè)信息,且依賴于兩個相鄰詞的依賴關(guān)系。
AE:
由式(2)可知,AE用mask掩蓋掉某些詞,優(yōu)化目標(biāo)是:在“我mask小狗”的條件下出現(xiàn)“我喜歡小狗”的概率,而這個概率等于在“我小狗”的條件下,mask=“喜歡”的概率,據(jù)此預(yù)測出mask的詞。對比AR自回歸模型,AE自編碼模型的優(yōu)點(diǎn)很明顯:充分利用了上下文詞與詞的關(guān)系而不依賴于相鄰的兩個詞的關(guān)系。因此本文BERT采用AE自編碼模型。
2.1.3 NSP(下一個句子預(yù)測)
在BERT訓(xùn)練過程中,模型接收成對的句子作為輸入,并學(xué)習(xí)預(yù)測成對中的第二個句子是否是原始文檔中的后續(xù)句子。在訓(xùn)練期間,50%的輸入是一對,其中第二個句子是原始文檔中的后續(xù)句子,而另外50%的輸入是從語料庫中隨機(jī)選擇的一個句子作為第二個句子。為了幫助模型區(qū)分訓(xùn)練中的兩個句子(正樣本和負(fù)樣本),輸入在進(jìn)入模型之前先按以下方式處理。
(1)在第一個句子的開頭插入一個[CLS]標(biāo)記,在每個句子的末尾插入一個[SEP]標(biāo)記。
(2)將表示句子A或句子B的sentenceembedding添加到每個token中。
(3)將Positional embedding[6]添加到每個embedding以表示其在序列中的位置。
為了預(yù)測第二個句子是否確實(shí)與第一個句子相關(guān)聯(lián),按照以下步驟進(jìn)行預(yù)測。
(1)整個輸入序列經(jīng)過Transformer模型。
(2)[CLS]標(biāo)記的輸出使用簡單的分類層(權(quán)重和偏差的學(xué)習(xí)矩陣)轉(zhuǎn)換為2×1形狀的向量。
(3)用softmax[7]計算IsNextSequence的概率。
在訓(xùn)練BERT模型時,MLM和NSP是一起訓(xùn)練的,目標(biāo)是最小化兩種策略的組合損失函數(shù)。
CNN首次被提出是被用在圖像處理上的,而后YoonKim提出的用于句子分類的卷積神經(jīng)網(wǎng)絡(luò)使得其對于句子分類更加有效。TextCNN[8]模型主要使用一維的卷積核以及時序最大池化層。如果輸入的新聞文本序列由k個詞組成,而每個詞的詞向量為n維,那么輸入的樣本寬度等于輸入的句子序列詞個數(shù)k,高為1,輸入的通道數(shù)等于每個詞的詞向量n。以下是TextCNN的主要計算步驟。
(1)先定義多個一維的卷積核,再通過這些卷積核對輸入分別進(jìn)行卷積計算。不同寬度的卷積核會得到個數(shù)不同的相鄰詞之間的相關(guān)性[9]。
(2)對所有輸出部分的通道一一進(jìn)行時序最大池化操作,再將池化后的結(jié)果連接為向量。
(3)使用全連接層將第2步連接好的向量變換為有關(guān)各個標(biāo)簽(本文使用的數(shù)據(jù)集標(biāo)簽一共有10個)的輸出。為了防止出現(xiàn)過擬合,本文還在這一步驟使用了丟棄層[10]。
下面用一個例子解釋TextCNN的原理。采用本文所用的數(shù)據(jù)集中的一個樣本:“某公司收費(fèi)遭投訴引關(guān)注,用戶抱怨賬單不明”,分詞結(jié)果為“某公司收費(fèi)遭投訴引關(guān)注用戶抱怨賬單不明”,詞數(shù)為11,每個詞的詞向量設(shè)置為6。因此輸入的序列寬度為11,輸出的通道數(shù)為6。然后設(shè)置2個一維的卷積核,卷積核尺寸為2*4,設(shè)置輸出通道分別為5和4。因此,經(jīng)過一維卷積核計算后,5個輸出通道的寬為11-4+1=8,4個輸出通道的寬為11-2+1=10。接著對各個通道進(jìn)行時序最大池化操作,并將9個池化后的輸出連接成一個9維的向量。最后,通過全連接層將9維向量轉(zhuǎn)化為10維輸出,也就是新聞文本類別的標(biāo)簽個數(shù)。具體過程如圖3所示。
圖3 TextCNN原理
在監(jiān)督學(xué)習(xí)中,模型的性能主要依賴于數(shù)據(jù)集。神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)也依賴于數(shù)據(jù)集,如果數(shù)據(jù)集的數(shù)量較少,學(xué)習(xí)就會不足。為了為模型訓(xùn)練和模型結(jié)果評估提供合適的數(shù)據(jù)集,本文使用一個名為THUCNews的大型新聞?wù)Z料庫。這個數(shù)據(jù)集主要爬取2005-2011年間新浪新聞的RSS訂閱頻道新聞標(biāo)題,一共有74萬篇新聞文檔(2.19 GB),均為UTF-8純文本格式。該語料庫已在Github上公開。本文主要抽取其中的20萬條新聞標(biāo)題,一共有10個類別:金融、房產(chǎn)、股票、教育、科技、社會、時政、體育、游戲及娛樂。每個類別有2萬條,平均文本字符長度為20~30。采用其中的18萬條作為訓(xùn)練集,1萬條用來做驗(yàn)證集,剩下的1萬條做測試集。
本實(shí)驗(yàn)采用的計算機(jī)處理器為AMD R5 3600六核十二線程CPU,顯卡為NVIDIA GTX 1060(6 GB),基于python3.8,深度學(xué)習(xí)框架主要用的是pytorch1.9.0+cu102 GPU版本,運(yùn)行內(nèi)存16 GB。由于顯存容量限制,batch_size設(shè)置為16,Epoch設(shè)置為3。編程軟件使用的是pycharm社區(qū)版。
本次實(shí)驗(yàn)采用的是BERT在Github的公開開源版本,并通過新聞數(shù)據(jù)集的特點(diǎn)微調(diào)BERT,以提升BERT的下游任務(wù)的效果。然后將BERT作為embedding輸入到CNN、RNN模型,最后進(jìn)行BERT、BERT-CNN、BERT-RNN的效果對比。
為了評估各個模型的性能,本實(shí)驗(yàn)使用“提前停止(earlystopping)”技術(shù)(一旦訓(xùn)練效果停止改善,立即自動停止訓(xùn)練過程),這可以更好地避免過擬合問題。主要采用3種常用的評估指標(biāo):Precision精準(zhǔn)率、Recall召回率以及F1。最后使用測試準(zhǔn)確率Test_accuracy進(jìn)行比較。3種指標(biāo)的計算方法為:
式中:TP表示預(yù)測10個標(biāo)簽(0~9)當(dāng)中的指定標(biāo)簽被正確預(yù)測的個數(shù);FP表示預(yù)測為指定標(biāo)簽但實(shí)際上是其他標(biāo)簽的個數(shù);FN表示預(yù)測為其他標(biāo)簽但實(shí)際上是指定標(biāo)簽的個數(shù)。
3.4.1 實(shí)驗(yàn)結(jié)果
BERT、BERT-CNN、BERT-RNN的試驗(yàn)結(jié)果分別如表1、表2及表3所示。平均Test_accuracy實(shí)驗(yàn)結(jié)果如表4所示。3個模型在1萬條測試數(shù)據(jù)中的表現(xiàn)如圖4所示。
圖4 3個模型在1萬條測試數(shù)據(jù)中的表現(xiàn)
表1 BERT實(shí)驗(yàn)結(jié)果
表2 BERT-CNN實(shí)驗(yàn)結(jié)果
表3 BERT-RNN實(shí)驗(yàn)結(jié)果
表4 平均Test_accuracy實(shí)驗(yàn)結(jié)果
3.4.2 結(jié)果分析
從表1、2、3可以得出:識別的標(biāo)簽不同,各個模型的評價體系得分也不同。10個標(biāo)簽共30個評分項,BERT-CNN一共有17個得分最高項,BERT有8個得分最高項,BERT-RNN有5個得分最高項。其中,BERT-CNN所有標(biāo)簽平均得分為0.941,BERT所有標(biāo)簽平均得分為0.938,BERT-RNN所有標(biāo)簽平均得分為0.936。可見BERT-CNN表現(xiàn)最佳。
從表4和圖4可以看出,BERT-CNN無論是在平均測試準(zhǔn)確率還是測試準(zhǔn)確率的表現(xiàn)都要優(yōu)于BERT和BERT-RNN。
實(shí)驗(yàn)結(jié)果證明,本文提出的基于改進(jìn)的BERTCNN模型在新聞文本測試的表現(xiàn),測試精度94.06%比原來的BERT模型高出了0.31%,且更為穩(wěn)定。
本文的模型主要運(yùn)用于文本的多分類場景中,未來可以嘗試在電影影評進(jìn)行分類(二分類,積極或消極),各個模型的表現(xiàn)可能會不盡相同,且在相同條件下可以考慮運(yùn)行時間的長短,將其添加進(jìn)模型的評級體系。
目前在文本分類問題中,通過各大閱讀理解競賽榜單可以看到,深度學(xué)習(xí)的成績已經(jīng)超過人類閱讀理解的能力,但是各個模型量都過于龐大,訓(xùn)練周期時間長,且對硬件的限制較大。希望未來研究者能夠提出一種輕量級的、能夠運(yùn)用于各個文本分類器的語言模型。