SkyworkAI / Skywork

Skywork series models are pre-trained on 3.2TB of high-quality multilingual (mainly Chinese and English) and code data. We have open-sourced the model, training data, evaluation data, evaluation methods, etc. 天工系列模型在3.2TB高质量多语言和代码数据上进行预训练。我们开源了模型参数,训练数据,评估数据,评估方法。
Other
1.21k stars 111 forks source link

eval loss标准化是否可以理解为平均每个token的loss #43

Closed Davidgzx closed 9 months ago

Davidgzx commented 9 months ago

如题 另外 如果 我提前 先分别计算 单条样本的平均token loss,然后在平均 每一条样本计算得到的平均token loss,是否是和你们的实现等价的呢

zhao1iang commented 9 months ago

不等价,差别很大,因为每个分词器分词差异极大,需要还原成似然后进行比较。

fengzi258 commented 9 months ago

您好,可以解释清楚一些吗? 该issue提到了两种eval_loss 计算方式:

  1. 单条样本平均token loss,然后所有样本再取平均;
  2. 所有样本的loss相加,所有token相加,然后total_loss/total_token; 代码中用的是第二种,即计算出了标准化loss,ppl是在这个基础上取指数2^loss,按代码跑出的结果取指数之后的ppl与报告不符,哪里会出问题吗?还有你说的还原成似然再比较是什么意思?
zhao1iang commented 9 months ago

不是total_loss/ total_token,而是total_loss total_token / skywork_token,total_loss total_token这一步是退化成-Log(似然),具体推导见readme,接下来除以skywork_token,这一步是所有模型都除以一个相同的数,不影响模型的排位,我们除以skywork_token是为了直接和我们模型skywork进行loss比较。

fengzi258 commented 9 months ago

代码中是avg_loss = total_loss / total_tokens,再加上你的解释与readme中的loss公式,所以:

  1. 对于非skywork模型,avg_loss*total_tokens = total_loss (其中avg_loss对应readme的loss公式),total_loss就是交叉熵(即似然),然后total_loss/skywork_token得到标准loss,ppl是在这个基础上取指数2^loss;所以该代码只支持跑出正确的skywork loss,其他模型的要自己编写。
  2. 对于skywork模型,1中的total_tokens与skywork_token一致,所以就是avg_loss,对应于代码中是avg_loss = total_loss / total_tokens。
  3. 两者都是交叉熵除以skywork_tokens,同除以相同数,不影响结果,相当于其实比较的还是句子的交叉熵,不影响排位。 因此,看了eval_loss代码与readme后产生歧义,建议在readme中在写详细些。
zhao1iang commented 9 months ago

这个代码并不是只支持跑skywork loss,loss脚本计算是和模型无关的,只不过我们是以skywork模型的loss进行标准,对其他模型loss进行标准化,这样做是为了方便在训练过程中监控loss。因为其他模型是最终模型,只用算一次loss就行,而skywork模型每运行一段时间都需要计算loss,avg_loss*total_tokens/ skywork_tokens,因为对于skywork来说total_tokens和skywork_tokens都一样,所以直接看loss就行了,这样我们在训练中就不用转换直接比较loss。

zhao1iang commented 9 months ago

假设你有A模型和Skywork两个模型,你需要计算标准化loss,那么eval_loss.py这个脚本计算出来A模型的result.txt中有两个值,loss和token数,我们记为loss_a和token_a;Skywork的result.txt文件中也有两个值,我们记作loss_skywork和token_skywork。我们对A模型的Loss进行标准化,那么计算公式为 norm_loss_a = loss_a * token_a / token_skywork,然后比较norm_loss_a和loss_skywork的大小。扩展成N个模型同理。

zhao1iang commented 9 months ago

感谢您的建议,后面更新会将评估脚本的用法写的更加详细

fengzi258 commented 9 months ago

ok, 感谢您的解释,很详细 很清晰。