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()

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

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

相关推荐
*星星之火*1 分钟前
【GPT入门】第59课 大模型内存计算指南:7B/8B/70B 模型在 32/16/8/4bit 精度下的内存需求测算
人工智能·gpt·深度学习
taxunjishu8 分钟前
ProfiNet 转 Ethernet/IP基于西门子 S7 - 1500 与罗克韦尔 PLC 的汽车零部件加工线协同案例
运维·人工智能·物联网·自动化·区块链
过往入尘土10 分钟前
从感知机到大模型:神经网络的全景解析与实践指南
人工智能
精灵vector23 分钟前
基于视觉的网页浏览Langraph Agent
python·aigc·ai编程
机器之心24 分钟前
DeepSeek刚提到FP8,英伟达就把FP4精度推向预训练,更快、更便宜
人工智能·openai
AiPy_极客团长39 分钟前
AI解决生活小事系列——用AI给我的电脑做一次“深度体检”
人工智能·python·电脑维修·实战技巧
CoovallyAIHub40 分钟前
AI如何一眼看穿鱼群健康?看改进HRNet模型实现水下健康监测
深度学习·算法·计算机视觉
小王爱学人工智能44 分钟前
神经网络模型搭建及手写数字识别案例
pytorch·python·神经网络
Go 鹏ya1 小时前
【Python学习笔记】whl包打包
笔记·python·学习
一念&1 小时前
今日科技热点 | AI创新、量子计算突破与5G应用加速:引领未来的技术浪潮
人工智能·科技·量子计算