大模型如火如荼的今天,不学点语言模型(LM)相关的技术实在是说不过去了。只不过由于过往项目用到LM较少,所以学习也主要停留在直面——动眼不动手的水平。Huggingface(HF)也是现在搞LM离不开的工具了。

出于项目需要,以及实践出真知的想法,在此记录一下第一次使用HF和微调ERNIE-gram的过程。

开始的开始

HF已经做的很好了。但是对于第一次上手实操LM的我来说,还是有点陌生的。上手时有几个问题是一直困扰我的:

  • HF上这么多模型,我该用哪一个?
  • 每个LM的主要作用是对文本进行Embedding,可我的任务是句子对相似性计算,这该怎么搞?
  • 我想在自己的数据上继续微调模型,该怎么做?

模型选择

简单描述一下我的任务:给定两个句子,判断两个句子的语义是否等价

从NLP的角度出发,这是一类STS(Semantic Textual Similarity)任务,本质是在比较两个文本的语义是否相似。通过检索,找到了一些相关的比赛,例如问题匹配的比赛和相关的模型,这里简单罗列一下:

通过以上资料,我大致确定了我要使用的模型——ERNIE-Gram[1]

如何使用选好的模型

首先,我找到了ERNIE-Gram的代码仓库[2]。代码里开源了模型的结构以及微调的代码,相对来说还是比较齐全的。但是有一个最不方便的地方——它是用飞浆写的(不是说飞浆不好,只是一直以来都用pytorch)。当然,很快我又找到了pytorch版的ERNIE-Gram,并且在HF找到了ERNIE-Gram模型。如果我知道怎么使用HF,那么或许我可以很快开始我的微调了,可惜没有如果。

那怎么使用HF上的模型,在自己的数据上进行微调呢?

找到了一篇比较合适的参考资料[3],其中介绍了如何在HF中调用ERNIE模型:

from transformers import BertTokenizer, ErnieModel
tokenizer = BertTokenizer.from_pretrained("nghuyong/ernie-1.0-base-zh")
model = ErnieModel.from_pretrained("nghuyong/ernie-1.0-base-zh")

根据这个,我发现通过HF使用某个模型的方法是从transformers库中导入对应的模型和工具即可。那么,我只需要找到对应的模型名和工具,然后以此作为基座,再添加一些可训练层就可以了?

分析dir(transformers)看看都有哪些和Ernie相关的类:

d = dir(transformers)
dd = [e for e in d if 'ernie' in e.lower()]
len(dd) # 26
print(dd)
# ====
['ERNIE_M_PRETRAINED_CONFIG_ARCHIVE_MAP', 'ERNIE_M_PRETRAINED_MODEL_ARCHIVE_LIST', 'ERNIE_PRETRAINED_CONFIG_ARCHIVE_MAP', 'ERNIE_PRETRAINED_MODEL_ARCHIVE_LIST', 'ErnieConfig', 'ErnieForCausalLM', 'ErnieForMaskedLM', 'ErnieForMultipleChoice', 'ErnieForNextSentencePrediction', 'ErnieForPreTraining', 'ErnieForQuestionAnswering', 'ErnieForSequenceClassification', 'ErnieForTokenClassification', 'ErnieMConfig', 'ErnieMForInformationExtraction', 'ErnieMForMultipleChoice', 'ErnieMForQuestionAnswering', 'ErnieMForSequenceClassification', 'ErnieMForTokenClassification', 'ErnieMModel', 'ErnieMPreTrainedModel', 'ErnieMTokenizer', 'ErnieModel', 'ErniePreTrainedModel', 'models.ernie', 'models.ernie_m']

为了更好了解每个类是干啥的,直接上transformers库来看各个类的介绍[4]。很快啊,我就发现ErnieForSequenceClassification很适合我的任务:

图中的GLUE(General Language Understanding Evaluation )[5]是一系列评测任务集合,显然,我的任务属于Similarity那一类。

很好,大致可以确定该怎么使用HF上的Ernie-Gram模型来完成我的任务了(可惜没有对应的示例)。

怎么微调

在实操之前,对于在预训练好的模型上进行微调,我的想法是:把预训练模型包起来,添加一个分类层,学习分类层的参数就可以了。

但是如果我选择了ErnieForSequenceClassification,通过源码可以发现该类其实是在ErnieModel的基础上添加了一个分类层,那我是否直接加载模型后,选择训练哪些参数就可以了呢?

其实,广义的来说,这等价于一个问题:在HuggingFace中如何微调模型?[6][7][8]

其实,微调和平常的模型训练没有太大区别,只不过需要加载预训练好的模型,以及利用现成的工具搭建训练流程,其中主要涉及到的就两点:模型的定义、训练流程的搭建。

模型定义

由于transformers中已经定义好了很多模型,如果某个完全符合要求,那就可以直接使用了。根据自己的需求,选择冻结和训练哪些参数就可以了。

但是有些时候只是用预训练的模型作为自己模型的一部分,这个时候就需要我们做一些额外的工作了——把预训练模型作为一块积木,搭建我们自己的模型。正如ErnieForSequenceClassification所做的一样。

训练流程

训练流程类似。可以重头自己搭建训练流程,或者使用transformes自带的Trainer接口。

这里直接参考HF的教程即可:Fine-tuning a model with the Trainer API自己搭建训练流程

参考


  1. ERNIE-Gram: Pre-Training with Explicitly N-Gram Masked Language Modeling for Natural Language Understanding, NAACL-HLT, 2021.

  2. ernie-gram.

  3. 试试在transformers中调用ERNIE.

  4. Hugging Face Ernie Doc``

  5. GLUE: A MULTI-TASK BENCHMARK AND ANALYSIS PLATFORM FOR NATURAL LANGUAGE UNDERSTANDING, ICLR, 2019.

  6. Hugging Face 的 Transformers 库快速入门(四):微调预训练模型.

  7. HuggingFace | 在HuggingFace中如何微调模型.

  8. FINE-TUNING A PRETRAINED MODEL.

Huggingface初上手即ERNIE-gram句子相似性实战的更多相关文章

  1. 利用Hugging Face中的模型进行句子相似性实践

      Hugging Face是什么?它作为一个GitHub史上增长最快的AI项目,创始人将它的成功归功于弥补了科学与生产之间的鸿沟.什么意思呢?因为现在很多AI研究者写了大量的论文和开源了大量的代码, ...

  2. 学习Keras:《Keras快速上手基于Python的深度学习实战》PDF代码+mobi

    有一定Python和TensorFlow基础的人看应该很容易,各领域的应用,但比较广泛,不深刻,讲硬件的部分可以作为入门人的参考. <Keras快速上手基于Python的深度学习实战>系统 ...

  3. 力扣每日一题2023.1.16---1813. 句子相似性 III

    一个句子是由一些单词与它们之间的单个空格组成,且句子的开头和结尾没有多余空格.比方说,"Hello World" ,"HELLO" ,"hello w ...

  4. Android 5.0 Lollipop初上手体验

    在等了好几天还没有等到OTA升级提示,前天笔者给Nexus4线刷入了官方提供的Lollipop的镜像,在试用了这两天之后,现在总结下自己感觉很惊艳的地方和一些地方的吐槽.(点击图片可以查看大图) 1. ...

  5. xss挖掘初上手

    本文主要总结了xss可能出现的场景.偏向于案例,最后分享一哈简单的绕过和比较好用的标签. 1.搜索框 首先看能否闭合前面的标签. 如输入111”><svg/onload=alert(1)& ...

  6. TensorFlow.org教程笔记(一)Tensorflow初上手

    本文同时也发布在自建博客地址. 本文翻译自www.tensorflow.org的英文教程. 本文档介绍了TensorFlow编程环境,并向您展示了如何使用Tensorflow解决鸢尾花分类问题. 先决 ...

  7. centos7初上手3-安装apache服务

    前两篇学习安装了mysql服务器,tomcat服务,这篇文章学习安装apache服务 1.执行yum install httpd,安装完成后查看httpd rpm -qa|grep httpd 2.新 ...

  8. centos7初上手2-安装tomcat服务

    上一篇文章说完安装mysql数据库,这篇文章来学习一下tomcat安装 1.先做准备工作,安装jdk,先看服务器上有没有安装相关java文件 下载好1.8版本的安装包,用xftp传到服务器上(根据个人 ...

  9. centos7初上手1-安装mysql数据库

    随着云服务器的普及,购入云服务器的门槛越来越低,对一个程序员来说,很多人会购买一款云服务器.以前买过两年windows服务器(没有什么实际用途,就是为了玩),最近有机会接触一下linux服务器,选择了 ...

  10. Linux初上手!

    虚拟机Virtual Box装的Kali Linux,是Debian的发行版本,安装过程不说了,不是硬盘安装也没什么说的,由于是新手所以只有两个分区,一个[/]和一个[swap] 装好之后是xwind ...

随机推荐

  1. Vue3中readonly 和 shallowReadonly和toRaw

    1.readonly 深度只读 被readonly包裹的数据只能够读取. 是一个深度只读,不能够修改. 我们看一下面的代码. 我们想修改值,但是修改后视图无响应. 并且控制台警告目标为只读 reado ...

  2. 解决VS选择运行“在证书存储区中找不到清单签名证书”

     转:https://www.cnblogs.com/190196539/archive/2011/12/03/2272861.html 解决"在证书存储区中找不到清单签名证书" ...

  3. [vue] 脚手架笔记

    笔记 脚手架文件结构 ├── node_modules ├── public │ ├── favicon.ico: 页签图标 │ └── index.html: 主页面 ├── src │ ├── a ...

  4. workman在线五子棋

    一.下载安装workman,地址:https://github.com/walkor/workerman composer require workerman/workerman 二.cd到worke ...

  5. 痞子衡嵌入式:我入选了2023年度与非网(eefocus)最佳创作者Top15

    最近收到了「与非网」发来的 2023 年度最佳创作者 证书,证书做得一如既往地有质感,这是与非网第二次给痞子衡发证书了,足见与非网对痞子衡的认可. 与非网自 2021 年起,每年都会评选一次年度创作者 ...

  6. Vulkan学习苦旅01:最初的相遇(学习路线、参考资料与环境配置)

    提示:博主本人也在努力学习Vulkan中,文中可能有写错的地方,敬请大家批评指正. 这个世界只有两种人:会Vulkan的和不会Vulkan的,大概不存在"只会一点"的中间状态.学习 ...

  7. JDK + Tomcat 安装 + 制作自定义镜像【第 2.1 篇 Tomcat 日志满问题】

    更好的方法,跨平台(不依赖平台,比如阿里云的后台)的方法是:spring boot 定时任务,直接在程序里写定时清除日志的任务:以后再说: ============================== ...

  8. crontab 里如何创建带日期的日志文件

    需求在crontab 执行定时任务时,将执行的任务输出到带日期的文件中 crontab中,执行脚本需要传入系统时间date +"%Y-%m-%d" 问题今天遇到一个crontab问 ...

  9. 如何做好一个基础的搜索功能?记一个因客户大数据量而导致的后发先至Bug

    壹 ❀ 引 上篇文章算是开了一个新系列,因为工作缘故,我基本每天都在跟各式各样的bug打交道.其实站在一个开发的角度,我想每个人应该都更喜欢创造新代码,创造新bug,而不是每天都泡在茫茫代码海洋中定位 ...

  10. NC24961 Hotel

    题目链接 题目 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and ...