如何使用Python实现softmax函数的反向传播?
作者:远山有雾青石小巷
时间:2023-05-08
浏览:6
反向传播求导可以看到,softmax计算了多个神经元的输入,在反向传播求导时,需要考虑对不同神经元的参数求导。分两种情况考虑:当求导的参数位于分子时当求导的参数位于分母时当求导的参数位于分子时:当求导的参数位于分母时(ez2orez3这两个是对称的,求导结果是一样的):代码importtorchimportmathdefmy_softmax(features):_sum=0foriinfeatures:_sum+=math.e**ireturntorch.Tensor([math.e**i/_sumfor
本文目录
反向传播求导
可以看到,softmax 计算了多个神经元的输入,在反向传播求导时,需要考虑对不同神经元的参数求导。
分两种情况考虑:
当求导的参数位于分子时
当求导的参数位于分母时

当求导的参数位于分子时:

当求导的参数位于分母时(ez2 or ez3这两个是对称的,求导结果是一样的):


代码
import torch import math def my_softmax(features): _sum = 0 for i in features: _sum += math.e ** i return torch.Tensor([ math.e ** i / _sum for i in features ]) def my_softmax_grad(outputs): n = len(outputs) grad = [] for i in range(n): temp = [] for j in range(n): if i == j: temp.append(outputs[i] * (1- outputs[i])) else: temp.append(-outputs[j] * outputs[i]) grad.append(torch.Tensor(temp)) return grad if __name__ == '__main__': features = torch.randn(10) features.requires_grad_() torch_softmax = torch.nn.functional.softmax p1 = torch_softmax(features,dim=0) p2 = my_softmax(features) print(torch.allclose(p1,p2)) n = len(p1) p2_grad = my_softmax_grad(p2) for i in range(n): p1_grad = torch.autograd.grad(p1[i],features, retain_graph=True) print(torch.allclose(p1_grad[0], p2_grad[i]))
作者最新文章
即梦AI怎么局部重绘修改图片?
2026-10-27 23:22
blender节点快捷键使用技巧详解教程
2026-10-18 14:21
漫蛙如何解除管控
2026-10-13 13:02
camtasia studio怎么导出视频和字幕
2026-10-12 09:22
iphone电池不耐用怎么修复?实用方法教程
2026-09-22 15:16
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多

































