huggingface NLP-微调一个预训练模型

微调一个预训练模型

1 预处理数据

1.1 处理数据

1.1.1 fine-tune

使用tokenizer后的token 进行训练

javascript 复制代码
batch = tokenizer(sequences, padding=True, truncation=True, return_tensors="pt")

# This is new
batch["labels"] = torch.tensor([1, 1])

optimizer = AdamW(model.parameters())
loss = model(**batch).loss
loss.backward()
optimizer.step()

1.2 从模型中心(Hub)加载数据集

1.2.1 数据集

DatasetDict对象,其中包含训练集、验证集和测试集

。每一个集合都包含几个列(sentence1, sentence2, label, and idx)以及一个代表行数的变量,即每个集合中的行的个数

下载数据集并缓存到 ~/.cache/huggingface/datasets. 回想一下第2章,您可以通过设置HF_HOME环境变量来自定义缓存的文件夹。

1.3 预处理数据集

1.3.1 预处理数据集,我们需要将文本转换为模型能够理解的数字

1.3.2 类型标记ID(token_type_ids)的作用就是告诉模型输入的哪一部分是第一句,哪一部分是第二句

1.3.3 不一定具有类型标记ID(token_type_ids

1.3.4 将数据保存为数据集,我们将使用Dataset.map()

调用map时使用了batch =True,这样函数就可以同时应用到数据集的多个元素上,而不是分别应用到每个元素上。这将使我们的预处理快许多

1.3.5 省略padding参数

在标记的时候将所有样本填充到最大长度的效率不高

一个更好的做法:在构建批处理时填充样本更好,因为这样我们只需要填充到该批处理中的最大长度,而不是整个数据集的最大长度。当输入长度变化很大时,这可以节省大量时间和处理能力!

1.3.6 将所有示例填充到最长元素的长度------我们称之为动态填充

为了解决句子长度统一的问题,我们必须定义一个collate函数,该函数会将每个batch句子填充到正确的长度

transformer库通过DataCollatorWithPadding为我们提供了这样一个函数

It's when you pad your inputs when the batch is created, to the maximum length of the sentences inside that batch.

1.3.7 数据集是以Apache Arrow文件存储在磁盘上

1.4 benefits

1.4.1 The results of the function are cached, so it won't take any time if we re-execute the code.

1.4.2 It can apply multiprocessing to go faster than applying the function on each element of the dataset.

1.4.3 It does not load the whole dataset into memory, saving the results as soon as one element is processed.

2 使用 Trainer API 微调模型(非并行批量模式)

2.1 TrainingArguments 类

2.1.1 它将包含 Trainer用于训练和评估的所有超参数

2.1.2 可以只调整部分默认参数进行微调

javascript 复制代码
training_args = TrainingArguments("test-trainer", evaluation_strategy="epoch")

2.2 Training

2.2.1 简单training

javascript 复制代码
trainer = Trainer(
    model,
    training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    data_collator=data_collator,
    tokenizer=tokenizer,
)
trainer.train()

2.3 评估

2.3.1 使用 Trainer.predict() 命令来使用我们的模型进行预测

predict() 的输出结果是具有三个字段的命名元组: predictions , label_ids , 和 metrics

metrics 字段将只包含传递的数据集的loss,以及一些运行时间(预测所需的总时间和平均时间)

要将我们的预测的可以与真正的标签进行比较,我们需要在第二个轴上取最大值的索引

javascript 复制代码
preds = np.argmax(predictions.predictions, axis=-1)
def compute_metrics(eval_preds):
    metric = evaluate.load("glue", "mrpc")
    logits, labels = eval_preds
    predictions = np.argmax(logits, axis=-1)
    return metric.compute(predictions=predictions, references=labels)

如何使用compute_metrics()函数定义一个新的 Trainer

2.4 AutoModelForSequenceClassification

2.4.1 when we used AutoModelForSequenceClassification with bert-base-uncased, we got warnings when instantiating the model. The pretrained head is not used for the sequence classification task, so it's discarded and a new head is instantiated(实例化) with random weights.

3 完整的训练,使用Accelerator和scheduler

3.1 训练前的数据准备

3.1.1 删除与模型不期望的值相对应的列(如sentence1和sentence2列)。

3.1.2 将列名label重命名为labels(因为模型期望参数是labels)。

3.1.3 设置数据集的格式,使其返回 PyTorch 张量而不是列表。

3.1.4 代码

javascript 复制代码
tokenized_datasets = tokenized_datasets.remove_columns(["sentence1", "sentence2", "idx"])
tokenized_datasets = tokenized_datasets.rename_column("label", "labels")
tokenized_datasets.set_format("torch")
tokenized_datasets["train"].column_names

3.2 data loader

3.2.1 from torch.utils.data import DataLoader

javascript 复制代码
train_dataloader = DataLoader(
    tokenized_datasets["train"], shuffle=True, batch_size=8, collate_fn=data_collator
)
eval_dataloader = DataLoader(
    tokenized_datasets["validation"], batch_size=8, collate_fn=data_collator
)

3.3 优化器和学习率调度器

3.3.1 optimizer = AdamW(model.parameters(), lr=5e-5)

javascript 复制代码
lr_scheduler = get_scheduler(
    "linear",
    optimizer=optimizer,
    num_warmup_steps=0,
    num_training_steps=num_training_steps,
)

3.4 训练循环

3.4.1

javascript 复制代码
num_epochs = 3
num_training_steps = num_epochs * len(train_dataloader)

3.5 使用accelerator

3.5.1

javascript 复制代码
train_dl, eval_dl, model, optimizer = accelerator.prepare(
    train_dataloader, eval_dataloader, model, optimizer
)

num_epochs = 3
num_training_steps = num_epochs * len(train_dl)

3.5.2 分布式

accelerate config

accelerate launch train.py

3.5.3 With 🤗Accelerate, your training loops will work for multiple GPUs and TPUs.

4 注意train只会对参数有调整

4.1 超参数(Hyperparameter),是机器学习算法中的调优参数,用于控制模型的学习过程和结构。 与模型参数(Model Parameter)不同,模型参数是在训练过程中通过数据学习得到的,而超参数是在训练之前由开发者或实践者直接设定的,并且在训练过程中保持不变。

4.2 需要自己设定,不是机器自己找出来的,称为超参数(hyperparameter)。

4.2.1 需要人工设置: 超参数的值不是通过训练过程自动学习得到的,而是需要训练者根据经验或实验来设定。

4.2.2 影响模型性能: 超参数的选择会直接影响模型的训练过程和最终性能。

4.2.3 需要优化: 为了获得更好的模型性能,通常需要对超参数进行优化,选择最优的超参数组合。

4.3 validated 数据集作用

4.3.1 验证集,用于挑选超参数的数据子集。

相关推荐
2401_890095611 分钟前
如何判断武汉人工智能应用软件开发是否适用?从部署步骤入手
人工智能·武汉自动意志科技有限公司·智钳claw·人工智能应用软件开发·企业ai智能体系统·企业数字化服务
东莞市奥普新音频技术有限公司4 分钟前
国产音频分析仪怎么选?从性能参数、测试软件到自动化能力
人工智能·科技·测试工具·自动化·音视频·音频
一只积极向上的小咸鱼13 分钟前
pytorch 与资源核算
人工智能·pytorch·python
皮皮虾❀13 分钟前
钉钉AI服务商+智能体高阶定制+DEAP旗舰版一体化实战:从“通用AI不满足”到“独享算力+自有模型接入的专属智能体
人工智能·钉钉
方芯半导体19 分钟前
EtherCAT 从站方案中 MAC、PHY 与 MII 的层级关系与实现解析
网络·人工智能·单片机·macos·ethercat
风途科技~19 分钟前
路面温度监测站:红外遥感测温不接触路面,免维护长期连续监测
大数据·人工智能
必须会一定会20 分钟前
AI 编程隐私保护清单:API Key、代码上传、Agent 权限与 Git 历史排查
人工智能·git·ai编程
OceanBase数据库官方博客25 分钟前
OceanBase:从核心系统现代化到AI 创新
人工智能·oceanbase
YHHLAI26 分钟前
从「跑分」到「干活」:Benchmark 与 GPT 5.6 的两种叙事
大数据·前端·人工智能·react.js·前端框架
Black_Rock_br26 分钟前
ARM服务器固件FVP仿真开发流程深度解析实战指南
arm开发·人工智能·嵌入式硬件·硬件工程