Huggingface初上手即ERNIE-gram句子相似性实战

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

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

文章目录

    • 开始的开始
    • 模型选择
    • 如何使用选好的模型
    • 怎么微调
      • 模型定义
      • 训练流程
    • 参考

开始的开始

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

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

模型选择

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

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

  • 千言数据集:问题匹配鲁棒性。
  • 千言-问题匹配鲁棒性评测基线。
  • Quora Question Pairs。
  • ATEC学习赛:NLP之问题相似度计算。
  • 第三届魔镜杯大赛—— 语义相似度算法设计。
  • LCQMC通用领域问题匹配数据集。
  • [Chinese-BERT-wwm]。

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

如何使用选好的模型

首先,我找到了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很适合我的任务:

image-20240227181634595

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

image-20240227182050635

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

怎么微调

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

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

image-20240227184848206

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

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

模型定义

由于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. ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/266761.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s pv与pvc理解与实践

参考文章: https://blog.csdn.net/qq_41337034/article/details/117220475 一、 pv/pvc简述 Pv是指PersistentVolume,中文含义是持久化存储卷是对底层的共享存储的一种抽象,Pv由管理员进行配置和创建,只要包含存储能力&#xff…

Rocky Linux 安装部署 Zabbix 6.4

一、Zabbix的简介 Zabbix是一种开源的企业级监控解决方案,用于实时监测服务器、网络设备和应用程序的性能和可用性。它提供了强大的数据收集、处理和可视化功能,同时支持事件触发、报警通知和自动化任务等功能。Zabbix易于安装和配置,支持跨平…

论文阅读:2020GhostNet华为轻量化网络

创新:(1)对卷积进行改进(2)加残差连接 1、Ghost Module 1、利用1x1卷积获得输入特征的必要特征浓缩。利用1x1卷积对我们输入进来的特征图进行跨通道的特征提取,进行通道的压缩,获得一个特征浓…

C语言第三十三弹---动态内存管理(上)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 动态内存管理 1、为什么要有动态内存分配 2、malloc和free 2.1、malloc 2.2、free 3、calloc和realloc 3.1、calloc 3.2、realloc 4、常见的动态内存的错…

阿里云短信验证笔记

1.了解阿里云的权限操作 进入AccessKey管理 选择子用户 创建用户组和用户 先创建用户组,建好再进行权限分配 添加短信管理权限 创建用户 创建好后的id和密码在此处下载可以得到 2.开通阿里云短信服务 进行申请,配置短信模板 阿里云短信API文档 短信服务…

MySQL 逗号分隔查询--find_in_set()函数

业务场景: 在使用MySQL的时候,可能的某个字段存储的是一个英文逗号分割的字符串(这里我们不讨论表设计的合理性),如图所示: 我们在查询的时候需要匹配逗号分割中的某个字符串,该怎么查询呢&am…

地图可视化绘制 | R-ggplot2 NC地图文件可视化

在推出两期数据分享之后,获取数据的小伙伴们也知道,数据格式都是NetCDF(nc) 格式网格数据,虽然我在推文分享中说明使用Python、R或者GIS类软件都是可以进行 处理和可视化绘制的,但是,还是有小伙伴咨询使用编程软件Pyth…

浅谈mysql mvcc

目录 前言 mvcc 是如何工作的? 数据的更新 前言 mvcc 与一个事物的隔离级别有关,未提交读永远读的是当前值,串行化是通过加锁实现,这两种隔离级别都与mvcc 没有任何关系。只要一提到mvcc应该想到的是读提交以及可重复读&#…

Spring八股 常见面试题

什么是Spring Bean 简单来说,Bean 代指的就是那些被 IoC 容器所管理的对象。我们需要告诉 IoC 容器帮助我们管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。 将一个类声明为 Bean 的注解有哪些? Com…

【buuctf-gakki】

binwalk 查看图片,发现有 rar 文件,提取后如上图所示(flag.txt为已经解压后出来的)其中这个 rar 需要用 archpr爆破一下 打开后一个 flag.txt 一堆杂乱无章的字符,需要用到 python 脚本进行词频统计,我们…

Vue3 在SCSS中使用v-bind

template 先创建一个通用的页面结构 <template><div class"v-bubble-bg"></div> </template>js 在JS中先对需要用的数据进行定义&#xff1a; 可以是参数&#xff0c;也可以是data <script setup>const props defineProps({bgCol…

设计模式系列文章-7个创建型模式更新已完结

其实从2019年开始就有些一套关于设计模式的系列文章&#xff0c;但是因为种种原因一直搁置到现在。直到2024年才又恢复更新。 24年1月份上旬一直在弄博客站&#xff1a;https://jaune162.blog 的搭建 24年1月份下旬弄专题站&#xff1a;https://books.jaune162.blog 的搭建。…

本地写的Bash脚本,Linux端运行报错:/bin/bash^M: bad interpreter: No such file or directory

背景 在本地写了个Bash Shell脚本&#xff0c;但上传到Linux端后加完权限执行时报错&#xff1a; &#xff08;脚本名&#xff1a;script.sh&#xff09; -bash: ./script.sh: /bin/bash^M: bad interpreter: No such file or directory 分析 这个错误通常是由于脚本文件的行…

beets,一个有趣的 Python 音乐信息管理工具!

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 什么是Beet库&#xff1f; 安装Beet库 使用Beet库 Beet库的功能特性 1. 多种音乐格式支持 2. 自动标签识…

LNMP架构介绍及配置--部署Discuz社区论坛与wordpress博客

一、LNMP架构定义 1、LNMP定义 LNMP&#xff08;Linux Nginx Mysql Php&#xff09;是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写&#xff1b;Linux系统下NginxMySQLPHP这种网站服务器架构。 Linux是一类Unix计算机操作系统的统称&#xff0c;是目…

力扣2月最后三天的每日一题

力扣2月最后三天的每日一题 前言2867.统计树中的合法路径数目思路确定1e5中的质数统计每个点的连接情况开始对质数点进行处理完整代码 2673.使二叉树所有路径值相等的最小代价思路完整代码 2581.统计可能的树根数目思路建立连通关系将猜测数组变为哈希表&#xff0c;方便查询利…

利用 Python 抓取数据探索汽车市场趋势

一、引言 随着全球对环境保护意识的增强和技术的进步&#xff0c;新能源汽车作为一种环保、高效的交通工具&#xff0c;正逐渐受到人们的关注和青睐。在这个背景下&#xff0c;对汽车市场的数据进行分析和研究显得尤为重要。 本文将介绍如何利用 Python 编程语言&#xff0c;结…

STM32标准库——(14)I2C通信协议、MPU6050简介

1.I2C通信 I2C 通讯协议(Inter&#xff0d;Integrated Circuit)是由Phiilps公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c; 不需要USART、CAN等通讯协议的外部收发设备&#xff0c;现在被广泛地使用在系统内多个集成电路(IC)间…

BCN-活性酯,BCN-活性酯,可用于合成双环壬酮功能化聚乙二醇聚合物涂层

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;1516551-46-4&#xff0c;BCN-NHS&#xff0c; BCN-NHS 酯&#xff0c;BCN-活性酯&#xff0c;BCN-succinimidylester&#xff0c;丙烷环辛炔-活性酯&#xff0c;BCN-琥珀酰亚胺酯 一、基本信息 【产品简介】&#…

JetPack 5.1编译mish_cuda

1.查看jetpack版本:sudo jtop 自带的就有cuda11.4和cudnn8.X以及python3.8,我的cudnn就没有是后期自己安装的 2.安装torch PyTorch for Jetson - Announcements - NVIDIA Developer Forums 选择对应的cuda版本和torch版本,我下载的是:torch-2.1.0a0+41361538.nv23.06-cp…