SFT训练时,损失LOSS一直为0的问题解决方案

UserWarning: Could not find response key `[/INST]` in the following instance: [INST] ...


在微调模型的时候遇到该问题,log文件如下:
This instance will be ignored in loss calculation. Note, if this happens often, consider increasing the max_seq_length.
warnings.warn(/home/wanglinjie/anaconda3/envs/chatkbqa/lib/python3.9/site-packages/trl/trainer/utils.py:110: UserWarning: Could not find response key [/INST] in the following instance: [INST] << SYS>><< SYS>>

找到的解决方案:

  1. https://github.com/huggingface/trl/issues/980
  2. https://discuss.huggingface.co/t/zero-loss-while-finetuning-llama2-usin-sft-trainer-and-the-use-of-collator/63831

这两个都提出,将collator进行修改:
变成response_template = “Answer: [/INST]”
collator = DataCollatorForCompletionOnlyLM(tokenizer.encode(response_template, add_special_tokens = False)[2:], tokenizer=tokenizer)

原因:
在NLP任务尤其是生成式任务中,通常会有一个响应模板,用于标记模型的输出部分,这个模板用于知识模型生成的答案部分
分词器处理文本时,可能会根据文本上下文生成不同token ID,当文本中包含更多单词时,分词器可能产生不同token id,这导致在预处理数据时,响应模板中的token id与实际数据中的不匹配,从而导致模型无法正确识别响应部分

如果响应模板在数据中找不到,模型会忽略这些样本,因为它们无法正确计算损失值

解决:
确保在预处理数据时,响应模板的token id与实际数据中的token id一致。可通过以下步骤实现:

  1. 定义一个响应模板
  2. 创建数据整理器

add_special_tokens=False:
在编译文本时,分词器不会添加任何特殊标记。
把特殊标记禁止,就能解决该问题。

默认为True的话,就会在里面有一些< SEP>什么的,导致识别失败。

添加完这个,就没问题了,有loss了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值