Python 文本分析(3)Pytorch-transformer實際應用

2021-12-28 一隻土博鼠

這期總算琢磨了點乾貨出來,主要涉及Pytorch-transformer給出的Bert ,XLM ,以及XLNet(三個NLP目前的大哥大)的參數調整和實際應用。

現在普遍的現象是要麼有現成的輪子但是封裝程度太高了,很難改裡面的參數,要麼允許調參數,但是代碼太多了,或者有些版本過低拿來根本不能用,這篇主要解決了:

Bert 、XLM、XLNet的參數由json導入並建立新類進行調整

XLM、XLNet的vocab_file的取出

XLM、XLNet與face.ai的結合(基於以上兩點)

我把自己詳細探索的步驟寫了下來,供大家參考和分享。文章有點長。

只要你對NLP有一丟丟了解,一定聽過Bert的大名,現在大量的技術類公眾號和CSDN博客上鋪天蓋地都是Bert 原理講解,其實最好的方式就是配合論文擼一遍源碼。但是對於像我這樣的平凡人,擼過代碼後也只能感嘆一聲谷歌牛X,但是實際改起來用到自己的研究中去工作量還是很大的。這些Algorithm是給天才們去做的,我們平凡的人類更需要的是實現和應用,即生產力。就像我們不會去關注信號發射用的是什麼算法,我們關心的是網速快不快。

雖然谷歌已經把bert開源了可是面對繁雜的代碼我等凡人還是望而卻步。一個叫Hugging face的天才創業團隊下凡普渡眾生了,在他們的網站上給出了六種NLP模型,均為現在自然語言處理(NLP)領域最常用的六種模型:BERT,GPT,GPT-2,Transformer-XL,XLNet,XLM

Github地址:

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

教程文檔:
https://huggingface.co/pytorch-transformers/quickstart.html#documentation

所以我覺得現在的環境對於平凡人真的太好了,大神和天才們已經把框架寫好了還很貼心的寫了教程文檔,我們需要做的只是閱讀這些教程和源碼、follow一下、然後修改,甚至可以和其他的輪子粘在一起。

我們先pip install pytorch-transformers, 就可以把六個模型收入囊中。

然後我們試一下教程example裡面的代碼。

因為Bert的結構就是每個句子的開頭結尾要加上[cls]和[sep]

print一下token_tensors

後面就是把henson挖掉,給訓練好的bert 餵一第一個句子,第二個句子把henson挖掉(masked),看看bert能不能準確的預測到。

print(predicted_index)

print(predict_token)

發現

確實預測對了,後面還給了OpenAI的例子,大家可以操作一下。

這就很激動人心了,可以從繁雜的代碼中解脫出來,僅僅調用幾個函數就可以用到最先進的武器!

但是例子歸例子,並且只是兩句話,如果是一個excel 文檔呢?這是平時我們最常見的形式,我們一般是從一些網站裡爬取數據然後寫入excel或者是資料庫,然後從中讀取評論並判定情感正負。

我試著改寫了一下,以做到只需要改動數據集就可以跑起來。

但是還是太複雜前後加起來一共700多行,於是我跑去github上逛了一圈看看有沒有人在造輪子做簡化,然後撿到寶了,這裡貼出地址:

作者用的數據集是Kaggle中的惡意評論分類,目標是把評論分為6類,大家可以上kaggle搜一下並下載這個數據集。

要知道faceai是最簡單的了,因為調用learn的話只需要databunch,pretrained_model,loss_func,metrics就能用了,簡直是伸手黨的福音!

我把他的代碼運行了一下,發現...

這啥..為什麼輸出是tuple?不應該啊

這個問題困擾了我一個禮拜,於是暫時不幹了,看了一個禮拜注會

稅法看吐了後決定好好研讀一下pytorch-transformer的教程文檔,有了驚喜的發現。

它們是叫pytorch-pretrained但是現在改了一個酷炫的名字transformer,同時輸出格式變成了tuple,output的元組的格式,並且作者很貼心的說,把元組中第一個元素取出來就可以達到和原來pytorch-pretrained的output一樣的結果,所以現在的問題是——這些函數都是封裝好的,怎麼取出第一個元素?我首先第一個愚蠢的想法是把github裡面的源碼下下來,然後在output後面加個[0]就好了呀

但是Google 後,發現了大神的建議

對啊,why not create my own model?自己定義一個類,我要做的就是修改BertForSequenceClassification類裡面的forward函數而已,使得其輸出的格式為forward[0]。

呵呵 完蛋 

這裡出錯說明我需要一個GPU了..果然窮人不適合玩深度學習

本著絕不花錢的原則,能改則改,我都改寫成函數的形式,加多線程,最後用main 調用(其實這個錯誤我在前一周爬SEC的網站時候出現過,後來改成函數用多線程就爬的很麻溜了)。

勉為其難的跑了起來,風扇轉的震天響,但是幸好沒有掛掉。

25分鐘才跑完一個epoch啊.這跑十多個不得好半天...

至暗時刻,谷歌爸爸來拯救蒼生了強烈推薦老師用這個進行教學,初學者用這個入門,因為實在是太方便了! 很多常用的包都裝好了(不僅僅是anaconda裡面那一套,更有kera等深度學習庫)還不用配置環境,記得去年被安裝各種包和配置環境折磨了很久的我幾乎要摔電腦,colab還是交互式的,還能修改後再運行..這就是相見恨晚吧(其實去年就可以用了)

最最最重要的是 谷歌爸爸提供免費GPU!Free! Free! Free!

這個GPU貌似也不便宜啊Tesla K80 GPU

前提是大家得有一個穩定的梯子(很多免費的梯子都不太穩定)...由於之前混跡於ins 和youtube,我有梯子和谷歌帳號。

登陸Google Drive,開始建立colab notebook

然後我把代碼從eclipse裡面複製過來在runtime裡面改成GPU模式運行了一下

訓練集上的準確度太低了,其實這是很正常的,大家看看bert的複雜程度

用它來訓練一個只有2000行的評論數據是不是大炮打螞蟻?

我決定改一下bert的參數,怎麼改,還是剛才的做法,定義一個新類,這個新類繼承了之前的類,在新類中把config設為自己想調整的。

我們不妨先看看谷歌的參數

我把新的參數做成json文件,導入新class中去,下面就是新的類,包括了參數調整和tuple的取出。

開始訓練

真的超快的啊...太強悍了

並且參數調整後訓練集上的準確度是有顯著提高的,我們再看看測試集的表現如何

還不賴吧

好了,Bert算是搞定了,別忘了pytorch-transformer還有XLM 和XLNet啊,用哪個好呢?

emm 我全要

其中要解決的最大的問題是語言模型,Bert我們可以用vocab.keys(),但是XLM和XLNet呢?

在閱讀源碼後我找到了

XLM的是bpe_ranks

但是只支持英文

剩下的只需要對原來bert的代碼做一點改動就行

之後的改動還是和之前的一樣,不過繼承的對象是XLMForSequenceClassification

改動這倆就Ok了

其中XLM的參數建議參考Bert的,不然根本跑不起來因為實在是太大了。

這裡可能有人發現了,我用到的都是SequenceClassification,但是如果沒有呢?像pytorch-transformer裡的其他三個模型是沒有的

那只能自己寫句子分類了,利用pytorch進行onehot編碼,思路和給出的教程是一樣的,再循環epoch。

我反正不想寫了,畢竟有這三個大哥何必再招小弟

我會找個時間把今天的代碼規整一下傳到github上去,大家去下載拿來用就好了

其實Huggingface上還有幾個庫很好玩,大家可以去嘗試一下多分類、猜詞等但是對於我來說暫時沒有那麼實用,就沒有做了

得抓緊看注會了,已經看不完了

參考文獻:

【1】 https://github.com/abhikjha/Fastai-integration-with-BERT

【2】https://github.com/huggingface/pytorch-transformers

httphttps://huggingface.co/pytorchtransformers/quickstart.html#documentation

相關焦點

  • PyTorch 1.7發布:支持CUDA 11、Windows分布式訓練
    在更新上,有了許多新的應用編程接口,如支持與NumPy兼容的快速傅立葉變換的操作及性能分析工具。此外,分布式數據並行(DDP)和基於遠程過程調用(RPC)的分布式訓練也有了重大的更新,在Windows平臺上的分布式訓練提供支持。最後,一些功能也穩定了下來,包括torchvision中的本機圖像IO,torchaudio中的語音識別、文字轉語音等許多功能。
  • 【實戰乾貨】用Pytorch輕鬆實現28個視覺Transformer(附代碼解讀)
    代碼解讀代碼來自:https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/vision_transformer.py
  • 使用PyTorch建立您的第一個文本分類模型
    pytorch-11在本文中,我們將使用PyTorch,它以其快速的計算能力而聞名。因此,在本文中,我們將逐步講解解決文本分類問題的要點。然後,我們將在PyTorch中實現我們的第一個文本分類器!注意:我強烈建議您先閱讀以下文章,然後再繼續閱讀本文章。
  • 用Transformer實現OCR字符識別!
    在CV領域中,transformer除了分類還能做什麼?本文將採用一個單詞識別任務數據集,講解如何使用transformer實現一個簡單的OCR文字識別任務,並從中體會transformer是如何應用到除分類以外更複雜的CV任務中的。
  • 【2020新書】Python文本分析,104頁pdf
    人工智慧的整個子領域與文本分析(自然語言處理)有關。開發的許多基本分析方法現在都可以作為Python實現使用。這本書將告訴您何時使用哪個方法、它如何工作的數學背景以及實現它的Python代碼。概述:今天,文本是我們生活中不可或缺的一部分,也是最豐富的信息來源之一。
  • Transformer 模型的 PyTorch 實現
    我們首先詳細地分析一下encoder和decoder的每一層是怎麼樣的。Encoderencoder由6層相同的層組成,每一層分別由兩部分組成:兩個部分,都有一個 殘差連接(residual connection),然後接著一個Layer Normalization。
  • Pytorch多GPU訓練
    所以這裡提供一個解決顯存使用不平衡問題的方案:首先這次的解決方案來自transformer-XL的官方代碼: https://github.com/kimiyoung/transformer-xl然後我將其中的平衡GPU顯存的代碼提取了出來(原代碼好像有點小問題)放到了github上面:https://github.com/Link-Li/Balanced-DataParallel這裡的代碼是原作者繼承了
  • pytorch多gpu並行訓練
    .使用共享文件系統初始化2.1.3.初始化rank和world_size2.1.4.初始化中一些需要注意的地方2.2.數據的處理-DataLoader2.3.模型的處理2.4.模型的保存與加載pytorch多gpu並行訓練注: 以下都在Ubuntu上面進行的調試, 使用的Ubuntu
  • PyTorch 模型訓練實用教程(附代碼)
    本教程以實際應用、工程開發為目的,著重介紹模型訓練過程中遇到的實際問題和方法。如上圖所示,在機器學習模型開發中,主要涉及三大部分,分別是數據、模型和損失函數及優化器。然而,工程應用開發中所遇到的問題並不是跑一個模型的 demo 就可以的,模型開發需要對數據的預處理、數據增強、模型定義、權值初始化、模型 Finetune、學習率調整策略、損失函數選取、優化器選取、可視化等等。鑑於此,我只能自己對著官方文檔,一步一步地學習。
  • 使用Pytorch訓練分類器詳解(附python演練)
    一、 數據通常來說,當你處理圖像,文本,語音或者視頻數據時,你可以使用標準python包將數據加載成numpy數組格式,然後將這個數組轉換成torch.CIFAR-10中的圖像尺寸為3*32*32,也就是RGB的3層顏色通道,每層通道內的尺寸為32*32。
  • PyTorch 1.7來了!支持Windows上的分布式訓練,還有大波API襲來
    注意:常規分析運行不應使用此功能,因為它會增加大量成本。這將完成計劃在TorchScript中支持的主要RPC API,它允許用戶在TorchScript中使用現有的python RPC API,並可能提高多線程環境中的應用程式性能。
  • 最強NLP模型BERT喜迎PyTorch版!谷歌官方推薦,也會支持中文 | 附459頁《Python深度學習》下載
    無監督意味著BERT只使用純文本語料庫進行訓練,這很重要,因為網絡上有大量的公開的純文本數據,而且是多語言的。預訓練的表示可以是上下文無關(context-free)的,也可以是上下文相關(contextual)的,並且上下文相關表示還可以是單向的或雙向的。
  • Python提取PDF表格及文本!
    這次介紹一個開源python工具庫-pdfplumber,可以方便地獲取pdf的各種信息,包括文本、表格、圖表、尺寸等。pdfplumber在github上有英文官方文檔,後面我們會撿重點講解,先看下如何用pdfplumber提取pdf表格?
  • 最強NLP模型BERT喜迎PyTorch版!谷歌官方推薦,也會支持中文
    就是根目錄下的這個腳本文件:convert_tf_checkpoint_to_pytorch.py使用這個腳本需要注意兩點。一是想要得到一個PyTorch模型的話,運行一次就夠了,接下來只需要忽略TensorFlow檢查點文件,保留配置文件和詞表文件;二是雖說最終用的都是PyTorch模型,但TensorFlow也得安裝。
  • PyTorch 1.7 來了:支持 Windows 上的分布式訓練,還有大波 API 襲來
    1、PyTorch.org上提供的二進位文件現在正式支持CUDA 112、對Autograd分析器中的RPC、TorchScript和堆棧跟蹤的分析和性能進行了更新和添加。3、(測試版)通過torch.fft支持NumPy兼容的快速傅立葉變換(FFT)。4、(原型)支持NVIDIA A100 GPU和本地的TF32格式。
  • onnx實現對pytorch模型推理加速
    自然語言處理》英、中文版PDF+源碼《21個項目玩轉深度學習:基於TensorFlow的實踐詳解》完整版PDF+附書代碼《深度學習之pytorch》pdf+附書源碼PyTorch深度學習快速實戰入門《pytorch-handbook》【下載】豆瓣評分8.1,《機器學習實戰:基於Scikit-Learn和TensorFlow
  • 本周優秀開源項目分享,pytorch 人臉識別、場景文字檢測Python 包 等8大項目
    ,用於NLP語料的數據增強文本複述任務是指把一句/段文本A改寫成文本B,要求文本B採用與文本A略有差異的表述方式來表達與之意思相近的文本。改進谷歌的LaserTagger模型,使用LCQMC等中文語料訓練文本複述模型,即修改一段文本並保持原有語義。複述的結果可用於數據增強,文本泛化,從而增加特定場景的語料規模,提高模型泛化能力。
  • Transformer及其變種
    因此一般選擇將文本直接進行截斷,而不考慮其自然文本的分割(例如標點符號等),使得文本的長距離依賴建模質量下降。計算資源分配對於不同的單詞都是相同的:在Encoder的過程中,所有的輸入token都具有相同的計算量。但是在句子中,有些單詞相對會更重要一些,而有些單詞並沒有太多意義。為這些單詞都賦予相同的計算資源顯然是一種浪費。
  • cnocr:用來做中文OCR的Python3包,裝上就能用!
    安裝真的很簡單pip install cnocr請使用Python3 (3.4, 3.5, 3.6以及之後版本應該都行可直接使用的模型cnocr雖然上表中給出的多個模型在測試集上的準確率都是 98.6%,但從實際使用經驗看,綜合中英文的識別效果,conv-lite-fc是效果最好的,其次是 densenet-lite-lstm 和 conv-lite-lstm。對於中文識別且識別困難(如文字比較模糊)的場景,建議嘗試模型 conv-lite-lstm。
  • pytorch如何將訓練提速?
    後來發現在0.3.0的時候已經修復了這個問題,可以用torch.backends.cudnn.deterministic = True這樣調用的CuDNN的卷積操作就是每次一樣的了。自然語言處理》英、中文版PDF+源碼《21個項目玩轉深度學習:基於TensorFlow的實踐詳解》完整版PDF+附書代碼《深度學習之pytorch》pdf+附書源碼PyTorch深度學習快速實戰入門《pytorch-handbook》【下載】豆瓣評分8.1,《機器學習實戰:基於Scikit-Learn和TensorFlow