Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] 支持DPO-Positive (DPOP),DPO改进版 #2587

Closed
1 task done
WangRongsheng opened this issue Feb 25, 2024 · 21 comments
Closed
1 task done

[Feature] 支持DPO-Positive (DPOP),DPO改进版 #2587

WangRongsheng opened this issue Feb 25, 2024 · 21 comments
Labels
wontfix This will not be worked on

Comments

@WangRongsheng
Copy link

Reminder

  • I have read the README and searched the existing issues.

Reproduction

  1. https://github.com/abacusai/smaug
  2. https://arxiv.org/abs/2402.13228

Expected behavior

No response

System Info

No response

Others

No response

@hiyouga hiyouga added the pending This problem is yet to be addressed label Feb 25, 2024
@KalsaHT
Copy link

KalsaHT commented Mar 1, 2024

你试过这个方法么? 公式(3)好像和后面描述的有些出入。 我实现之后,lambda 按文中设置的50,warmup之后loss直接起飞了

@LuJunru
Copy link

LuJunru commented Mar 16, 2024

@KalsaHT

是不是和附录C的公式对不上?我按照公式3训了一下,感觉完全没效果。

@ticoAg
Copy link

ticoAg commented Apr 2, 2024

@hiyouga 可以参考:abacusai/smaug#2 (comment)

@ticoAg
Copy link

ticoAg commented Apr 2, 2024

定义self.dpo_positive_lambda

        elif self.loss_type == "positive":
            # ref: https://github.com/abacusai/smaug/issues/2#issuecomment-2019468927
            losses = -F.logsigmoid(self.beta * logits) - self.dpo_positive_lambda * torch.clamp(
                reference_chosen_logps - policy_chosen_logps, min=0
            )
        elif self.loss_type == "peremptory":
            losses = (
                -F.logsigmoid(self.beta * logits)
                - self.dpo_positive_lambda * torch.clamp(reference_chosen_logps - policy_chosen_logps, min=0)
                + self.dpo_positive_lambda * torch.clamp(policy_rejected_logps - reference_rejected_logps, min=0)
            )

还未经测试

@tenggyut
Copy link

tenggyut commented Apr 3, 2024

定义self.dpo_positive_lambda

        elif self.loss_type == "positive":
            # ref: https://github.com/abacusai/smaug/issues/2#issuecomment-2019468927
            losses = -F.logsigmoid(self.beta * logits) - self.dpo_positive_lambda * torch.clamp(
                reference_chosen_logps - policy_chosen_logps, min=0
            )
        elif self.loss_type == "peremptory":
            losses = (
                -F.logsigmoid(self.beta * logits)
                - self.dpo_positive_lambda * torch.clamp(reference_chosen_logps - policy_chosen_logps, min=0)
                + self.dpo_positive_lambda * torch.clamp(policy_rejected_logps - reference_rejected_logps, min=0)
            )

还未经测试

我觉得减号是错的,后面那个惩罚项是个非负数,用减号的话会让loss越来越小,和论文的idea相冲突而且也不符合直觉,应该是加号

@tenggyut
Copy link

tenggyut commented Apr 3, 2024

你试过这个方法么? 公式(3)好像和后面描述的有些出入。 我实现之后,lambda 按文中设置的50,warmup之后loss直接起飞了

不应该设置那么大,设置为50的话,loss会很大。我估计最多也就0.5

@LuJunru
Copy link

LuJunru commented Apr 3, 2024

定义self.dpo_positive_lambda

        elif self.loss_type == "positive":
            # ref: https://github.com/abacusai/smaug/issues/2#issuecomment-2019468927
            losses = -F.logsigmoid(self.beta * logits) - self.dpo_positive_lambda * torch.clamp(
                reference_chosen_logps - policy_chosen_logps, min=0
            )
        elif self.loss_type == "peremptory":
            losses = (
                -F.logsigmoid(self.beta * logits)
                - self.dpo_positive_lambda * torch.clamp(reference_chosen_logps - policy_chosen_logps, min=0)
                + self.dpo_positive_lambda * torch.clamp(policy_rejected_logps - reference_rejected_logps, min=0)
            )

还未经测试

我觉得减号是错的,后面那个惩罚项是个非负数,用减号的话会让loss越来越小,和论文的idea相冲突而且也不符合直觉,应该是加号

我觉得按照公式就是加号,可以放在括号里面保持负号,根据论文的公式3。但整体来说,我觉得smug有效果是因为它针对open llm排行榜搞了一些额外数据,而不是因为这个loss。

@TobiasLee
Copy link

TobiasLee commented Apr 3, 2024

定义self.dpo_positive_lambda

        elif self.loss_type == "positive":
            # ref: https://github.com/abacusai/smaug/issues/2#issuecomment-2019468927
            losses = -F.logsigmoid(self.beta * logits) - self.dpo_positive_lambda * torch.clamp(
                reference_chosen_logps - policy_chosen_logps, min=0
            )
        elif self.loss_type == "peremptory":
            losses = (
                -F.logsigmoid(self.beta * logits)
                - self.dpo_positive_lambda * torch.clamp(reference_chosen_logps - policy_chosen_logps, min=0)
                + self.dpo_positive_lambda * torch.clamp(policy_rejected_logps - reference_rejected_logps, min=0)
            )

还未经测试

我觉得减号是错的,后面那个惩罚项是个非负数,用减号的话会让loss越来越小,和论文的idea相冲突而且也不符合直觉,应该是加号

来这边用中文聊聊哈哈。抛开文章公式,reference_chosen_logps - policy_chosen_logps 这一项是 ratio,也就是 ref_chosen / policy_chosen,希望 p(policy_chosen) > p(ref_chosen) 因此是 ratio 是越小越好?不考虑那个 relu 的操作,那我们应该 minimize 这一项,所以前面应该是 +

这么看下来公式是错的
回去看了一下公式,发现前面有个负号,我之前漏了那个前面的负号。sorry for the confusion.

@LuJunru
Copy link

LuJunru commented Apr 3, 2024

它后面新加的那一项是在中括号里面的,我感觉就等于是+:page5,公式3,https://arxiv.org/pdf/2402.13228.pdf

@TobiasLee
Copy link

定义self.dpo_positive_lambda

        elif self.loss_type == "positive":
            # ref: https://github.com/abacusai/smaug/issues/2#issuecomment-2019468927
            losses = -F.logsigmoid(self.beta * logits) - self.dpo_positive_lambda * torch.clamp(
                reference_chosen_logps - policy_chosen_logps, min=0
            )
        elif self.loss_type == "peremptory":
            losses = (
                -F.logsigmoid(self.beta * logits)
                - self.dpo_positive_lambda * torch.clamp(reference_chosen_logps - policy_chosen_logps, min=0)
                + self.dpo_positive_lambda * torch.clamp(policy_rejected_logps - reference_rejected_logps, min=0)
            )

还未经测试

我觉得减号是错的,后面那个惩罚项是个非负数,用减号的话会让loss越来越小,和论文的idea相冲突而且也不符合直觉,应该是加号

我觉得按照公式就是加号,可以放在括号里面保持负号,根据论文的公式3。但整体来说,我觉得smug有效果是因为它针对open llm排行榜搞了一些额外数据,而不是因为这个loss。

同意。我发现其实原先的 DPO 通过调整 beta,也能够极大程度的缓解 positive prob 降低的问题,default 的 0.1 可能不太够,可以适当 increase,因此这个方案的效果不一定好。

@TobiasLee
Copy link

它后面新加的那一项是在中括号里面的,我感觉就等于是+:page5,公式3,https://arxiv.org/pdf/2402.13228.pdf

是的是的,我之前的实现有问题。

@LuJunru
Copy link

LuJunru commented Apr 3, 2024

定义self.dpo_positive_lambda

        elif self.loss_type == "positive":
            # ref: https://github.com/abacusai/smaug/issues/2#issuecomment-2019468927
            losses = -F.logsigmoid(self.beta * logits) - self.dpo_positive_lambda * torch.clamp(
                reference_chosen_logps - policy_chosen_logps, min=0
            )
        elif self.loss_type == "peremptory":
            losses = (
                -F.logsigmoid(self.beta * logits)
                - self.dpo_positive_lambda * torch.clamp(reference_chosen_logps - policy_chosen_logps, min=0)
                + self.dpo_positive_lambda * torch.clamp(policy_rejected_logps - reference_rejected_logps, min=0)
            )

还未经测试

我觉得减号是错的,后面那个惩罚项是个非负数,用减号的话会让loss越来越小,和论文的idea相冲突而且也不符合直觉,应该是加号

我觉得按照公式就是加号,可以放在括号里面保持负号,根据论文的公式3。但整体来说,我觉得smug有效果是因为它针对open llm排行榜搞了一些额外数据,而不是因为这个loss。

同意。我发现其实原先的 DPO 通过调整 beta,也能够极大程度的缓解 positive prob 降低的问题,default 的 0.1 可能不太够,可以适当 increase,因此这个方案的效果不一定好。

beta很玄学,hf这个超参扫描结果来看,不同的模型dpo beta最佳值不一样,可能是0.01,也有可能是0.6

@LuJunru
Copy link

LuJunru commented Apr 3, 2024

定义self.dpo_positive_lambda

        elif self.loss_type == "positive":
            # ref: https://github.com/abacusai/smaug/issues/2#issuecomment-2019468927
            losses = -F.logsigmoid(self.beta * logits) - self.dpo_positive_lambda * torch.clamp(
                reference_chosen_logps - policy_chosen_logps, min=0
            )
        elif self.loss_type == "peremptory":
            losses = (
                -F.logsigmoid(self.beta * logits)
                - self.dpo_positive_lambda * torch.clamp(reference_chosen_logps - policy_chosen_logps, min=0)
                + self.dpo_positive_lambda * torch.clamp(policy_rejected_logps - reference_rejected_logps, min=0)
            )

还未经测试

我觉得减号是错的,后面那个惩罚项是个非负数,用减号的话会让loss越来越小,和论文的idea相冲突而且也不符合直觉,应该是加号

我觉得按照公式就是加号,可以放在括号里面保持负号,根据论文的公式3。但整体来说,我觉得smug有效果是因为它针对open llm排行榜搞了一些额外数据,而不是因为这个loss。

同意。我发现其实原先的 DPO 通过调整 beta,也能够极大程度的缓解 positive prob 降低的问题,default 的 0.1 可能不太够,可以适当 increase,因此这个方案的效果不一定好。

至少从我的实验来看,同样的模型、数据和超参,dpop不如dpo。感觉这个它设计的第二项,可能还不如直接加个sft loss项。

@TobiasLee
Copy link

定义self.dpo_positive_lambda

        elif self.loss_type == "positive":
            # ref: https://github.com/abacusai/smaug/issues/2#issuecomment-2019468927
            losses = -F.logsigmoid(self.beta * logits) - self.dpo_positive_lambda * torch.clamp(
                reference_chosen_logps - policy_chosen_logps, min=0
            )
        elif self.loss_type == "peremptory":
            losses = (
                -F.logsigmoid(self.beta * logits)
                - self.dpo_positive_lambda * torch.clamp(reference_chosen_logps - policy_chosen_logps, min=0)
                + self.dpo_positive_lambda * torch.clamp(policy_rejected_logps - reference_rejected_logps, min=0)
            )

还未经测试

我觉得减号是错的,后面那个惩罚项是个非负数,用减号的话会让loss越来越小,和论文的idea相冲突而且也不符合直觉,应该是加号

我觉得按照公式就是加号,可以放在括号里面保持负号,根据论文的公式3。但整体来说,我觉得smug有效果是因为它针对open llm排行榜搞了一些额外数据,而不是因为这个loss。

同意。我发现其实原先的 DPO 通过调整 beta,也能够极大程度的缓解 positive prob 降低的问题,default 的 0.1 可能不太够,可以适当 increase,因此这个方案的效果不一定好。

至少从我的实验来看,同样的模型、数据和超参,dpop不如dpo。感觉这个它设计的第二项,可能还不如直接加个sft loss项。

实践出真知,agree!

@tenggyut
Copy link

tenggyut commented Apr 3, 2024

另外,咨询下,dpotrainer里loss-type: hinge, ipo这些和原始的sigmoid有提升没呀?

@LuJunru
Copy link

LuJunru commented Apr 3, 2024

另外,咨询下,dpotrainer里loss-type: hinge, ipo这些和原始的sigmoid有提升没呀?

我的结论是ipo用了square loss,可以有效防止过拟合,类似作者说的cDPO,求稳的话可以用。因为DPO训多了会显著变长,ipo就没有这个退化现象,输出结果和底座sft保持比较相近的风格。其它都是和dpo差不多的单调loss,我测下来不如dpo。

@KalsaHT
Copy link

KalsaHT commented Apr 10, 2024

定义self.dpo_positive_lambda

        elif self.loss_type == "positive":
            # ref: https://github.com/abacusai/smaug/issues/2#issuecomment-2019468927
            losses = -F.logsigmoid(self.beta * logits) - self.dpo_positive_lambda * torch.clamp(
                reference_chosen_logps - policy_chosen_logps, min=0
            )
        elif self.loss_type == "peremptory":
            losses = (
                -F.logsigmoid(self.beta * logits)
                - self.dpo_positive_lambda * torch.clamp(reference_chosen_logps - policy_chosen_logps, min=0)
                + self.dpo_positive_lambda * torch.clamp(policy_rejected_logps - reference_rejected_logps, min=0)
            )

还未经测试

我觉得减号是错的,后面那个惩罚项是个非负数,用减号的话会让loss越来越小,和论文的idea相冲突而且也不符合直觉,应该是加号

我觉得按照公式就是加号,可以放在括号里面保持负号,根据论文的公式3。但整体来说,我觉得smug有效果是因为它针对open llm排行榜搞了一些额外数据,而不是因为这个loss。

同意。我发现其实原先的 DPO 通过调整 beta,也能够极大程度的缓解 positive prob 降低的问题,default 的 0.1 可能不太够,可以适当 increase,因此这个方案的效果不一定好。

至少从我的实验来看,同样的模型、数据和超参,dpop不如dpo。感觉这个它设计的第二项,可能还不如直接加个sft loss项。

最后我把加号、减号都试过后,就像你说的,都不如加个sft的loss; 其实如果从文中为了缓解positive样本负向学习的问题化,确实直接加上这个sft loss是最直接有效的了

@hiyouga hiyouga added wontfix This will not be worked on and removed pending This problem is yet to be addressed labels Apr 19, 2024
@hiyouga hiyouga reopened this Apr 19, 2024
@hiyouga hiyouga closed this as not planned Won't fix, can't repro, duplicate, stale Apr 19, 2024
@LuJunru
Copy link

LuJunru commented Apr 28, 2024

update一下,dpop的作者在issue里面提供了他们的实现:abacusai/smaug#2 (comment) 。他提到之前论文的公式是有问题的。我实测了一下,新的loss比之前论文里对应的版本效果要好一点,但还是略弱于dpo。

@carachu1
Copy link

carachu1 commented Dec 4, 2024

定义self.dpo_positive_lambda

        elif self.loss_type == "positive":
            # ref: https://github.com/abacusai/smaug/issues/2#issuecomment-2019468927
            losses = -F.logsigmoid(self.beta * logits) - self.dpo_positive_lambda * torch.clamp(
                reference_chosen_logps - policy_chosen_logps, min=0
            )
        elif self.loss_type == "peremptory":
            losses = (
                -F.logsigmoid(self.beta * logits)
                - self.dpo_positive_lambda * torch.clamp(reference_chosen_logps - policy_chosen_logps, min=0)
                + self.dpo_positive_lambda * torch.clamp(policy_rejected_logps - reference_rejected_logps, min=0)
            )

还未经测试

我觉得减号是错的,后面那个惩罚项是个非负数,用减号的话会让loss越来越小,和论文的idea相冲突而且也不符合直觉,应该是加号

我觉得按照公式就是加号,可以放在括号里面保持负号,根据论文的公式3。但整体来说,我觉得smug有效果是因为它针对open llm排行榜搞了一些额外数据,而不是因为这个loss。

同意。我发现其实原先的 DPO 通过调整 beta,也能够极大程度的缓解 positive prob 降低的问题,default 的 0.1 可能不太够,可以适当 increase,因此这个方案的效果不一定好。

至少从我的实验来看,同样的模型、数据和超参,dpop不如dpo。感觉这个它设计的第二项,可能还不如直接加个sft loss项。

你好,我想请教一下,这个直接加sft loss是如何实现的

@hiyouga
Copy link
Owner

hiyouga commented Dec 4, 2024

@carachu1 添加这个参数即可

pref_ftx: float = field(
default=0.0,
metadata={"help": "The supervised fine-tuning loss coefficient in DPO training."},
)

@LeonNerd
Copy link

LeonNerd commented Dec 9, 2024

@carachu1 添加这个参数即可

pref_ftx: float = field(
default=0.0,
metadata={"help": "The supervised fine-tuning loss coefficient in DPO training."},
)

一般这个值给多少合适呢?
我在dpo训练中,结果总是很差,我发现打印的结果中logps/chosen特别大,有些奇怪。但是如果排除数据问题,不知道是为什么
{'loss': 0.6947, 'grad_norm': 7.488363742828369, 'learning_rate': 2.127659574468085e-07, 'rewards/chosen': -0.0018957583233714104, 'rewards/rejected': -0.0035060157533735037, 'rewards/accuracies': 0.375, 'rewards/margins': 0.0016102575464174151, 'logps/chosen': -102.19650268554688, 'logps/rejected': -82.204345703125, 'logits/chosen': 0.14029107987880707, 'logits/rejected': 0.12593945860862732, 'epoch': 0.06}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
wontfix This will not be worked on
Projects
None yet
Development

No branches or pull requests

9 participants