为防止错过月来客栈给大家推送的最新文章,大家可以手动将公众号设置为“星标⭐”以第一时间获得推送,感谢大家~
在上一篇文章中,笔者介绍了如何推导以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]])