
678
4
밑바닥부터 구현하는 딥러닝
19.3
앞서 ‘음의 로그 가능도’ 함수를 정의한 코드를 본 적이 있습니다.
def nll(input, target): return -input[range(target.shape[0]), target].mean()
그런데 파이토치의
nll
과 같은 방식으로 정의했기 때문에 이름과는 달리 로그가 적용되지는
않았습니다. 즉 로그를 소프트맥스와 함께 처리해야 합니다.
>>> def log_softmax(x): return (x.exp()/(x.exp().sum(-1,keepdim=True))).log()
>>> sm = log_softmax(r); sm[0][0]
tensor(-1.2790, grad_fn=<SelectBackward>)
이 셋을 조합하면 비로소 교차 엔트로피 손실을 얻을 수 있습니다.
>>> loss = nll(sm, yb)
>>> loss
tensor(2.5666, grad_fn=<NegBackward>)
로그의 다음 성질을 고려해보죠.
− log
= log a
b
이에 따라
(
x
.
exp
()/(
x
.
exp
().
sum
(-
1
)).
log
()
로 정의되었던 로그 소프트맥스의 계산을
단순화할 수 있습니다.
>>> def log_softmax(x): return x - x.exp().sum(-1,keepdim=True).