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