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

ops/2024/12/15 10:29:12/

微调一个预训练模型
在这里插入图片描述

1 预处理数据

1.1 处理数据
1.1.1 fine-tune
使用tokenizer后的token 进行训练

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 可以只调整部分默认参数进行微调

training_args = TrainingArguments("test-trainer", evaluation_strategy="epoch")

2.2 Training
2.2.1 简单training

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,以及一些运行时间(预测所需的总时间和平均时间)
要将我们的预测的可以与真正的标签进行比较,我们需要在第二个轴上取最大值的索引

preds = np.argmax(predictions.predictions, axis=-1)
def compute_metrics(eval_preds):metric = evaluate.load("glue", "mrpc")logits, labels = eval_predspredictions = 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 代码

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

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)

lr_scheduler = get_scheduler("linear",optimizer=optimizer,num_warmup_steps=0,num_training_steps=num_training_steps,
)

3.4 训练循环
3.4.1

num_epochs = 3
num_training_steps = num_epochs * len(train_dataloader)

3.5 使用accelerator
3.5.1

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 验证集,用于挑选超参数的数据子集。
4.3.2


http://www.ppmy.cn/ops/142067.html

相关文章

机器学习之交叉熵

交叉熵(Cross-Entropy)是机器学习中用于衡量预测分布与真实分布之间差异的一种损失函数,特别是在分类任务中非常常见。它源于信息论,反映了两个概率分布之间的距离。 交叉熵的数学定义 对于分类任务,假设我们有&#…

Scala测试

implicit class StrongString(str: String) {def isPhone: Boolean {val reg "1[3-9]\\d{9}".rreg.matches(str)}}def main(args: Array[String]): Unit {val str: String "18888488488"// 需求:给字符串补充一个功能isPhone,判…

【Python系列】异步 Web 服务器

???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

es的join是什么数据类型

在 Elasticsearch 中,parent 并不是一个独立的数据类型,而是与 join 数据类型一起使用的一个概念。join 数据类型用于在同一个索引中建立父子文档之间的关系,允许你在一个索引内表示层级结构或关联关系。通过 join 字段,你可以定义不同类型的文档(如父文档和子文档),并指…

【前端面试】随机、结构赋值、博弈题

解构赋值(Destructuring Assignment)是 JavaScript ES6 引入的一项非常有用的特性,它允许我们快速地从数组或对象中提取值,并将它们赋给变量。这种方式使得代码更加简洁、易读,并且能够减少重复的访问和赋值操作。 1.…

基于Spring Boot + Vue的摄影师分享交流社区的设计与实现

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…

Android-ImagesPickers 拍照崩溃优化

Android-ImagesPickers 作为老牌图片选择器,帮助了很多牛马宝宝,刚好最近用到了多相册选择以及拍照,可能是高版本机型问题,导致拍照后就闪退 原作者文章以及git Android实用视图动画及工具系列之九:漂亮的图片选择器…

配置mysqld(读取选项内容,基本配置),数据目录(配置的必要性,目录下的内容,具体文件介绍,修改配置)

目录 配置mysqld 读取选项内容 介绍 启动脚本 基本配置 内容 端口号 数据目录的路径 配置的必要性 配置路径 mysql数据目录 具体文件 修改配置时 权限问题 配置mysqld 读取选项内容 介绍 会从[mysqld] / [server] 节点中读取选项内容 优先读取[server] 虽然服务…