當前位置:
首頁 > 新聞 > 機器學習必須需要大量數據?小數據集也能有大價值!

機器學習必須需要大量數據?小數據集也能有大價值!

新智元推薦

來源:大數據文摘(ID:BigDataDigest)

【新智元導讀】數據不夠大,就不能玩深度學習?長期存在的一大挑戰就是:只有極少數情況下有足夠的數據進行深度學習。本文作者提出了一些比較實用的方法,從簡單的經典機器學習建模方法開始著手解決這個問題,以應對文本數據量不夠大的情況。

深度學習往往需要大量數據,不然就會出現過度擬合,本文作者提出了一些在文本數據量不夠大的時候可用的一些實用方法,從而賦予小數據集以價值。

作為數據科學家,為你的問題選擇正確的建模方法和演算法應該是你最重要的技能之一。

幾個月前,我致力於解決一個文本分類問題,關鍵在於判斷哪些新聞文章與我的客戶相關。

我只有一個幾千條帶標註的新聞數據集,所以我從簡單的經典機器學習建模方法開始著手解決這個問題,例如用TF-IDF來做Logistic回歸分類。

一般說來,這些模型適用於長文檔(如新聞、博客文章等)的文本分類,然而在我這個任務上的執行效果卻不盡如人意,僅僅略好於隨機分類。

在研究了一番模型錯在哪裡之後,我發現詞袋模型(bag of words)這種表示方法對於這個任務是不夠的,我需要一個能深入理解文檔語義的模型。

深度學習模型在需要深入理解文本語義的複雜任務上已經表現出了非常好的效果,例如機器翻譯,自動問答,文本摘要,自然語言推理等。

這看起來對我的任務而言是一個很完美的方法,但是為了訓練深度學習模型通常需要數十萬甚至數百萬個被標記的數據,而我只有一個很小的數據集。怎麼辦呢?

通常,我們需要大量數據來訓練深度學習模型目的在於避免過擬合。深度神經網路具有非常非常多的參數,因此如果沒有用足夠的數據去訓練它們,它們往往會記住整個訓練集,這就會導致訓練的效果很好,但在測試集上的效果就很差了。

為了避免因缺乏大量數據而導致的這種情況,我們需要使用一些特殊的技巧!一擊必殺的技巧!

在這篇文章中,我將展示一些由我自己開發或是我在文章、博客、論壇、Kaggle和其他一些地方發現的方法,看看它們是如何在沒有大數據的情況下讓深度學習更好地完成我的任務的。其中許多方法都基於計算機視覺中廣泛使用的最佳實踐。

一個小小的免責聲明:我並不是一個深度學習方面的專家,這個項目也只是最初幾個我用深度學習完成的大項目之一。這篇文章的所有內容都是對我個人經驗的總結,有可能我的方法並不適用你的問題。

正則化

正則化方法以不同的形式呈現在機器學習模型中,它可以被用來避免過擬合。這些方法的理論性很強,對於大多數問題來說是一種普遍通用的方式。

L1和L2正則化

這些方法可能是最古老的,並且在許多機器學習模型中已經使用多年。

使用這種方法時,我們將權重的大小添加到我們試圖最小化的模型損失函數中。這樣,模型將盡量使權重變小,同時那些對模型影響不明顯的權重值將被減小到零。

通過這種方式,我們可以使用更少數量的權重來記住訓練集。

更多細節:

https://towardsdatascience.com/only-numpy-implementing-different-combination-of-l1-norm-l2-norm-l1-regularization-and-14b01a9773b

Dropout

Dropout是另一種較新的正則化方法。它具體的做法是在訓練期間,神經網路中的每個節點(神經元)按照P的概率被丟棄(即權重被設置為零)。這樣,網路就不會依賴於特定的神經元和他們之間的相互作用,而必須在不同的部分學習每一種模式。這就使得模型專註於學習那些更易於適用到新數據的重要模式。

Early stopping

Early stopping是一種簡單的正則化方法,只需監控驗證集性能,如果你發現驗證集性能不再提高,就停止訓練。這種方法在沒有大數據的情況下非常重要,因為模型在5-10次甚至更少次數的迭代之後,通常就開始出現過擬合了。

減少參數的數量

如果你沒有大型數據集,那你就應該謹慎設計網路中的層數和每層的神經元數量。 此外,向卷積層這樣的特殊層比全連接層具有更少的參數,所以如果可能的話,使用它們會非常有用。

數據增強

數據增強是一種通過更改訓練數據而不改變數據標籤的方式來創建更多訓練數據的方法。 在計算機視覺中,許多圖像變換的方法被用於數據集大小進行擴增,例如翻轉、裁剪、縮放、旋轉等。

這些變換對於圖像類型的數據很有用,但不適用於文本,譬如翻轉出像「狗愛我」這樣無意義的句子,用它來訓練模型的話將不會有什麼效果。以下是一些針對文本的數據的增強方法:

同義詞替換

在這種方法中,我們隨機的選一些詞並用它們的同義詞來替換這些詞,例如,我們將句子「我非常喜歡這部電影」改為「我非常喜歡這個影片」,這樣句子仍具有相同的含義,很有可能具有相同的標籤。但這種方法對我的任務來說沒什麼用,因為同義詞具有非常相似的詞向量,因此模型會將這兩個句子當作相同的句子,而在實際上並沒有對數據集進行擴充。

回譯

在這個方法中,我們用機器翻譯把一段英語翻譯成另一種語言,然後再翻譯回英語。這個方法已經成功的被用在Kaggle惡意評論分類競賽中。

例如,如果我們把「I like this movie very much」翻譯成俄語,就會得到「Мне очень нравится этот фильм」,當我們再譯回英語就會得到「I really like this movie」。回譯的方法不僅有類似同義詞替換的能力,它還具有在保持原意的前提下增加或移除單詞並重新組織句子的能力。

文檔裁剪

新聞文章通常很長,在查看數據時,我發現對於分類來說並不需要整篇文章。 而且,我發現文章的主要想法通常會重複出現。

這讓我想到將文章裁剪為幾個子文章來實現數據增強,這樣我將獲得更多的數據。開始的時候我嘗試從文檔中抽取幾個句子並創建10個新文檔。這些新創建的文檔句子間沒有邏輯關係,所以用它們訓練得到的分類器性能很差。第二次,我嘗試將每篇文章分成若干段,每段由文章中五個連續的句子組成。這個方法就運行得非常好,讓分類器的性能提升很大。

生成對抗網路

GAN是深度學習領域中最令人興奮的最新進展之一,它們通常用來生成新的圖像。下面這篇博客解釋了如何使用GAN進行圖像數據的數據增強,但它的一些方法或許也可以適用於文本數據。

博客鏈接:

https://towardsdatascience.com/generative-adversarial-networks-for-data-augmentation-experiment-design-2873d586eb59

遷移學習

遷移學習是指使用為其他任務訓練的網路參數來解決你自己的問題,這些網路參數通常是用大性數據集訓練得到的。遷移學習有時被用作某些層的初始化,有時也直接被用於特徵提取讓我們免於訓練新模型。在計算機視覺中,從預先訓練的ImageNet模型開始是解決問題的一種常見的做法,但是NLP沒有像ImageNet那樣可以用於遷移學習的大型數據集。

預訓練的詞向量

一般應用於自然語言處理的深度學習網路架構通常以嵌入層(Embedding Layer)開始,該嵌入層將一個詞由獨熱編碼(One-Hot Encoding)轉換為數值型的向量表示。我們可以從頭開始訓練嵌入層,也可以使用預訓練的詞向量,如 Word2Vec、FastText 或 GloVe。

這些詞向量是通過無監督學習方法訓練大量數據或者是直接訓練特定領域的數據集得到的。

預訓練的詞向量非常有效,因為基於大數據它們給模型提供了詞的上下文並減少了模型的參數,從而顯著地降低了過擬合的可能性。

更多有關詞嵌入的信息:

https://www.springboard.com/blog/introduction-word-embeddings/

預訓練的句向量

我們可以將模型的輸入從單詞轉換為句子,用這種方法我們得到參數少並且性能好的簡單模型。為了做到這一點,我們可以使用預訓練的句子編碼器,如 Facebook 的InferSent或谷歌的通用句子編碼器。

我們還可以把數據集中未打標的數據用 skip-thought 向量或語言模型等方法訓練句子編碼器模型。

更多有關無監督句子向量的信息:

https://blog.myyellowroad.com/unsupervised-sentence-representation-with-deep-learning-104b90079a93

預訓練的語言模型

最近很多論文運用大量語料庫預訓練語言模型來處理自然語言任務得到了驚人的結果,如ULMFIT,Open-AI transformer和BERT。語言模型是通過前面的單詞預測句子中會出現的下一個單詞。

這種預訓練並沒有對我取得更好的結果起到真正的幫助,但文章給出了一些我沒有嘗試過的方法來幫助我做更好地微調。

一個關於預訓練語言模型很棒的博客:

http://ruder.io/nlp-imagenet/

預訓練無監督或自監督學習

如果掌握大量無標籤數據,我們可以使用無監督的方法如自動編碼器或掩碼語言模型去訓練模型,這樣僅僅依靠文本本身就可以做到。

對我來說另一個更好的選擇是使用自監督模型。自監督模型可以在沒有人工標註的情況下自動提取標籤。Deepmoji項目是一個很好的例子。

在Deepmoji項目中,作者們訓練了一個預測推文中表情符號的模型,在模型表現良好的情況下,他們使用網路預先訓練了一個推文者的情緒分析模型來獲取表情符號預測模型的狀態。

表情符號預測和情緒分析顯然非常相關,因此它作為預訓練任務表現得非常好。自監督在新聞數據中的運用包括預測標題,報刊,評論數量,轉發數量等。自監督是一種非常好的預訓練方法,但通常很難分辨出代理標籤與真實標籤的關聯。

使用現成的網路進行預訓練

在很多公司中,大部分用於不同任務的機器學習模型都建立在相同的數據集或類似的數據集上。例如推文,我們可以預測其主題、觀點、轉發數量等。最好通過已經成熟應用的網路預先訓練你的網路。對我的任務而言,應用這個方法確實可以提高性能。

特徵工程

我知道深度學習「殺死」了特徵工程,再談特徵工程已經有點過時了。但是當你沒有大量數據時,通過特徵工程幫助網路學習複雜模式可以大大提高性能。例如,在我對新聞文章的分類過程中,作者、報刊、評論數、標籤以及更多特徵可以幫助預測標籤。

多模式體系結構

我們可以用多模式體系結構將文檔級特徵組合到我們的模型中。在多模式體系結構中,我們構建了兩個不同的網路,一個用於文本,一個用於特徵,合併它們的輸出層(無 softmax)並添加更多層。這些模型很難訓練,因為這些特徵通常比文本具有更強的信號,因此網路主要受特徵的影響。

關於多模式網路很棒的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 表示其他單詞,這樣模型可以很容易地學習它需要關注的一些詞。在我的任務中,我添加了某些重要實體的維度,這給模型帶來了一個很好的性能提升。

特徵工程預處理

最後一種特徵工程方法是以一種模型更容易學習的方式預處理輸入文本。一個例子是「詞幹提取」,如果運動並不是一個重要標籤,我們可以用運動代替足球,棒球和網球這些詞,這將有助於神經網路模型了解到不同運動之間的差異並不重要,可以減少網路中的參數。

另一個例子是使用自動摘要。正如我之前所說,神經網路在長文本上表現不佳,因此我們可以在文本上運行自動摘要演算法,如 TextRank 並僅向神經網路網路提供重要句子。

我的模型

嘗試了本文中討論的方法的不同組合後,在我的項目中表現最好的模型是本文中提到分層注意力網路(HAN),模型使用dropout 和 early stopping 作為正則化,並採用文檔剪裁的方法進行數據集增強。我使用預訓練的詞向量以及我公司的一個預訓練網路(這個網路使用了同樣數據,只是針對的任務不一樣)。

在做特徵工程時,我新增了實體詞級特徵到詞嵌入向量。這些變化使我的模型精確度提高了近 10%,模型效果從比隨機效果稍好一點上升到了到具有重要業務價值的水準。

深度學習在小數據集上的應用仍處於該研究領域的早期階段,但看起來它越來越受歡迎,特別是對於預訓練的語言模型,我希望研究人員和從業者能夠找到更多的方法使用深度學習,讓每一個數據集產生價值。

相關報道:

https://towardsdatascience.com/lessons-learned-from-applying-deep-learning-for-nlp-without-big-data-d470db4f27bf

編譯:王緣緣、周家樂、塗世文、夏雅薇

【加入社群】

新智元 AI 技術 + 產業社群招募中,歡迎對 AI 技術 + 產業落地感興趣的同學,加小助手微信號:aiera2015_2入群;通過審核後我們將邀請進群,加入社群後務必修改群備註(姓名 - 公司 - 職位;專業群審核較嚴,敬請諒解)。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 新智元 的精彩文章:

重磅!基於三維集成晶元的光量子計算原型機問世,上海交大金賢敏團隊研製
谷歌全球大罷工!AI女研究員一呼百應,五點要求抗議不公

TAG:新智元 |