이론과 구현이 다르다?
- logistic regression의 이론 공부를 마치고 나면 아래와 같이 생각이 정리된다.
- output layer에 softmax layer를 두어 weited sum 의 output을 prob 형태로 변경한다.
- prob 형태로 나온 output에 대해 실제 정답분포와의 cross entropy loss 를 사용하여 loss를 계산한다.
- 근데... pytorch로 구현할때는...
- output layer 에 softmax를 취하지 않고 바로 CrossEntropyLoss 를 적용한다...
왜?
- pytorch 의 CrossEntropyLoss 안에 Softmax (정확하게는 log_softmax) 가 구현되어 있기 때문이다.
왜 이렇게 구현이..???
- softmax 함수를 취할때 exp 함수를 적용하며, cross entropy를 계산할때 다시 log를 취한다....
- 그럼 원래대로 돌아온다...
다시 원복될거 두번할 필요도 없을 뿐더러... 더 중요한 이유가 있는데,
softmax를 취하기 위해 exp 함수를 적용하면서 overflow 문제가 발생하는 것이 더 주된 이유이다.
exp 함수를 취할때 overflow가 발생하면 log를 취하더라도 이미 값은 유실된 후이다(..... 는 뻘소리였나...)
그래서 softmax가 따로 구현되어있지 않는 것임. 자세한 건 여기를 참조
- 다 집어치우고, softmax + CrossEntropyLoss 를 합쳐서 구현하면... forward / backward 구현이 개 쉬워진다. 더하기 빼기로 구현되어버림... (당연히 계산량이 엄청 줄어듦...) 이제 진짜 이유. (공신력 있는 자료를 참고하는 습관을 갖자...)