自从Vaswani 等人发表开创性论文“ Attention Is All You Need ”以来,transformer 模型已经成为 NLP 技术中的最新技术。从 NER、文本分类、问答或文本生成等应用,这项惊人技术的应用是无限的。

更具体地说,BERT——代表来自变压器的双向编码器表示——以一种新颖的方式利用了变压器架构。例如,BERT 用一个随机屏蔽的词分析句子的两边来进行预测。除了预测被屏蔽的token之外,BERT还通过在第一个句子的开头添加一个分类token [CLS]来预测句子的顺序,并尝试通过添加一个separation token [SEP]来预测第二个句子是否在第一个句子之后两句话之间。

BERT架构

在本文章中,我将向您展示如何微调 BERT 模型以预测软件职位描述中的技能、文凭、文凭专业和经验等实体。 

微调变压器需要具有并行处理功能的强大 GPU。为此,我们使用 Google Colab,因为它提供免费可用的带有 GPU 的服务器。

在本教程中,我们将使用新发布的spaCy v3.0 库来微调我们的转换器。以下是有关如何在 spaCy v3.0 上微调 BERT 模型的分步指南。Github repo中提供了代码和必要的文件。

要使用 spaCy v3.0 微调 BERT,我们需要以 spaCy v3.0 JSON 格式(请参阅此处)提供训练和开发数据,然后将其转换为.spacy二进制文件。我们将提供包含在 TSV 文件中的 IOB 格式的数据,然后将其转换为 spaCy JSON 格式。

我只标记了 120 个职位描述,其中包含培训数据集的技能、文凭、文凭专业和经验等实体,以及开发数据集的大约 70 个职位描述。

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

  • 机器学习自动注释
  • 字典、正则表达式和基于规则的自动注释
  • 团队协作共享注释任务
  • 直接注释导出为 IOB 格式

使用 UBIAI 中的正则表达式功能,我预先注释了所有遵循“\d.*\+.*”模式的经验提及,例如“5 + 年的 C++ 经验”。然后我上传了一个包含所有软件语言的 CSV 字典并分配了实体技能。预注释可以节省大量时间,并将帮助您最大限度地减少手动注释。

有关 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使用此命令将训练和开发 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。

现在我们需要使用 BERT 模型所需的其余参数自动填充配置文件;你所要做的就是运行这个命令:

Python:

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

如果出现错误,我建议调试您的配置文件:

Python:

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

我们终于准备好训练 BERT 模型了!只需运行此命令即可开始训练:

Python:

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

注意:如果出现错误,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 个培训文档就令人印象深刻!我们能够正确提取大部分技能、文凭、文凭专业和经验。

随着更多的训练数据,模型肯定会进一步改进并产生更高的分数。

结论

由于令人惊叹的 spaCy v3.0 库,我们只用几行代码就成功地训练了一个功能性的 NER 变换器模型。