App下載

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

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

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

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

BERT架構

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

微調變壓器需要具有并行處理功能的強大 GPU。為此,我們使用 Google Colab,因為它提供免費可用的帶有 GPU 的服務器。

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

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

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

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

  • 機器學習自動注釋
  • 字典、正則表達式和基于規(guī)則的自動注釋
  • 團隊協(xié)作共享注釋任務
  • 直接注釋導出為 IOB 格式

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

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

導出的注釋將如下所示:

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 轉換為 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

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

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

模型訓練

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

為了加速訓練過程,我們需要在 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 轉換器管道:

Python:

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

接下來,我們安裝為 CUDA 9.2 配置的 PyTorch 機器學習庫:

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 調整的 spaCy 轉換器并更改CUDA_PATH和LD_LIBRARY_PATH如下。最后,安裝 CuPy 庫,它相當于 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包含所有模型訓練組件的配置文件來訓練模型。在spaCy 訓練頁面,您可以選擇模型語言(本教程中為英文)、組件(NER)和硬件(GPU)使用并下載配置文件模板。

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

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

Python:

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

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

Python:

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

我們終于準備好訓練 BERT 模型了!只需運行此命令即可開始訓練:

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并重新安裝它,它應該可以解決問題。

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

在訓練結束時,模型將保存在文件夾下model-best。模型分數位于meta.json文件model-best夾內的文件中:

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}

由于訓練數據集有限,這些分數肯定遠低于生產模型水平,但值得在示例工作描述中檢查其性能。

使用 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 個培訓文檔就令人印象深刻!我們能夠正確提取大部分技能、文憑、文憑專業(yè)和經驗。

隨著更多的訓練數據,模型肯定會進一步改進并產生更高的分數。

結論

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


0 人點贊