尧图精选

迁移学习怎么落地?Transformers 库微调实战

🕒 发布时间:2026/9/6 7:52:40 📁 来源:尧图网络
迁移学习怎么落地Transformers 库微调实战关键词迁移学习、Transfer Learning、Hugging Face Transformers、模型微调fine-tuning、预训练模型适读人群手里有几百到几万条标注数据、想训个分类/打标模型但嫌从头训太慢太难的 Python 工程师以及想搞清楚“预训练模型怎么为我所用”的人。本文概览迁移学习Transfer Learning的本质是“站在预训练模型的肩膀上”——不从头训直接复用它在海量数据上已经学到的语言特征。这篇用 Hugging Face Transformers 库把这件事跑通先用pipeline看预训练模型开箱即用的能力再用AutoModelForSequenceClassification做“换头”接着用Trainer微调最后闭环验证。全程以一段可运行代码为主线逐段拆解结尾给出最小可运行模板和常见改动点。目录一、从零训练为何行不通小数据集的困境二、迁移学习到底在“迁移”什么三、pipeline 三行就能用预训练模型四、AutoModel 怎么“换头”迁移学习的核心动作五、准备数据Tokenizer 与 Dataset六、Trainer 微调让预训练模型适配你的任务七、闭环验证加载微调后的模型再推理八、Feature Extraction 还是 Fine-tuning怎么选九、微调好的模型怎么进大模型管线十、迁移学习的边界这几种情况别硬上最小可运行模板与常见改动点一、从零训练为何行不通小数据集的困境你接了个工单分类的需求把用户反馈分成bug / 咨询 / 建议 / 投诉四类。手里只有 2000 条标注。如果从头训一个 Transformer随机初始化模型要从“什么是词、什么是句法”开始学而你只有 2000 条样本容易过拟合小数据喂给大模型记住的是样本而不是规律慢且不稳单卡训上半天准确率可能还不如拍脑袋规则。而迁移学习的思路是已经有人在几亿条文本上训好了一个语言模型它早就懂“词性、句法、语义”了。你只要把它学到的“语言能力”借过来套上你自己的分类头就行。这套思路在 CV 里同样成立ResNet 在 ImageNet 上预训练好后你换掉最后的全连接层就能做自己的图像分类卷积特征直接复用——NLP 和 CV 的迁移学习是同一个思想的两套实现。在大模型时代迁移学习不但没被取代反而更底层了今天所有“微调一个基座模型”的做法LoRA、指令微调、领域适配本质都是迁移学习只是头和训练方式更花。理解它是看懂后面整套微调技术的前提——这也是它值得单独写一篇的原因。若硬要从零训同一个工单分类器你得import torch.nn as nn手写nn.Module嵌入层 Transformer 编码器 线性头、自己选初始化、写反向传播、调学习率与 warmup——几十行样板代码、几小时试错。迁移学习把这些封装进from_pretrained你只声明num_labels4。省下的不是几行代码而是几亿条文本的训练和几十次试错。这里有个容易忽略的点从零训慢不只是慢在算力更慢在“要走完整个试错周期”——学习率怎么设、要不要 warmup、权重初始化用哪种、过拟合了加什么正则每一项都要你自己试。迁移学习把这些“通用经验”提前封装进预训练权重你剩下的旋钮只剩“学习率、轮数、批次”三四个试错成本骤降。图一从零训练 vs 迁移学习图一左边随机初始化 小数据 慢且易过拟合右边预训练 Backbone 复用 只训新头 快且稳小结迁移学习解决的核心矛盾是你的数据少但任务需要的“基础语言能力”别人已经训好了。下面看它到底迁移了什么。二、迁移学习到底在“迁移”什么一个预训练语言模型可以拆成两半Backbone特征提取器底层到中层学的是通用语言特征——词法、句法、语义角色。这部分和你具体任务无关是“通用资产”。Head任务头最后一层把特征映射到具体输出比如 SST-2 的正负向、ImageNet 的 1000 类。这部分是“任务专属”的。从数学看分类头就是一个线性变换y W·h bh是 Backbone 输出的句向量W、b是随机初始化的参数。训练时梯度从y反传到W、b再继续往 Backbone 传——但因为 Backbone 学习率小或干脆冻结它只被“轻轻推”主体特征不被破坏。理解这个W·hb就理解了为什么“换头 小学习率”能成立。为什么 Backbone 能直接复用因为预训练任务如 MLM 掩码语言建模、NLI 句子关系判断逼模型去理解“词怎么组成句、句怎么表达意”学到的特征是与具体下游任务解耦的通用语言结构。你做工单分类也好、做舆情分析也好底层要理解的“语言”是同一套——这正是迁移学习成立的前提。从早期的 Word2Vec只训静态词向量到 ELMo双向 LSTM 出上下文向量、再到 BERTTransformer MLM预训练模型从“给每个词一个向量”进化到“给每个上下文一个表示”可复用的特征越来越深迁移学习的效果也越来越好——今天用from_pretrained一把梭正是这条演进链的终点。反过来如果预训练语料和你的任务域差太远比如用代码预训练模型去做医疗文本分类复用收益就会打折这点后面边界一节会讲。迁移学习做的事就是复用 Backbone换掉 Head图二迁移学习的结构图二预训练 Backbone 冻结不动新 Head 随机初始化后单独训练梯度只更新 Head关键点新 Head 是随机初始化的预训练时根本不存在它所以必须训练。而 Backbone 已经很懂语言了通常冻结或小幅微调即可。小结“迁移”迁移的是 Backbone 的通用语言特征Head 是你自己的任务层必须重新训。这就是后面所有代码的底层逻辑。三、pipeline 三行就能用预训练模型先不急着微调用pipeline看一眼“预训练模型到底有多能打”——它甚至能在没见过你数据的情况下做零样本分类。开始前先装依赖pip install transformers datasets accelerate evaluate。fromtransformersimportpipeline# 零样本分类预训练 NLI 模型没见过“工单”却因为懂语言就能分clspipeline(zero-shot-classification,modelfacebook/bart-large-mnli)outcls(登录后页面一直转圈,candidate_labels[bug,咨询,建议])print(out[labels][0],out[scores][0])# → bug / 0.9x三行就跑通说明一件事预训练模型已经把“语言理解”这项基础能力训好了你看到的“开箱即用”就是上游迁移学习的结果。pipeline本身是把三件事包成了一步用对应AutoTokenizer分词 → 调AutoModel拿 logits → 用后处理把 logits 变成可读标签和分数。它省的是“样板代码”底层还是 Auto 那一套等你要把控每一步比如自定义截断、加特殊 token、改输出格式时就退回AutoTokenizerAutoModel手动写——下一节正是这么做的。首次运行会自动下载模型权重如bart-large-mnli约 1.6GB之后走~/.cache/huggingface本地缓存重复运行不重复下离线或内网环境提前用huggingface-cli download facebook/bart-large-mnli把权重拉进缓存即可避免训练时卡在网络。pipeline适合“快速验证”和“简单任务”。但你的工单有 4 类、有自己的标注分布零样本不一定准——零样本靠的是“语义匹配”类别边界模糊或你的标签体系很专业时准确率会掉。要真正适配你的数据得自己做“换头 微调”。小结pipeline是预训练能力的“快捷入口”零样本能救急但上限有限要适配自有数据下一步用AutoModel显式换头。四、AutoModel 怎么“换头”迁移学习的核心动作迁移学习的核心动作就一行——加载预训练 Backbone并指定你自己的类别数fromtransformersimportAutoModelForSequenceClassification,AutoTokenizer MODELdistilbert-base-uncasedtokenizerAutoTokenizer.from_pretrained(MODEL)# num_labels4我们的工单有 4 类。# 这一层分类头是随机初始化的“新头”预训练时不存在所以必须训练。modelAutoModelForSequenceClassification.from_pretrained(MODEL,num_labels4)AutoModelForSequenceClassification做的事很明确下载distilbert-base-uncased的预训练权重当 Backbone在它上面拼一个随机初始化的线性分类头输出维度 num_labelsBackbone 权重来自预训练Head 权重随机。顺带一提num_labels决定的是分类头的输出维度。二分类有两种常见写法设num_labels1配 BCE 损失或设num_labels2走 softmax——看你的评估习惯。如果一条工单能同时是“bug”和“投诉”多标签则要换BCEWithLogitsLoss、让 Head 输出 N 个独立 sigmoid但from_pretrained(num_labelsN)这一行写法不变。本文聚焦单标签多类多标签只是损失函数和输出层的小改动。这里的Auto前缀值得记住AutoModelForSequenceClassification只是 Auto 家族一员还有AutoModel拿隐藏状态、AutoModelForTokenClassification命名实体识别、AutoModelForQuestionAnswering抽取式问答等。同一个MODEL名换个不同的AutoModelForX就能适配不同任务——Backbone 复用、只换头这正是迁移学习被 API 化的体现你不必为每个任务重新理解模型结构框架替你接好头。常用基座怎么选快速验证用distilbert-base-uncased小、快要精度换bert-base-uncased英文更强用roberta-base中文用bert-base-chinese或hfl/chinese-roberta-wwm-ext长文本512 token看longformer/bigbird。关键点选模型只改MODEL这一个字符串换头、分词、训练代码全不变——又是“换头不换流程”的体现。建议先用小模型把整条链路跑通、确认标注和指标没问题再换大模型提上限避免一上来就和大模型搏显存、出问题还难定位。这就是为什么后面必须train()Head 是瞎的得靠你的数据把它训亮。而 Backbone 已经很懂语言通常是“顺手微调”而不是“从头学”。经验AutoTokenizer必须和AutoModel用同一个模型名——分词方式要和预训练时一致否则输入错位模型直接瞎。想先只训 Head、冻结 Backbone把上面那行之后补一句即可# model.base_model 就是预训练 Backbone锁死它梯度只更新分类头forpinmodel.base_model.parameters():p.requires_gradFalserequires_gradFalse告诉 PyTorch“这层参数不参与反向传播、不更新”——这就是迁移学习里“冻结”的实现方式。后续两阶段工作流的第一步就是靠它先跑通 baseline。注意AutoModelForSequenceClassification的base_model才是 Backbone分类头在model.classifier/model.score上别冻错了对象。from_pretrained背后干了三件事下载配置文件模型层数、隐藏维度等、下载权重文件、把它们缓存到本地~/.cache/huggingface下次不重复下。对应的save_pretrained(./ticket-bert)则把配置 权重 分词器一起写进目录所以第七节才能用pipeline(model./ticket-bert)直接加载——这两个方法是“下载”和“落地”的一对记住它俩就记住了迁移学习的输入输出边界。小结“换头” 指定num_labels让预训练 Backbone 接上你的任务层Head 随机、必须训这是迁移学习落地的总开关。requires_gradFalse则负责把 Backbone 冻住。五、准备数据Tokenizer 与 Dataset模型只吃数字张量文本得先分词。用datasets库把 CSV 工单变成模型能吃的格式fromdatasetsimportload_datasetfromtransformersimportDataCollatorWithPadding dsload_dataset(csv,data_files{train:tickets_train.csv,test:tickets_test.csv})deftokenize(batch):# truncation超长截断max_length 按你的文本长度定returntokenizer(batch[text],truncationTrue,max_length128)tokds.map(tokenize,batchedTrue,remove_columns[text])toktok.rename_column(label,labels)# Trainer 认 labels 这个列名collatorDataCollatorWithPadding(tokenizertokenizer)# 按 batch 动态补齐省显存几个容易踩的点truncationTrue必加不加快长文本会超模型最大长度直接报错。DataCollatorWithPadding而非写死padding它按每个 batch 里最长序列动态补齐比全量补到最大长度省显存。列名labelsTrainer默认读labels你的 CSV 若叫label要rename_column。你的tickets_train.csv长这样就行两列足够text,label 登录后页面一直转圈刷新也没用,bug 想问下上个月的账单怎么导出,咨询 建议加个深色模式晚上太刺眼,建议 付了钱会员没到账要求退款,投诉label用整数0/1/2/3最省事和num_labels4一一对应用文字标签也行Trainer会按出现顺序编码但整数更可控。切分比例上数据少就 8:2train:test数据过万可以 9:1 甚至 95:5——测试集只要能稳定反映准确率就行不必太大。max_length怎么定别拍脑袋填 128。先tok.filter(lambda x: len(x[text]) 128)看看你的文本长度分布若 95% 的句子都短于 128填 128 就够更长的截断不亏若大量样本超 256填 128 会砍掉关键信息、伤准确率。原则是“覆盖绝大多数样本的最小长度”——短则浪费、长则撑显存。tokenizer还会自动补[CLS]/[SEP]这类特殊 tokenBERT 靠它们判断句子边界你不用手动拼但要知道它们在长度要留 2 个位置的余量。类别不平衡若“投诉”只有几十条而其他类上千直接训模型会倒向多数类。补救在数据侧——采样上对少数类resample或用WeightedRandomSampler损失上给少数类更大的class_weight——评估时看 macro-F1 而非 accuracy。这不改变迁移学习本身是训练前的常规处理和换头、微调是正交的两件事。小结数据侧的固定动作分词 截断 改名labels 动态补齐外加按真实长度分布定max_length。准备好就能交给Trainer。六、Trainer 微调让预训练模型适配你的任务Trainer把训练循环前向、反向、优化、评估全包了你只要给模型、数据和配置fromtransformersimportTrainer,TrainingArguments argsTrainingArguments(output_dir./ticket-bert,per_device_train_batch_size16,num_train_epochs3,learning_rate2e-5,# 比从头训小 10~100 倍只微调不破坏预训练特征logging_steps20,evaluation_strategyepoch,)trainerTrainer(modelmodel,argsargs,train_datasettok[train],eval_datasettok[test],tokenizertokenizer,data_collatorcollator,)trainer.train()trainer.save_model(./ticket-bert)# 落地权重 分词器都存进目录learning_rate2e-5是点睛之笔微调要用比从头训小得多的学习率。原因在下一节讲。怎么判断训练在收敛、没过拟合盯evaluation_strategyepoch吐出的eval_loss它应当随轮数下降并趋平如果train_loss一路降但eval_loss开始回升就是过拟合信号——此时要么少训一轮num_train_epochs减 1要么加weight_decay如0.01或warmup_steps。别等train_loss贴到 0 才停那往往是背下了训练集。准确率不够高时先确认测试集标签没标错再考虑换更大的基座distilbert → bert-base或解冻更多层微调而不是盲目加轮数。其他常用旋钮按需加进TrainingArgumentswarmup_steps100训练前若干步学习率从 0 线性升到目标值避免开头大梯度把预训练特征冲坏和“小学习率”是同一个保护思路。weight_decay0.01L2 正则抑制过拟合微调时基本必开。fp16True/bf16True半精度训练显存砍半、速度翻倍有支持的训练卡建议开。gradient_accumulation_steps2等效把批次翻倍但显存不涨小显存跑大批次的常用技巧。load_best_model_at_endTruemetric_for_best_modeleval_loss每轮评估后自动保留最优权重省得你自己挑 epoch。这些旋钮都不改变“迁移学习”的本质只是让微调更稳更快——先跑通上面的最小配置再按显存和效果逐个加。小结Trainer一句话启动微调save_model把权重落盘。真正要调的只有学习率、轮数、批次这几个旋钮判断好坏看eval_loss曲线其余旋钮按需叠加。七、闭环验证加载微调后的模型再推理微调完直接拿保存的目录当模型用验证它真的学会了你的工单fromtransformersimportpipeline# 直接喂目录pipeline 会自动读里面的权重 分词器clspipeline(text-classification,model./ticket-bert)print(cls(支付接口超时用户投诉))# → 投诉 / 0.97这一步把“迁移学习”闭环了预训练 Backbone通用语言力 你的 Head工单 4 类 一个专属分类器。从pipeline初体验到Trainer微调再到这里推理主线就是这一条代码链。两个落地时的坑顺手提醒其一如果你不用pipeline、而是直接model(**inputs)拿 logits推理前务必model.eval()——否则 Dropout/BatchNorm 处在训练态同一条文本多次跑结果会飘。其二训好的模型想分享或版本管理用trainer.push_to_hub(你的名/工单模型)一键推到 Hugging Face Hub比手动传文件省心团队协同时尤其有用。其三批量推理用tokenizer(texts, return_tensorspt, paddingTrue, truncationTrue)一次喂多条比逐条循环快一个数量级paddingTrue让不等长样本对齐到 batch 内最长和训练时的DataCollatorWithPadding是同一个补齐思路只是推理时你手动指定。怎么定量确认它真学会了别只看一条样例“看起来对”用evaluate在测试集上算准确率才靠谱importevaluate accevaluate.load(accuracy)defcompute_metrics(eval_pred):logits,labelseval_pred predslogits.argmax(-1)# 取分数最高的类别returnacc.compute(predictionspreds,referenceslabels)# 把 compute_metrics 传给 Trainer(...) 每轮 eval 会打印 accuracy类别不平衡时把accuracy换成f1宏平均否则多数类会掩盖少数类的差。这个指标就是你判断“要不要解冻微调、学习率调多少”的客观依据——靠它而不是靠感觉调参。小结能用自己的目录跑出正确类别说明迁移学习落地成功。直接调model推理记得先model.eval()要分享就push_to_hub微调出的目录下游用pipeline(text-classification, model...)即可零改动接入业务方不必感知背后是 DistilBERT 还是 BERT。用compute_metrics在测试集上量化效果才稳。下面看你该用哪种微调策略。八、Feature Extraction 还是 Fine-tuning怎么选迁移学习落地有两种力度区别在“Backbone 冻不冻”图三Feature Extraction vs Fine-tuning图三左 冻结 Backbone 只训 Head右 解冻部分层一起训学习率更小维度Feature Extraction冻结Fine-tuning微调做法冻结 Backbone只训 Head解冻部分/全部层小学习率一起训适配数据量很小 1k中大1k100k可训练参数约 0.5%全部学习率较大Head 随机初始化小1e-5 ~ 1e-4风险上限受 Backbone 限制学习率太大 → 灾难性遗忘为什么微调要用更小的学习率预训练权重已经是“好特征”如果学习率太大几步就把它们冲坏模型得重新学语言——这叫灾难性遗忘Catastrophic Forgetting。小学习率让 Backbone 只做“小幅适配”不破坏已有知识。经验法则数据极少先冻结 Head 跑通数据够再解冻 Backbone 微调学习率从2e-5起调看eval_loss增减。有公开实测可参考在 Oxford Flowers 102小数据图像分类上冻结 Backbone 的“特征提取”达到 85.7%解冻微调达到 92.5%——那 7 个点的差距正来自 Backbone 是否被允许适配你的特定域。NLP 上同理同域数据微调通常比纯冻结 Head 高几个点差距大小取决于你的数据和预训练域的贴近程度。到了大模型时代这种“解冻部分层微调”被发扬成 LoRA、QLoRA 等参数高效微调PEFT不改预训练权重只训一小撮低秩适配矩阵显存从“全量微调”降到几分之一——思想和本文“冻结 Backbone、只训一小块”一脉相承只是适配的“小块”更巧、更省卡。理解迁移学习就是理解这套 PEFT 技术的地基。推荐的两阶段工作流绝大多数场景够用阶段一·冻结跑通先for p in model.base_model.parameters(): p.requires_grad False把 Backbone 锁死只训 Head1~2 个 epoch。这一步几分钟就能出 baseline用来验证“数据标注、分词、标签映射”这条链路本身对不对。阶段二·解冻微调baseline 达标后放开 Backbone或只放最后几层学习率降到2e-5甚至1e-5再训 2~3 个 epoch。此时在 baseline 之上小幅提升且因为学习率小不会把预训练特征冲坏。两阶段分开做的好处第一阶段能快速暴露数据/代码问题避免你花半小时微调完才发现标签列名写错。小结选哪种看数据量少 → 冻结 Head多 → 解冻微调。微调记住“小学习率防遗忘”并用两阶段工作流先验证链路再提精度。九、微调好的模型怎么进大模型管线迁移学习不是“被大模型取代”而是大模型管线里的高性价比零件。四个具体落点场景 1意图路由——用微调小模型判断用户 query 意图决定进哪个 Agent / 工具routerpipeline(text-classification,model./ticket-bert)intentrouter(帮我查一下上月的账单)[0][label]# → 咨询# if intent 咨询: call_billing_agent(user_text)场景 2大模型兜底——高置信度小模型直答低置信度才进 LLM省 tokenoutrouter(这个报错怎么解)[0]ifout[score]0.9:returnkb[out[label]]# 小模型直答毫秒级else:returnllm_chain(user_text)# 低置信度才进大模型实测上微调小模型推理 p99 常在 10ms 级而一次 LLM 调用动辄 1~2s——把 70% 的高频确定性问题拦在快路径整体吞吐和 API 成本都能降一个数量级这也是 RAG / Agent 系统普遍在 LLM 前加一层小模型过滤的原因。场景 3领域适配器——在通用基座上微调出“金融 / 医疗专用”分类头当大模型前置过滤器先粗分再交给对应专家模型。比如医疗问诊先分出“用药咨询 / 报告解读 / 挂号导诊”大模型只处理最复杂的“报告解读”其余走轻量流程整体时延和 API 成本都降一截。场景 4训练数据初标——用微调模型给 LLM 的 SFT 数据打初标人工只校不用从零标。几千条待标注语料小模型先标一遍、人工只改错的比纯人工从白纸开始快数倍标注成本降 60%且先有基线模型本身就能反哺数据质量检查标错的和模型拿不准的重合度最高。图四微调模型在大模型管线中的位置图四微调小模型卡在路由 / 兜底 / 初标等环节LLM 只处理它搞不定的复杂样本小结微调小模型是 LLM 管线的“快路径”把简单、高频、低置信度门槛内的活揽了复杂活留给大模型。十、迁移学习的边界这几种情况别硬上迁移学习不是万金油。三种场景下它收益有限甚至不如从头训预训练域和任务域差太远用代码语料预训练的模型去做古文分类Backbone 的通用语言特征几乎用不上。域差距大时优先选同域预训练模型中文任务用bert-base-chinese而非英文bert-base-uncased实在没有再考虑从头训或做领域继续预训练。你的数据其实够大如果干净标注有几十万条从零训一个中等模型往往上限更高——迁移学习的优势本就是“用小数据补短板”数据管够时这块板不存在。任务本质和预训练目标冲突预训练学的是“理解”如果你的任务是“生成长文”或“多模态对齐”单纯换头式迁移学习不够得上生成式微调指令微调 / LoRA那套不在本文换头范畴内。另有一个常见混淆迁移学习 ≠ 持续学习lifelong learning。迁移学习是“一次预训练、一次适配”就定格产物是个固定的工单模型持续学习则要求模型在不断来的新任务上一直学、还不忘记旧任务要专门对抗灾难性遗忘——而本文说的“小学习率防遗忘”恰恰是在单轮微调里避免把预训练特征冲坏和持续学习的“跨任务不忘”是两件事。实际落地新来一批标注直接重训或增量微调即可不必追求“一个模型永远学”那会引入持续学习的额外复杂度对小团队往往得不偿失。一句话判断小数据 同域 理解类任务 迁移学习最舒服的区间超出这个区间先想清楚该换模型、加数据还是换方法别无脑from_pretrained。最小可运行模板与常见改动点把前面五段拼成一条最小可运行链以工单 4 分类为例fromtransformersimport(pipeline,AutoTokenizer,AutoModelForSequenceClassification,Trainer,TrainingArguments)fromdatasetsimportload_datasetfromtransformersimportDataCollatorWithPadding MODELdistilbert-base-uncasedtokenizerAutoTokenizer.from_pretrained(MODEL)modelAutoModelForSequenceClassification.from_pretrained(MODEL,num_labels4)dsload_dataset(csv,data_files{train:tickets_train.csv,test:tickets_test.csv})tokds.map(lambdab:tokenizer(b[text],truncationTrue,max_length128),batchedTrue).rename_column(label,labels)collatorDataCollatorWithPadding(tokenizertokenizer)trainerTrainer(modelmodel,argsTrainingArguments(./ticket-bert,per_device_train_batch_size16,num_train_epochs3,learning_rate2e-5,evaluation_strategyepoch),train_datasettok[train],eval_datasettok[test],tokenizertokenizer,data_collatorcollator,)trainer.train();trainer.save_model(./ticket-bert)clspipeline(text-classification,model./ticket-bert)print(cls(登录后白屏))常见改动点换数据集CSV 改 JSON / 直接load_dataset(imdb)等内置集列名不同就改rename_column。换模型distilbert-base-uncased→bert-base-chinese中文、roberta-base英文更强换完num_labels不变。调学习率2e-5起eval_loss不降就降到1e-5震荡就加warmup_steps。加评估指标from evaluate import load; acc load(accuracy)在compute_metrics里算 F1类别不平衡时别只看准确率。多标签分类一条样本可属多类时损失换BCEWithLogitsLossHead 输出 N 个独立 sigmoidnum_labels不变评估用 micro/macro F1。多卡 / 大批次单卡显存不够就gradient_accumulation_stepsfp16顶上或accelerate launch多卡起训TrainingArguments不用大改。中文场景用bert-base-chinese或hfl/chinese-roberta-wwm-ext分词器和模型名保持一致。#迁移学习 #HuggingFace #Transformers #模型微调 #预训练模型
上一篇/下一篇内容由系统自动关联 返回资讯列表 →