深度學習的NLP工具

本文為 AI 研習社編譯的技術博客,原標題 :

NLP tools of DL

作者 |  Thomas Delteil

翻譯 | 孫稚昊2

校對 | 醬番梨        整理 | 菠蘿妹

原文鏈接:

https://medium.com/apache-mxnet/gluonnlp-deep-learning-toolkit-for-natural-language-processing-98e684131c8a


深度學習的NLP工具

為什麼最新的模型結果這麼難以復現?為什麼去年可以工作的代碼和最新發佈的深度學習框架不適配?為什麼一個很直白的基線這麼難以建立?在今天的世界中,這些都是自然語言處理(NLP)的研究員遇到的問題。

我們來看一個假想的博士學生。我們叫它亞歷山大,他剛開始機械翻譯(NMT)的研究。有一天早上他看到了Google 最著名的 論文「注意力是你全部需要的」,其中介紹了Transformer 模型,完全基於注意力機制。被結果驚艷到了,Alex搜索了一下google,結果告訴他T恩送染髮咯哇的 Tensor2Tensor包已經包含了這個模型的實現。他的實驗室里充滿了快樂的尖叫;他應該可以在下午就復現出來結果,並且享受一個放鬆的晚上來和朋友在酒吧看世界盃!他還想。。。

然後,我們的朋友發現官方實現用的超參數和論文中提到的很不一樣。他的導師建議:稍微調整一下參數,跑一下看看,結果應該還好--真的嗎?

三天之後 。。。。實驗室里所有的GPU都冒煙了,在不停地100%負荷運轉。他的同事強制把他登出了,並且告訴他回家休息。我們不行的英雄照做了,並且去了Tensor2Tensor的Github 頁面去報告這個問題,看看有沒有別人遇到了同樣的問題。很快,很多人回復他們遇到了同樣的問題,但他們還沒找到解決方案。

半個月過去了。。。終於項目的維護者出現了並回復說他會看看。

三個月過去了。。。。Alex 還在無助地詢問:有沒有進展?

在亞馬遜雲服務(AWS)上研究深度學習和自然語言處理之後,我發現這不是個例。重現NLP模型比計算機視覺模型難得多。數據預處理管道包括需要重要步驟,並且模型本身有很多可調節組件。例如,人們需要注意下面的東西,比如:

  • 字符串編碼/解碼和Unicode格式

  • 文本解析和分割

  • 來自多種語言的文本遵循不同的語法和句法規則

  • 左到右和右到左的閱讀順序

  • 詞語表徵

  • 輸入填充

  • 梯度切割

  • 處理變長輸入數據和狀態

從載入訓練數據集到在測試集上計算輸出的BLEU分數,有一千種可能做錯。如果沒有合適的工具,每次你開始新的項目,你都有遭遇全新問題的風險。

許多MXNet的貢獻者和我曾經分享我們在做NLP時遇到的問題,並且每個人都有相似的故事,我們之間有很強的共鳴。我們都同意雖然NLP很困難,我們還是想做些事情!我們決定開發一個工具來幫助你復現最新的研究結果,並且簡單的在Gluon中開發新模型。這個團隊包括 Xingjian Shi (@sxjscience), Chenguang Wang (@cgraywang), Leonard Lausen (@leezu), Aston Zhang (@astonzhang), Shuai Zheng (@szhengac), 和我自己 (@szha).  GluonNLP 誕生了!

癥狀:自然語言處理論文難以復現。Github上的開源實現質量參差不齊,並且維護者可以停止維護項目。

GluonNLP處方:復現最新的研究結果。頻繁更新復現代碼,包括訓練腳本,超參數,運行日誌等。

你曾經也被無法復現結果困擾過,而且這並不少見。理論上,你的代碼不會隨時間變質,但事實上會這樣。一個主要原因是深度學習庫的API會隨時間變化。

為了了解這種現象,我們在Google搜索中跑了這個請求 --- 「X API 掛了

┌────────────┬────────────────┐
│     X      │ Search Results │
├────────────┼────────────────┤
│ MXNet      │ ~17k           │
│ Tensorflow │ ~81k           │
│ Keras      │ ~844k          │
│ Pytorch    │ ~23k           │
│ Caffe      │ ~110k          │
└────────────┴────────────────┘

雖然MXNet 社區花了很多努力來保持API最小的變化,搜索結果還是返回了1萬7千個結果。為了防止我們的包遭遇這樣的問題,我們在開發中特別注意了。每個訓練腳本都進入連續集成(CI)來捕捉任何回退並避免給用戶不好的影響。

癥狀:復現代碼對API變化很敏感,所有隻有很短的壽命。

GluonNLP處方:自動化對訓練和評估腳本的測試,儘早適應最新API的變化。

去年做了一些NLP的服務,我最後有五個 Beam 搜索算法的實現,每個都和別的不太一樣。原因是每個模塊的接口都因為要趕截止日去而被潦草設計。為了不同的使用情景,最簡單的方法就是複製並稍稍修改他們中的一個。結果是,我最後有了五個版本的Beam 搜索算法,只在打分和步函數上略有不同。

做一個可服用,易擴展的接口需要很多努力,研究使用場景,並且和許多開發做討論。在GlunonNLP中,我們不僅專註於復現現存的例子,還要把它設計得易用,接口可擴展,使以後的研究更簡單。

癥狀:複製粘貼以前的項目並做少許修改,作為短期解決方法,因為趕工期而沒有精細的設計接口,導致了難以維護的代碼。

GluonNLP 處方:易用並可擴展的接口,基於GluonNLP團隊對各種使用場景的研究。

最近,我在做一個新項目,並且發現一個常見問題,就是很多有用的資源沒有被聚攏起來。每個人都知道預訓練的詞語表徵和語言模型對很多應用都很有用。然而對特定問題該用哪一個模型需要很多實驗才能知道。開發人員經常需要在探索階段安裝很多工具。比如,Google的 Word2vec 對gensim有依賴,然而Salesforce的AWD語言模型是用PyTorch實現的,並且不提供預訓練模型。Facebook的Fasttext是自己開發的獨立包。為了正確地使用這些資源,用戶經常需要話費大量努力來搭建環境,並把數據轉化為各種格式。

我們都知道資源共享是社區的特點。在 GluonNLP中,我們不僅提供工具和社區給NLP 愛好者們,還要讓他們易於使用這些資源,通過整合這些來自不同平台的資源,使GluonNLP成為一站式解決方案。

癥狀:NLP資源太分散了。為了完成一個項目需要依賴很多包。

GluonNLP 處方:整合併重新分發這些有用的公開資源。一鍵為不同應用下載預訓練詞表徵,預訓練語言模型,常用的數據集和預訓練模型。


  說的夠多了,給我看代碼!

import mxnet as mx
import gluonnlp as nlp

# Load GloVe word embeddings
glove = nlp.embedding.create('glove', source='glove.6B.50d')

# Compute 'baby' and 'infant' word embeddings
baby_glove, infant_glove = glove['baby'], glove['infant']

# Load pre-trained AWD LSTM language model and get the embedding
lm_model, lm_vocab = nlp.model.get_model(name='awd_lstm_lm_1150',
                                        dataset_name='wikitext-2',
                                        pretrained=True)
baby_idx, infant_idx = lm_vocab['baby', 'infant']
lm_embedding = lm_model.embedding[0]

# Get the word embeddings of 'baby' and 'infant'
baby_lm, infant_lm = lm_embedding(mx.nd.array([baby_idx, infant_idx]))

# cosine similarity
def cos_similarity(vec1, vec2):
   return mx.nd.dot(vec1, vec2) / (vec1.norm() * vec2.norm())

print(cos_similarity(baby_glove, infant_glove)) # 0.74056691
print(cos_similarity(baby_lm, infant_lm)) # 0.3729561

gluonnlp.py hosted with ❤ by GitHub

在這個例子中,我們用 GluonNLP來加載Glove 詞語表徵,和預訓練好的AWD語言模型,然後比較了他們在測量相似度問題傷的準確性。我們通過在 'baby'和 'infant'這兩個例子上比較詞語表徵之間的餘弦相似度。從結果可以看到,Glove  表徵能更好地捕捉語義相似度。


  項目在哪裡?

最新的GluonNLP 和最新版的MXNet可以在 gluon-nlp.mxnet.io 上獲得,並且可以通過指令 pip install gluonnlp 來安裝。

v.0.3.2版本的GluonNLP 包含這個功能:

  • 預訓練模型:超過300個詞語表徵模型(GloVe, FastText, Word2vec),5種語言模型 (AWD, Cache, LSTM)。

  • 神經機器翻譯(Google NMT, Transformer)模型訓練

  • 用來訓練Word2vec 和 FastText的詞語表徵,包括未知詞表徵和用部分詞來產生的表徵。

  • 靈活的數據管道工具和許多公開數據集。

  • NLP的例子,比如情感分析。

我們會在接下來的版本中繼續增加功能和模型。如果你對某個模型有興趣或者有反饋給我們,可以在Github上找到我們。雷鋒網


想要繼續查看該篇文章相關鏈接和參考文獻?

長按鏈接點擊打開【深度學習的NLP工具】:雷鋒網

https://ai.yanxishe.com/page/TextTranslation/731


AI研習社每日更新精彩內容,觀看更多精彩內容:雷鋒網

用Python實現遺傳算法

如何將深度學習應用於無人機圖像的目標檢測

機器學習和深度學習大PK!昆蟲分類誰更強?

Python高級技巧:用一行代碼減少一半內存佔用


等你來譯:

五個很厲害的 CNN 架構 

如何在神經NLP處理中引用語義結構 

特朗普都被玩壞了,用一張照片就能做出惟妙惟肖的 Memoji

讓神經網絡說「我不知道」——用Pyro/PyTorch實現貝葉斯神經網絡


◆◆    敲黑板,划重點啦!    ◆◆

AI求職百題斬已經悄咪咪上線啦,點擊下方小程序卡片,開始愉快答題吧!



想在手機閱讀更多周邊設備資訊?下載【香港矽谷】Android應用
分享到Facebook
技術平台: Nasthon Systems