cross entropy与softmax求导(1) 思路

softmax是向量函数,输入向量并输出另一个向量,

“对softmax求导”,到底是在对什么求导?

 

对向量函数求导 得到的是一个矩阵: (不要在意字母的含义) 

 

因为有多个输出,要明确的是:计算哪个输出元素的导数?

以及,由于softmax具有多个输入,所以也要明确:计算它(这个输出元素)关于哪个输入元素的偏导数?

求导在这里更具体的表述是: 求第 i 个输出关于第 j 个输入的偏导数

这样:

 

 

求导是为了配合cross entropy来进行backpropagation,

假设最后cross entropy中进行计算的one-hot向量的第 i 位为1,其余的为0,

我们只要求出 第 i 个输出关于 每一个输入元素的偏导数就可以了,

因为其他的输出都乘以0了,对loss没有贡献,

 

 

对于所有的输入元素,用 j 来表示输入元素的序号,这里又分两种情况,

(1) j 等于 i 时,即第 i 个输入变量 ;

(2) j 不等于 i 时;

 

这两种情况下,偏导数的公式是不同的

 j 等于 i 时,softmax分子分母都含有第 j 个输入元素,

 j 不等于 i 时,softmax只有分母含有第 j 个输入元素,

 

转载并自己发挥:https://blog.csdn.net/cassiePython/article/details/80089760

转载于:https://www.cnblogs.com/yummy-roast-duck/p/9638879.html

在 PyTorch 中,`nn.CrossEntropyLoss` 是一个常用的损失函数,通常用于多分类问题中。该函数将 softmax 函数和负对数似然损失函数结合在一起,可以直接计算神经网络的输出和真实标签之间的交叉熵损失。 `nn.CrossEntropyLoss` 的输入包括两个部分:神经网络的输出和真实标签。其中,神经网络的输出是一个形状为 `(batch_size, num_classes)` 的张量,其中 `batch_size` 表示批次大小,`num_classes` 表示类别数;真实标签是一个长度为 `batch_size` 的一维张量,其中每个元素的取值范围为 `[0, num_classes-1]`。 使用 `nn.CrossEntropyLoss` 可以在训练过程中方便地计算损失值,并且该函数还可以自动进行反向传播求导。下面是一个简单的使用 `nn.CrossEntropyLoss` 的示例代码: ```python import torch import torch.nn as nn # 定义神经网络的输出和真实标签 outputs = torch.randn(10, 5) # batch_size=10, num_classes=5 labels = torch.tensor([2, 4, 1, 0, 3, 2, 2, 1, 4, 0]) # 定义损失函数 criterion = nn.CrossEntropyLoss() # 计算损失值 loss = criterion(outputs, labels) # 打印损失值 print(loss.item()) ``` 在上面的示例中,`outputs` 的形状为 `(10, 5)`,表示有 10 个样本,每个样本有 5 个类别的输出得分。`labels` 是一个长度为 10 的一维张量,表示 10 个样本的真实标签。定义损失函数时,我们直接使用 `nn.CrossEntropyLoss()`,不需要额外设置参数。使用 `loss.item()` 可以得到一个标量,表示该批次样本的平均交叉熵损失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值