OpenLMLab / MOSS-RLHF

MOSS-RLHF
Apache License 2.0
1.3k stars 101 forks source link

关于Reward model打分的一些疑惑 #21

Open hannlp opened 1 year ago

hannlp commented 1 year ago

感谢作者的无私开源,但是目前使用作者的Reward model打分时遇到一些问题,对于大部分问答,作者的reward model都会给负分,此外不同prompt对应的分数差别也很大,想请教一下是我的使用方法不对吗?

以下是我的使用代码:

import torch
from transformers import LlamaTokenizer
from transformers.models.llama.modeling_llama import LlamaForCausalLM

class LlamaRewardModel(LlamaForCausalLM):
    def __init__(self, config, tokenizer):
        super().__init__(config)
        self.tokenizer = tokenizer
        self.reward_head = torch.nn.Linear(config.hidden_size, 1, bias=False)

    def forward(self, decoder_input, only_last=True):
        attention_mask = decoder_input.ne(self.tokenizer.pad_token_id)
        output = self.model.forward(
            input_ids=decoder_input,
            attention_mask=attention_mask, 
            return_dict=True,
            use_cache=False
            )

        if only_last:
            logits = self.reward_head(output.last_hidden_state[:, -1, :]).squeeze(-1)
        else:
            logits = self.reward_head(output.last_hidden_state).squeeze(-1)

        return (logits,)

rm_path = "./moss-rlhf-reward-model-7B-zh/recover"
tokenizer_moss = LlamaTokenizer.from_pretrained(rm_path, add_eos_token=True)
rm = LlamaRewardModel.from_pretrained(rm_path, tokenizer_moss)
device1 = torch.device("cuda:1")
rm = rm.eval().half().to(device1)

# 这是我使用的一个例子
prefix_user = "<|Human|>"
prefix_bot = "<|MOSS|>"
query = "列举一种空气污染。"
response = [
    "一种常见的空气污染源是化石燃料的燃烧产生的尾气排放,包括来自汽车、卡车、飞机、火车和工业厂房的废气排放。这会导致大气中的二氧化硫、氮氧化物、一氧化碳、臭氧和颗粒物(例如灰尘和烟雾)等污染物含量增加,对人类健康和环境造成不利影响。",
    "一种常见的空气污染源是化石燃料的燃烧产生的尾气排放,包括来自汽车、卡车、飞机、火车和工业厂房的废气排放。这会导致大气中的二氧化硫、二氧化硫、二氧化硫、二氧化硫、氮氧化物、一氧化碳、臭氧和颗粒物(例如灰尘和烟雾)等污染物含量增加,对人类健康和环境造成不利影响。",
    "一种水污染是氮氧化物污染,它是由于氮和硝化物的排放,以及由氮、硝化物和磷细菌共同作用在水体中,导致水体变成浊褐色而造成的。氮氧化物污染会影响水体中所有生物,包括鱼类和其他水生生物,影响它们的健康和生长。",
    "一种常见的空气污染源是化石燃料的燃烧产生的尾气排放,包括来自汽车、卡车、飞机、火车和工业厂房的废气排放。这会导致大气中的二氧化硫、",
]

# batch为1的时候(避免padding的影响)
text = prefix_user+query+prefix_bot+response[0]
batch = tokenizer_moss(text, return_tensors="pt",padding=True,truncation=True,max_length=1024)
print(tokenizer_moss.batch_decode(batch["input_ids"]))
with torch.no_grad():
    reward = rm(batch['input_ids'].to(device1), only_last=True)
    print(reward)

### 输出
# ['<s> <|Human|> 列举一种空气污染。 <|MOSS|>  一种常见的空气污染源是化石燃料的燃烧产生的尾气排放,包括来自汽车、卡车、飞机、火车和工业厂房的废气排放。这会导致大气中的二氧化硫、氮氧化物、一氧化碳、臭氧和颗粒物(例如灰尘和烟雾)等污染物含量增加,对人类健康和环境造成不利影响。</s>']
# (tensor([-3.2520], device='cuda:1', dtype=torch.float16),)

# batch>1的时候(分别尝试了left padding和right padding)
text = [prefix_user+query+prefix_bot+r for r in response]
tokenizer_moss.padding_side = "left"
batch = tokenizer_moss(text, return_tensors="pt",padding=True,truncation=True,max_length=1024)
print(tokenizer_moss.batch_decode(batch["input_ids"]))
with torch.no_grad():
    reward = rm(batch['input_ids'].to(device1), only_last=True)
    print(reward)

### 输出
#left padding: (tensor([-3.2617, -3.1094, -5.2656, -4.3125], device='cuda:1',
#       dtype=torch.float16),)

#right padding: (tensor([-41.9688,  -3.1094, -51.0000, -44.8438], device='cuda:1',
#       dtype=torch.float16),)

# left padding, only_last设为False时的输出
#['<unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><s> <|Human|> 列举一种空气污染。 <|MOSS|>  一种常见的空气污染源是化石燃料的燃烧产生的尾气排放,包括来自汽车、卡车、飞机、火车和工业厂房的废气排放。这会导致大气中的二氧化硫、氮氧化物、一氧化碳、臭氧和颗粒物(例如灰尘和烟雾)等污染物含量增加,对人类健康和环境造成不利影响。</s>', '<s> <|Human|> 列举一种空气污染。 <|MOSS|>  一种常见的空气污染源是化石燃料的燃烧产生的尾气排放,包括来自汽车、卡车、飞机、火车和工业厂房的废气排放。这会导致大气中的二氧化硫、二氧化硫、二氧化硫、二氧化硫、氮氧化物、一氧化碳、臭氧和颗粒物(例如灰尘和烟雾)等污染物含量增加,对人类健康和环境造成不利影响。</s>', '<unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><s> <|Human|> 列举一种空气污染。 <|MOSS|>  一种水污染是氮氧化物污染,它是由于氮和硝化物的排放,以及由氮、硝化物和磷细菌共同作用在水体中,导致水体变成浊褐色而造成的。氮氧化物污染会影响水体中所有生物,包括鱼类和其他水生生物,影响它们的健康和生长。</s>', '<unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><unk><s> <|Human|> 列举一种空气污染。 <|MOSS|>  一种常见的空气污染源是化石燃料的燃烧产生的尾气排放,包括来自汽车、卡车、飞机、火车和工业厂房的废气排放。这会导致大气中的二氧化硫、</s>']
#(tensor([[  2.0918,   2.0918,   2.0918,  ..., -20.8906, -22.8750,  -3.2617],
        [-11.0000,  -8.3984,  -2.4316,  ..., -20.0000, -22.3438,  -3.1094],
        [  1.3350,   1.3350,   1.3350,  ..., -26.9844, -37.7812,  -5.2656],
        [  1.0459,   1.0459,   1.0459,  ..., -16.3281, -17.3594,  -4.3125]],
       device='cuda:1', dtype=torch.float16),)

# 可以发现除了padding外,其他每个位置大概都是负数

还有一些其他例子:

--- Query: DNA代表什么?

Preds-0 (-1.2548828125):
 DNA (deoxyribonucleic acid) 是一种长链分子,由四种核苷酸(核苷酸是核酸的基本单位)通过磷酸二酯键连接而成。它在生物体内的主要功能是储存和传递遗传信息,是生物体结构和功能的基础。

Preds-1 (0.4287109375):
 DNA,即脱氧核糖核酸,是人体内储存遗传信息的生物分子。它由4种碱基(腺嘌呤(A)、鸟嘌呤(G)、胞嘧啶(C)和胸腺嘧啶(T)),以及DNA连接酶和DNA聚合酶等蛋白分子组成。DNA具有双螺旋结构,能够稳定地储存遗传信息,并通过复制、转录和修复等过程传递给后代。它在生物体内的作用非常重要,能够控制细胞的生长、分裂和发育,并参与蛋白质的合成、基因表达和免疫应答等过程。

Preds-2 (5.359375):
 DNA代表脱氧核糖核酸。

--- Query: 什么是三原色?

Preds-0 (3.59765625):
 三原色是指红、绿、蓝三种颜色,它们是光谱中能产生互补色关系的颜色,通过三种颜色混合可以产生其他颜色。例如,红色和蓝色混合可以产生紫色,红色和绿色混合可以产生黄色,绿色和蓝色混合可以产生青色。因此,这三种颜色被称之为原色,它们是其他颜色的基础。

这三种颜色是按照它们在色轮中的位置来命名的。色轮是一个圆,上面展示了各种颜色之间的关系。红、绿和蓝被标记为红色,绿色和蓝色,它们的位置是围绕着圆心,呈对角线排列。

Preds-1 (3.5625):
 三原色是指红、绿、蓝三种基本颜色,它们是色彩的三个基本要素,也被称为色料三原色。它们能够混合出几乎所有其他颜色,如橙色、黄色、紫色等。三原色理论是由英国化学家约瑟夫·普利斯特里在1704年提出的,他认为三原色是光学上不可分割的最小颜色单元。

Preds-2 (3.94921875):
 三原色是红、蓝、黄。这些颜色被称为原色,因为它们不能通过混合其他颜色来创建,所有其他颜色都可以通过将它们按不同比例组合而成。在用于光的加色系统中,原色是红色、绿色和蓝色 (RGB)。

--- Query: 以第三人称叙述的方式写一个关于必须做出重要职业决定的主人公的短篇故事。

Preds-0 (-4.27734375):
 凯莉是一个年轻的女孩,她面临着一个艰难的职业选择。她的父亲是一名成功的律师,而她从小就对法律产生了浓厚的兴趣。凯莉一直希望能够继承父亲的衣钵,成为一名出色的律师。然而,当她进入大学学习法律后,她发现自己并不喜欢法律这个职业。她想要追求自己的梦想,去做自己真正热爱的事情。

最终,凯莉决定放弃法律,她找到了一份她热爱的职业。她加入了一家科技公司,负责市场营销和推广工作。在那里,她每天都能够为客户提供最优质的服务,并且能够实现自己的梦想。凯莉感到非常开心,她觉得自己的选择是正确的。

凯莉的故事告诉我们,无论在人生的道路上遇到什么困难,我们都应该坚持自己的梦想,并且勇敢地做出选择。只有这样,我们才能在人生的道路上走得更加顺利。

Preds-1 (-4.78125):
 在一个阳光明媚的下午,玛丽亚在她的小镇里散步。她决定做一些事情来帮助她做出一个重要的职业决定。她来到她最喜欢的咖啡馆,点了一杯热巧克力,开始阅读报纸。

突然,她注意到一个标题“一个改变命运的机会”。她点了点头,意识到这是一个很好的机会。于是,她迅速打电话给她的顾问,询问这个机会。她的顾问非常高兴,立即为她安排了面试。

玛丽亚在面试中表现得非常出色,最终被邀请加入这个机会。她非常激动,立刻开始准备工作。她辞去了她的工作,开始为新的机会做准备。

玛丽亚非常感谢这个机会,她决定为她未来的职业生涯做出一个重要的决定。她感到非常幸运,因为她能够通过自己的努力和智慧来获得一个改变命运的机会。

最终,玛丽亚成功地获得了这个机会,她感到非常自豪。她意识到,她为自己做了一个明智的职业决定。她的未来将会有无限可能。

Preds-2 (-5.58203125):
 奥菲坐在她的办公桌前,茫然地盯着电脑屏幕。当她权衡摆在她面前的选项时,她的思绪在飞速运转。她被提拔到公司的高级管理职位,但这意味着要搬到全国各地,而要离开她的朋友和家人。与此同时,她在竞争对手公司梦寐以求的工作终于打开了,她收到了面试的邀请。

一想到要离开舒适的生活,去尝试一些新的、不确定的事情,索菲就感到焦虑,但也很兴奋。她一直是一个敢于冒险的人,这在过去得到了回报。可现在,做出这么重大的决定,苏菲不禁有些不知所措。

思前想后,苏菲做出了自己的选择。她收拾好行囊,告别了她所爱的人,为了新的工作搬到了全国各地。刚开始的几个月很艰难,要适应新的城市和新的公司文化。但随着时间的推移,苏菲意识到她做出了对她职业生涯最好的决定。这份工作充满挑战,但也很有收获,她周围都是充满热情、干劲十足的同事,他们激励着她成长和发展。

最终,苏菲的大胆举动得到了回报。她在新角色中表现出色,并在新城市结识了新朋友和人脉。回顾过去,索菲很感激有机会冒险做出改变,并坚信自己为自己的职业生涯做出了正确的决定。

--- Query: 讨论大萧条的原因

Preds-0 (-0.2393798828125):
 大萧条是指20世纪30年代全球经济危机,它始于1929年美国股市崩盘,并迅速席卷全球,导致数百万人失业,无数家庭陷入贫困。

大萧条的原因有很多,其中主要有以下几个方面:

1. 经济过热:大萧条之前,美国经历了长达10年的经济繁荣,通货膨胀率不断上升,导致经济过热。

2. 货币紧缩政策:政府采取了紧缩的货币政策,以控制通货膨胀。然而,这一政策使银行和企业无法获得充足的贷款,从而导致经济衰退。

3. 银行危机:银行过度扩张,信贷过度扩张,最终导致银行体系崩溃。许多银行倒闭,使得借贷更加困难,企业无法获得充足的资金。

4. 国际经济危机:大萧条也与当时国际经济危机密切相关。当时,欧洲各国经济受到萧条的影响,出口减少,进口增加,使美国也受到牵连。

5. 生产过剩:在繁荣时期,企业盲目扩张,生产过剩。然而,在经济危机中,需求下降,企业无法销售产品,导致大量企业破产。

大萧条给世界各国造成了巨大的损失,同时也给世界各国带来了深刻的教训。各国政府应加强对经济的宏观调控,避免经济过热,同时保持充足的流动性,以应对经济危机。

Preds-1 (0.182861328125):
 大萧条是指1929年到1939年间,全球经济的严重衰退。这场经济危机对全球各国都产生了深远的影响,造成了大量失业、饥荒、流离失所和大规模的死亡。

造成大萧条的原因有很多,其中最主要的因素包括:

1. 经济危机:大萧条是由于1929年发生的经济危机所导致的。这场危机导致许多公司破产,失业率上升,消费需求下降,经济增长放缓。

2. 银行危机:大萧条期间,银行危机严重,许多银行倒闭,储户的存款无法兑现。银行的倒闭导致经济的流动性减弱,进一步加剧了经济危机。

3. 工业生产下降:大萧条期间,工业生产下降,许多工厂倒闭,工人失业。生产下降导致需求下降,进一步加剧了经济危机。

4. 国际贸易减少:大萧条期间,国际贸易减少,各国之间的贸易减少,经济增长放缓。

5. 政府干预不足:大萧条期间,政府没有采取有效措施来应对经济危机。政府没有及时提供援助,帮助工人和企业度过难关。

6. 政府支持不足:大萧条期间,政府支持不足,没有提供足够的救济和援助。政府没有有效地

Preds-2 (-1.515625):
 大萧条是从 1929 年持续到 1939 年的一场严重的全球经济衰退。它是由多种因素造成的,包括 1929 年的股市崩盘、经济的结构性弱点、低消费支出、高失业率以及对经济缺乏信心。银行系统。其他促成因素包括商品生产过剩、依赖借贷为投资融资、农业生产过剩以及国际贸易减少。
ruizheng20 commented 1 year ago
  1. reward model打分主要看相对大小,通过大小来比较不同response的好坏。绝对的数值没有意义。
  2. 不同prompt下的得分也是不可以比较的,这是由于建模阶段只对一个prompt的不同response进行了比较。
hannlp commented 1 year ago

感谢回复,但是我尝试使用moss的reward model的打分时给baichuan-13b-chat或者gpt-4的response的平均打分甚至还不如几k数据sft的baichuan-7b(用其他的reward model就没有这种情况),可以麻烦作者使用我上面的测试代码试一下吗?我想确认一下是我这哪里出了问题(也有可能是我合并没合并对,但是初步检查了一下好像没问题),万分感谢!

lln1997 commented 1 year ago

@hannlp 请问大佬知道原因了嘛

hannlp commented 1 year ago

@lln1997 还没有,你也遇到这个问题了吗? @ruizheng20

lln1997 commented 1 year ago

@hannlp 目前感觉效果没有子牙的好

hannlp commented 1 year ago

@hannlp 目前感觉效果没有子牙的好

这个倒还正常吧,毕竟跟训练的各因素有很大的关系,但是我这个好像有点不对劲了,老哥能帮我试一下我的样例吗?我想对一下输出,看看是哪里出了问题

zjutkarma commented 1 year ago

你好,reward model的打分是负数的话,是看相对大小吗,比如 -1>-2 我们认为得分为-1的结果比-2好?

lln1997 commented 1 year ago

@hannlp 哈哈哈老哥我是用的你的代码

hannlp commented 1 year ago

@hannlp 哈哈哈老哥我是用的你的代码

输出和我的一致吗?

lln1997 commented 1 year ago

@hannlp 对

Ablustrund commented 1 year ago

你好,reward model的打分是负数的话,是看相对大小吗,比如 -1>-2 我们认为得分为-1的结果比-2好?

是的 因为目标是一定的 在RL中让打分上升。但是分数是相对的 只能知道那个sample相对较好

Ablustrund commented 1 year ago

@hannlp 哈哈哈老哥我是用的你的代码

很抱歉回复较晚,需要确认一下这里的输入是否缺少</s>,但是不知道这对模型的打分是否有较大的影响 https://github.com/OpenLMLab/MOSS-RLHF/issues/24