带视觉注意力的图像描述TensorFlow实现中loss_function作用解析
自定义损失函数逐逻辑拆解
预先初始化的基础损失配置
这段代码先实例化了稀疏类别交叉熵的损失计算对象,两个关键参数的作用:
from_logits=True:支持直接对模型输出的未归一化logits计算损失,比先把输出过softmax再算交叉熵的数值稳定性更好reduction='none':关闭框架自带的损失自动聚合逻辑,保留序列每个时间步的独立计算结果,方便后续做位置过滤
自定义损失函数的逐行作用
1. 生成有效位置掩码
mask = tf.math.logical_not(tf.math.equal(real, 0))
图像描述的训练序列为了凑齐批次内的固定长度,会对长度不足的真实描述用填充符0做补齐。这行代码逐位置比对真实标签,把所有值等于填充符0的位置标记为无效位置,其余有实际语义的文本位置标记为有效位置,生成布尔类型的掩码矩阵。
2. 逐时间步计算原始损失
loss_ = loss_object(real, pred)
基于前面配置好的无聚合稀疏交叉熵逻辑,逐位置计算预测值和真实标签的交叉熵损失,输出结果的形状和真实标签序列完全一致,每个元素对应一个时间步的损失值。
3. 掩码适配并过滤无效损失
mask = tf.cast(mask, dtype=loss_.dtype) loss_ *= mask
- 先把布尔类型的掩码转成和损失值同精度的浮点数:有效位置的布尔值转成1.0,无效的填充位置转成0.0
- 逐元素把损失值和掩码相乘,直接把所有填充位置的损失值置为0,避免这些无实际语义的位置产生的损失值参与梯度更新。要是不做这个过滤,模型平白要花算力去学怎么预测填充符,完全偏离生成图像描述的核心训练目标;甚至会因为短样本的填充段占比更高,让损失值的权重分布被扭曲,训练效率大幅下降。
4. 聚合输出最终损失
return tf.reduce_mean(loss_)
把所有保留下来的有效位置的损失值取平均,作为当前训练批次的最终损失值,供优化器更新模型参数。
内容的提问来源于stack exchange,提问作者Yash Khasgiwala
相关产品推荐
相关产品推荐

