详细介绍:Qwen2.5-VL 损失函数

news/2025/10/6 14:37:18/文章来源:https://www.cnblogs.com/slgkaifa/p/19127605

详细介绍:Qwen2.5-VL 损失函数

Qwen2.5-VL 损失函数

flyfish

文章名称链接
深入理解交叉熵损失 CrossEntropyLoss - 概率基础链接
深入理解交叉熵损失 CrossEntropyLoss - 对数链接
深入理解交叉熵损失 CrossEntropyLoss - 概率分布链接
深入理解交叉熵损失 CrossEntropyLoss - 信息论(交叉熵)链接
深入理解交叉熵损失 CrossEntropyLoss - 损失函数链接
深入理解交叉熵损失 CrossEntropyLoss - one-hot 编码链接
深入理解交叉熵损失 CrossEntropyLoss - Softmax链接
深入理解交叉熵损失 CrossEntropyLoss - 归一化链接
深入理解交叉熵损失 CrossEntropyLoss - nn.LogSoftmax链接
深入理解交叉熵损失 CrossEntropyLoss - 似然链接
深入理解交叉熵损失 CrossEntropyLoss - 乘积符号在似然函数中的应用链接
深入理解交叉熵损失 CrossEntropyLoss - 最大似然估计链接
深入理解交叉熵损失 CrossEntropyLoss - nn.NLLLoss(Negative Log-Likelihood Loss)链接
深入理解交叉熵损失 CrossEntropyLoss - CrossEntropyLoss链接

qwen2_5_vl/modular_qwen2_5_vl.py
qwen2_5_vl/modeling_qwen2_5_vl.py
文件的forward方法中使用了CrossEntropyLoss

loss = None
if labels is
not None:
# Upcast to float if we need to compute the loss to avoid potential precision issues
logits = logits.float(
)
# Shift so that tokens < n predict n
shift_logits = logits[...
, :-1
, :].contiguous(
)
shift_labels = labels[...
, 1:].contiguous(
)
# Flatten the tokens
loss_fct = CrossEntropyLoss(
)
shift_logits = shift_logits.view(-1
, self.config.vocab_size)
shift_labels = shift_labels.view(-1
)
# Enable model parallelism
shift_labels = shift_labels.to(shift_logits.device)
loss = loss_fct(shift_logits, shift_labels)
if
not return_dict:
output = (logits,
) + outputs[1:]
return (loss,
) + output if loss is
not None
else output

loss_fct(shift_logits, shift_labels)

1. shift_logits

2. shift_labels

示例代码

使用 CrossEntropyLoss 计算

import torch
from torch.nn import CrossEntropyLoss
# 假设词汇表大小为10
vocab_size = 10
# 假设总样本数为5
N = 5
# 生成随机的logits和labels
shift_logits = torch.randn(N, vocab_size)
shift_labels = torch.randint(0
, vocab_size, (N,
)
)
# 创建CrossEntropyLoss实例
loss_fct = CrossEntropyLoss(
)
# 计算损失
loss = loss_fct(shift_logits, shift_labels)
print(f"Loss: {
loss.item(
)
}"
)

shift_logits 是模型的原始输出得分,shift_labels 是样本的真实标签,loss_fct(shift_logits, shift_labels) 会计算出这些样本的交叉熵损失。

代码中使用了CrossEntropyLoss类来计算损失,在 PyTorch 中,CrossEntropyLoss结合了LogSoftmax和NLLLoss(负对数似然损失)。LogSoftmax操作会对模型的输出logits应用 Softmax 函数,将其转换为概率分布,然后再取对数;NLLLoss则基于这个对数概率分布和真实标签计算损失。因此,CrossEntropyLoss本质上实现的是 Softmax 交叉熵。

多分类场景的体现:shift_logits被调整为形状(-1, self.config.vocab_size),其中self.config.vocab_size表示词汇表的大小,这意味着模型的输出是一个多分类的概率分布,每个类别对应词汇表中的一个词。

简单的说

1. 基础概念:熵、交叉熵与KL散度

1.1 信息熵(Entropy)

信息熵是随机变量的不确定性度量,对于离散概率分布 P ( x ) P(x) P(x),其公式为 H ( P ) = − ∑ i P ( x i ) log ⁡ P ( x i ) H(P) = -\sum_{i} P(x_i) \log P(x_i) H(P)=iP(xi)logP(xi)。直观来看,熵越高意味着分布越“均匀”,不确定性越大——例如掷骰子结果的熵高于抛硬币,因为骰子的可能结果更多且分布更均匀,其不确定性更强。

1.2 交叉熵(Cross-Entropy)

交叉熵用于衡量用分布 Q Q Q 表示分布 P P P 的困难程度,公式为 H ( P , Q ) = − ∑ i P ( x i ) log ⁡ Q ( x i ) H(P, Q) = -\sum_{i} P(x_i) \log Q(x_i) H(P,Q)=iP(xi)logQ(xi)。交叉熵越小,说明 Q Q Q P P P 的差异越小,即 Q Q Q 越接近真实分布 P P P,因此常被用作衡量两个分布相似性的指标。

1.3 KL散度(Kullback-Leibler Divergence)

KL散度是对两个概率分布差异的量化度量,公式为 D K L ( P ∣ ∣ Q ) = ∑ i P ( x i ) log ⁡ P ( x i ) Q ( x i ) D_{KL}(P||Q) = \sum_{i} P(x_i) \log \frac{P(x_i)}{Q(x_i)} DKL(P∣∣Q)=iP(xi)logQ(xi)P(xi),其与交叉熵、信息熵的关系为 H ( P , Q ) = H ( P ) + D K L ( P ∣ ∣ Q ) H(P, Q) = H(P) + D_{KL}(P||Q) H(P,Q)=H(P)+DKL(P∣∣Q),即交叉熵等于信息熵与KL散度之和。当真实分布 P P P 固定时,最小化交叉熵等价于最小化KL散度,目标是让预测分布 Q Q Q 尽可能接近 P P P

2. 交叉熵损失在分类任务中的应用

2.1 二分类问题

在二分类场景中,模型需要预测样本属于0或1类的概率,通常通过sigmoid函数将输出映射到[0, 1]区间,得到概率 y ^ \hat{y} y^。二元交叉熵(BCE)损失函数为 L = − 1 N ∑ i = 1 N [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] L = -\frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i) \right] L=N1i=1N[yilog(y^i)+(1yi)log(1y^i)]:当真实标签 y i = 1 y_i=1 yi=1 时,损失为 − log ⁡ ( y ^ i ) -\log(\hat{y}_i) log(y^i),鼓励 y ^ i \hat{y}_i y^i 接近1;当 y i = 0 y_i=0 yi=0 时,损失为 − log ⁡ ( 1 − y ^ i ) -\log(1-\hat{y}_i) log(1y^i),鼓励 y ^ i \hat{y}_i y^i 接近0。

2.2 多分类问题

多分类任务中,样本需被预测为 C C C 个类别之一,模型通过softmax函数将输出转换为概率分布 y ^ 1 , … , y ^ C \hat{y}_1, \dots, \hat{y}_C y^1,,y^C(满足 ∑ i = 1 C y ^ i = 1 \sum_{i=1}^{C} \hat{y}_i = 1 i=1Cy^i=1),损失函数为多类交叉熵 L = − 1 N ∑ i = 1 N ∑ c = 1 C y i , c log ⁡ ( y ^ i , c ) L = -\frac{1}{N} \sum_{i=1}^{N} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c}) L=N1i=1Nc=1Cyi,clog(y^i,c),其中 y i , c y_{i,c} yi,c 是one-hot标签(样本 i i i 属于类别 c c c 时为1,否则为0),该公式本质是对每个样本的真实类别对应的预测概率取负对数并求平均。

3. 交叉熵损失与最大似然估计

3.1 从最大似然到交叉熵

假设训练数据 ( x i , y i ) (x_i, y_i) (xi,yi) 独立同分布,模型预测为条件概率 P ( y ∣ x ; θ ) P(y|x; \theta) P(yx;θ),对数似然函数为 log ⁡ L ( θ ) = ∑ i = 1 N log ⁡ P ( y i ∣ x i ; θ ) \log \mathcal{L}(\theta) = \sum_{i=1}^{N} \log P(y_i|x_i; \theta) logL(θ)=i=1NlogP(yixi;θ),最小化负对数似然(NLL)即 L = − 1 N ∑ i = 1 N log ⁡ P ( y i ∣ x i ; θ ) L = -\frac{1}{N} \sum_{i=1}^{N} \log P(y_i|x_i; \theta) L=N1i=1NlogP(yixi;θ) 等价于最大化似然。对于分类问题,若 P ( y i ∣ x i ; θ ) P(y_i|x_i; \theta) P(yixi;θ) 是softmax分布,则NLL损失恰好对应交叉熵损失。

3.2 为什么用交叉熵而非MSE?

从梯度特性看,交叉熵在预测错误时梯度较大,能加速收敛;而MSE在预测值远离真实值时梯度较小,可能导致训练缓慢。从概率解释角度,交叉熵直接优化似然函数,与概率模型的训练目标一致,而MSE更适用于回归任务,不直接关联概率分布的拟合。

4. 交叉熵损失在语言模型中的应用

4.1 自回归语言模型

自回归语言模型的任务是根据前文 x 1 , … , x t − 1 x_1, \dots, x_{t-1} x1,,xt1 预测下一个token x t x_t xt 的概率分布,损失函数为对序列每个位置 t t t 计算交叉熵 L = − 1 T ∑ t = 1 T log ⁡ P ( x t ∣ x 1 , … , x t − 1 ) L = -\frac{1}{T} \sum_{t=1}^{T} \log P(x_t | x_1, \dots, x_{t-1}) L=T1t=1TlogP(xtx1,,xt1)。以PyTorch为例,假设模型输出logits为 [batch_size, seq_len, vocab_size],真实标签为 [batch_size, seq_len],可通过 nn.CrossEntropyLoss() 计算损失:loss = loss_fct(logits.view(-1, vocab_size), labels.view(-1)),其中函数会自动对logits应用softmax并计算交叉熵。

4.2 与分类任务的联系

语言模型中每个token位置的预测可视为独立的分类问题,词汇表大小即类别数,模型需在每个位置预测当前token属于词汇表中某个词的概率。因此,语言模型的训练本质是对序列中每个位置的“分类器”进行联合优化,与多分类任务的核心逻辑一致,只是序列场景下需要考虑上下文依赖关系。

交叉熵损失和交叉熵区别

1. 区别

交叉熵(信息论概念)是衡量两个概率分布差异的指标,数学定义为 H ( P , Q ) = − ∑ i P ( x i ) log ⁡ Q ( x i ) H(P, Q) = -\sum_{i} P(x_i) \log Q(x_i) H(P,Q)=iP(xi)logQ(xi),其中 P P P是真实分布, Q Q Q是预测分布,核心作用是衡量用分布 Q Q Q表示分布 P P P的“不匹配程度”,不匹配程度越低,交叉熵越小。而交叉熵损失(机器学习损失函数)是交叉熵在模型训练中的具体应用,本质上是对样本的交叉熵求平均,用于量化模型预测与真实标签的差距,作为优化目标,例如在分类任务中,其表达式为 L = − 1 N ∑ i = 1 N ∑ c = 1 C y i , c log ⁡ y ^ i , c L = -\frac{1}{N} \sum_{i=1}^{N} \sum_{c=1}^{C} y_{i,c} \log \hat{y}_{i,c} L=N1i=1Nc=1Cyi,clogy^i,c,其中 N N N是样本数, C C C是类别数, y i , c y_{i,c} yi,c是样本 i i i的one-hot标签, y ^ i , c \hat{y}_{i,c} y^i,c是模型预测的概率。

2. 联系:交叉熵损失是交叉熵的“工程化应用”

交叉熵损失的设计直接基于交叉熵的数学定义,在机器学习中,真实标签(如one-hot向量)可视为真实分布 P P P,模型预测的概率分布是 Q Q Q,此时交叉熵即对应单个样本的损失,而交叉熵损失是所有样本交叉熵的平均。例如在二分类问题中,真实标签 y y y(0或1)对应伯努利分布 P P P,模型预测概率 y ^ \hat{y} y^对应分布 Q Q Q,单个样本的交叉熵为 L = − [ y log ⁡ y ^ + ( 1 − y ) log ⁡ ( 1 − y ^ ) ] L = -[y \log \hat{y} + (1-y) \log (1-\hat{y})] L=[ylogy^+(1y)log(1y^)],这正是二元交叉熵损失(BCE Loss)的表达式。
交叉熵是通用指标,不依赖于机器学习任务,只要存在两个概率分布,就可用交叉熵衡量它们的差异(如在信息压缩、分布匹配中);而交叉熵损失是任务特定的优化目标,仅在模型训练时使用,目的是通过最小化损失让预测分布 Q Q Q逼近真实分布 P P P,例如在语言模型中,交叉熵损失对应“预测下一个token的概率与真实token的匹配程度”,而交叉熵本身可用来评估语言模型的困惑度(Perplexity)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/929414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hetao 国庆

Day 5 T3 Solution Subtask 1 可能比较具有启发性。 每个人只关心:每条路径上的最大值。我们要让这个值最小。所以容易发现他们只会在最小瓶颈树上走。 由于 MST 一定是最小瓶颈树,所以我们跑 kruskal 然后把树建出来…

详细介绍:AI健康小屋+微高压氧舱:科技如何重构我们的健康防线?

详细介绍:AI健康小屋+微高压氧舱:科技如何重构我们的健康防线?2025-10-06 14:34 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !im…

网站制作关键技术服务器可以备案别人的域名吗

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼/*程序功能&#xff1a;计算一个正整数n的阶乘&#xff0c;目前最大能运算10000的阶乘&#xff0c;可秒杀。程序意义&#xff1a;加强自己对于大数的处理。说明&#xff1a;此程序对乘法和除法还未做任何优化&#xff0c;如果用上位…

详细介绍:运维 pgsql 安装完后某次启动不了

详细介绍:运维 pgsql 安装完后某次启动不了pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

廊坊高端品牌网站建设广州西樵网站制作

基坑整体坍塌不亲身经历&#xff0c;不知其恐怖▼前段时间&#xff0c;南宁绿地中央广场房地产项目D号地块(二期)基坑北侧约60米支护桩突然崩塌&#xff01;所幸无人伤亡。深基坑施工安全生产管理要点一、基坑开挖 1、 临边防护(1)基坑施工必须按要求进行&#xff0c;具体临边防…

visual studio

Microsoft Visual Studio 无法启动程序” D:\install\installedLibllibigl-2.1.0\build\x64\Debug\INSTALL" 系统找不到指定的文件。

[MCP] StreamableHTTPServer

远程通信方式 通信方式:Stdio: 推荐,高效、简洁、本地 Streamable HTTP: 远程前置知识 SSE 全称 Server-Sent Events,中文是“服务器发送事件”。是一种基于 HTTP 的单向通信协议,由浏览器发起连接,服务器可以持…

HttpServletResponse 对象用来做什么? - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

谁有国外hs网站手表购物网站排名

核心提示&#xff1a;相信很多机友都会使用UC浏览器&#xff0c;但是其多个功能你们能了解多少? 下面小编就为大家介绍UC浏览器云标签使用方法吧! 1、打开【UC浏览器】&#xff0c;点击【多窗口】按钮&#xff0c;然后点击【云标签】;(如下图所示) 2、登陆微博、QQ等&#…

牛客 周赛109 20250924

牛客 周赛109 20250924 https://ac.nowcoder.com/acm/contest/116945 A: 题目大意: 给定两个坐标,判断和原点一起能否构成一个直角三角形 void solve(){double x, y, u, v;cin >> x >> y >> u &g…

域名网站如何做市场推广长沙网页网站制作

在赋予一个string值的时候&#xff0c;可以用单引号或者双引号。 1.单引号和双引号的区别&#xff1a; 单引号&#xff1a;不会翻译变量。 双引号&#xff1a;会翻译变量&#xff0c;会将变量替换为之前赋予变量的值。 例子&#xff1a; &#xff08;1&#xff09;单引号&a…

建歌网站多少钱温州网站建设价格

💡💡💡本文独家改进:卷积和注意力融合模块(CAFMAttention),增强对全局和局部特征的提取能力,2024年最新的改进思路 💡💡💡创新点:卷积和注意力巧妙设计 💡💡💡如何跟YOLOv8结合:1)放在backbone后增强对全局和局部特征的提取能力;2)放在detect前面,增…

罗技G102螺丝型号

共有三种,都是PH00螺丝(反正就就是很小的十字螺丝) 外壳固定用  M1.4*4mm  直径3mm厚0.5的平头螺丝  共三个 侧键固定用  M2*4mm   直径5mm厚0.5的平头螺丝  共俩个 主板固定用  M1.4*3mm  直径4…

详细介绍:深入剖析C#构造函数执行:基类调用、初始化顺序与访问控制

详细介绍:深入剖析C#构造函数执行:基类调用、初始化顺序与访问控制pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

公司网站建设进度vitality wordpress

TCP与UDP TCP 是面向连接的、可靠的流协议&#xff0c;通过三次握手建立连接&#xff0c;通讯完成时要拆除连接。 UDP是面向无连接的通讯协议&#xff0c;UDP通讯时不需要接收方确认&#xff0c;属于不可靠的传输&#xff0c;可能会出现丢包现象 端口号&#xff1a; 端口号用…

上海网站建设 销售营销型网站开发推荐

一、产品介绍 此次发布一款7寸高清全新外壳产品&#xff0c;让HMI人机界面家族再添一新成员。该产品相比其他外壳有以下5个大改动&#xff1a; 1 表面玻璃盖板使用2.5D立体结构&#xff1b; 2 液晶盖板采用一体黑设计&#xff0c;且液晶屏与触摸板是全贴合结构&#xff1b; …

广州网站建设培训学校seo优化外包

了解动态内存函数 前言&#xff1a;一、malloc函数二、calloc函数三、realloc函数四、free函数 前言&#xff1a; 在C语言中&#xff0c;动态内存函数是块重要的知识点。以往&#xff0c;我们开辟空间都是固定得&#xff0c;数组编译结束后就不能继续给它开辟空间了&#xff0…

[LUCKY」在Windows下使用STUN穿透实现Minecraft联机并设置SRV记录

[LUCKY」在Windows下使用STUN穿透实现Minecraft联机并设置SRV记录2024.02.18 本教程目标 在无公网环境低成本的实现较为稳定的 Minecraft Java版联机(服务器) 目前常见的联机(服务器)方法及其问题(针对好友联机和小…

系统管理员的日常困境与幽默自嘲

这篇文章通过Reddit论坛上系统管理员们的真实讨论,展现了IT专业人员面对"请联系系统管理员"这类提示时的无奈与幽默,揭示了技术支持工作中的常见困境和职业共鸣。这篇文章通过Reddit论坛上系统管理员们的真…

46设计网站官网网站开发项目团队人员

前言 如果你被hutool坑过、被fastjson坑过&#xff0c;nicetool帮你解脱&#xff01; 如果你想用稳定、Spring原生的工具类&#xff0c;nicetool已帮你封装&#xff01; nicetool不生产工具&#xff0c;只是JDK和Spring的封装侠&#xff01; 介绍 nicetool&#xff1a;超好…