pytorch-forecasting SMAPE

이성준·2023년 8월 29일
0

Pytorch

목록 보기
5/5

최근에 다른 실험을 하던 도중에 결과가 내예상대로 안나오는 부분을 발견하고 코드를 유심히 살펴보았는데, 이전에 작성한 코드들에서도 똑같은 문제가 발생했을 거라는 생각이 들어서 해당 문법을 살펴본 결과 역시나 그랬다.. 이미 교수님께 결과 전송을 마치고 같이 분석도 한 상황이라서 교수님께 죄송하고 믿고 싶지 않았다. 그러면 어떤 내용일지 공유를 해보겠다.

pytorch-forecasting의 SMAPE


우선 내가 발생한 오류는 loss를 구하는데에 있어서 발생했는데, 이전에 contest에서도 비슷한 오류를 발견했었는데, contest는 Interval 예측이라서 오류가 가시적으로 나왔다. 그래서 발견이 늦었는데, 우선 위의 사진을 보면 통상적으로 아는 SMAPE가 나와 있음을 확인할 수 있다.
나는 loss를 구하기 위해서 out Tensor와 Target Tensor의 size를 통일 시켰는데 따라서, loss가 잘못 계산 될거라는 생각 자체를 하지를 않았다.
그래서 설마하고 out과 Target Tensor의 size를 바꾸기 전과 바꾸고 나서의 loss를 찍어봤는데,

위와 같이 loss가 달라지는 것을 확인할 수 있었다. loss의 중요성은 contest에서 얼마전 깨달은 만큼 이것이 심각한 성능이상을 초래할 수 있다는 것을 직감하고 서둘러 document를 확인했다.

SMAPE의 y_pred에 to_prediction이라는 클래스 메소드가 적용된것을 확인할 수 있는데 이것은 만약에 3차원[일반적으로 시계열에서 Tensor는 다음과 같이 구성돼있다.(Batch Size,Sample Length, Feature_dimension)] Prediction을 받게 되면 y_pred = y_pred[...,0] 즉 마지막 차원의 첫번째 원소를 y_pred로써 사용하는 것을 볼 수 있는데, 이는 결론적으로 prediction의 차원을 하나 줄이는 셈이 된다.

결국 위와같이 label과 output간의 size가 mismatch된 상태로 SMAPE값을 계산하게 하여서 문제가 발생하게 된다.

reduction이 어떻게 작동하는지 확인해봤다
링크
일단 outputs와 labels를 뺀 Tensor의 Size는 다음과 같다.

결국 SMAPE를 reduction(default = 'mean')을 하기전에 Tensor의 size는 위와 같이 31,31,1일텐데 이때 Batch의 첫번째 값들만을 평균내서 output으로 내는 것으로 보인다.

내가쓰는 pytorch-forecasting의 document version이 나오지 않아서 reduction이 어떻게 작용하는지는 확인하지 못했는데 일반적으로 reduction은 여러 loss를 하나의 loss로 바꾸는데에 관한 논의이기 때문에, 위의 예시처럼 사이즈가 달라지면 오류가 발생한다.

Trouble Shooting

이 문제를 해결하기 위해서는 Target과 Prediction을 모두 2차원으로 바꾸면 깔끔하게 해결된다.
그이유는 위에 코드중에서 y_pred.ndim==3에 걸리지 않기 때문이다.

혹은 그냥 SMAPE,RMSE,MAPE등의 LossFunction코드를 직접짜는게 나을 것이다..


위와 같이 깔끔하게 맞아 떨어지는 것을 확인할 수 있다.

profile
Time-Series

0개의 댓글