作為大數(shù)據(jù)科學(xué)家,你最重要的技能之一應(yīng)該是為你的問題選擇正確的建模技術(shù)和算法。幾個月前,我試圖解決文本分類問題,即分類哪些新聞文章與我的客戶相關(guān)。
我只有幾千個標(biāo)記的例子,所以我開始使用簡單的經(jīng)典機器學(xué)習(xí)建模方法,如TF-IDF上的Logistic回歸,但這個模型通常適用于長文檔的文本分類。
在發(fā)現(xiàn)了我的模型錯誤之后,我發(fā)現(xiàn)僅僅是理解詞對于這個任務(wù)是不夠的,我需要一個模型,它將使用對文檔的更深層次的語義理解。
深度學(xué)習(xí)模型在復(fù)雜任務(wù)上有非常好的表現(xiàn),這些任務(wù)通常需要深入理解翻譯、問答、摘要、自然語言推理等文本。所以這似乎是一種很好的方法,但深度學(xué)習(xí)通常需要數(shù)十萬甚至數(shù)百萬的訓(xùn)練標(biāo)記的大數(shù)據(jù)點,幾千的大數(shù)據(jù)量顯然是不夠的。
通常,大數(shù)據(jù)集進(jìn)行深度學(xué)習(xí)以避免過度擬合。深度神經(jīng)網(wǎng)絡(luò)具有許多參數(shù),因此通常如果它們沒有足夠的大數(shù)據(jù),它們往往會記住訓(xùn)練集并且在測試集上表現(xiàn)不佳。為了避免沒有大數(shù)據(jù)出現(xiàn)這種現(xiàn)象,我們需要使用特殊技術(shù)。
在這篇文章中,我將展示我在文章、博客、論壇、Kaggle上發(fā)現(xiàn)的一些方法,以便在沒有大數(shù)據(jù)的情況下更好地完成目標(biāo)。其中許多方法都基于計算機視覺中廣泛使用的最佳實踐。
正則化
正則化方法是在機器學(xué)習(xí)模型內(nèi)部以不同方式使用的方法,以避免過度擬合,這個方法具有強大的理論背景并且可以以通用的方式解決大多數(shù)問題。
L1和L2正則化
這個方法可能是最古老的,它在許多機器學(xué)習(xí)模型中使用多年。在這個方法中,我們將權(quán)重大小添加到我們試圖最小化的模型的損失函數(shù)中。這樣,模型將嘗試使權(quán)重變小,并且對模型沒有幫助的權(quán)重將顯著減小到零,并且不會影響模型。這樣,我們可以使用更少數(shù)量的權(quán)重來模擬訓(xùn)練集。有關(guān)更多說明,你可以閱讀這篇文章。
Dropout
Dropout是另一種較新的正則化方法,訓(xùn)練期間神經(jīng)網(wǎng)絡(luò)中的每個節(jié)點(神經(jīng)元)都將被丟棄(權(quán)重將被設(shè)置為零),這種方式下,網(wǎng)絡(luò)不能依賴于特定的神經(jīng)元或神經(jīng)元的相互作用,必須學(xué)習(xí)網(wǎng)絡(luò)不同部分的每個模式。這使得模型專注于推廣到新大數(shù)據(jù)的重要模式。
提早停止
提早停止是一種簡單的正則化方法,只需監(jiān)控驗證集性能,如果你發(fā)現(xiàn)驗證性能不斷提高,請停止訓(xùn)練。這種方法在沒有大數(shù)據(jù)的情況下非常重要,因為模型往往在5-10個時期之后甚至更早的時候開始過度擬合。
參數(shù)數(shù)量少
如果你沒有大型大數(shù)據(jù)集,則應(yīng)該非常小心設(shè)置每層中的參數(shù)和神經(jīng)元數(shù)量。此外,像卷積層這樣的特殊圖層比完全連接的圖層具有更少的參數(shù),因此在它們適合你的問題時使用它們非常有用。
大數(shù)據(jù)增強
大數(shù)據(jù)增強是一種通過以標(biāo)簽不變的方式更改訓(xùn)練大數(shù)據(jù)來創(chuàng)建更多訓(xùn)練大數(shù)據(jù)的方法。在計算機視覺中,許多圖像變換用于增強大數(shù)據(jù)集,如翻轉(zhuǎn)、裁剪、縮放、旋轉(zhuǎn)等。
這些轉(zhuǎn)換對于圖像大數(shù)據(jù)很有用,但不適用于文本,例如翻轉(zhuǎn)像“狗愛我”這樣的句子不是一個有效的句子,使用它會使模型學(xué)習(xí)垃圾。以下是一些文本大數(shù)據(jù)增強方法:
同義詞替換
在這種方法中,我們用他們的同義詞替換我們文本中的隨機單詞,例如,我們將句子“我非常喜歡這部電影”更改為“我非常愛這部電影”,它仍具有相同的含義,可能相同標(biāo)簽。這種方法對我來說不起作用,因為同義詞具有非常相似的單詞向量,因此模型將兩個句子看作幾乎相同的句子而不是擴充。
方向翻譯
在這種方法中,我們采用我們的文本,將其翻譯成具有機器翻譯的中間語言,然后將其翻譯成其他語言。該方法在Kaggle毒性評論挑戰(zhàn)中成功使用。例如,如果我們將“我非常喜歡這部電影”翻譯成俄語,我們會得到“Мнеоченьнравитсяэтотфильм”,當(dāng)我們翻譯成英文時,我們得到“I really like this movie”。反向翻譯方法為我們提供了同義詞替換,就像第一種方法一樣,但它也可以添加或刪除單詞并解釋句子,同時保留相同的含義。
文件裁剪
新聞文章很長,在查看大數(shù)據(jù)時,有時不需要所有文章來分類文檔。這讓我想到將文章裁剪為幾個子文檔作為大數(shù)據(jù)擴充,這樣我將獲得更多的大數(shù)據(jù)。首先,我嘗試從文檔中抽取幾個句子并創(chuàng)建10個新文檔。這就創(chuàng)建了沒有句子之間邏輯關(guān)系的文檔,但我得到了一個糟糕的分類器。我的第二次嘗試是將每篇文章分成5個連續(xù)句子。這種方法運行得非常好,給了我很好的性能提升。
生成對抗性網(wǎng)絡(luò)
GAN是大數(shù)據(jù)科學(xué)中最令人興奮的最新進(jìn)展之一,它們通常用作圖像創(chuàng)建的生成模型。這篇博客文章解釋了如何使用GAN進(jìn)行圖像大數(shù)據(jù)的大數(shù)據(jù)增強,但它也可能用于文本。
遷移學(xué)習(xí)
遷移學(xué)習(xí)是指使用來自網(wǎng)絡(luò)的權(quán)重,這些網(wǎng)絡(luò)是針對你的問題通過另一個問題(通常是大數(shù)據(jù)集)進(jìn)行訓(xùn)練的。遷移學(xué)習(xí)有時被用作某些層的權(quán)重初始化,有時也被用作我們不再訓(xùn)練的特征提取器。在計算機視覺中,從預(yù)先訓(xùn)練的Imagenet模型開始是解決問題的一種非常常見的做法,但是NLP沒有像Imagenet那樣可以用于遷移學(xué)習(xí)的非常大的大數(shù)據(jù)集。
預(yù)先訓(xùn)練的詞向量
NLP深度學(xué)習(xí)架構(gòu)通常以嵌入層開始,該嵌入層將一個熱編碼字轉(zhuǎn)換為數(shù)字矢量表示。我們可以從頭開始訓(xùn)練嵌入層,但我們也可以使用預(yù)訓(xùn)練的單詞向量,如Word2Vec,F(xiàn)astText或Glove,這些詞向量使用無監(jiān)督學(xué)習(xí)方法訓(xùn)練大量大數(shù)據(jù)或訓(xùn)練我們域中的大數(shù)據(jù)。預(yù)訓(xùn)練的詞向量非常有效,因為它們?yōu)榛诖罅?span style="background-color:#ffd700;">大數(shù)據(jù)的單詞提供模型上下文,并減少模型的參數(shù)數(shù)量,從而顯著降低過度擬合的可能性。你可以在此處閱讀有關(guān)詞嵌入的更多信息。
預(yù)先訓(xùn)練的句子向量
我們可以將模型的輸入從單詞更改為句子,這樣我們可以使用較少的模型,其中參數(shù)數(shù)量較少,仍然具有足夠的表達(dá)能力。為了做到這一點,我們可以使用預(yù)先訓(xùn)練好的句子編碼器,如Facebook的InferSent或谷歌的通用句子編碼器。我們還可以使用跳過思維向量或語言模型等方法訓(xùn)練未標(biāo)記大數(shù)據(jù)的句子編碼器。你可以從我之前的博文中了解有關(guān)無監(jiān)督句子向量的更多信息。
預(yù)先訓(xùn)練的語言模型
最近的論文如ULMFIT、Open-AI變換器和BERT通過在非常大的語料庫中預(yù)訓(xùn)練語言模型,為許多NLP任務(wù)獲得了驚人的結(jié)果。語言模型是使用前面的單詞預(yù)測句子中的下一個單詞的任務(wù)。對我來說,這種預(yù)訓(xùn)練并沒有真正幫助獲得更好的結(jié)果,但文章已經(jīng)展示了一些方法來幫助我更好地微調(diào),我還沒有嘗試過。這是一個關(guān)于預(yù)訓(xùn)練語言模型的好博客。
無人監(jiān)督或自我監(jiān)督學(xué)習(xí)的預(yù)訓(xùn)練
如果我們有一個來自未標(biāo)記大數(shù)據(jù)的大型大數(shù)據(jù)集,我們可以使用無監(jiān)督的方法,如自動編碼器或掩碼語言模型,僅使用文本本身預(yù)訓(xùn)我們的模型。對我來說更好的另一個選擇是使用自我監(jiān)督。自我監(jiān)督模型是在沒有人類注釋的情況下自動提取標(biāo)簽的模型。一個很好的例子是Deepmoji項目,在Deepmoji中,作者訓(xùn)練了一個模型,用于從推文中預(yù)測表情符號,在表情符號預(yù)測中獲得良好結(jié)果之后,他們使用他們的網(wǎng)絡(luò)預(yù)先訓(xùn)練了一個獲得最新結(jié)果的高音揚聲器情緒分析模型。表情符號預(yù)測和情緒分析顯然非常相關(guān),因此它作為預(yù)訓(xùn)練任務(wù)表現(xiàn)得非常好。新聞大數(shù)據(jù)的自我監(jiān)督任務(wù)可以預(yù)測標(biāo)題、報紙、評論數(shù)量、轉(zhuǎn)推的數(shù)量等等。自我監(jiān)督可以是一種非常好的預(yù)訓(xùn)方法,但通常很難分辨出哪個代理標(biāo)簽將與你的真實標(biāo)簽相關(guān)聯(lián)。
特征工程
我知道深度學(xué)習(xí)“殺死”了特征工程,這樣做有點過時了。但是,當(dāng)你沒有大數(shù)據(jù)集時,讓網(wǎng)絡(luò)通過特征工程學(xué)習(xí)復(fù)雜模式可以大大提高性能。例如,在我對新聞文章的分類中,作者、報紙、評論、標(biāo)簽和更多功能的數(shù)量可以幫助預(yù)測我們的標(biāo)簽。
多模式架構(gòu)
我們可以使用多模式架構(gòu)將文檔級特征組合到我們的模型中。在multimodal中,我們構(gòu)建了兩個不同的網(wǎng)絡(luò),一個用于文本、一個用于特征,合并它們的輸出層并添加更多層。這些模型很難訓(xùn)練,因為這些特征通常比文本具有更強的信號,因此網(wǎng)絡(luò)主要學(xué)習(xí)特征效果。這是關(guān)于多模式網(wǎng)絡(luò)的偉大的Keras教程。這種方法使我的性能表現(xiàn)提高了不到1%。
字級(word level)特征
另一種類型的特征工程是詞級特征,如詞性標(biāo)注、語義角色標(biāo)記、實體提取等。我們可以將一個熱編碼表示或詞級特征的嵌入與詞的嵌入相結(jié)合,并將其用作模型的輸入。我們也可以在這個方法中使用其他單詞特征,例如在情感分析任務(wù)中我們可以采用情感字典并為嵌入添加另一個維度,其中1表示我們在字典中的單詞,0表示其他單詞,這樣模型可以很容易地學(xué)習(xí)它需要關(guān)注的一些詞。在我的任務(wù)中,我添加了某些重要實體的維度,這給了我一個很好的性能提升。
預(yù)處理作為特征工程
最后一種特征工程方法是以一種模型更容易學(xué)習(xí)的方式預(yù)處理輸入文本。一個例子是特殊的“阻止”,如果體育對我們的標(biāo)簽不重要,我們可以改變足球,棒球和網(wǎng)球這個詞運動,這將有助于網(wǎng)絡(luò)了解體育之間的差異并不重要,可以減少數(shù)量網(wǎng)絡(luò)中的參數(shù)。另一個例子是使用自動摘要,正如我之前所說的,神經(jīng)網(wǎng)絡(luò)在長文本上表現(xiàn)不佳,因此我們可以在文本上運行自動匯總算法,如“文本排名”,并僅向網(wǎng)絡(luò)提供重要句子。