基于transformer一步一步训练一个多标签文本分类的BERT模型

NLP transformer网络下Bert模型的完整训练 阅读详情

Bert(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的预训练语言模型,由Google在2018年提出。Bert模型在自然语言处理领域取得了重大突破,被广泛应用于各种NLP任务,如文本分类、命名实体识别、问答系统等。

Bert模型的核心思想是通过大规模无监督预训练来学习通用的语言表示,然后再通过有监督微调来适应特定任务。与传统的语言模型不同,Bert模型采用了双向Transformer编码器,能够同时利用上下文信息,从而更好地理解句子中的词语。

在这里插入图片描述

BERT

Bert模型的预训练过程包括两个阶段:Masked Language Model(MLM)和Next Sentence Prediction(NSP)。在MLM阶段,Bert模型会随机遮盖输入句子中的一些词语,然后通过上下文信息预测这些被遮盖的词语。在NSP阶段,Bert模型会判断两个句子是否是连续的。

屏蔽语言建模 (MLM):取一个句子,模型随机屏蔽输入中 15% 的单词,然后通过模型运行训练,并预测屏蔽的单词。 这与传统的循环神经网络 (RNN) 不同,传统的循环神经网络通常会一个接一个的输入单词,也不同于 GPT 等自回归模型。

在这里插入图片描述

句子预测(NSP):模型在预训练期间连接屏蔽两个句子作为输入。数据有时2个句子是相邻的句子,有时则不是,模型需要进行训练,来判断2个句子的相关性。

在微调阶段,Bert模型可以通过简单地添加一个任务特定的输出层来适应不同的NLP任务。通过微调,Bert模型可以在各种任务上取得出色的性能,而无需针对每个任务进行独立的训练。本期我们就使用transformers来从头训练一个多标签的Bert模型。

在这里插入图片描述

这里使用的是hugging face的transformers库来进行Bert模型的训练,并加载了一个dataset,运行以上代码后,模型会自动下载相关的数据集,可以看到此数据集有6838行train训练数据,3259行test数据以及886行validation验证数据。

example = dataset['train'][0]
example

当然这里可以看一下整个数据的样式,打印一下这个数据集的数据,可以看到,每行数据有一个ID,一句话以及这句话的标签组成。我们就来训练此数据集,最终模型可以接受一个输入,并反馈此句话的标签。

labels = [label for label in dataset['train'].features.keys() if label not in ['ID', 'Tweet']]
id2label = {idx:label for idx, label in enumerate(labels)}
label2id = {label:idx for idx, label in enumerate(labels)}
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
def preprocess_data(examples):
  text = examples["Tweet"]
  encoding = tokenizer(text, padding="max_length", truncation=True, max_length=128)
  labels_batch = {k: examples[k] for k in examples.keys() if k in labels}
  labels_matrix = np.zeros((len(text), len(labels)))
  for idx, label in enumerate(labels):
    labels_matrix[:, idx] = labels_batch[label]
  encoding["labels"] = labels_matrix.tolist()
  return encoding

encoded_dataset = dataset.map(preprocess_data, batched=True, remove_columns=dataset['train'].column_names)

这里首先我们处理一下数据集,并获取数据集中的所有标签,并加载Bert预训练模型,这里使用preprocess_data函数来进行数据集的map操作。

Downloading (…)okenizer_config.json: 100% 28.0/28.0 [00:00<00:00, 1.62kB/s]
Downloading (…)lve/main/config.json: 100% 570/570 [00:00<00:00, 25.3kB/s]
Downloading (…)solve/main/vocab.txt: 100% 232k/232k [00:00<00:00, 8.78MB/s]
Downloading (…)/main/tokenizer.json: 100% 466k/466k [00:00<00:00, 5.48MB/s]
Map: 100% 6838/6838 [00:01<00:00, 7062.05 examples/s]
Map: 100% 3259/3259 [00:00<00:00, 6021.69 examples/s]
Map: 100% 886/886 [00:00<00:00, 5738.86 examples/s]

接下来,就可以定义一个transformer模型来训练Bert模型了。


[id2label[idx] for idx, label in enumerate(example['labels']) if label == 1.0]
encoded_dataset.set_format("torch")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased",  problem_type="multi_label_classification",  num_labels=len(labels),id2label=id2label, label2id=label2id)
batch_size = 8# 修改此参数进行训练
metric_name = "f1"
args = TrainingArguments( f"bert-finetuned-sem_eval-english",evaluation_strategy = "epoch",save_strategy = "epoch", learning_rate=2e-5,per_device_train_batch_size=batch_size,per_device_eval_batch_size=batch_size,num_train_epochs=5, weight_decay=0.01,load_best_model_at_end=True,metric_for_best_model=metric_name,)
def multi_label_metrics(predictions, labels, threshold=0.5):
    sigmoid = torch.nn.Sigmoid()
    probs = sigmoid(torch.Tensor(predictions))
    y_pred = np.zeros(probs.shape)
    y_pred[np.where(probs >= threshold)] = 1
    y_true = labels
    f1_micro_average = f1_score(y_true=y_true, y_pred=y_pred, average='micro')
    roc_auc = roc_auc_score(y_true, y_pred, average = 'micro')
    accuracy = accuracy_score(y_true, y_pred)
    metrics = {'f1': f1_micro_average, 'roc_auc': roc_auc, 'accuracy': accuracy}
    return metrics

def compute_metrics(p: EvalPrediction):
    preds = p.predictions[0] if isinstance(p.predictions, tuple) else p.predictions
    result = multi_label_metrics(predictions=preds, labels=p.label_ids)
    return result
trainer = Trainer(model,args,train_dataset=encoded_dataset["train"],eval_dataset=encoded_dataset["validation"],tokenizer=tokenizer,compute_metrics=compute_metrics)
trainer.train()

以上搭建了一个Bert的预训练模型,我们可以根据自己的数据集进行训练,运行以上代码,模型会自动加载相关数据集进行训练,训练完成后,我们就可以进行模型的使用了。

text = "I'm happy, the bert model is so good"
encoding = tokenizer(text, return_tensors="pt")
encoding = {k: v.to(trainer.model.device) for k,v in encoding.items()}
outputs = trainer.model(**encoding)
logits = outputs.logits
logits.shape
sigmoid = torch.nn.Sigmoid()
probs = sigmoid(logits.squeeze().cpu())
predictions = np.zeros(probs.shape)
predictions[np.where(probs >= 0.5)] = 1
predicted_labels = [id2label[idx] for idx, label in enumerate(predictions) if label == 1.0]
print(predicted_labels)
[ 'joy','love']

通过以上的代码,我们就使用了Bert模型的预训练模型训练了一个文本多标签分类任务模型,Bert模型当然也可以进行其他文本相关的任务,比如mask完形填空,预测下一个句子等等,这些模型的训练都可以基于Bert的预训练模型进行微调。而正是Bert模型无监督学习方式来进行模型的预训练,大大提高了模型的泛化能力,从而使transformer预训练成为了可能。

在这里插入图片描述

​

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

深度学习经典模型之BERT(上) BERT(Bidirectional Encoder Representations from Transformers)是一个双向transformer编码器的言表示模型。。由Google公司的研发,BERT的出现使得我们能够在一个大的数据集上面训练好一个比较深的神经网络,简化了NLP任务的训练,又提升了它的性能,使得自然语言处理有了质的飞跃。 阅读详情

相关推荐

文本分类模型_BERT模型实战之多文本分类

作者介绍高开远,漫威铁粉/吸猫重症患者,本科就读于哈尔滨工业大学,现为上海交通大学2017级硕士研究生,研究方向:知识图谱/chatbot,大鱼AI特约作者。01Transformer模型BERT模型就是以Transformer基础上训练出来的,所以在开始之前我们首先复习一下目前NLP领域可以说是最高效的‘变形金刚’Transformer。由于网上Transformer介绍解读文章满天飞...

weixin_39527372的博客 1544

【BERT-多标签文本分类实战】之七——训练-评估-测试与运行主程序

采样是指:把模型输出出来的概率,转化成独热数组,通常使用阈值为0.5的阈值函数,即概率大于0.5的标签采样为1,否则为0。也是把一组数据放缩到[0,1]区间,但它更类似于等比例缩放,原来大的数现在还大,可以有多个较大的概率存在,所以。它就是算单标签的损失的,大家去看一下它的公式,它对一个文本只取概率最大的那个标签;具有排斥性,放缩后的一组数据之和为1,所以这样一组标签概率只会有一个较大值;代码还是比较好懂的,但是还是有一个整体能运行起来的项目体验更佳。多标签文本分类任务,用的损失函数是。

十一月廿七风雨大作 1万+

Bert原理细节及训练理解

文章目录1. BERT的工作原理1.1 为什么需要BERT?1.2 BERT框架:预训练+微调1.3 模型细节2. 使用BERT进行文本分类2.1 预训练模型准备2.2 数据准备2.3 使用预训练的BERT模型进行训练2.4 使用BERT进行预测2.5 导出模型2.6 部署上线参考文档 1. BERT的工作原理   BertBertBert名称解读:Bidirectionalidirectiona...

headonenjoy的博客 3778

bert模型简介、transformers中bert模型源码阅读、分类任务实战和难点总结

1、bert模型简介和原理回顾 2、bert模型源码理解 3、bert模型任务实战 4、bert模型一些难点

HUSTHY的博客 1万+

BERT详解:bert文本分类怎么做的

BERT详解:bert文本分类怎么做的

4876

LIGGGHTS开源离散元仿真:从基础安装到高级应用实战

本文详细介绍了LIGGGHTS开源离散元仿真软件的基础安装、脚本编写及高级应用实战。从颗粒自由落体模拟到工业级复杂系统建模,涵盖CFD-DEM耦合、高性能计算优化等关键技术,帮助用户快速掌握这一强大的颗粒仿真工具。特别适合需要处理颗粒系统仿真的科研人员和工程师。

l1k9j8h7g6的博客 619

【BERT-多标签文本分类实战】之四——数据集预处理

可以看到,每个文本平均有1.2个标签,相对其他数据集来说,是极低的。:在使用预训练词向量的时候,首先会构建一个词典,然后把文本里面的每个单词逐个转化成词典里面对应的序号,最后根据序号再去预训练词向量里面找对应单词的d维向量,于是一条文本就变成了。除此之外,我们还应该关心数据集平均一个本文有几个标签、最多有几个标签、最少有几个标签,哪些标签出现的比较频繁,这些有助于我们加深对数据集、任务难点的了解。在处理数据集的文本数据前,有必要了解一下使用预处理词向量的模型,是如何处理文本数据的。的文本有3964个。

十一月廿七风雨大作 1万+

ArcMap实战:用栅格计算器搞定16年NDVI趋势分析,附完整F检验流程

本文详细介绍了如何使用ArcMap的栅格计算器进行16年NDVI趋势分析,包括数据预处理、线性趋势计算和F显著性检验的全流程操作。通过实际案例和统计原理解析,帮助GIS从业者掌握植被覆盖变化的分析方法,特别适合生态评估和农业监测应用。

weixin_29251567的博客 252

BERT模型实战之多文本分类(附源码)

写在前面 BERT模型也出来很久了,之前看了论文学习过它的大致模型(可以参考前些日子写的笔记NLP大杀器BERT模型解读),但是一直有杂七杂八的事拖着没有具体去实现过真实效果如何。今天就趁机来动手写一写实战,顺便复现一下之前的内容。这篇文章的内容还是以比较简单文本分类任务入手,数据集选取的是新浪新闻cnews,包括了[‘体育’, ‘财经’, ‘房产’, ‘家居’, ‘教育’, ‘科技’, ‘时尚’...

Kaiyuan_sjtu的博客 6万+

修改 Alist 密码时报错?看看这个坑怎么解决!

启动服务后,再修改密码”。以后再遇到类似问题,先检查服务是否正常运行,说不定就能少踩不少坑。如果还有其他 Alist 的问题,欢迎在评论区留言交流~

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1154

让 RAP 弹窗参数真正变成必填:Excel Upload Action 的两种实现路径

摘要 在RAP应用中,action弹窗参数经常缺乏必填校验,导致用户体验差。本文提出两种解决方案:1)在action实现中手动校验,简单但交互不流畅;2)通过root abstract entity和abstract BDEF建模,利用field(mandatory)实现框架级校验,推荐此长期方案。后者将约束集中到模型层,使UI与执行期校验一致,特别适合ABAP Cloud环境。以Excel导入为例,强制填写备注和明确选择试运行,可避免审计问题,提升系统可靠性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 198

BERT预训练模型

参考资料。

个人学术整理 6366

SI好文翻译:铜箔表面纹理对损耗的影响:一个有效的模型(一)

Paul G. Huray发表在DesignCon2010的提出铜箔表面雪球模型的论文。第一部分说明之前的铜箔表面模型只适用于5GHz以内,超过5GHz后就不再准确。

小孟同学的博客 2172

微调BERT模型实现文本分类

模型微调只是针对某种下游任务,针对性的强化模型的能力,但是微调之后的模型在泛化能力上有所下降。

大模型研究中心 4299

Python 实战:手语翻译系统——从视频到文本的智能转换

今天,我们用 Python 构建了一个。

Echo_Wish 344

PMP--工件

合同是指对双方都有约束力的协议,强制卖方提供规定的产品、服务或结果,以及强制买方支付相应的费用。它还可能包括处于中间状态的特性,例如已设计但尚未构建的特性、质量保证中的特性或测试中的特性。RACI 矩阵是一种常见的方法,用于显示执行、担责、咨询或知情,且与项目活动、决策和可交付物有关的干系人。计划是提议的实现某种目标的方式。在项目开始前或开始时创建的文件,涉及与项目有关的战略、商业或高层级的信息。或 © 它们是用特定方法创建的结果,例如,虽然成本估算结果是一个重要工件,它们是用不同估算方法得出的结果。

stqer的博客 1666

一文看懂Transformer到BERT模型

目录:ELMo与Transformer的简单回顾DAE与Masked Language ModelBERT模型详解BERT模型的不同训练方法如何把BERT模型应用在实际项目中如何对BER...

fengdu78的博客 8523

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

BERT,Transformer的模型架构与详解

BERT,Transformer的模型架构与详解 1.1 认识BERT 学习目标 了解什么是BERT. 掌握BERT的架构. 掌握BERT的预训练任务. 什么是BERT BERT是2018年10月由Google AI研究院提出的一种预训练模型. BERT的全称是Bidirectional Encoder Representation from Transformers. BERT在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩: 全部两个衡量指标上全面超越人类, 并且在11种不同..

码python的Vinsmoke 9746

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

基于BERT的文本分类——附-简单的示例代码

*BERT(Bidirectional Encoder Representations from Transformers)**是一种预训练的自然语言处理模型,由Google于2018年提出。BERT通过在大规模文本语料上进行预训练,学习了深层次的语言表示,然后可以通过微调用于各种下游任务,包括文本分类。文本分类是一个常见的自然语言处理任务,它涉及将文本分为不同的类别或标签。

技术宅学长的博客 4925

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

多标签文本分类研究进展概述

     基于标签语义注意力的多标签文本分类 一、研究背景 什么是多标签文本分类?    现实生活中很多对象是同时属于多个类别,具有多个标签。 传统的多标签文本分类与该论文的对比         传统的多标签文本分类算法将标签视为没有语义信息的符号,然 而,在许多情况下,文本的标签是具有特定语义的,标签的语义信息和文档的内容信息是有对应关系的

yueyue129a的博客 5897

Transformer+BERT 推特文本分类(是否抱怨)

文章目录1.基础设置2.下载/导入数据集2.1 下载数据集2.2 Load Train Data2.3 Load Test Data3. 设置GPU/CPU来训练4.Fine-tuning BERT4.1 对原始文本进行轻微的数据处理4.2 BERT Tokenizer 相关函数构建4.3 确定输入句子的固定长度4.4 tokenize data 正式对数据进行分词4.5 创建PyTorch DataLoader5.训练模型Train model5.1 创建 BertClassifier5.2 创建优化器和

weixin_42167712的博客 4780

【NLP】使用Transformer模型进行文本分类

作者 | Eric Fillion编译 | VK来源 | Towards Data Science文本分类是NLP最常见的应用。与大多数NLP应用一样,Transformer模型近年来在该...

fengdu78的博客 6508
上一篇: 聊聊基于BERT模型实现多标签分类任务的实践与思考
下一篇: 中国大模型落地应用案例集(2023)(医疗、教育、金融、科技、汽车、遥感等52个领域)
少喝冰美式
博客等级 码龄3年 6839粉丝 517原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值