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

2021-01-10 人工智慧遇見磐創

介紹

「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學」)

相關焦點

  • Pytorch-Transformers 1.0 發布,支持六個預訓練框架,含 27 個預...
    哪些支持PyTorch-Transformers(此前叫做pytorch-pretrained-bert)是面向自然語言處理,當前性能最高的預訓練模型開源庫。該開源庫現在包含了 PyTorch 實現、預訓練模型權重、運行腳本和以下模型的轉換工具:1、谷歌的 BERT,論文:「BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding」,論文作者:Jacob Devlin, Ming-Wei Chang, Kenton Lee
  • 微信開源推理加速工具 TurboTransformers,性能超越 PyTorch/...
    該工具面向自然語言處理領域中 Transformers 相關模型豐富的線上預測場景,據介紹,其在微信、騰訊雲、QQ 看點等產品的線上服務中已經廣泛應用,這也是騰訊對外開源的第 100 個項目。在自然語言處理領域中,以 BERT 為代表的 Transformers 相關神經網絡模型是近年來最重要的模型創新,可以為閱讀理解、文章摘要、語義分類、同義改寫等 NLP
  • 良心整理15個超級Python庫,不要錯過!
    Python 是最流行和使用最廣泛的程式語言之一,它已經超越了業界許多程式語言,名列前茅。它在開發人員中流行的原因有很多,最重要的一點就是它有大量的庫供用戶使用。Python 的易用性、靈活性吸引了許多開發人員為機器學習創建新的庫。
  • 《小灰教你零基礎學python》-Python入門語言
    程式語言有很多,咱們就學簡單強大的python即可。Python目前是分成2個大版本,python2 和python3,python是完全免費的,所以不用擔心版權問題,因為python2已經廢棄,所以咱們這套課程完全基於python3。
  • TensorFlow、PyTorch、Keras:NLP框架哪家強
    本文著重分析比較了這三個框架用於自然語言處理(Natural Language Processing,NLP)時的不同之處。1. 可用的RNN類型當試圖用深度學習方法來解決NLP問題時,循環神經網絡(Recurrent Neural Networks,RNNs)是開發者最常用的專業架構。
  • 57行代碼給《瑞克和莫蒂》寫新劇集
    介紹隨著機器學習(Machine Learning, ML)和自然語言處理(Natural Language Processing, NLP)技術的快速進展,新算法具備生成文本的能力,這些文本也變得越來越接近人類寫出的內容。GPT21就是其中一個算法,它被應用在很多開源項目2中。
  • 20個超棒的Python 庫集合分享
    Plotly (Commits: 2906, Contributors: 48) 官網:https://plot.ly/python/ Plotly 是一個流行的庫,它可以讓你輕鬆構建複雜的圖形。該軟體包適用於交互式 Web 應用程,可實現輪廓圖、三元圖和三維圖等視覺效果。 8.
  • Facebook 開源 3D 深度學習函數庫 PyTorch3D
    新酷產品第一時間免費試玩,還有眾多優質達人分享獨到生活經驗,快來新浪眾測,體驗各領域最前沿、最有趣、最好玩的產品吧~!下載客戶端還能獲得專享福利哦!原標題:Facebook開源3D深度學習函數庫PyTorch3D來源:開源中國Facebook近日開源了將PyTorch用於3D深度學習的函數庫PyTorch3D,這是一個高度模塊化且經過優化的庫,具備獨有的功能,旨在通過PyTorch簡化3D深度學習。
  • 微軟發布新的VS Code Python語言插件Pylance:高性能代碼提示
    最近微軟VS Code博客宣布了Python的支持插件Pylance,這是微軟推出的一個快速而且功能豐富的Python語言擴展。Pylance依賴於微軟官方的ms-python,目前在VS Code應用市場可以下載。本文蟲蟲就帶大家一起嘗鮮使用這個插件。
  • 最全!2019 年 NLP 領域都發生了哪些大事件?
    該方法在12個自然語言處理任務上,都實現了最先進的性能。2019 年初,英偉達的研究人員發表了一篇著名的論文「StyleGAN」,它基於風格遷移方法,提出了一種可選的 GAN 生成架構。接著,他們在論文《Analyzing and Improving the Image Quality of StyleGAN》中對 StyleGAN 進行了改進,重新設計了生成器的歸一化過程。
  • Python文本處理工具都有哪些?
    1、 NLTK — Natural Language Toolkit搞自然語言處理的同學應該沒有人不知道NLTK吧,這兒也就不多說了。不過引薦兩本書籍給剛剛觸摸NLTK或許需求具體了解NLTK的同學: 一個是官方的《Natural Language Processing with Python》,以介紹NLTK裡的功用用法為主,一起附帶一些Python常識,一起國內陳濤同學友情翻譯了一個中文版,這兒可以看到:引薦《用Python進行自然語言處理》中文翻譯-NLTK配套書;另外一本是《Python Text Processing with
  • python初學者必看的學習路線 Python是近幾年比較火的程式語言
    Python是近幾年比較火的程式語言之一,因為人工智慧的火爆,讓很多人都想從事python開發。很多零基礎學員在學習python的時候都會走一些彎路,下面小編就為大家分享python學習路線圖,幫助零基礎學員在學習的時候少走彎路。 很多人都在問Python學習步驟應該如何安排?
  • 自動生成pandas代碼,python數據處理神器
    熟悉我的同學都知道,我的大部分教程最終都希望教會你怎麼節省代碼。今天我要說的不是怎麼寫代碼,而是介紹一款我親手打造的小工具,它作為探索數據的工具,你不僅不需要寫任何的代碼,它最終還會自動生成pandas代碼。
  • GPT-2沒什麼神奇的,PyTorch 就可以復現代碼
    我讀過的最精彩、解釋最清楚的文章之一是「The Annotated Transformer」https://nlp.seas.harvard.edu/2018/04/03/attention.html。它引起了前所未有的關注,一個簡單的想法就是用一個文件注釋你所需要的代碼。
  • Python真的值得學習嗎
    1989年,Guido van Rossum在參加設計ABC(一種教學語言)後,萌生了想要開發一種新的計算機高級語言的想法。他綜合了ABC語言的優點,並且結合了Unix shell和C的習慣,創造出了一種新的語言——Python。1991年初python公布了第一個公開發行版本。
  • 如何使用python語言第三方庫獲取CPU信息
    >psutilpythondjango在Visual Studio 2019開發工具中,我們創建python項目,然後新建python文件,安裝psutil第三方庫,接著獲取電腦CPU的相關信息。選擇python環境,輸入psutil並進行安裝3、經過兩次安裝,psutil庫安裝成功
  • python數據挖掘常用工具有哪幾種?
    python數據挖掘常用工具有哪幾種? python有強大的第三方庫,廣泛用於數據分析,數據挖掘、機器學習等領域,下面小編整理了python數據挖掘的一些常用庫,希望對各位小夥伴學習python數據挖掘有所幫助。
  • 一行代碼安裝,TPU也能運行PyTorch,修改少量代碼即可快速移植
    曉查 發自 凹非寺量子位 報導 | 公眾號 QbitAI對於PyTorch開發者來說,Google Colab上的TPU資源不能用,恐怕是最遺憾的事情了。Google的雲計算資源眼看著不能用,轉TensorFlow又是不可能的。
  • Pytorch框架安裝方法(基於Anaconda環境和Pycharm IDE)
    1.6 單擊啟動Anaconda Prompt 創建虛擬「房間」通過conda創建一個名為:pytorch的虛擬「房間」,可以方便未來對不同版本的PyTorch進行管理,具體方法如下:conda create -n pytorch python=3.61.7 查看創建的「房間」方法:conda info --envs
  • 用於自然語言處理的BERT-雙向Transformers的直觀解釋
    一種理解用於自然語言處理的BERT-Transformer雙向編碼器表示的直觀方法在這篇文章中,我們將使用一種直觀的方法來理解NLP的發展,包括BERT。預訓練策略使BERT如此強大和流行,並且BERT可針對大多數NLP任務進行微調。