App下載

如何使用 spaCy v3.0 微調(diào) BERT 變壓器?方法介紹!

少女一米八 2021-09-10 10:23:16 瀏覽數(shù) (2814)
反饋

自從Vaswani 等人發(fā)表開創(chuàng)性論文“ Attention Is All You Need ”以來,transformer 模型已經(jīng)成為 NLP 技術(shù)中的最新技術(shù)。從 NER、文本分類、問答或文本生成等應(yīng)用,這項驚人技術(shù)的應(yīng)用是無限的。

更具體地說,BERT——代表來自變壓器的雙向編碼器表示——以一種新穎的方式利用了變壓器架構(gòu)。例如,BERT 用一個隨機(jī)屏蔽的詞分析句子的兩邊來進(jìn)行預(yù)測。除了預(yù)測被屏蔽的token之外,BERT還通過在第一個句子的開頭添加一個分類token [CLS]來預(yù)測句子的順序,并嘗試通過添加一個separation token [SEP]來預(yù)測第二個句子是否在第一個句子之后兩句話之間。

BERT架構(gòu)

在本文章中,我將向您展示如何微調(diào) BERT 模型以預(yù)測軟件職位描述中的技能、文憑、文憑專業(yè)和經(jīng)驗等實體。 

微調(diào)變壓器需要具有并行處理功能的強(qiáng)大 GPU。為此,我們使用 Google Colab,因為它提供免費可用的帶有 GPU 的服務(wù)器。

在本教程中,我們將使用新發(fā)布的spaCy v3.0 庫來微調(diào)我們的轉(zhuǎn)換器。以下是有關(guān)如何在 spaCy v3.0 上微調(diào) BERT 模型的分步指南。Github repo中提供了代碼和必要的文件。

要使用 spaCy v3.0 微調(diào) BERT,我們需要以 spaCy v3.0 JSON 格式(請參閱此處)提供訓(xùn)練和開發(fā)數(shù)據(jù),然后將其轉(zhuǎn)換為.spacy二進(jìn)制文件。我們將提供包含在 TSV 文件中的 IOB 格式的數(shù)據(jù),然后將其轉(zhuǎn)換為 spaCy JSON 格式。

我只標(biāo)記了 120 個職位描述,其中包含培訓(xùn)數(shù)據(jù)集的技能、文憑、文憑專業(yè)和經(jīng)驗等實體,以及開發(fā)數(shù)據(jù)集的大約 70 個職位描述。

在本教程中,我使用了UBIAI注釋工具,因為它具有廣泛的功能,例如:

  • 機(jī)器學(xué)習(xí)自動注釋
  • 字典、正則表達(dá)式和基于規(guī)則的自動注釋
  • 團(tuán)隊協(xié)作共享注釋任務(wù)
  • 直接注釋導(dǎo)出為 IOB 格式

使用 UBIAI 中的正則表達(dá)式功能,我預(yù)先注釋了所有遵循“\d.*\+.*”模式的經(jīng)驗提及,例如“5 + 年的 C++ 經(jīng)驗”。然后我上傳了一個包含所有軟件語言的 CSV 字典并分配了實體技能。預(yù)注釋可以節(jié)省大量時間,并將幫助您最大限度地減少手動注釋。

有關(guān) UBIAI 注釋工具的更多信息,請訪問文檔頁面。

導(dǎo)出的注釋將如下所示:

Python:

MS B-DIPLOMA
in O
electrical B-DIPLOMA_MAJOR
engineering I-DIPLOMA_MAJOR
or O
computer B-DIPLOMA_MAJOR
engineering I-DIPLOMA_MAJOR
. O
5+ B-EXPERIENCE
years I-EXPERIENCE
of I-EXPERIENCE
industry I-EXPERIENCE
experience I-EXPERIENCE
. I-EXPERIENCE
Familiar O
with O
storage B-SKILLS
server I-SKILLS
architectures I-SKILLS
with O
HDD B-SKILLS

為了從 IOB 轉(zhuǎn)換為 JSON(請參閱此處的文檔),我們使用 spaCy v3.0 命令:

Python:

!python -m spacy convert drive/MyDrive/train_set_bert.tsv ./ -t json -n 1 -c iob
!python -m spacy convert drive/MyDrive/dev_set_bert.tsv ./ -t json -n 1 -c iob

轉(zhuǎn)換為 spaCy v3.0 JSON 后,我們需要.spacy使用此命令將訓(xùn)練和開發(fā) JSON 文件都轉(zhuǎn)換為二進(jìn)制文件(使用您自己的更新文件路徑):

Python:

!python -m spacy convert drive/MyDrive/train_set_bert.json ./ -t spacy!python -m spacy convert drive/MyDrive/dev_set_bert.json ./ -t spacy

模型訓(xùn)練

打開一個新的 Google Colab 項目,并確保在筆記本設(shè)置中選擇 GPU 作為硬件加速器。

為了加速訓(xùn)練過程,我們需要在 GPU 上運行并行處理。為此,我們安裝了 NVIDIA 9.2 CUDA 庫:

Python:

!wget https://developer.nvidia.com/compute/cuda/9.2/Prod/local_installers/cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64 -O cuda-repo-ubuntu1604–9–2-local_9.2.88–1_amd64.deb!dpkg -i cuda-repo-ubuntu1604–9–2-local_9.2.88–1_amd64.deb!apt-key add /var/cuda-repo-9–2-local/7fa2af80.pub!apt-get update!apt-get install cuda-9.2

要檢查是否安裝了正確的 CUDA 編譯器,請運行: !nvcc --version

安裝 spacy 庫和 spacy 轉(zhuǎn)換器管道:

Python:

pip install -U spacy
!python -m spacy download en_core_web_trf

接下來,我們安裝為 CUDA 9.2 配置的 PyTorch 機(jī)器學(xué)習(xí)庫:

Python:

pip install torch==1.7.1+cu92 torchvision==0.8.2+cu92 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html

安裝 PyTorch 后,我們需要安裝針對 CUDA 9.2 調(diào)整的 spaCy 轉(zhuǎn)換器并更改CUDA_PATH和LD_LIBRARY_PATH如下。最后,安裝 CuPy 庫,它相當(dāng)于 NumPy 庫,但適用于 GPU:

Python:

!pip install -U spacy[cuda92,transformers]
!export CUDA_PATH=”/usr/local/cuda-9.2"
!export LD_LIBRARY_PATH=$CUDA_PATH/lib64:$LD_LIBRARY_PATH
!pip install cupy

SpaCy v3.0 使用config.cfg包含所有模型訓(xùn)練組件的配置文件來訓(xùn)練模型。在spaCy 訓(xùn)練頁面,您可以選擇模型語言(本教程中為英文)、組件(NER)和硬件(GPU)使用并下載配置文件模板。

我們唯一需要做的就是填寫 train 和 dev.spacy文件的路徑。完成后,我們將文件上傳到 Google Colab。

現(xiàn)在我們需要使用 BERT 模型所需的其余參數(shù)自動填充配置文件;你所要做的就是運行這個命令:

Python:

!python -m spacy init fill-config drive/MyDrive/config.cfg drive/MyDrive/config_spacy.cfg

如果出現(xiàn)錯誤,我建議調(diào)試您的配置文件:

Python:

!python -m spacy debug data drive/MyDrive/config.cfg

我們終于準(zhǔn)備好訓(xùn)練 BERT 模型了!只需運行此命令即可開始訓(xùn)練:

Python:

!python -m spacy train -g 0 drive/MyDrive/config.cfg — output ./

注意:如果出現(xiàn)錯誤,cupy_backends.cuda.api.driver.CUDADriverError: CUDA_ERROR_INVALID_PTX:則表示 PTX JIT 編譯失敗。只需卸載cupy并重新安裝它,它應(yīng)該可以解決問題。

如果一切順利,您應(yīng)該開始看到模型得分和損失正在更新。

在訓(xùn)練結(jié)束時,模型將保存在文件夾下model-best。模型分?jǐn)?shù)位于meta.json文件model-best夾內(nèi)的文件中:

Python:

“performance”:{“ents_per_type”:{“DIPLOMA”:{“p”:0.5584415584,“r”:0.6417910448,“f”:0.5972222222},“SKILLS”:{“p”:0.6796805679,“r”:0.6742957746,“f”:0.6769774635},“DIPLOMA_MAJOR”:{“p”:0.8666666667,“r”:0.7844827586,“f”:0.8235294118},“EXPERIENCE”:{“p”:0.4831460674,“r”:0.3233082707,“f”:0.3873873874}},“ents_f”:0.661754386,“ents_p”:0.6745350501,“ents_r”:0.6494490358,“transformer_loss”:1408.9692438675,“ner_loss”:1269.1254348834}

由于訓(xùn)練數(shù)據(jù)集有限,這些分?jǐn)?shù)肯定遠(yuǎn)低于生產(chǎn)模型水平,但值得在示例工作描述中檢查其性能。

使用 Transformer 提取實體

要在示例文本上測試模型,我們需要加載模型并在我們的文本上運行它:

Python:

nlp = spacy.load(“./model-best”)
text = ['''Qualifications- A thorough understanding of C# and .NET Core- Knowledge of good database design and usage- An understanding of NoSQL principles- Excellent problem solving and critical thinking skills- Curious about new technologies- Experience building cloud hosted, scalable web services- Azure experience is a plusRequirements- Bachelor's degree in Computer Science or related field(Equivalent experience can substitute for earned educational qualifications)- Minimum 4 years experience with C# and .NET- Minimum 4 years overall experience in developing commercial software''']for doc in nlp.pipe(text, disable=["tagger", "parser"]):    print([(ent.text, ent.label_) for ent in doc.ents])

僅使用 120 個培訓(xùn)文檔就令人印象深刻!我們能夠正確提取大部分技能、文憑、文憑專業(yè)和經(jīng)驗。

隨著更多的訓(xùn)練數(shù)據(jù),模型肯定會進(jìn)一步改進(jìn)并產(chǎn)生更高的分?jǐn)?shù)。

結(jié)論

由于令人驚嘆的 spaCy v3.0 庫,我們只用幾行代碼就成功地訓(xùn)練了一個功能性的 NER 變換器模型。 


0 人點贊