深度學(xué)習(xí)往往需要大量數(shù)據(jù),不然就會(huì)出現(xiàn)過度擬合,本文作者提出了一些在文本數(shù)據(jù)量不夠大的時(shí)候可用的一些實(shí)用方法,從而賦予小數(shù)據(jù)集以價(jià)值。
作為數(shù)據(jù)科學(xué)家,為你的問題選擇正確的建模方法和算法應(yīng)該是你最重要的技能之一。
幾個(gè)月前,我致力于解決一個(gè)文本分類問題,關(guān)鍵在于判斷哪些新聞文章與我的客戶相關(guān)。
我只有一個(gè)幾千條帶標(biāo)注的新聞數(shù)據(jù)集,所以我從簡(jiǎn)單的經(jīng)典機(jī)器學(xué)習(xí)建模方法開始著手解決這個(gè)問題,例如用TF-IDF來做Logistic回歸分類。
一般說來,這些模型適用于長文檔(如新聞、博客文章等)的文本分類,然而在我這個(gè)任務(wù)上的執(zhí)行效果卻不盡如人意,僅僅略好于隨機(jī)分類。
在研究了一番模型錯(cuò)在哪里之后,我發(fā)現(xiàn)詞袋模型(bag of words)這種表示方法對(duì)于這個(gè)任務(wù)是不夠的,我需要一個(gè)能深入理解文檔語義的模型。
深度學(xué)習(xí)模型在需要深入理解文本語義的復(fù)雜任務(wù)上已經(jīng)表現(xiàn)出了非常好的效果,例如機(jī)器翻譯,自動(dòng)問答,文本摘要,自然語言推理等。
這看起來對(duì)我的任務(wù)而言是一個(gè)很完美的方法,但是為了訓(xùn)練深度學(xué)習(xí)模型通常需要數(shù)十萬甚至數(shù)百萬個(gè)被標(biāo)記的數(shù)據(jù),而我只有一個(gè)很小的數(shù)據(jù)集。怎么辦呢?
通常,我們需要大量數(shù)據(jù)來訓(xùn)練深度學(xué)習(xí)模型目的在于避免過擬合。深度神經(jīng)網(wǎng)絡(luò)具有非常非常多的參數(shù),因此如果沒有用足夠的數(shù)據(jù)去訓(xùn)練它們,它們往往會(huì)記住整個(gè)訓(xùn)練集,這就會(huì)導(dǎo)致訓(xùn)練的效果很好,但在測(cè)試集上的效果就很差了。
為了避免因缺乏大量數(shù)據(jù)而導(dǎo)致的這種情況,我們需要使用一些特殊的技巧!一擊必殺的技巧!
在這篇文章中,我將展示一些由我自己開發(fā)或是我在文章、博客、論壇、Kaggle和其他一些地方發(fā)現(xiàn)的方法,看看它們是如何在沒有大數(shù)據(jù)的情況下讓深度學(xué)習(xí)更好地完成我的任務(wù)的。其中許多方法都基于計(jì)算機(jī)視覺中廣泛使用的最佳實(shí)踐。
一個(gè)小小的免責(zé)聲明:我并不是一個(gè)深度學(xué)習(xí)方面的專家,這個(gè)項(xiàng)目也只是最初幾個(gè)我用深度學(xué)習(xí)完成的大項(xiàng)目之一。這篇文章的所有內(nèi)容都是對(duì)我個(gè)人經(jīng)驗(yàn)的總結(jié),有可能我的方法并不適用你的問題。
正則化
正則化方法以不同的形式呈現(xiàn)在機(jī)器學(xué)習(xí)模型中,它可以被用來避免過擬合。這些方法的理論性很強(qiáng),對(duì)于大多數(shù)問題來說是一種普遍通用的方式。
L1和L2正則化
這些方法可能是最古老的,并且在許多機(jī)器學(xué)習(xí)模型中已經(jīng)使用多年。
使用這種方法時(shí),我們將權(quán)重的大小添加到我們?cè)噲D最小化的模型損失函數(shù)中。這樣,模型將盡量使權(quán)重變小,同時(shí)那些對(duì)模型影響不明顯的權(quán)重值將被減小到零。
通過這種方式,我們可以使用更少數(shù)量的權(quán)重來記住訓(xùn)練集。
更多細(xì)節(jié):
https://towardsdatascience.com/only-numpy-implementing-different-combination-of-l1-norm-l2-norm-l1-regularization-and-14b01a9773b
Dropout
Dropout是另一種較新的正則化方法。它具體的做法是在訓(xùn)練期間,神經(jīng)網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)(神經(jīng)元)按照P的概率被丟棄(即權(quán)重被設(shè)置為零)。這樣,網(wǎng)絡(luò)就不會(huì)依賴于特定的神經(jīng)元和他們之間的相互作用,而必須在不同的部分學(xué)習(xí)每一種模式。這就使得模型專注于學(xué)習(xí)那些更易于適用到新數(shù)據(jù)的重要模式。
Early stopping
Early stopping是一種簡(jiǎn)單的正則化方法,只需監(jiān)控驗(yàn)證集性能,如果你發(fā)現(xiàn)驗(yàn)證集性能不再提高,就停止訓(xùn)練。這種方法在沒有大數(shù)據(jù)的情況下非常重要,因?yàn)槟P驮?-10次甚至更少次數(shù)的迭代之后,通常就開始出現(xiàn)過擬合了。
減少參數(shù)的數(shù)量
如果你沒有大型數(shù)據(jù)集,那你就應(yīng)該謹(jǐn)慎設(shè)計(jì)網(wǎng)絡(luò)中的層數(shù)和每層的神經(jīng)元數(shù)量。 此外,向卷積層這樣的特殊層比全連接層具有更少的參數(shù),所以如果可能的話,使用它們會(huì)非常有用。
數(shù)據(jù)增強(qiáng)
數(shù)據(jù)增強(qiáng)是一種通過更改訓(xùn)練數(shù)據(jù)而不改變數(shù)據(jù)標(biāo)簽的方式來創(chuàng)建更多訓(xùn)練數(shù)據(jù)的方法。 在計(jì)算機(jī)視覺中,許多圖像變換的方法被用于數(shù)據(jù)集大小進(jìn)行擴(kuò)增,例如翻轉(zhuǎn)、裁剪、縮放、旋轉(zhuǎn)等。
這些變換對(duì)于圖像類型的數(shù)據(jù)很有用,但不適用于文本,譬如翻轉(zhuǎn)出像“狗愛我”這樣無意義的句子,用它來訓(xùn)練模型的話將不會(huì)有什么效果。以下是一些針對(duì)文本的數(shù)據(jù)的增強(qiáng)方法:
同義詞替換
在這種方法中,我們隨機(jī)的選一些詞并用它們的同義詞來替換這些詞,例如,我們將句子“我非常喜歡這部電影”改為“我非常喜歡這個(gè)影片”,這樣句子仍具有相同的含義,很有可能具有相同的標(biāo)簽。但這種方法對(duì)我的任務(wù)來說沒什么用,因?yàn)橥x詞具有非常相似的詞向量,因此模型會(huì)將這兩個(gè)句子當(dāng)作相同的句子,而在實(shí)際上并沒有對(duì)數(shù)據(jù)集進(jìn)行擴(kuò)充。
回譯
在這個(gè)方法中,我們用機(jī)器翻譯把一段英語翻譯成另一種語言,然后再翻譯回英語。這個(gè)方法已經(jīng)成功的被用在Kaggle惡意評(píng)論分類競(jìng)賽中。
例如,如果我們把“I like this movie very much”翻譯成俄語,就會(huì)得到“Мне очень нравится этот фильм”,當(dāng)我們?cè)僮g回英語就會(huì)得到“I really like this movie”?;刈g的方法不僅有類似同義詞替換的能力,它還具有在保持原意的前提下增加或移除單詞并重新組織句子的能力。
文檔裁剪
新聞文章通常很長,在查看數(shù)據(jù)時(shí),我發(fā)現(xiàn)對(duì)于分類來說并不需要整篇文章。 而且,我發(fā)現(xiàn)文章的主要想法通常會(huì)重復(fù)出現(xiàn)。
這讓我想到將文章裁剪為幾個(gè)子文章來實(shí)現(xiàn)數(shù)據(jù)增強(qiáng),這樣我將獲得更多的數(shù)據(jù)。開始的時(shí)候我嘗試從文檔中抽取幾個(gè)句子并創(chuàng)建10個(gè)新文檔。這些新創(chuàng)建的文檔句子間沒有邏輯關(guān)系,所以用它們訓(xùn)練得到的分類器性能很差。第二次,我嘗試將每篇文章分成若干段,每段由文章中五個(gè)連續(xù)的句子組成。這個(gè)方法就運(yùn)行得非常好,讓分類器的性能提升很大。
生成對(duì)抗網(wǎng)絡(luò)
GAN是深度學(xué)習(xí)領(lǐng)域中最令人興奮的最新進(jìn)展之一,它們通常用來生成新的圖像。下面這篇博客解釋了如何使用GAN進(jìn)行圖像數(shù)據(jù)的數(shù)據(jù)增強(qiáng),但它的一些方法或許也可以適用于文本數(shù)據(jù)。
博客鏈接:
https://towardsdatascience.com/generative-adversarial-networks-for-data-augmentation-experiment-design-2873d586eb59
遷移學(xué)習(xí)
遷移學(xué)習(xí)是指使用為其他任務(wù)訓(xùn)練的網(wǎng)絡(luò)參數(shù)來解決你自己的問題,這些網(wǎng)絡(luò)參數(shù)通常是用大性數(shù)據(jù)集訓(xùn)練得到的。遷移學(xué)習(xí)有時(shí)被用作某些層的初始化,有時(shí)也直接被用于特征提取讓我們免于訓(xùn)練新模型。在計(jì)算機(jī)視覺中,從預(yù)先訓(xùn)練的ImageNet模型開始是解決問題的一種常見的做法,但是NLP沒有像ImageNet那樣可以用于遷移學(xué)習(xí)的大型數(shù)據(jù)集。
預(yù)訓(xùn)練的詞向量
一般應(yīng)用于自然語言處理的深度學(xué)習(xí)網(wǎng)絡(luò)架構(gòu)通常以嵌入層(Embedding Layer)開始,該嵌入層將一個(gè)詞由獨(dú)熱編碼(One-Hot Encoding)轉(zhuǎn)換為數(shù)值型的向量表示。我們可以從頭開始訓(xùn)練嵌入層,也可以使用預(yù)訓(xùn)練的詞向量,如 Word2Vec、FastText 或 GloVe。
這些詞向量是通過無監(jiān)督學(xué)習(xí)方法訓(xùn)練大量數(shù)據(jù)或者是直接訓(xùn)練特定領(lǐng)域的數(shù)據(jù)集得到的。
預(yù)訓(xùn)練的詞向量非常有效,因?yàn)榛诖髷?shù)據(jù)它們給模型提供了詞的上下文并減少了模型的參數(shù),從而顯著地降低了過擬合的可能性。
更多有關(guān)詞嵌入的信息:
https://www.springboard.com/blog/introduction-word-embeddings/
預(yù)訓(xùn)練的句向量
我們可以將模型的輸入從單詞轉(zhuǎn)換為句子,用這種方法我們得到參數(shù)少并且性能好的簡(jiǎn)單模型。為了做到這一點(diǎn),我們可以使用預(yù)訓(xùn)練的句子編碼器,如 Facebook 的InferSent或谷歌的通用句子編碼器。
我們還可以把數(shù)據(jù)集中未打標(biāo)的數(shù)據(jù)用 skip-thought 向量或語言模型等方法訓(xùn)練句子編碼器模型。
更多有關(guān)無監(jiān)督句子向量的信息:
https://blog.myyellowroad.com/unsupervised-sentence-representation-with-deep-learning-104b90079a93
預(yù)訓(xùn)練的語言模型
最近很多論文運(yùn)用大量語料庫預(yù)訓(xùn)練語言模型來處理自然語言任務(wù)得到了驚人的結(jié)果,如ULMFIT,Open-AI transformer和BERT。語言模型是通過前面的單詞預(yù)測(cè)句子中會(huì)出現(xiàn)的下一個(gè)單詞。
這種預(yù)訓(xùn)練并沒有對(duì)我取得更好的結(jié)果起到真正的幫助,但文章給出了一些我沒有嘗試過的方法來幫助我做更好地微調(diào)。
一個(gè)關(guān)于預(yù)訓(xùn)練語言模型很棒的博客:
http://ruder.io/nlp-imagenet/
預(yù)訓(xùn)練無監(jiān)督或自監(jiān)督學(xué)習(xí)
如果掌握大量無標(biāo)簽數(shù)據(jù),我們可以使用無監(jiān)督的方法如自動(dòng)編碼器或掩碼語言模型去訓(xùn)練模型,這樣僅僅依靠文本本身就可以做到。
對(duì)我來說另一個(gè)更好的選擇是使用自監(jiān)督模型。自監(jiān)督模型可以在沒有人工標(biāo)注的情況下自動(dòng)提取標(biāo)簽。Deepmoji項(xiàng)目是一個(gè)很好的例子。
在Deepmoji項(xiàng)目中,作者們訓(xùn)練了一個(gè)預(yù)測(cè)推文中表情符號(hào)的模型,在模型表現(xiàn)良好的情況下,他們使用網(wǎng)絡(luò)預(yù)先訓(xùn)練了一個(gè)推文者的情緒分析模型來獲取表情符號(hào)預(yù)測(cè)模型的狀態(tài)。
表情符號(hào)預(yù)測(cè)和情緒分析顯然非常相關(guān),因此它作為預(yù)訓(xùn)練任務(wù)表現(xiàn)得非常好。自監(jiān)督在新聞數(shù)據(jù)中的運(yùn)用包括預(yù)測(cè)標(biāo)題,報(bào)刊,評(píng)論數(shù)量,轉(zhuǎn)發(fā)數(shù)量等。自監(jiān)督是一種非常好的預(yù)訓(xùn)練方法,但通常很難分辨出代理標(biāo)簽與真實(shí)標(biāo)簽的關(guān)聯(lián)。
使用現(xiàn)成的網(wǎng)絡(luò)進(jìn)行預(yù)訓(xùn)練
在很多公司中,大部分用于不同任務(wù)的機(jī)器學(xué)習(xí)模型都建立在相同的數(shù)據(jù)集或類似的數(shù)據(jù)集上。例如推文,我們可以預(yù)測(cè)其主題、觀點(diǎn)、轉(zhuǎn)發(fā)數(shù)量等。最好通過已經(jīng)成熟應(yīng)用的網(wǎng)絡(luò)預(yù)先訓(xùn)練你的網(wǎng)絡(luò)。對(duì)我的任務(wù)而言,應(yīng)用這個(gè)方法確實(shí)可以提高性能。
特征工程
我知道深度學(xué)習(xí)“殺死”了特征工程,再談特征工程已經(jīng)有點(diǎn)過時(shí)了。但是當(dāng)你沒有大量數(shù)據(jù)時(shí),通過特征工程幫助網(wǎng)絡(luò)學(xué)習(xí)復(fù)雜模式可以大大提高性能。例如,在我對(duì)新聞文章的分類過程中,作者、報(bào)刊、評(píng)論數(shù)、標(biāo)簽以及更多特征可以幫助預(yù)測(cè)標(biāo)簽。
多模式體系結(jié)構(gòu)
我們可以用多模式體系結(jié)構(gòu)將文檔級(jí)特征組合到我們的模型中。在多模式體系結(jié)構(gòu)中,我們構(gòu)建了兩個(gè)不同的網(wǎng)絡(luò),一個(gè)用于文本,一個(gè)用于特征,合并它們的輸出層(無 softmax)并添加更多層。這些模型很難訓(xùn)練,因?yàn)檫@些特征通常比文本具有更強(qiáng)的信號(hào),因此網(wǎng)絡(luò)主要受特征的影響。
關(guān)于多模式網(wǎng)絡(luò)很棒的Keras教程:
https://medium.com/m/global-identity?redirectUrl=https://becominghuman.ai/neural-networks-for-algorithmic-trading-multimodal-and-multitask-deep-learning-5498e0098caf
這種方法使我的模型提高了不到1%的性能。
詞級(jí)特征
詞級(jí)特征是另一種類型的特征工程,如詞性標(biāo)注,語義角色標(biāo)記,實(shí)體抽取等。我們可以將一個(gè)獨(dú)熱編碼表示或一個(gè)詞特征的嵌入與詞的嵌入相結(jié)合并將其用作模型的輸入。
我們也可以在這個(gè)方法中使用其他詞特征,例如在情感分析任務(wù)中我們可以采用情感字典并添加另一個(gè)維度嵌入其中,用 1 表示在字典中的單詞, 0 表示其他單詞,這樣模型可以很容易地學(xué)習(xí)它需要關(guān)注的一些詞。在我的任務(wù)中,我添加了某些重要實(shí)體的維度,這給模型帶來了一個(gè)很好的性能提升。
特征工程預(yù)處理
最后一種特征工程方法是以一種模型更容易學(xué)習(xí)的方式預(yù)處理輸入文本。一個(gè)例子是“詞干提取”,如果運(yùn)動(dòng)并不是一個(gè)重要標(biāo)簽,我們可以用運(yùn)動(dòng)代替足球,棒球和網(wǎng)球這些詞,這將有助于神經(jīng)網(wǎng)絡(luò)模型了解到不同運(yùn)動(dòng)之間的差異并不重要,可以減少網(wǎng)絡(luò)中的參數(shù)。
另一個(gè)例子是使用自動(dòng)摘要。正如我之前所說,神經(jīng)網(wǎng)絡(luò)在長文本上表現(xiàn)不佳,因此我們可以在文本上運(yùn)行自動(dòng)摘要算法,如 TextRank 并僅向神經(jīng)網(wǎng)絡(luò)網(wǎng)絡(luò)提供重要句子。
我的模型
嘗試了本文中討論的方法的不同組合后,在我的項(xiàng)目中表現(xiàn)最好的模型是本文中提到分層注意力網(wǎng)絡(luò)(HAN),模型使用dropout 和 early stopping 作為正則化,并采用文檔剪裁的方法進(jìn)行數(shù)據(jù)集增強(qiáng)。我使用預(yù)訓(xùn)練的詞向量以及我公司的一個(gè)預(yù)訓(xùn)練網(wǎng)絡(luò)(這個(gè)網(wǎng)絡(luò)使用了同樣數(shù)據(jù),只是針對(duì)的任務(wù)不一樣)。
在做特征工程時(shí),我新增了實(shí)體詞級(jí)特征到詞嵌入向量。這些變化使我的模型精確度提高了近 10%,模型效果從比隨機(jī)效果稍好一點(diǎn)上升到了到具有重要業(yè)務(wù)價(jià)值的水準(zhǔn)。
深度學(xué)習(xí)在小數(shù)據(jù)集上的應(yīng)用仍處于該研究領(lǐng)域的早期階段,但看起來它越來越受歡迎,特別是對(duì)于預(yù)訓(xùn)練的語言模型,我希望研究人員和從業(yè)者能夠找到更多的方法使用深度學(xué)習(xí),讓每一個(gè)數(shù)據(jù)集產(chǎn)生價(jià)值。
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8418瀏覽量
132646 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1208瀏覽量
24703 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5503瀏覽量
121170
原文標(biāo)題:幾千條文本庫也能做機(jī)器學(xué)習(xí)!NLP小數(shù)據(jù)集訓(xùn)練指南
文章出處:【微信號(hào):CAAI-1981,微信公眾號(hào):中國人工智能學(xué)會(huì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論