基于transformer一步一步训练一个多标签文本分类的BERT模型
Bert(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的预训练语言模型,由Google在2018年提出。Bert模型在自然语言处理领域取得了重大突破,被广泛应用于各种NLP任务,如文本分类、命名实体识别、问答系统等。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%免费】🆓
CSDN粉丝独家福利
这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】
读者福利: 👉👉CSDN大礼包:《最新AI大模型学习资源包》免费分享 👈👈
对于0基础小白入门:
如果你是零基础小白,想快速入门大模型是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。
👉1.大模型入门学习思维导图👈
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)
👉2.AGI大模型配套视频👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。
👉3.大模型实际应用报告合集👈
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)
👉4.大模型落地应用案例PPT👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(全套教程文末领取哈)
👉5.大模型经典学习电子书👈
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(全套教程文末领取哈)
👉6.大模型面试题&答案👈
截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(全套教程文末领取哈)
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习
CSDN粉丝独家福利
这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】
读者福利: 👉👉CSDN大礼包:《最新AI大模型学习资源包》免费分享 👈👈
更多推荐
所有评论(0)