梯度grad公式_Softmax+Cross entropy 梯度检验

本文通过实例验证了使用softmax和交叉熵损失函数时的梯度求解公式,比较了手动推导的梯度与Pytorch自动微分计算的梯度,结果一致,证明公式正确。
摘要由CSDN通过智能技术生成

为防止错过月来客栈给大家推送的最新文章,大家可以手动将公众号设置为“星标⭐”以第一时间获得推送,感谢大家~

7af7d8db6ec457f4d5ce9d0bcf386d15.png

上一篇文章中,笔者介绍了如何推导以softmax + cross entropy为目标函数下的梯度求解公式,同时还介绍了如何仅通过numpy来实现反向传播的过程。但是还有一个没说到的问题就是如何对推导公式进行验证。换句话说,推导得到的这个公式正确吗?下面,我们通过一个小的示例来对结果进行验证。

假设现在某一网络最后一层的线性组合输出结果为,经过softmax作用后的输出为,正确标签为,由此我们便可以编码得到其损失的计算结果为:

import torch
def softmax(x):
    s = torch.exp(x)
    return s / torch.sum(s, dim=1, keepdim=True)

z = torch.tensor([[0.1, 0.2, 0.3], [0.5, 0.1, 0.1]], requires_grad=True)
a = softmax(z)
y = torch.tensor([[0, 0, 1], [1, 0, 0]])
l = -(y * torch.log(a)).sum()

此时,根据在上一篇文章我们推导得到的公式,,即:

grad_z = a-y
print(grad_z)

同时,我们也可以根据pytorch框架的自动微分功能计算得到损失值关于的梯度:

l.backward()
print(z.grad)

由此我们便分别得到了两种方式下关于参数的梯度,那两种方式计算得到的结果会相等吗?

tensor([[ 0.3006,  0.3322, -0.6328],
        [-0.5728,  0.2864,  0.2864]], grad_fn=)
tensor([[ 0.3006,  0.3322, -0.6328],
        [-0.5728,  0.2864,  0.2864]])

如下所示为两种方式下的计算结果,可以看到计算结果都是一样的,这也证明我们推导得到的计算公式没有任何问题。

tensor([[ 0.3006,  0.3322, -0.6328],
        [-0.5728,  0.2864,  0.2864]], grad_fn=)
tensor([[ 0.3006,  0.3322, -0.6328],
        [-0.5728,  0.2864,  0.2864]])

e7a2b04f815c12c5855b8f0d5005da48.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值