英文

T5基础模型在SQUaD v1.1葡萄牙语问答(QA)上的微调

简介

t5-base-qa-squad-v1.1-portuguese 是一个在葡萄牙语上进行微调的问答(Question Answering)模型,它是在2022年1月27日在Google Colab上基于Neuralmind的 unicamp-dl/ptt5-base-portuguese-vocab 模型和SQUAD v1.1葡萄牙语数据集上进行微调的,使用了Test2Text-Generation目标。

由于T5基础模型和微调数据集都很小,模型在训练结束之前就出现了过拟合的现象。以下是验证数据集上的最终整体指标:

  • f1:79.3
  • exact_match:67.3983

阅读我们在SQUAD v1.1上微调的其他葡萄牙语问答模型:

博客文章

NLP nas empresas | Como eu treinei um modelo T5 em português na tarefa QA no Google Colab (2022年1月27日)

小部件和应用

您可以在本页面的小部件中测试此模型。

还可以使用 QA App | T5 base pt ,它允许使用在SQuAD v1.1 pt数据集上进行问答任务微调的T5基础模型。

在生产环境中使用该模型进行推理

# install pytorch: check https://pytorch.org/
# !pip install transformers 
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

# model & tokenizer
model_name = "pierreguillou/t5-base-qa-squad-v1.1-portuguese"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

# parameters
max_target_length=32
num_beams=1
early_stopping=True

input_text  = 'question: Quando foi descoberta a Covid-19? context: A pandemia de COVID-19, também conhecida como pandemia de coronavírus, é uma pandemia em curso de COVID-19, uma doença respiratória aguda causada pelo coronavírus da síndrome respiratória aguda grave 2 (SARS-CoV-2). A doença foi identificada pela primeira vez em Wuhan, na província de Hubei, República Popular da China, em 1 de dezembro de 2019, mas o primeiro caso foi reportado em 31 de dezembro do mesmo ano.'
label = '1 de dezembro de 2019'

inputs = tokenizer(input_text, return_tensors="pt")

outputs = model.generate(inputs["input_ids"],
                             max_length=max_target_length, 
                             num_beams=num_beams, 
                             early_stopping=early_stopping
                            )
pred = tokenizer.decode(outputs[0], skip_special_tokens=True, clean_up_tokenization_spaces=True)
             
print('true answer |', label)
print('pred        |', pred)

您也可以使用pipeline。然而,它似乎存在输入序列max_length的问题。

!pip install transformers
import transformers
from transformers import pipeline

# model
model_name = "pierreguillou/t5-base-qa-squad-v1.1-portuguese"

# parameters
max_target_length=32
num_beams=1
early_stopping=True
clean_up_tokenization_spaces=True

input_text  = 'question: Quando foi descoberta a Covid-19? context: A pandemia de COVID-19, também conhecida como pandemia de coronavírus, é uma pandemia em curso de COVID-19, uma doença respiratória aguda causada pelo coronavírus da síndrome respiratória aguda grave 2 (SARS-CoV-2). A doença foi identificada pela primeira vez em Wuhan, na província de Hubei, República Popular da China, em 1 de dezembro de 2019, mas o primeiro caso foi reportado em 31 de dezembro do mesmo ano.'
label = '1 de dezembro de 2019'
    
text2text = pipeline(
                    "text2text-generation",
                     model=model_name,
                     max_length=max_target_length, 
                     num_beams=num_beams, 
                     early_stopping=early_stopping,
                     clean_up_tokenization_spaces=clean_up_tokenization_spaces
                    )

pred = text2text(input_text)

print('true answer |', label)
print('pred        |', pred)

训练过程

笔记本

微调的笔记本( HuggingFace_Notebook_t5-base-portuguese-vocab_question_answering_QA_squad_v11_pt.ipynb )位于GitHub上。

超参数

# do training and evaluation
do_train = True
do_eval= True

# batch
batch_size = 4
gradient_accumulation_steps = 3
per_device_train_batch_size = batch_size
per_device_eval_batch_size = per_device_train_batch_size*16

# LR, wd, epochs
learning_rate = 1e-4
weight_decay = 0.01
num_train_epochs = 10
fp16 = True

# logs
logging_strategy = "steps"
logging_first_step = True 
logging_steps = 3000     # if logging_strategy = "steps"
eval_steps = logging_steps 

# checkpoints
evaluation_strategy = logging_strategy
save_strategy = logging_strategy
save_steps = logging_steps
save_total_limit = 3

# best model
load_best_model_at_end = True
metric_for_best_model = "f1" #"loss"
if metric_for_best_model == "loss":
  greater_is_better = False
else:
  greater_is_better = True  

# evaluation
num_beams = 1

训练结果

Num examples = 87510
Num Epochs = 10
Instantaneous batch size per device = 4
Total train batch size (w. parallel, distributed & accumulation) = 12
Gradient Accumulation steps = 3
Total optimization steps = 72920
 
Step 	Training Loss  Exact Match	F1
3000 	0.776100	     61.807001  	75.114517
6000 	0.545900	     65.260170  	77.468930
9000 	0.460500	     66.556291  	78.491938
12000	0.393400	     66.821192  	78.745397
15000	0.379800  	   66.603595  	78.815515
18000	0.298100  	   67.578051  	79.287899
21000	0.303100  	   66.991485  	78.979669
24000	0.251600  	   67.275307  	78.929923

27000	0.237500	     66.972564  	79.333612

30000	0.220500 	    66.915799  	79.236574
33000	0.182600	     67.029328  	78.964212
36000	0.190600 	    66.982025  	79.086125