DZone> AI专区 >如何用spaCy v3.0微调BERT变换器
如何用spaCy v3.0微调BERT变换器
关于如何在spaCy v3.0上对BERT进行微调以成功预测各种实体,如简历上的工作经验和教育程度的分步指南。
·
Aug. 09, 21 -AI Zone -教程
喜欢 (1)
评论
保存
Tweet
79次浏览
加入DZone社区,获得完整的会员体验。
自从Vaswani等人的开创性论文 "Attention Is All You Need"发表以来,转化器模型已经成为迄今为止NLP技术中最先进的技术。其应用范围包括NER、文本分类、问题回答或文本生成,这项神奇技术的应用是无限的。
更具体地说,BERT--代表来自变压器的双向编码器表示法--以一种新颖的方式利用了变压器架构。例如,BERT用一个随机屏蔽的单词分析句子的两边,以进行预测。除了预测被掩盖的标记外,BERT还通过在第一句的开头添加一个分类标记[CLS]来预测句子的顺序,并试图通过在两个句子之间添加一个分离标记[SEP]来预测第二句是否紧随第一句。
BERT架构
在本教程中,我将向你展示如何微调BERT模型来预测软件工作描述中的技能、文凭、文凭专业和经验等实体。
微调变换器需要一个强大的具有并行处理能力的GPU。为此,我们使用谷歌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注释工具,因为它具有广泛的功能,如。
- ML自动注解
- 词典、重词和基于规则的自动注释
- 团队协作,分享注释任务
- 直接将注释输出到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之后,我们需要使用这个命令将训练和开发的JSON文件转换为.spacy 二进制文件(用你自己的文件路径更新)。
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 文件的路径。完成后,我们将文件上传到谷歌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 。模型的分数位于model-best 文件夹内的meta.json 文件中。
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}
由于训练数据集有限,这些分数肯定远远低于生产模型的水平,但值得检查它在工作描述样本上的表现。
用变形器提取实体
为了在样本文本上测试该模型,我们需要加载该模型并在我们的文本上运行。
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])
下面是从我们的样本工作描述中提取的实体。
Python
[("C", "SKILLS"),("#", "SKILLS"),(".NET Core", "SKILLS"),("database design", "SKILLS"),("usage", "SKILLS"),("NoSQL", "SKILLS"),("problem solving", "SKILLS"),("critical thinking", "SKILLS"),("Azure", "SKILLS"),("Bachelor", "DIPLOMA"),("'s", "DIPLOMA"),("Computer Science", "DIPLOMA_MAJOR"),("4 years experience with C# and .NET\n-", "EXPERIENCE"),("4 years overall experience in developing commercial software\n\n", "EXPERIENCE")]
对于只使用120个训练文件来说,这是很了不起的我们能够正确地提取大部分的技能、文凭、文凭专业和经验。
如果有更多的训练数据,该模型肯定会进一步提高,并产生更高的分数。
结论
只用了几行代码,我们就成功地训练了一个功能性的NER转化器模型,这要感谢神奇的spaCy v3.0库。来吧,在你的用例中试试,并请分享你的结果。注意,你可以使用UBIAI注释工具来标记你的数据。
一如既往,如果你有任何意见,请在下面留言或发邮件到 admin@ubiai.tools!
主题。
nlp, transformers, bert transformers, 机器学习, spacy v3.0, nvidia cuda
经Walid Amamou授权发表于DZone。点击这里查看原文。
DZone贡献者所表达的观点属于他们自己。
DZone上的热门文章
评论