【LLM】大模型SFT技术总结(数据|训练|评估)

note

一、背景篇

作者: ybq,nlp码农,中国科学院大学 信号与信息处理硕士
原文: https://zhuanlan.zhihu.com/p/809229182

1. Special Token

pretrain 阶段完全没见过的 token,在sft 阶段会被赋予全新的语义。主要用于标注对话的角色:user、assistant、system 这些。

此外,special_token 可以用来“构造知识”,比如"喜欢"这种知识一定是 sft 阶段才会见到的,可以剔除掉 pretrain 先验知识的影响,用来验证 sft 的训练情况,比如会不会过拟合。

我默认大家都知道怎么用 special_token 去拼 prompt,如果不熟悉,看下 tokenizer_config.json 里的"chat_template"这个字段也就懂了。

比如GLM4的tokenizer_config.json文件的相关token如下:

  "added_tokens_decoder": {
   
   
   
### Sparse Fine-Tuning (SFT) 微调过程及实现方法 #### 什么是Sparse Fine-Tuning? Sparse Fine-Tuning(简称SFT)是一种针对特定任务优化深度学习模型的技术。其核心理念是在大规模预训练的基础上,仅对部分参数进行调整或更新,从而减少计算开销和内存占用的同时保持较高的性能表现[^2]。 #### SFT微调过程 SFT微调通常分为以下几个方面: 1. **初始阶段:基于大规模语料的预训练** 预训练是指利用大量无标注的数据集来初始化模型权重。这一阶段的目标是让模型能够捕捉到通用的语言模式或者特征表示。例如,在自然语言处理领域中,BERT 使用了大量的文本数据进行了预训练[^1]。 2. **稀疏化策略的选择** 在进入具体的微调之前,需要决定哪些层或参数会被保留用于后续的任务适配。这一步骤可以通过多种方式完成: - 手动指定某些重要层; - 自动检测最敏感的部分并通过剪枝技术移除冗余连接; - 应用梯度范数分析找出贡献最大的节点集合等。 3. **目标函数的设计** 设计适合当前应用场景的目标损失函数对于成功实施SFT至关重要。常见的做法包括但不限于交叉熵损失、均方误差以及自定义组合形式等等。这些指标会指导整个反向传播过程中如何有效地修正选定区域内的权值分布情况[^4]。 4. **迭代优化与评估** 利用小型专用数据集执行多次前馈-反馈循环操作直至达到预期效果为止 。在此期间还需不断监控验证集上的表现以防过拟合现象发生 . #### 实现方法示例 下面给出一段简单的Python代码片段展示了一个假设场景下的SFT流程: ```python import torch from transformers import BertModel, AdamW def sparse_fine_tune(model_name='bert-base-uncased', train_dataset=None, val_dataset=None): device = 'cuda' if torch.cuda.is_available() else 'cpu' # 加载预训练好的 BERT 模型 model = BertModel.from_pretrained(model_name).to(device) # 假设只允许最后两层 Transformer 层参与训练 for param in model.base_model.parameters(): param.requires_grad = False last_two_layers = list(model.encoder.layer)[-2:] for layer in last_two_layers: for parameter in layer.parameters(): parameter.requires_grad = True optimizer = AdamW(filter(lambda p: p.requires_grad, model.parameters()), lr=5e-5) criterion = torch.nn.CrossEntropyLoss() epochs = 3 best_accuracy = 0. for epoch in range(epochs): total_loss = 0. model.train() for batch in train_dataset: inputs, labels = map(lambda t:t.to(device),batch[:2]) outputs = model(**inputs)[0][:,0,:] # 取CLS token embedding作为句子表征 loss = criterion(outputs,labels.long()) total_loss +=loss.item() optimizer.zero_grad() loss.backward() optimizer.step() avg_train_loss =total_loss /len(train_loader ) accuracy = evaluate_on_validation_set(val_dataset,model ) print(f"Epoch {epoch}: Training Loss={avg_train_loss}, Validation Accuracy={accuracy}") if accuracy>best_accuracy : save_checkpoint({'state_dict':model.state_dict()},is_best=True,filename="sft_bert.pth.tar") return model if __name__=='__main__': dataset_setup(...) trained_sft_model=sparse_fine_tune(...) ``` 上述脚本展示了如何冻结大部分原始架构中的参数,并专注于修改最后一两个关键组件以适应新的分类需求^。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山顶夕景

小哥哥给我买个零食可好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值