pytorch的CrossEntropyLoss交叉熵损失函数默认reduction是平均值

pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的,即多个样本输入后获取的是一个均值标量,而不是样本大小的向量。

复制代码
net = nn.Linear(4, 2)
loss = nn.CrossEntropyLoss()
X = torch.rand(10, 4)
y = torch.ones(10, dtype=torch.long)
y_hat = net(X)
l = loss(y_hat, y)
print(l)

打印的结果:tensor(0.7075, grad_fn=<NllLossBackward0>)

以上是对10个样本做的均值的标量

复制代码
net = nn.Linear(4, 2)
loss = nn.CrossEntropyLoss(reduction='none')
X = torch.rand(10, 4)
y = torch.ones(10, dtype=torch.long)
y_hat = net(X)
l = loss(y_hat, y)
print(l)

在构造CrossEntropyLoss时候加入 reduction='none',就把默认求平均取消掉了

打印结果:

复制代码
tensor([0.6459, 0.7372, 0.6373, 0.6843, 0.6251, 0.6555, 0.5510, 0.7016, 0.6975,
        0.6849], grad_fn=<NllLossBackward0>)

以上是10个样本各自的loss值

上图是pytorch的CrossEntropyLoss的构造方法,默认是 reduction='mean'

此外,使用反向传播计算梯度也会发生变化,loss值调用backward()要求loss值是一个tensor标量,如果是reduction='none',loss值得到的是tensor向量,会报错。 loss值需要求和或者求平均得到标量再进行backward()的计算

复制代码
l = loss(y_hat, y)
l.sum().backward()

至于为什么求和或者求平均都可以,首先要看下更新梯度的计算公式

求和学习率就调整的大一点,求均值的话学习率就可以小一点,总之就是除以样本数这个操作可以放到调整学习率中

相关推荐
Wnq1007221 分钟前
世界模型 AI:认知跃迁的可行性与本质性挑战
人工智能
穷人小水滴22 分钟前
科幻 「备用肉身虫」 系列设定集 (AI 摘要)
人工智能·aigc·科幻·未来·小说·设定
老赵聊算法、大模型备案26 分钟前
北京市生成式人工智能服务已备案信息公告(2025年12月11日)
人工智能·算法·安全·aigc
咬人喵喵29 分钟前
上下文窗口:AI 的“大脑容量”
人工智能
workflower29 分钟前
时序数据获取事件
开发语言·人工智能·python·深度学习·机器学习·结对编程
weixin_4461224630 分钟前
一个案例验证 LLM大模型编码能力哪家强
人工智能
C++业余爱好者1 小时前
Java 提供了8种基本数据类型及封装类型介绍
java·开发语言·python
老蒋新思维1 小时前
创客匠人峰会深度解析:知识变现的 “信任 - 效率” 双闭环 —— 从 “单次交易” 到 “终身复购” 的增长密码
大数据·网络·人工智能·tcp/ip·重构·数据挖掘·创客匠人
java1234_小锋2 小时前
Transformer 大语言模型(LLM)基石 - Transformer架构详解 - 编码器(Encoder)详解以及算法实现
深度学习·语言模型·transformer
大刘讲IT2 小时前
面向中小企业的企业AI Agent未来3年构建蓝图规划
人工智能·经验分享·ai·开源·制造