Closed Davidgzx closed 9 months ago
不等价,差别很大,因为每个分词器分词差异极大,需要还原成似然后进行比较。
您好,可以解释清楚一些吗? 该issue提到了两种eval_loss 计算方式:
不是total_loss/ total_token,而是total_loss total_token / skywork_token,total_loss total_token这一步是退化成-Log(似然),具体推导见readme,接下来除以skywork_token,这一步是所有模型都除以一个相同的数,不影响模型的排位,我们除以skywork_token是为了直接和我们模型skywork进行loss比较。
代码中是avg_loss = total_loss / total_tokens,再加上你的解释与readme中的loss公式,所以:
这个代码并不是只支持跑skywork loss,loss脚本计算是和模型无关的,只不过我们是以skywork模型的loss进行标准,对其他模型loss进行标准化,这样做是为了方便在训练过程中监控loss。因为其他模型是最终模型,只用算一次loss就行,而skywork模型每运行一段时间都需要计算loss,avg_loss*total_tokens/ skywork_tokens,因为对于skywork来说total_tokens和skywork_tokens都一样,所以直接看loss就行了,这样我们在训练中就不用转换直接比较loss。
假设你有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个模型同理。
感谢您的建议,后面更新会将评估脚本的用法写的更加详细
ok, 感谢您的解释,很详细 很清晰。
如题 另外 如果 我提前 先分别计算 单条样本的平均token loss,然后在平均 每一条样本计算得到的平均token loss,是否是和你们的实现等价的呢