基于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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值