我们将使用Hugging Face提供的transformer大模型实现一个完整的训练过程
课程网址:https://huggingface.co/learn
一、数据
1、导包
from datasets import load_dataset
from transformers import AutoTokenizer, DataCollatorWithPadding
from torch.utils.data import DataLoader
from transformers import AutoModelForSequenceClassification, AdamW, get_scheduler
import torch
from tqdm.auto import tqdm # 进度条
import evaluate
(1)AutoTokenizer
功能:AutoTokenizer是一个自动化工具,能够根据给定的模型名称或路径,自动选择并加载适当的分词器(tokenizer)。这意味着你可以轻松使用 Hugging Face 预训练模型而无需手动指定具体的分词器类型。
主要用途:AutoTokenizer可以对文本进行分词、编码(将单词转换为对应的ID)、解码(将ID转换为文本)、填充(padding)和截断(truncation)等操作。它会根据模型的要求自动处理这些步骤。
(2)DataCollatorWithPadding
功能:DataCollatorWithPadding 是一个用于将不同长度的输入序列整理成批次的工具。它会在批处理时自动填充短于最大长度的序列,以确保所有序列在输入到模型时具有相同的长度。
主要用途:在自然语言处理任务中,文本的长度通常是不一致的。这个数据整理器可以将输入序列填充到相同的长度,从而使它们可以被批量处理,提高模型训练的效率。
(3)AutoModelForSequenceClassification、AdamW、get_scheduler
AutoModelForSequenceClassification:用于加载适合文本分类任务的预训练模型。它根据输入的模型名称或路径,自动选择和加载适合的模型架构
AdamW:用于模型训练的优化器,具备权重衰减的功能,常用于 NLP 任务。
get_scheduler:用于创建学习率调度器,动态调整优化器的学习率以优化模型训练过程。通常是在训练过程中逐步减小学习率以提高模型的收敛性
2、准备数据
raw_datasets = load_dataset("glue", "mrpc") # MRPC是一个用于评估文本重述paraphrase检测能力的数据集
checkpoint = "bert-base-uncased" # bert-base-uncased是BERT模型的基础版本,具有12层Transformer编码器,110M参数。
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
checkpoint使用BERT模型的基础版本,然后将其传入tokenizer标记器,从而把输入的句子转换成model能够理解的输入格式;MRPC(Microsoft Research Paraphrase Corpus)是用于判断句子对是否同义的任务。
3、数据预处理
(1) 定义分词函数
def tokenize_function(example):
return tokenizer(example["sentence1"], example["sentence2"], truncation=True)
tokenize_function接受的参数example通常是一个字典,truncation=True表示如果输入的句子长度超过模型允许的最大长度,分词器将截断句子。
下面是调用该函数的一个示例:
example = {
"sentence1": "I love you more than you know.",
"sentence2": "I think there are no limits but the sky."
}
调用tokenize_function函数会得到如下输出:
{'input_ids': [101, 1045, 2293, 2017, 2062, 2084, 2017, 2113, 1012, 102, 1045, 2228, 2045, 2024, 2053, 6537, 2021, 1996, 3712, 1012, 102],
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1