摘要: 還在發愁沒有數據作深度學習,看看別人如何實現的把!git
做爲數據科學家,你最重要的技能之一應該是爲你的問題選擇正確的建模技術和算法。幾個月前,我試圖解決文本分類問題,即分類哪些新聞文章與個人客戶相關。github
我只有幾千個標記的例子,因此我開始使用簡單的經典機器學習建模方法,如TF-IDF上的Logistic迴歸,但這個模型一般適用於長文檔的文本分類。算法
在發現了個人模型錯誤以後,我發現僅僅是理解詞對於這個任務是不夠的,我須要一個模型,它將使用對文檔的更深層次的語義理解。spring
深度學習模型在複雜任務上有很是好的表現,這些任務一般須要深刻理解翻譯、問答、摘要、天然語言推理等文本。因此這彷佛是一種很好的方法,但深度學習一般須要數十萬甚至數百萬的訓練標記的數據點,幾千的數據量顯然是不夠的。數據庫
一般,大數據集進行深度學習以免過分擬合。深度神經網絡具備許多參數,所以一般若是它們沒有足夠的數據,它們每每會記住訓練集而且在測試集上表現不佳。爲了不沒有大數據出現這種現象,咱們須要使用特殊技術。服務器
在這篇文章中,我將展現我在文章、博客、論壇、Kaggle上發現的一些方法,以便在沒有大數據的狀況下更好地完成目標。其中許多方法都基於計算機視覺中普遍使用的最佳實踐。網絡
正則化架構
正則化方法是在機器學習模型內部以不一樣方式使用的方法,以免過分擬合,這個方法具備強大的理論背景而且能夠以通用的方式解決大多數問題。機器學習
L1和L2正則化函數
這個方法多是最古老的,它在許多機器學習模型中使用多年。在這個方法中,咱們將權重大小添加到咱們試圖最小化的模型的損失函數中。這樣,模型將嘗試使權重變小,而且對模型沒有幫助的權重將顯着減少到零,而且不會影響模型。這樣,咱們可使用更少數量的權重來模擬訓練集。有關更多說明,你能夠閱讀這篇文章。
Dropout
Dropout是另外一種較新的正則化方法,訓練期間神經網絡中的每一個節點(神經元)都將被丟棄(權重將被設置爲零),這種方式下,網絡不能依賴於特定的神經元或神經元的相互做用,必須學習網絡不一樣部分的每一個模式。這使得模型專一於推廣到新數據的重要模式。
提前中止
提前中止是一種簡單的正則化方法,只需監控驗證集性能,若是你發現驗證性能不斷提升,請中止訓練。這種方法在沒有大數據的狀況下很是重要,由於模型每每在5-10個時期以後甚至更早的時候開始過分擬合。
參數數量少
若是你沒有大型數據集,則應該很是當心設置每層中的參數和神經元數量。此外,像卷積層這樣的特殊圖層比徹底鏈接的圖層具備更少的參數,所以在它們適合你的問題時使用它們很是有用。
數據加強是一種經過以標籤不變的方式更改訓練數據來建立更多訓練數據的方法。在計算機視覺中,許多圖像變換用於加強數據集,如翻轉、裁剪、縮放、旋轉等。
這些轉換對於圖像數據頗有用,但不適用於文本,例如翻轉像「狗愛我」這樣的句子不是一個有效的句子,使用它會使模型學習垃圾。如下是一些文本數據加強方法:
同義詞替換
在這種方法中,咱們用他們的同義詞替換咱們文本中的隨機單詞,例如,咱們將句子「我很是喜歡這部電影」更改成「我很是愛這部電影」,它仍具備相同的含義,可能相同標籤。這種方法對我來講不起做用,由於同義詞具備很是類似的單詞向量,所以模型將兩個句子看做幾乎相同的句子而不是擴充。
方向翻譯
在這種方法中,咱們採用咱們的文本,將其翻譯成具備機器翻譯的中間語言,而後將其翻譯成其餘語言。該方法在Kaggle毒性評論挑戰中成功使用。例如,若是咱們將「我很是喜歡這部電影」翻譯成俄語,咱們會獲得「Мнеоченьнравитсяэтотфильм」,當咱們翻譯成英文時,咱們獲得「I really like this movie」。反向翻譯方法爲咱們提供了同義詞替換,就像第一種方法同樣,但它也能夠添加或刪除單詞並解釋句子,同時保留相同的含義。
文件裁剪
新聞文章很長,在查看數據時,有時不須要全部文章來分類文檔。這讓我想到將文章裁剪爲幾個子文檔做爲數據擴充,這樣我將得到更多的數據。首先,我嘗試從文檔中抽取幾個句子並建立10個新文檔。這就建立了沒有句子之間邏輯關係的文檔,但我獲得了一個糟糕的分類器。個人第二次嘗試是將每篇文章分紅5個連續句子。這種方法運行得很是好,給了我很好的性能提高。
生成對抗性網絡
GAN是數據科學中最使人興奮的最新進展之一,它們一般用做圖像建立的生成模型。這篇博客文章解釋瞭如何使用GAN進行圖像數據的數據加強,但它也可能用於文本。
遷移學習是指使用來自網絡的權重,這些網絡是針對你的問題經過另外一個問題(一般是大數據集)進行訓練的。遷移學習有時被用做某些層的權重初始化,有時也被用做咱們再也不訓練的特徵提取器。在計算機視覺中,從預先訓練的Imagenet模型開始是解決問題的一種很是常見的作法,可是NLP沒有像Imagenet那樣能夠用於遷移學習的很是大的數據集。
預先訓練的詞向量
NLP深度學習架構一般以嵌入層開始,該嵌入層將一個熱編碼字轉換爲數字矢量表示。咱們能夠從頭開始訓練嵌入層,但咱們也可使用預訓練的單詞向量,如Word2Vec,FastText或Glove,這些詞向量使用無監督學習方法訓練大量數據或訓練咱們域中的數據。預訓練的詞向量很是有效,由於它們爲基於大量數據的單詞提供模型上下文,並減小模型的參數數量,從而顯着下降過分擬合的可能性。你能夠在此處閱讀有關詞嵌入的更多信息。
預先訓練的句子向量
咱們能夠將模型的輸入從單詞更改成句子,這樣咱們可使用較少的模型,其中參數數量較少,仍然具備足夠的表達能力。爲了作到這一點,咱們可使用預先訓練好的句子編碼器,如Facebook的InferSent或谷歌的通用句子編碼器。咱們還可使用跳過思惟向量或語言模型等方法訓練未標記數據的句子編碼器。你能夠從我以前的博文中瞭解有關無監督句子向量的更多信息。
預先訓練的語言模型
最近的論文如ULMFIT、Open-AI變換器和BERT經過在很是大的語料庫中預訓練語言模型,爲許多NLP任務得到了驚人的結果。語言模型是使用前面的單詞預測句子中的下一個單詞的任務。對我來講,這種預訓練並無真正幫助得到更好的結果,但文章已經展現了一些方法來幫助我更好地微調,我尚未嘗試過。這是一個關於預訓練語言模型的好博客。
無人監督或自我監督學習的預訓練
若是咱們有一個來自未標記數據的大型數據集,咱們可使用無監督的方法,如自動編碼器或掩碼語言模型,僅使用文本自己預訓咱們的模型。對我來講更好的另外一個選擇是使用自我監督。自我監督模型是在沒有人類註釋的狀況下自動提取標籤的模型。一個很好的例子是Deepmoji項目,在Deepmoji中,做者訓練了一個模型,用於從推文中預測表情符號,在表情符號預測中得到良好結果以後,他們使用他們的網絡預先訓練了一個得到最新結果的高音揚聲器情緒分析模型。表情符號預測和情緒分析顯然很是相關,所以它做爲預訓練任務表現得很是好。新聞數據的自我監督任務能夠預測標題、報紙、評論數量、轉推的數量等等。自我監督能夠是一種很是好的預訓方法,但一般很難分辨出哪一個代理標籤將與你的真實標籤相關聯。
我知道深度學習「殺死」了特徵工程,這樣作有點過期了。可是,當你沒有大數據集時,讓網絡經過特徵工程學習複雜模式能夠大大提升性能。例如,在我對新聞文章的分類中,做者、報紙、評論、標籤和更多功能的數量能夠幫助預測咱們的標籤。
多模式架構
咱們可使用多模式架構將文檔級特徵組合到咱們的模型中。在multimodal中,咱們構建了兩個不一樣的網絡,一個用於文本、一個用於特徵,合併它們的輸出層並添加更多層。這些模型很難訓練,由於這些特徵一般比文本具備更強的信號,所以網絡主要學習特徵效果。這是關於多模式網絡的偉大的Keras教程。這種方法使個人性能表現提升了不到1%。
字級(word level)特徵
另外一種類型的特徵工程是詞級特徵,如詞性標註、語義角色標記、實體提取等。咱們能夠將一個熱編碼表示或詞級特徵的嵌入與詞的嵌入相結合,並將其用做模型的輸入。咱們也能夠在這個方法中使用其餘單詞特徵,例如在情感分析任務中咱們能夠採用情感字典併爲嵌入添加另外一個維度,其中1表示咱們在字典中的單詞,0表示其餘單詞,這樣模型能夠很容易地學習它須要關注的一些詞。在個人任務中,我添加了某些重要實體的維度,這給了我一個很好的性能提高。
預處理做爲特徵工程
最後一種特徵工程方法是以一種模型更容易學習的方式預處理輸入文本。一個例子是特殊的「阻止」,若是體育對咱們的標籤不重要,咱們能夠改變足球,棒球和網球這個詞運動,這將有助於網絡瞭解體育之間的差別並不重要,能夠減小數量網絡中的參數。另外一個例子是使用自動摘要,正如我以前所說的,神經網絡在長文本上表現不佳,所以咱們能夠在文本上運行自動彙總算法,如「文本排名」,並僅向網絡提供重要句子。
我使用預先訓練過的詞向量來完成我公司爲同一數據爲該客戶所作的另外一項任務。做爲特徵工程,我在詞嵌入中添加了實體字級特徵。基本模型的這些變化使個人精確度提升了近10%,這使得個人模型從隨機性稍微好一點到具備重要業務影響的模型。
阿里雲雙十一1折拼團活動:已滿6人,都是最低折扣了
【滿6人】1核2G雲服務器99.5元一年298.5元三年 2核4G雲服務器545元一年 1227元三年
【滿6人】1核1G MySQL數據庫 119.5元一年
【滿6人】3000條國內短信包 60元每6月