如何使用Python实现softmax函数的反向传播?
作者:远山有雾青石小巷
时间:2023-05-07
来源:互联网
浏览:0
反向传播求导可以看到,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]))
作者最新文章
2026年车市新势力崛起:新车型精准发力 单月销量突破两万大关
2026-08-25 15:36
黄渤亮相重庆赛力斯工厂 共庆全新一代问界M9全国首批用户交付盛典
2026-08-25 15:35
iPhone14Pro怎么关闭待机显示 iPhone14Pro关闭待机显示教程
2026-08-25 14:21
荣耀 X80 Pro Max 手机获 SGS 五星抗摔认证 并推出免费换屏服务
2026-08-25 11:41
小米 REDMI K 系列新款 K90 至尊版月底发布
2026-08-25 11:14
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多
Windows 10
Windows
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式
Windows/macOS/Linux
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















