BERT语言模型损失函数工作机制与交叉熵计算方法
BERT掩码语言模型交叉熵损失计算逻辑
你首先要搞清楚一个核心认知:MLM任务算交叉熵完全不需要真实标签的向量表示,你是把分类任务的标签形式和向量回归/相似度任务搞混了,整个计算流程是这样的:
- 第一步,拿到真实标签:做掩码操作的时候,你本来就知道每个被
[MASK]替换的位置原本是哪个token,这个token在词表中对应的整数ID就是该位置的真实标签。比如词表中"猫"对应的ID是2157,掩码位置原词是"猫",那这个位置的标签就是整数2157,不是任何形式的向量。 - 第二步,明确模型输出形式:每个掩码位置经过BERT前向传播后,会输出一个长度等于词表总大小的logit向量,向量每一维的数值,对应该位置生成词表中对应ID token的未归一化预测得分。比如常用的BERT-base中文词表大小是21128,那每个位置就输出21128维的logit向量。
- 第三步,直接计算稀疏交叉熵损失:这里不需要把标签转成和输出同维度的one-hot向量(实际工程实现中也不会这么做,太占显存),直接调用框架自带的稀疏交叉熵接口就能算,对应PyTorch的
nn.CrossEntropyLoss、TensorFlow的SparseCategoricalCrossentropy,内部计算逻辑是:- 对模型输出的logit向量做softmax运算,归一化成所有token的预测概率分布,所有概率值和为1
- 直接用真实标签的整数ID,从概率分布中取出对应真实token的预测概率值
- 对这个概率值取负对数,即
单位置损失 = -log(真实token对应的预测概率) - 把所有掩码位置的单位置损失求平均,就是整个MLM任务的最终损失
常见误区:不要把这里的交叉熵损失和需要对比两个向量距离的MSE、余弦相似度损失搞混。分类场景下的交叉熵本质是衡量模型预测的概率分布和真实分布的差异,真实分布就是"只有真实token的概率为1,其他所有token概率为0"的离散分布,用整数ID直接索引计算就等价于和one-hot形式的标签向量计算,效率高得多,完全不需要额外生成标签向量。
内容的提问来源于stack exchange,提问作者kowser66
相关产品推荐
相关产品推荐

