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

相关推荐
菜要多训练1 小时前
【自动驾驶】Ubuntu20.04安装ROS1 Noetic
人工智能·机器学习·自动驾驶
余生H2 小时前
Brain.js(十):GRUTimeStep 实战教程 - 股市指数预测以及与 LSTMTimeStep 对比
javascript·人工智能·深度学习·神经网络·webml·brain.js
小熊bdg2 小时前
3D 生成重建034-NerfDiff借助扩散模型直接生成nerf
人工智能·3d·aigc
aiblog2 小时前
能不能用一句话或者简洁地凝练深度学习的本质和精髓?
人工智能·深度学习·ai·deep learning
芜湖_2 小时前
从〇开始深度学习(番外)——混淆矩阵(Confusion Matrix)
人工智能·深度学习·混淆矩阵
小熊bdg2 小时前
3D 生成重建035-DiffRF直接生成nerf
人工智能·3d·aigc
Milk夜雨3 小时前
人工智能与大数据:从零开始学习的教学指南
大数据·人工智能·学习
AIBigModel4 小时前
专访李飞飞:从2D到3D,AI将为我们带来哪些改变?
人工智能·3d
我的龙呢4 小时前
Flash Attention
人工智能·flash attention