You need to enable JavaScript to run this app. 带视觉注意力的图像描述TensorFlow实现中loss_function作用解析
优惠活动
大模型
产品
解决方案
定价
更多

带视觉注意力的图像描述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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 02:54:03