大模型微调定义模板 高级版—BYOT解析(108)
“高级版—BYOT”摘要
• 每个模板都必须定义一个响应模板,且理想情况下应以EOS标记(结束标记,End-of-Sequence Token)结尾。
• 仔细检查分词器(Tokenizer)的EOS标记、PAD标记(填充标记,Padding Token)和UNK标记(未识别标记,Unknown Token):
◦ EOS标记必须与PAD标记和UNK标记均不相同。
◦ PAD标记和UNK标记可以相同。
• 仅在绝对必要时(所有“空槽位”(empty slots)均已使用完毕)才调整嵌入层(Embedding Layer)大小:
◦ 调用模型的resize_token_embeddings()函数时,需使用pad_to_multiple_of参数,以确保嵌入层大小始终为2的幂的倍数。
• 若不想自行创建Jinja模板(一种常用模板引擎),可使用ChatML等默认模板。你可以使用trl包(Transformer Reinforcement Learning,Transformer强化学习工具包)及其setup_chat_format()函数,但该函数存在一些不足:
◦ 会将EOS标记分配给PAD标记(后续需手动修正此问题)。
◦ 默认会调整模型嵌入层大小,即便只是为了缩短嵌入层(不过可通过选择合适的resize_to_multiple_of参数避免调整)。
• 无需为分词器创建Jinja模板,可通过格式化函数(formatting function)定义并应用自定义模板:
◦ 若在SFTTrainer类(监督微调训练器,Supervised Fine-Tuning Trainer)中指定formatting_func(详见第5节,Ses