PyTorch-Transformers:最先進的自然語言處理庫(附帶python代碼)

2020-12-15 人工智慧遇見磐創

介紹

「NLP’s ImageNet moment has arrived.」 – Sebastian Ruder

想像一下我們有能力構建支持谷歌翻譯的自然語言處理(NLP)模型,並且在Python中僅需幾行代碼來完成,這聽起來是不是讓人非常興奮。

而現在我們就可以坐在自己的機器前實現這個了!藉助於被HuggingFace稱為PyTorch-Transformers目前最先進的NLP工具。

https://github.com/huggingface/pytorch-transformers

我們可以簡單地用Python導入它並進行實驗。

我對現在NLP的研發速度感到非常驚訝,每一篇新論文、每一個框架和庫都在推動著這個不可思議的強大領域的發展。由於圍繞人工智慧的研究的開放文化和大量免費可用的文本數據,幾乎沒有什麼是我們今天不能做的。

無論我再怎麼強調PyTorch-Transformers對研究社區和NLP行業的影響也不為過。我相信這有可能徹底改變我們所知的自然語言處理領域。

揭開NLP的神秘面紗

本質上,自然語言處理是教計算機理解人類語言的複雜性。

在討論PyTorch-Transformers的技術細節之前,讓我們快速回顧一下該庫構建的概念——NLP。我們還將理解最先進的(state-of-the-art)意味著什麼。

在我們開始PyTorch-Transformers的講解之前,這裡有一些你需要了解的東西:

最先進的(state-of-the-art)是指目前對於某項任務「最好的」算法或技術。當我們說「最好的」時,我們的意思是這些算法是由像谷歌、Facebook、微軟和亞馬遜這樣的巨頭所倡導的。NLP有許多定義明確的任務,研究人員正在研究創建智能技術來解決這些問題。一些最受歡迎的任務像機器翻譯、文本摘要、問答系統等。深度學習技術如Recurrent Neural Networks (RNNs), Sequence2Sequence, Attention,還有Word Embeddings(Glove, Word2Vec)對NLP任務來說曾是最先進的。然而這些技術被一個叫Transformers的框架取代了,其背後是幾乎所有的當前最先進的NLP模型。注意 這篇文章將多處提及Transformers ,所以我強烈建議你閱讀下面的指南,以對Transformers有個理解

https://www.analyticsvidhya.com/blog/2019/06/understanding-transformers-nlp-state-of-the-art-models/?utm_source=blog&utm_medium=pytorch-transformers-nlp-python

PyTorch-Transformers是什麼?

PyTorch-Transformers是一個最先進的自然語言處理預訓練模型庫。

我從PyTorch-Transformers的文檔中選取了這一部分。這個庫目前包含PyTorch實現、預訓練的模型權重、使用腳本和用於以下模型的轉換工具:

BERT(來自谷歌) 與論文BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 一起發布GPT(來自OpenAI) 與論文 Improving Language Understanding by Generative Pre-Training 一起發布GPT-2(來自OpenAI) 與論文 Language Models are Unsupervised Multitask Learners 一起發布Transformer-XL(來自谷歌/CMU) 與論文 Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context 一起發布XLNet (來自谷歌/CMU) 與論文 XLNet: Generalized Autoregressive Pretraining for Language Understanding 一起發布XLM (來自Facebook) 與論文 Cross-lingual Language Model Pretraining一起發布上述所有模型都是適用於各種NLP任務的最佳模型。

大多數最先進的模型需要大量的訓練數據和花費數天時間在昂貴的GPU硬體上進行訓練,而這些只有大型技術公司和研究實驗室才能負擔得起。但隨著PyTorch-Transformers的推出,現在任何人都可以利用這些最先進的模型!

在你的機器上安裝PyTorch-Transformers

在Python中 Pytorch-Transformers非常簡單。你可以只使用pip安裝:

pip install pytorch-transformers或者在Colab上使用以下命令:

!pip install pytorch-transformers由於大多數這些模型都是GPU密集型的,因此我建議按照本文使用谷歌Colab。

注意:本文中的代碼是使用PyTorch框架編寫的。

使用GPT-2預測下一個單詞

因為PyTorch-Transformers支持許多經過語言建模訓練的NLP模型,所以它支持自然語言生成任務,比如完形填空(sentence completion)。

2019年2月,OpenAI發布了一種新的基於transformer語言模型GPT-2,引起了不小的轟動。GPT-2是一種於基於transformer的生成語言模型,它基於來自網際網路上的40GB的精選文本進行訓練。

在無監督的方式下進行訓練,它只學會根據通過訓練學會識別的模式預測最可能遵循給定句子的序列(即單詞)。

讓我們使用GPT-2構建我們自己的完形填空模型,我們試著預測句子中的下一個單詞:

what is the fastest car in the _

我選擇這個例子是因為這是谷歌的文本補全給出的第一個例子,下面是實現預測的代碼:

# 導入必要的庫import torchfrom pytorch_transformers import GPT2Tokenizer, GPT2LMHeadModel# 加載預訓練模型tokenizer (vocabulary)tokenizer = GPT2Tokenizer.from_pretrained('gpt2')# 對文本輸入進行編碼text = "What is the fastest car in the"indexed_tokens = tokenizer.encode(text)# 在PyTorch張量中轉換indexed_tokenstokens_tensor = torch.tensor([indexed_tokens])# 加載預訓練模型 (weights)model = GPT2LMHeadModel.from_pretrained('gpt2')#將模型設置為evaluation模式,關閉DropOut模塊model.eval()# 如果你有GPU,把所有東西都放在cuda上tokens_tensor = tokens_tensor.to('cuda')model.to('cuda')# 預測所有的tokenswith torch.no_grad(): outputs = model(tokens_tensor) predictions = outputs[0]# 得到預測的單詞predicted_index = torch.argmax(predictions[0, -1, :]).item()predicted_text = tokenizer.decode(indexed_tokens + [predicted_index])# 列印預測單詞print(predicted_text)代碼很直觀,我們將文本標記為數字序列並將其索引,然後將其傳遞給GPT2LMHeadModel。

是不是很棒! 該模型成功地預測出了下一個單詞 「world」。這是非常驚人的,因為這就是谷歌的例子。我建議你輸入不同的句子來嘗試這個模型,看看它預測的下一個單詞時是怎樣的。

使用GPT-2、Transformer-XL和XLNet生成自然語言

在讓我們把文本生成帶到下一個層次。我們將根據給定的輸入生成一段文本,而不是只預測下一個單詞。讓我們看看我們的模型為以下輸入文本生成了什麼輸出:

In a shocking finding, scientist discovered a herd of unicorns living in a remote, previously unexplored valley, in the Andes Mountains. Even more surprising to the researchers was the fact that the unicorns spoke perfect English.我們將使用PyTorch-Transformers為此任務提供的現成腳本,我們先克隆他們的倉庫:

!git clone https://github.com/huggingface/pytorch-transformers.gitGPT-2

現在,你只需要一個命令就可以啟動模型了!

!python pytorch-transformers/examples/run_generation.py \ --model_type=gpt2 \ --length=100 \ --model_name_or_path=gpt2 \我們看看我們的GPT-2模型為輸入文本生成了什麼輸出:

The unicorns had seemed to know each other almost as well as they did common humans. The study was published in Science Translational Medicine on May 6. What's more, researchers found that five percent of the unicorns recognized each other well. The study team thinks this might translate into a future where humans would be able to communicate more clearly with those known as super Unicorns. And if we're going to move ahead with that future, we've got to do it at least a這個結果看起來似乎很瘋狂,模型生成的文本具有很強的內聚性,並且實際上有可能被誤認為是真實的新聞文章。

XLNet

XLNet將來自Transformer-XL(最先進的自回歸模型)的思想運用到預訓練中。從經驗上看,XLNet在20個任務上的表現都比BERT好,而且通常是佔據很大的優勢。XLNet在18項任務上取得了最先進的結果,包括問答、自然語言推理、情感分析和文檔排序。

你可以用下面的代碼來做實現同樣的功能:

!python pytorch-transformers/examples/run_generation.py \ --model_type=xlnet \ --length=50 \ --model_name_or_path=xlnet-base-cased \這是XLNet生成的輸出:

St. Nicholas was located in the valley in Chile. And, they were familiar with the southern part of Spain. Since 1988, people had lived in the valley, for many years. Even without a natural shelter, people were getting a temporary shelter. Some of the unicorns were acquainted with the Spanish language, but the rest were completely unfamiliar with English. But, they were also finding relief in the valley.<eop> Bioinfo < The Bioinfo website has an open, live community about the很有趣,雖然GPT-2模型直接從科學角度關注關於獨角獸的新聞,但XLNet實際上很好地構建了上下文並巧妙地引入了獨角獸的主題。接下來讓我們看看Transformer-XL的效果怎樣!

Transformer-XL

Transformer網絡受到固定長度上下文的限制,因此可以通過學習長期依賴(longer-term dependency)來改進。這就是為什麼谷歌提出了一種稱為Transformer-XL(意為超長)的語言建模新方法,它使Transformer體系結構能夠學習長期依賴。

Transformer-XL比標準Transformer快1800倍。

你可以使用以下代碼運行Transformer-XL:

!python pytorch-transformers/examples/run_generation.py \ --model_type=transfo-xl \ --length=100 \ --model_name_or_path=transfo-xl-wt103 \以下是生成的文本:

both never spoke in their native language ( a natural language ). If they are speaking in their native language they will have no communication with the original speakers. The encounter with a dingo brought between two and four unicorns to a head at once, thus crossing the border into Peru to avoid internecine warfare, as they did with the Aztecs. On September 11, 1930, three armed robbers killed a donkey for helping their fellow soldiers fight alongside a group of Argentines. During the same year這太棒了,有趣的是,可以看到不同的模型關注輸入文本的不同方面來進一步生成輸出文本。這種差異是由很多因素造成的,但主要歸因於不同的訓練數據和模型架構。

但是,最近,神經文本生成一直有一些強烈反對的聲音,因為人們擔心神經文本生成會增加與假新聞相關的問題。但是我們應該想想它積極的一面! 我們可以將它用於許多積極的應用,比如幫助作家或是創意人員提出新想法等等。

為BERT訓練一個遮蔽語言模型(Masked Language Model)

BERT框架是來自谷歌AI的一種新的語言表徵模型,它使用預訓練和微調來為各種任務創建最先進的NLP模型。這些任務包括問答系統、情感分析和語言推理。

BERT使用以下兩個無監督預測任務進行預訓練:

Masked Language Modeling (MLM)Next Sentence Prediction你可以使用PyTorch-Transformers實現這兩個任務。實際上,你可以從頭構建自己的BERT模型,也可以對預訓練版本進行微調。那麼,讓我們看看如何為BERT實現遮蔽語言模型。

問題定義

讓我們正式定義我們的問題:

給定一個輸入序列,我們將隨機屏蔽一些單詞。然後,模型應該根據上下文中提供的其他非屏蔽詞預測屏蔽詞的原始值。

那麼我們為什麼要這麼做呢?因為模型在訓練過程中學習語言規則。我們很快就會看到這個過程有多有效。

首先,讓我們使用BertTokenizer從一個文本字符串準備一個標記化的輸入:

import torchfrom pytorch_transformers import BertTokenizer, BertModel, BertForMaskedLM# 加載預訓練模型 tokenizer (vocabulary)tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')# 標記化輸出text = "[CLS] Who was Jim Henson ? [SEP] Jim Henson was a puppeteer [SEP]"tokenized_text = tokenizer.tokenize(text)這是我們的文本在標記化之後的樣子:

下一步將把它轉換成一個整數序列,並創建它們的PyTorch張量,以便我們可以直接使用它們進行計算:

# 掩碼一個標記,我們將嘗試用' BertForMaskedLM '預測回來masked_index = 8tokenized_text[masked_index] = '[MASK]'assert tokenized_text == ['[CLS]', 'who', 'was', 'jim', 'henson', '?', '[SEP]', 'jim', '[MASK]', 'was', 'a', 'puppet', '##eer', '[SEP]']# 將標記轉換為詞彙表索引indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)segments_ids = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]# 將輸入轉換為PyTorch張量tokens_tensor = torch.tensor([indexed_tokens])segments_tensors = torch.tensor([segments_ids])注意,我們將[MASK]設置在句子的第8個索引處,即單詞' Hensen '。這就是我們的模型要預測的。

現在我們的數據已經正確地為BERT進行了預處理,我們將創建一個遮蔽語言模型。現在讓我們使用BertForMaskedLM來預測一個屏蔽標記:

# 加載預訓練模型 (weights)model = BertForMaskedLM.from_pretrained('bert-base-uncased')model.eval()# :如果你有GPU,把所有東西都放在cuda上tokens_tensor = tokens_tensor.to('cuda')segments_tensors = segments_tensors.to('cuda')model.to('cuda')# 預測所有的tokenswith torch.no_grad(): outputs = model(tokens_tensor, token_type_ids=segments_tensors) predictions = outputs[0]# 證實我們能夠預測到'henson'predicted_index = torch.argmax(predictions[0, masked_index]).item()predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0]assert predicted_token == 'henson'print('Predicted token is:',predicted_token)讓我們看看我們的模型輸出是什麼:

Predicted token is: henson這是一個在單個輸入序列上訓練遮蔽語言模型的小演示。然而,對於許多基於Transformer的架構來說,它是訓練過程中非常重要的一部分。這是因為它允許模型中的雙向訓練——這在以前是不可能的。

恭喜你,因為你剛剛實現了你的第一個遮蔽語言模型! 如果你想訓練BERT,你只完成了一半的工作。這個例子將使你對如何使用PyTorch-Transformers來處理BERT模型有一個很好的了解。

總結

在本文中,我們使用PyTorch-Transformers實現並探索了各種最先進的NLP模型,如BERT、GPT-2、Transformer-XL和XLNet。我這樣做是為了讓你們對如何使用這個神奇的庫有一個很好的直觀感受。

下是我認為你會喜歡這個庫的6個理由:

預訓練模型:為6種最先進的NLP架構提供了預訓練模型,並為27種模型的變化提供了預訓練的權重預處理和微調API:PyTorch-Transformers不會在預訓練權重停止。它還提供了一個簡單的API,用於執行這些模型所需的所有預處理和微調步驟。現在,如果你讀過最近的研究論文,你就會知道許多最先進的模型都有獨特的預處理數據的方法,而且很多時候為整個預處理管道編寫代碼會很麻煩使用腳本:它還附帶了一些腳本,用於在基準NLP數據集上運行這些模型,比如SQUAD2.0(Stanford Question Answering Dataset)和GLUE(General Language Understanding Evaluation)。通過使用yTorch-Transformers,你可以直接針對這些數據集運行模型,並相應地評估性能多語言:PyTorch-Transformers支持多種語言。這是因為有些模型已經可以很好地用於多種語言TensorFlow兼容性:你可以將ensorFlow checkpoints作為PyTorch中的模型導入BERTology:越來越多的研究領域關注於研究像BERT這樣的大型transformers的內部工作(有人稱之為「BERT學」)

相關焦點

  • Transformers2.0讓你三行代碼調用語言模型,兼容TF2.0和PyTorch
    近日 HuggingFace 公司開源了最新的 Transformer2.0 模型庫,用戶可非常方便地調用現在非常流行的 8 種語言模型進行微調和應用,且同時兼容 TensorFlow2.0 和 PyTorch 兩大框架,非常方便快捷。
  • Pytorch-Transformers 1.0 發布,支持六個預訓練框架,含 27 個預...
    哪些支持PyTorch-Transformers(此前叫做pytorch-pretrained-bert)是面向自然語言處理,當前性能最高的預訓練模型開源庫。安裝該項目是在Python 2.7和3.5+上測試(例子只在python 3.5+上測試)和PyTorch 0.4.1到1.1.0測試pip 安裝:pip install pytorch-transformers測試:python -m pytest
  • ​關於深度學習、NLP和計算機視覺的30個頂級Python庫
    圖1:用於深度學習、自然語言處理和計算機視覺的頂級Python庫由星級和貢獻者數量繪製;按提交的對數表示相對大小那麼,廢話少說,下面是就是由KDnuggets員工精心挑選出來,可用於深度學習、自然語言處理和計算機視覺的
  • 獨家 | 快速掌握spacy在python中進行自然語言處理(附代碼&連結)
    本文與配套的Domino項目,簡要介紹了如何使用spaCy和相關庫在Python中處理自然語言(有時稱為「文本分析」)。業界的數據科學團隊時常處理大量文本數據,這也是機器學習中使用的四大數據類別之一,通常是人為生成的文本,但也不全是這樣。想想看:商業世界的「作業系統」是如何運行的?
  • OpenAI的GPT-2:用Python構建世界上最先進的文本生成器
    是的,你沒聽錯,這是一個在OpenAI的GPT-2框架上訓練的自然語言處理(NLP)模型訓練「說出」了這句話。所以你現在覺得機器學習的狀態完全在另一個層次上了嗎?在NLP真正的黃金時代,OpenAI的GPT-2改變了我們處理文本數據的方式。ULMFiT和谷歌的BERT輕鬆地為NLP愛好者打開了大門,而GPT-2則打破了這一局面,使NLP任務(主要是文本生成)的工作變得更加容易。
  • 自然語言處理 |收藏!使用Python代碼的4種句嵌入技術
    例如,如果有小夥伴用日文在底部寫評論,大部分人應該看不懂他寫的是什麼吧,自然也不敢輕易回復。所以,為了實現有效溝通,我們需要用彼此能理解的語言進行互動。而對於機器來說,為了讓機器可以處理和理解任意文本,我們必須用機器能夠理解的語言來表示文本。那麼它最懂哪種語言呢?
  • 數據科學家最喜歡的5個自然語言處理Python庫
    由於其特殊的特性,我們無法以一種簡單的方式處理數據,為了解決這一問題,在大數據和數據科學環境下,出現了許多技術和工具來解決這一問題。自然語言處理是人工智慧領域的前沿技術之一。它研究能實現人與計算機之間用自然語言進行有效通信的各種理論和方法。NLP的最終目標是以一種有價值的方式閱讀、破譯、理解和理解人類語言。
  • 快速掌握 Spacy 在 Python 中進行自然語言處理
    (點擊上方公眾號,可快速關注)轉自:數據派THU  英文:Paco Nathan  翻譯:笪潔瓊本文與配套的Domino項目,簡要介紹了如何使用
  • 五分鐘入門Python自然語言處理(一)
    blog:https://my.oschina.net/jhao104/blog  github:https://github.com/jhao104本文簡要介紹Python自然語言處理(NLP),使用Python的NLTK庫。
  • ...TurboTransformers,性能超越 PyTorch/TensorFlow 與主流優化引擎
    該工具面向自然語言處理領域中 Transformers 相關模型豐富的線上預測場景,據介紹,其在微信、騰訊雲、QQ 看點等產品的線上服務中已經廣泛應用,這也是騰訊對外開源的第 100 個項目。在自然語言處理領域中,以 BERT 為代表的 Transformers 相關神經網絡模型是近年來最重要的模型創新,可以為閱讀理解、文章摘要、語義分類、同義改寫等 NLP 任務提供顯著的效果提升。
  • GitHub 最受歡迎的 NLP 相關項目 | 資源推薦
    AILearninghttps://github.com/apachecn/AiLearning中文資料包含機器學習、深度學習、自然語言處理的學習路線圖、視頻、電子書、學習建議等。Transformershttps://github.com/huggingface/transformersTranformers(之前稱為 pytorch-transformers 和 pytorch-pretrained-bert),為自然語言理解(NLU) 和 自然語言生成(NLG)提供了 SOTA 通用架構
  • 7個最佳的學習Python編程的開源庫
    編程學習的開源庫:這個存儲庫一共有19本Jupyter筆記本。它涵蓋了字符串和條件之類的基礎知識,然後討論了面向對象編程,以及如何處理異常和一些Python標準庫的特性等。每一個主題都有一個「notebook」連結,它會向你介紹該主題和一些示例代碼,當你完成這些內容之後,還有一個練習連結,點擊後你就可以做一些測試題。
  • 一文總結數據科學家常用的Python庫(下)
    一文總結數據科學家常用的Python庫(上)用於建模的Python庫我們已經到達了本文最受期待的部分 - 構建模型!這就是我們大多數人首先進入數據科學領域的原因,不是嗎?讓我們通過這三個Python庫探索模型構建。
  • 手把手教 | 深度學習庫PyTorch(附代碼)
    介紹每隔一段時間,就會有一個有潛力改變深度學習格局的python庫誕生,PyTorch就是其中一員。 在過去的幾周裡,我一直沉浸在PyTorch中,我被它的易用性所吸引。在本文中,我們將以一種更實用的方式探索PyTorch, 其中包含了基礎知識和案例研究。
  • 微信開源推理加速工具 TurboTransformers
    該工具面向自然語言處理領域中 Transformers 相關模型豐富的線上預測場景,據介紹,其在微信、騰訊雲、QQ 看點等產品的線上服務中已經廣泛應用,這也是騰訊對外開源的第 100 個項目。在自然語言處理領域中,以 BERT 為代表的 Transformers 相關神經網絡模型是近年來最重要的模型創新,可以為閱讀理解、文章摘要、語義分類、同義改寫等 NLP 任務提供顯著的效果提升。
  • 教你用PyTorch實現「看圖說話」(附代碼、學習資源)
    本文用淺顯易懂的方式解釋了什麼是「看圖說話」(Image Captioning),藉助github上的PyTorch代碼帶領大家自己做一個模型,並附帶了很多相關的學習資源。介紹深度學習目前是一個非常活躍的領域---每天都會有許多應用出現。
  • 自然語言處理庫spaCy號稱最快句法分析器
    【IT168 評論】spaCy是Python和Cython中的高級自然語言處理庫,它建立在最新的研究基礎之上,從一開始就設計用於實際產品。spaCy帶有預先訓練的統計模型和單詞向量,目前支持20多種語言的標記。它具有世界上速度最快的句法分析器,用於標籤的卷積神經網絡模型,解析和命名實體識別以及與深度學習整合。它是在MIT許可下發布的商業開源軟體。
  • 快100 倍,Python 為自然語言處理加速度!
    沒有字符串操作,沒有 Unicode 編碼,自然語言處理中的難點都沒有支持啊!t=19m29s),因為你得處理GIL(全局解釋器鎖,https://wiki.python.org/moin/GlobalInterpreterLock)!而且,別忘了Cython也支持多線程(https://cython.readthedocs.io/en/latest/src/userguide/parallelism.html)!
  • 快 100 倍,Python 為自然語言處理加速度!
    我們發現,儘管在處理對話時這個包的速度完全沒問題,但在處理較大的問題時卻非常慢。我決定調查一下這個問題,於是就產生了 NeuralCoref v3.0(https://github.com/huggingface/neuralcoref/)這一項目,它比上一個版本快 100 倍(每秒能分析幾千個單詞),同時保持準確度、易用性,並且依然在 Python 庫的生態系統中。
  • 良心整理15個超級Python庫,不要錯過!
    Python 是最流行和使用最廣泛的程式語言之一,它已經超越了業界許多程式語言,名列前茅。它在開發人員中流行的原因有很多,最重要的一點就是它有大量的庫供用戶使用。Python 的易用性、靈活性吸引了許多開發人員為機器學習創建新的庫。有一個庫大家必都會介紹,就是TensorFlow,這裡就不多說了。