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

評論