1. 程式人生 > >NLP的這一年2017:深度學習或成主角

NLP的這一年2017:深度學習或成主角

在過去幾年,深度學習(DL)的架構和演算法在很多領域都取得了里程碑似的進展,例如影象識別和語言處理。

起初,深度學習在自然語言處理(NLP)中的應用並不起眼,但後來卻出現了許多重量級的成果,例如命名實體識別(NER)、詞性標註(POS tagging)或文字情感分析(sentiment analysis)等都是神經網路模型超越傳統模型的方法。然而,機器翻譯領域所取得的進步才是最顯著的。

本文作者Javier Couto是tryo labs公司的一名研發科學家,專注於NLP技術。這篇文章是他對2017年NLP領域中深度學習技術應用的總結,也許並不全面,但都是他認為有價值、有意義的成果。Couto表示,2017年是對NLP領域非常有意義的一年,隨著深度學習的應用,NLP技術也將繼續發展下去。以下是論智對原文的編譯。

從訓練word2vec到使用預先訓練的模型

通常來說,詞嵌入(word embeddings)是與NLP相關的最有名的深度學習技術了,它遵循了Harris提出的分佈假想(distributional hypothesis),分佈假想源自於語言學中的語義學原理,即認為出現在相似的上下文環境中的詞彙可能是用於表達相似的意思。

詞的分散式向量

雖然著名的word2vec和GloVe等演算法不能算作是深度學習框架(word2vec中只涉及淺顯的神經網路,而GloVe是基於矩陣的方法),但用它們訓練的許多模型都被輸入到用於NLP的深度學習工具中。所以在這一領域使用詞嵌入通常是非常好的做法。

開始時,對於一個需要詞嵌入的問題,我們傾向於從與該領域相關的語料庫中訓練自己的模型。不過,這種方法並不適用於所有情況,所以出現了預訓練模型。通過在維基百科、Twitter、谷歌新聞以及其他網頁上訓練,這些模型可以讓你輕鬆地將詞嵌入整合到深度學習演算法中。

今年,許多人認為預訓練的詞嵌入模型仍然是NLP中的一個關鍵問題。例如,Facebook人工智慧實驗室(FAIR)釋出的fastText是一款能夠支援294種語言的預訓練詞嵌入模型,為NLP領域做出了巨大的貢獻。除了支援多種語言,fastText還能夠將字分解成字元n-gram,即使遇到詞典中不存在的字(OOV problem),也能給出向量表示。因為一些特定領域的罕見詞仍然可以被分解成字元n-gram,所以它們可以與通用字共享這些n-gram。而word2vec和GloVe都不能為詞典中不存在的詞提供向量表示。所以從這方面來說,fastText比上述兩種方法表現得更好,在小資料集上更是如此。

不過,雖然取得了一些進展,NLP方面還有很多工作要做。例如,強大的NLP框架spaCy能夠以本地方式將詞嵌入整合到深度學習模型中,完成例如NER或依存句法分析(Dependency Parsing)等任務,允許使用者更新或使用自己的模型。

我認為,在將來,對於易於在NLP框架中使用的特定領域(例如生物學、文學、經濟等),使用預訓練的模型是很合適的。對我們來說,如果能用最簡單的方式對它們進行調校,那就更是錦上添花的進步了。與此同時,能夠適應詞嵌入的方法開始出現。

將通用型嵌入應用到具體應用案例

使用預訓練的詞嵌入的主要缺點就是,訓練資料與實際問題中的資料存在著詞語分佈的差距(word distributional gap)。假如你有一份生物學論文、或一份食譜、或經濟學研究論文的語料,但是沒有足夠大的語料庫來訓練良好的嵌入,所以最終會選擇通用詞嵌入來幫助你提高結果。但是如果能將通用的嵌入調整為適合你個人案例的情況呢?

這種適應通常被稱為NLP中的跨領域或域自適應技術,與遷移學習非常接近。Yang等人今年提出了一個正則化的skip-gram模型,給定始源域(source domain)的嵌入,可以學習目標域(target domain)的嵌入,是一項非常有趣的研究。

重要思想簡潔且高效。假設我們知道始源域中單詞w的詞嵌入為ws。為了計算目標域中wt的嵌入,就要在兩個域之間加入一個特定量的遷移ws。一般來說,如果這個單詞在兩個域中都經常出現,那麼它的語義就是獨立的。在這種情況下,遷移的值越大,嵌入的結果可能在兩個域中就越相似。反之,如果一個單詞在一個域中的出現頻率高於另一個域,那麼遷移的值就小。

關於這一話題的研究並未深入展開,但我相信在不遠的未來會有更多人關注它。

情感文字分析不可思議的副作用

偉大的發明往往是意外之喜,下面要說的這個成就也不例外。今年,Radford等人在研究位元組級迴圈語言模型的特性,目的是要預測亞馬遜評論文字中的下一個字元。然而在這一過程中,他們發現訓練模型中的一個單一神經元能夠高度預測出文章的情感價值(sentiment value)。這個單一的“情感神經元”(sentiment neuron)能夠以相當準確的方式將評論分為積極或消極的兩類。

評論極性vs神經元值

在發現了這一特性後,作者決定將模型應用於Stanford Sentiment Treebank資料集上,結果得到的精確度高達91.8%,比之前最佳的90.2%的結果還要高。這意味著,他們的模型經過無監督的方式訓練後,用更少的訓練資料達到了最先進的情感文字分析結果。

情感神經元的工作過程

由於模型是在字元層面工作,可以看到,神經元在文字中進行判斷時,能夠改變特殊的字元顏色。如下圖所示:

在單詞“best”之後,神經元使文字變成了深綠色(代表積極),而在單詞“horrendous”之後,綠色消失,表示情感由積極開始轉向消極。

生成極性偏向文字

當然,訓練過的模型是一個有效地生成模型,所以你也可以拿他來生成類似亞馬遜的評論那樣的文字。但是,我覺得很棒的一點是,你可以簡單地改寫情感神經元的值來決定生成文字的極性(polarity)。

積極情緒 消極情緒
這是我買過的最好的吊床!完全不會變形,而且超級舒服。我喜歡上面的印花,看起來好可愛! 根本不能用,吃一塹長一智吧。
這就是我想要的。這條褲子完全合身,走線也很精密,強烈推薦! 包裹竟然是空的,沒有二維碼。浪費時間金錢。

作者選用的神經網路模型是Krause等人在2016年提出的multiplicative LSTM,主要原因是他們觀察到該模型的超引數設定比正常的LSTM收斂地更快。它有4096個單位,訓練的語料庫中含有8200萬條亞馬遜的評論。

同時,你還可以試著訓練自己的模型並進行試驗。當然這需要你有足夠的時間和強大的GPU:論文的作者在NVIDIA Pascal GPU上花了一個月的時間訓練了該模型。

Twitter上的情感文字分析

要想知道人們對某個品牌的評價,或是分析某一營銷活動的影響,甚至是衡量人們對總統大選的感受,Twitter中的情感分析是一個非常強大的工具。

推特對有關川普和希拉里的推文的情感分析

SemEval 2017

Twitter中的情感文字分析已經引起了NLP研究人員的關注,而且也引起了政界和社會科學界的關注。所以自從2013年以來,國際語義測評SemEval提出了一項具體的任務。

2017年共有48支隊伍參加了評選,以下五個子任務可以讓你瞭解SemEval在Twitter上都分析了什麼。

  • A:給定一條推文,判斷它是積極的或是消極的或是中立的情緒。

  • B:給定一條推文和話題,將話題中所傳達出的情緒進行分類:正面或負面。

  • C:給定一條推文和話題,將推文中所傳達出的情緒分為五類:非常積極、一般積極、中立、一般消極、非常消極。

  • D:給定關於某一話題的一組推文,估計這些推文在積極和消極中的分佈。

  • E:給定關於某一話題的一組推文,將推文的情緒分為五類:非常積極、一般積極、中立、一般消極、非常消極。

可以看到,A任務是最常見的任務,共有38支隊伍參加了這個任務,其他的幾項更難一些。主辦方指出,今年使用深度學習方法的隊伍比較顯眼,並且在不斷增加,有20個團隊使用了CNN和LSTM等模型。另外,儘管SVM模型仍然非常流行,但已經有幾個隊伍將它們與神經網路或詞嵌入等方法結合起來了。

BB_twtr系統

我認為今年最值得關注的是一個純粹的深度學習系統——BB_twtr,該系統在英語的5個子任務中排名第一。作者將10個CNN和10個biLSTM的集合結合起來,用不同的超引數和不同的預訓練策略進行訓練。可以在論文中看到神經網路架構的細節。

為了訓練這些模型,作者使用了帶有話題標籤的推文(A任務中共有49693條推文),然後建立了一個含有1億條沒有標籤的推文資料集,將其中帶有類似微笑表情的推文歸為積極一類,反之歸為消極一類,再次建立派生的資料集。在這裡,推文都被變成了小寫、標上了記號;URL和表情符號被替換成了特殊的符號;重複的字母都被合併,例如“niiice”和“niiiiiiiice”變成了“niice”。

為了對用作CNN和biLSTM的輸入詞嵌入進行預訓練,作者使用帶有預設設定的word2vec、GloVe和fastText在未標記的資料集上進行訓練。然後他使用派生資料集改進嵌入,並加入極性資訊,然後再使用帶有標籤的資料集再次改進。

使用從前的SemEval資料集的實驗表明,使用GloVe會降低效能,並且對所有金標準資料集沒有一個最佳模型。然後作者將所有模型與軟投票策略結合起來,由此產生的模型比2014和2016年的最佳成績都好,接近2015年的最佳成績。它最終在2017SemEval的5個子任務中排名第一。

即使這種組合並不是以一種有機的方式進行的,而是加入了簡單的軟投票策略,也表明了將深度學習模型應用其中的潛力非常大,同樣也證明了幾乎所有端到端的方法在Twitter中的情感分析可以超越監督的方法(輸入必須進行預處理)。

令人激動的抽象總結系統

自動總結(automatic summarization)是NLP最早的任務之一。方式主要有兩種:抽取式(extraction-based)和生成式(abstraction-based)。抽取式自動文摘方法是通過提取文件中已存在的關鍵詞、句子形成摘要;生成式自動文摘方法是通過建立抽象的語義表示,使用自然語言生成技術形成摘要。在過去,抽取式是最常用的方法,因為他們比另一種方法簡單。

在過去幾年,基於RNN的模型在文字生成方面取得了驚人的成果。對於簡短的文字輸入和輸出,它們表現得很好。但是遇到長文字,往往輸出的是不連貫的、重複的結果。在他們的工作中,Paulus等人提出了一種新型的神經網路模型來克服這一侷限性,並取得了令人興奮的結果,如下所示:

自動摘要生成模型

作者使用biLSTM編碼器讀取輸入,並使用LSTM解碼器生成輸出。他們的主要貢獻是建立了一種新的內部注意策略,能夠分別關注輸入和連續的輸出,並且還有一種新的訓練方法,將監督詞語預測的標準和強化學習結合起來。

內部注意策略

新型的內部注意策略的目的是避免在輸出中出現重複。為了達到這個目的,他們在解碼時用快取的注意檢視輸入文字的前一段內容,然後再決定下一個將要產生的字。這就使得模型在生成過程中使用輸入的不同部分。他們還允許模型從解碼器訪問之前的隱藏狀態,兩個函式結合後,就會選擇出最適合輸出摘要的下個詞。

強化學習

寫摘要時,兩個不同的人會使用不同的詞語和句子,但寫出的摘要都是正確的。因此,判斷一個摘要是好的標準不一定是使其完全與資料集中的單詞序列相匹配。瞭解這一點後,作者就避免了標準的強制教導(teacher forcing)演算法,該演算法會在每個解碼步驟將損失最小化,而是依賴更可靠的強化學習策略。

近似端到端模型的好結果

該模型在CNN和《每日郵報》的資料集上進行了測試,並取得了前所未有的好結果。在人類評估下,一項具體的實驗結果表明,可讀性和質量都有了增長。由於在預處理時,輸入文字都被打上了標記、改為小寫,同時數字被替換成0,以及資料集的一些特殊物件被移除,還能得到這樣的結果,實在令人印象深刻。

邁向完全無監督機器翻譯的第一步

雙語詞典構建是NLP領域一個老生常談的問題了,它使用兩種語言的源語言和目標語言的單語料庫生成詞語互譯。自動生成的雙語詞典能夠幫助其他NLP任務,例如資訊檢索和機器翻譯統計。然而,這些方法大多都需要一個初始的雙語詞典,但通常很難建立。

隨著詞嵌入的出現,跨語言詞嵌入(cross-lingual word embeddings)也隨之產生,其目的是調整嵌入空間而不是生成字典。但不幸的是,跨語言嵌入也需要有雙語詞典或平行語料庫。接著,Conneau等人提出了一個可行的方法,可以不依賴任何特定的資源,在詞語翻譯、句子翻譯檢索以及跨語言詞語相似性等任務上由於現有的監督式方法。

作者提出的方法是將兩組在單語語料庫上訓練的詞嵌入作為輸入,然後學習二者之間的對映,使得公共空間上的翻譯相近。他們利用fastText對維基百科上的文字進行無監督訓練,如下圖所示。

構建兩個詞嵌入空間之間的對映

紅色的X表示英語單詞的嵌入,紫色的Y表示義大利語的詞嵌入。

剛開始,他們使用對抗學習來學習旋轉矩陣W,W將執行第一次原始對齊。接著,在Ian Goodfellow等人提出生成對抗網路之後,他們也訓練了一個GAN。

為了用生成學習對該問題建模,他們將判別器看作能夠做決定的角色。他們從Wx和Y中隨機取樣(上圖第二欄),兩種語言分別屬於Wx和Y。然後,他們訓練W,防止判別器做出好的預測。我認為這種方式非常聰明優雅,直接結果也非常不錯。

之後,他們增加了兩步來完善對映。一是消除罕見字在對映計算中產生的噪聲,另一個是利用學到的對映和測量距離建立實際的翻譯。

在某些案例中,輸出的結果已經超越了最佳紀錄。例如在[email protected]的英語和義大利語之間的詞語翻譯中,他們在1500個源單詞所組成的資料庫中得出了近17%的平均準確率。

英語-義大利語詞語翻譯平均精確度

作者稱,他們的方法可以用作開啟無監督機器翻譯的第一步,讓我們拭目以待。

特別的框架和工具

現如今已經有很多通用的深度學習框架和工具,例如TensorFlow、Keras、PyTorch等等。然而,面向NLP的特定開源深度學習框架和工具才剛剛興起。今年對我們來說十分重要,因為有許多開源框架出現,其中三個是我很感興趣的。

AllenNLP

AllenNLP框架是構建在PyTorch之上的一個平臺,它的設計初衷是將深度學習方法應用其中,執行相關的NLP任務。其目的是讓研究人員設計並評估新模型,它包含了語義角色標註(semantic role labeling)、文字蘊涵(textual entailment)和共指消解(coreference resolution)等常見的NLP語義任務。

ParlAI

ParlAI框架是一個開源的用於對話研究的軟體平臺。它在Python中實現,其目標是提供一個集分享、訓練和測試於一體的框架。ParlAI提供了一個與亞馬遜Mechanical Turk輕鬆整合的機制,同時還提供了該領域流行的資料集,並支援多種模型,包括記憶體網路、seq2seq和注意力LSTM等神經模型。

OpenNMT

OpenNMT工具箱是專門用於序列到序列模型的通用框架,它可以執行類似機器翻譯、總結、影象到文字和語音識別的任務。

寫在最後

不可否認,用於NLP領域的深度學習技術在不斷增長,從過去幾年的ACL、EMNLP、EACL、NAACL等關鍵大會上所提交的有關NLP深度學習的論文上就能看出這一趨勢。

有關深度學習的論文

然而,真正端到端的學習才剛剛開始出現,我們仍在處理一些經典的NLP任務來準備資料集,例如清理、標記或合併(例如URL、數字、電子郵件地址等)。我在研究的專案中發現,通用嵌入除了不能捕捉特定領域術語的重要性,而且在多次表達中表現不佳。

2017對深度學習在NLP領域的應用是關鍵的一年,我希望2018年將帶來更多端到端的學習工作,並湧現出更多的開源框架。

原文地址:tryolabs.com/blog/2017/12/12/deep-learning-for-nlp-advancements-and-trends-in-2017/

相關推薦

NLP2017深度學習主角

在過去幾年,深度學習(DL)的架構和演算法在很多領域都取得了里程碑似的進展,例如影象識別和語言處理。 起初,深度學習在自然語言處理(NLP)中的應用並不起眼,但後來卻出現了許多重量級的成果,例如命名實體識別(NER)、詞性標註(POS tagging)或文字情感分析(s

CCAI 2017 | 專訪德國語言技術領軍者 Hans Uszkoreit深度學習還不足以解決 NLP 核心問題...

文 | 胡永波7 月 22 - 23 日,由中國人工智慧學會、阿里巴巴集團 & 螞蟻金服主辦,CSDN、中國科學院自動化研究所承辦的第三屆中國人工智慧大會(CCAI 2017)將在杭州國際會議中心盛大開幕。會前,我們採訪到了大會 Keynote 嘉賓、德

你還記得2017火爆的VR街機店,他們過得還好嗎?

驗收 量化 col 來看 這也 bdb 康斯坦丁 遊戲機 成本控制 對於當下太過急於成功、一夜暴富的人們來說,似乎總是會急不可耐地去抓住每一個有可能成為大勢的風口。在這份普遍存在的浮躁心理下,蘊含著極大的不確定性——既讓大眾認識到太多的創新產品和服務,也讓很多參與者痛並

JAVA 題目輸入某某月某日,判斷天是的第幾天?

再看 應該 boolean post pos tin als ini ror 1 package Training; 2 3 //import java.util.Calendar; 4 import java.util.Scanner; 5 /** 6

JS用函式實現輸入,月,日,獲取這個日期是的第多少天

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body>

網易雲覆盤雲端計算前端(AngularJS粉慎入)

此文已由作者趙雨森授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 2017年的前端已然沒有劇烈的變動,但發展勢頭仍然不減。語言、標準、框架和庫逐漸穩定和完善,各團隊再也不用花大把精力放在造輪子上,而更多的是去積累所需的元件庫、開發合適的工具以及整合自己的解決方案。 我們雲端計算

乾貨丨2017AI與深度學習要點大全

2017已經正式離我們遠去~ ~ ~ 部落格WILDML的作者、曾在Google Brain做了一年Resident的Denny Britz,就把他眼中的2017年AI和深度學習的大事,進行了一番梳理彙總。 強化學習稱霸人類遊戲 如果說2016年A

達觀資料於敬深度學習波,受限玻爾茲曼機原理及在推薦系統中的應用

深度學習相關技術近年來在工程界可謂是風生水起,在自然語言處理、影象和視訊識別等領域得到極其廣泛的應用,並且在效果上更是碾壓傳統的機器學習。一方面相對傳統的機器學習,深度學習使用更多的資料可以進行更好的擴充套件,並且具有非常優異的自動提取抽象特徵的能力。 另外得益於GPU、SSD儲存、大

讀書寄語,謝謝自己

時光荏苒,暮去朝來。這一年你對很多人說過溫柔的謝語,但千萬別忘了,最值得感謝的,還有你自己。                  

Java IntelliJ 稱霸 IDE,Kotlin 最大贏家!

【CSDN 編者按】我們已經迎來了 Java 11,而 Java 12 也將很快到來,Oracle 已經帶著 Java 如此向前了,但我們在實際生產環境中所使用的卻顯得滯後許多,本文作者分享了整個 Java 生態在2018 年的現狀,值得一讀。 作者 | 帝都羊

演算法工程師過去理想很豐滿,現實很骨感

本文轉自100offer微信公眾號【導讀】人工智慧火熱的 2017 年,演算法相關崗位無論在薪資

第四題輸入某某月某日,判斷天是的第幾天?

#輸入某年某月某日,判斷這一天是這一年的第幾天? '''思路:首先年月日是分著輸入還是一塊輸入,想到如果一塊輸入可能還需要分割分別找到年月日 所以還是分著輸入比較好;接著考慮計算天數其實就是往常月份的天數和加上本月天數(如:7月5號就是前6個月天數之和加上5) 那麼接下來的

計算機視覺2017CV技術報告()

[10] See「What I learned from competing against a ConvNet on ImageNet」by Andrej Karpathy. The blog post details the author』s journey to provide a human benc

工作總結10畢業的收穫

本文內容: 當前狀況 工作方面 目標 業務 軟體工程 程式碼 溝通協作 生活方面 感情 親人 朋友 不足 總結 去年七月初畢業來到上海,一轉眼就又是七月了,這一年還是經歷了不少事,回頭看看,這一年中的大多數選擇還是比較滿意的。今天趁著懶癌

C語言計算某某月某日是的第幾天

C語言:計算某年某月某日是這一年的第幾天 我是一名在校大學生,初次寫部落格,希望各位大佬不喜勿噴,這個小程式,僅供參考,希望對大家有所幫助。 分析題意: 1.判斷使用者輸入的年數是閏年還是平年。 2.如何將不同月份的天數相加。 定義: 1.Input()函式,接收使用者輸

初學java輸入某某月某日,判斷天是的第幾天

import java.util.Scanner; public class 輸入某年某月某日並判斷這一天是這一年的第幾天 {public static void main(String[] args) {Scanner in=new Scanner(System.in);System.out.print("

2017IT人年終總結,一個都不知道的你就白過了

作者:程式猿(ID:imkuqin) 猿妹移動互聯時代,每天都會湧現大量新詞熱詞,我們IT圈也不

程式設計 輸入某某月某日,判斷天是的第幾天?

沒有用函式做,定義了一個數組,裝每個月的月份天數。明天把改成函式在重做一遍,可以不用陣列 import java.util.Scanner; public class Which_day {

C語言經典演算法輸入某某月某日,判斷天是的第幾天?

題目:輸入某年某月某日,判斷這一天是這一年的第幾天?1.程式分析:以3月5日為例,應該先把前兩個月的加起來,然後再加上5天即本年的第幾天,特殊      情況,閏年且輸入月份大於3時需考慮多加一天。2.程式原始碼:main(){int day,month,year,sum,l

演算法輸入某某月某日,判斷天是的第幾天

程式分析:將年份分為平年和閏年,閏年是能被4整除但不能被100整除,或能被400整除的年份,再計算是這一年的第幾天, 以3月5日為例,將前兩月的天數加起來,然後加上5就是該天在本年的天數。 實現程式碼: #include "stdio.h" int