指令微调模型中的ppl困惑度指标

一、背景

在得到指令微调大模型后,需要对模型进行评测,一般分为ppl困惑度评测(从理解上说:ppl是一种用来评价语言模型好坏的指标,生成正确的文本概率越高,就认为模型的困惑度越小,模型也就越好。从数学概念上说:ppl是测试文本中每个token预测概率的几何平均数的倒数)、长序列(如:大海捞针)评测。这篇文章主要说明下对ppl的理解

二、前序知识:几何平均、信息熵、交叉熵

1、几何平均

假设你投资了一个项目,本金是10000元,在过去三年的年回报率分别为10%、20%和30%。我们可以分别计算这三年的利润。

第一年的利润计算:

第一年的年回报率是10%,所以第一年的利润是:

10000×10%=1000元

第一年末的总金额(本金+利润)是:

10000+1000=11000元

第二年的利润计算

第二年的年回报率是20%,但这里的20%是基于第一年末的总金额11000元来计算的。所以第二年的利润是:

11000×20%=2200元

第二年末的总金额(本金+两年利润)是:

11000+2200=13200元

第三年的利润计算

第三年的年回报率是30%,这里的30%是基于第二年末的总金额13200元来计算的。所以第三年的利润是:

13200×30%=3960元

第三年末的总金额(本金+三年利润)是:

13200+3960=17160元

对于这样一个有成绩关系的数据来说,如果我们要算平均回报率,如果用(1.1+1.2+1.3)/ 3 = 1.2求算数平均,得到的值是1.2。如果用几何平均来算, 1.1∗1.2∗1.33 = 1.194。两个值差不多,但是从1.1、1.2、1.3这三个数字看,这是个复利指标,三个数值不能用平均的办法来计算,用连乘的办法得到最终的收入再平均到每一年(也就是取根号)才是最合适的

具体的可以从大学的一些书籍,比如:统计学,这类再看看

2、信息熵

前提:

如果我们有两个不相关的事件x和y,那么我们观察到的两个事件同时发生时获得的信息应该等于观察到的事件各自发生时获得的信息之和,即:h(x,y) = h(x) + h(y)

由于x,y是俩个不相关的事件,那么事件发生的概率应该满足p(x,y) = p(x)*p(y)

假设与推导

  • 假设 h(x) 是关于 p(x) 的某种函数,即 h(x)=f(p(x))。
  • 根据题目条件,我们有 h(x,y)=h(x)+h(y) 和 p(x,y)=p(x)⋅p(y)。
  • 将 h(x) 和 h(y) 的表达式代入 h(x,y),得到 f(p(x,y))=f(p(x))+f(p(y))。

对数函数的性质

  • 注意到对数函数具有 log(ab)=loga+logb 的性质,这与我们需要的 f(p(x,y))=f(p(x))+f(p(y)) 形式非常相似。

我们可以尝试将h(x) = f(p(x))设为logp(x)的形式,也就是我们前面定义的log关系,即h(x)=−logp(x)(这里加负号是为了保证信息量是非负的)

信息量是用来衡量一个具体事件发生后所包含的信息大小,而熵则是在事件结果揭晓之前,对可能产生的所有信息量的一种预期或期望值的度量。这里考虑了随机变量的所有可能取值,即涵盖了所有可能发生的事件各自所包含的信息量的平均值。所以信息熵的公式为

3、交叉熵

二分类的交叉熵损失函数一般会有特殊的公式,下面只说明多分类(通用)

−1N∑i=1Nyilog(pi)

三、困惑度

1、联合概率

以大模型生成句子的实例来看,我们要定义生成某个句子(比如:我爱吃草莓。)的概率情况。 [0.96, 0.01, 0.01, 0.01, 0.005, 0.003, 0.002] 这行意思是生成第一个字时,词库里面所有字的概率(词库一共7个词),假设0.96是“我”这个字的概率,其他类推,那么生成【我爱吃草莓。】的概率是: 0.96∗0.5∗0.4∗0.6∗0.05∗0.05

probs = [
    [0.96, 0.01, 0.01, 0.01, 0.005, 0.003, 0.002], 
    [0.05, 0.50, 0.05, 0.20, 0.05, 0.10, 0.05], 
    [0.30, 0.05, 0.40, 0.10, 0.05, 0.05, 0.05], 
    [0.10, 0.10, 0.05, 0.60, 0.05, 0.05, 0.05], 
    [0.40, 0.30, 0.05, 0.05, 0.10, 0.05, 0.05], 
    [0.05, 0.05, 0.05, 0.15, 0.40, 0.25, 0.05], 
]

2、困惑度

困惑度是联合概率的倒数的几何平均,倒数是因为概率越大说明模型效果越好,求倒数是想把困惑度这个指标弄成像loss一样,越小越好,也为了后面和交叉熵公式联合。求几何平均是因为,具有连乘关系的一系列数据,如果想看平均值,一般都要用几何平均,而不是算数平均(具体可以看前面的例子)。具体公式如下

PPL=(∏i=1N1P(wi))1N

在实际计算中,一般不这样计算,因为这个公式可以推到成具有交叉熵在内的一个公式

数学中有公式: elogx=x ,那么 PPL=exp{logPPL}

log(a ** 5) = 5,所以可以把 1/N 这个指数给提到前面来,1/p(wi),也就是p(wi)的-1指数,那么-1这个指数也可以提到前面来,最终里面就剩下log(p(wi)),也就是下面这样

PPL=exp{−1n∑i=0nlogp(wi|w<i)}

里面也就是交叉熵,如果用代码可以这样子实现

nlls = []

for begin_loc in tqdm(range(0, seq_len, stride)):
    # ... 忽略一些无关代码
    target_ids[:, :-trg_len] = -100
    # 推理
    with torch.no_grad():
        outputs = model(input_ids, labels=target_ids)
        neg_log_likelihood = outputs.loss
    # 记录
    nlls.append(neg_log_likelihood)

# 计算 ppl
ppl = torch.exp(torch.stack(nlls).mean())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值