yangzhipeng1108 / DeepSpeed-Chat-ChatGLM

43 stars 7 forks source link

chatglm和opt的tokenizer行为不一致 #5

Closed yuguo-Jack closed 1 year ago

yuguo-Jack commented 1 year ago

chatglm和opt的tokenizer行为不一致,opt的经过其tokenizer后如下所示: image chatglm tokenizer后如下: image 可以看出,两者的padding顺序是不同的,首先带来的问题就是chatglm的step2 reward model内计算时按原始的索引是对不齐anwser部分的rewards的,导致chosen和reject的reward的loss计算肯定是不对的。我想问下,你工程里这部分也没有改动,是怎么训起来的,你不需要把chatglm和opt的tokenizer行为对齐吗。或者说按deepspeed-chat的方式直接调用chatglm的tokenizer的输出(如上图)真的可行吗,attention_mask和sentence里感觉不太能对上。期望回复

EthenZhang commented 1 year ago

我是直接把整个chosen_reward和rejected_reward拿来相减计算loss的,可以train

yuguo-Jack commented 1 year ago

我想问下能训的代码是在哪,如果在step2中正常运行run_chatglm.sh,走不到你刚说的这部分代码里

EthenZhang commented 1 year ago

我没有用deepspeed chat的计算loss的代码(我自己会有divergence_ind=0的问题),没有对chosen_reward和rejected_reward进行截取,而是直接loss += -torch.log(torch.sigmoid(chosen_reward - rejected_reward)+10e-5).mean() 这样来计算的

yangzhipeng1108 commented 1 year ago

chosen_reward,rejected_reward来自于模型的输出,跟attention_mask无关,如果你觉得不合理,你可以在代码逆转chosen_reward,rejected_reward

yangzhipeng1108 commented 1 year ago

chatglm和opt的tokenizer行为不一致,opt的经过其tokenizer后如下所示: image chatglm tokenizer后如下: image 可以看出,两者的padding顺序是不同的,首先带来的问题就是chatglm的step2 reward model内计算时按原始的索引是对不齐anwser部分的rewards的,导致chosen和reject的reward的loss计算肯定是不对的。我想问下,你工程里这部分也没有改动,是怎么训起来的,你不需要把chatglm和opt的tokenizer行为对齐吗。或者说按deepspeed-chat的方式直接调用chatglm的tokenizer的输出(如上图)真的可行吗,attention_mask和sentence里感觉不太能对上。期望回复

reward model 代码已更新