2.2 基于输出层更新的微调与上述基于特征的方法相关的一种流行方法是微调输出层 。与基于特征的方法类似,保持预训练LLM的参数不变,只训练新添加的输出层,类似于在嵌入特征上训练逻辑回归分类器或小型多层感知器 。在代码中,将如下所示:
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased",num_labels=2)# freeze all layersfor param in model.parameters():param.requires_grad = False# then unfreeze the two last layers (output layers)for param in model.pre_classifier.parameters():param.requires_grad = Truefor param in model.classifier.parameters():param.requires_grad = True# f.NETune modellightning_model = CustomLightningModule(model)trainer = L.Trainer(max_epochs=3,...)trainer.fit(model=lightning_model,train_dataloaders=train_loader,val_dataloaders=val_loader)# evaluate modeltrainer.test(lightning_model, dataloaders=test_loader)
理论上,这种方法应该具有与基于特征的方法同样的良好建模性能和速度 。然而,由于基于特征的方法使预计算和存储嵌入特征更加容易,因此在特定的实际情况下,记忆特征的方法可能更加方便 。
2.3 面向所有层更新的微调尽管原始的BERT论文声称,仅微调输出层可以实现与微调所有层相当的建模性能,但后者涉及更多参数,因此成本更高 。例如,BERT基本模型约有1.1亿个参数 。然而,BERT基本模型用于二元分类的最后一层仅包含1,500个参数 。此外,BERT基本模型的最后两层占据60,000个参数,仅占总模型大小的约0.6% 。]
由于目标任务和目标领域与模型预训练的数据集相似程度的不同,几乎总是通过微调所有层来获得更优秀的模型性能 。因此,当优化模型性能时,使用预训练LLM的黄金标准是更新所有层 。从概念上讲,这种方法与输出层更新非常相似 。唯一的区别是不冻结预训练LLM的参数,而是对其进行微调 。
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased",num_labels=2)# don't freeze layers# for param in model.parameters():#param.requires_grad = False# finetune modellightning_model = LightningModel(model)trainer = L.Trainer(max_epochs=3,...)trainer.fit(model=lightning_model,train_dataloaders=train_loader,val_dataloaders=val_loader)# evaluate modeltrainer.test(lightning_model, dataloaders=test_loader)
多层微调通常会导致更好的性能,但代价也会增加,各种方法的计算和模型性能如下图所示 。
【解读大模型的微调】
文章插图
上面的情景突出了微调的三种极端情况:基于特征,仅训练最后一层或几层,或者训练所有层 。当然,根据模型和数据集的不同,在各种选项之间探索也可能是值得的 。
3. 参数高效微调参数高效微调允许我们在最小化计算和资源占用的同时重复使用预训练模型 。总的来说,参数高效微调至少有以下5个优点:
- 减少计算成本(需要更少的GPU和GPU时间);
- 更快的训练时间(更快地完成训练);
- 更低的硬件要求(可以使用更小的GPU和更少的存储器);
- 更好的模型性能(减少过拟合);
- 更少的存储空间(大部分权重可以在不同任务之间共享) 。
在huggingface提供的PEFT工具中,可以很方便地实现将普通的HF模型变成用于支持轻量级微调的模型,使用非常便捷,目前支持4种策略,分别是:
- LoRA
- Prefix Tuning
- P-Tuning
- Prompt Tuning
文章插图
那么这些技术是如何工作的呢?简而言之,它们都涉及引入少量的额外参数,而不是对所有层都进行修改 。从某种意义上讲,输出层微调也可以被视为一种参数高效的微调技术 。然而,像前缀微调、适配器和低秩适应等技术,它们“修改”多个层,以极低的成本实现更好的预测性能 。
推荐阅读
- 计算机网络和计算机通信网络之间的本质区别是什么?
- 曾经风靡一时的ghost系统,为什么销声匿迹了?
- 一文看懂显卡的显存容量/频率/位宽/带宽
- 戴上2万5的苹果头显,我只看到了库克的焦虑
- 编程的未来 - 还有未来么?
- 陈俊生|柳州蓝澜什么家底什么身份,素颜照判若两人,梁局的父母很着急
- 蜂王浆|蜂王浆的价格,它的价值和价格是否对等
- 苏芒|不可一世的苏芒,也走到了今天
- 求职|北大教授建议:暂时找不到工作的年轻人,可先结婚生子,你同意吗
- |不走寻常路!十种反常规的特色和田玉!