보시다시피, 소프트맥스는 여러 뉴런의 입력을 계산합니다. 역전파 파생 시에는 다양한 뉴런의 매개변수 파생을 고려해야 합니다.
두 가지 상황을 생각해 보세요.
미분을 위한 매개변수가 분자에 있을 때
미분을 위한 매개변수가 분모에 있을 때
미분을 위한 매개변수가 분자에 있을 때 분자:
미분의 매개변수가 분모에 있는 경우(ez2 또는 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]))
위 내용은 Python에서 소프트맥스 역전파를 구현하는 방법.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!