Naver AI Tech

[주간학습 정리] Week 1

Lagom92 2024. 8. 9. 13:45

 

학습 중 생긴 이론적 이슈 및 해결방법에 대해 기록하자

 

1. nn.BCELoss() 파라미터 순서

이슈: train loss가 비정상적으로 크고 학습하면서 감소가 되지 않는다.

  • BCELoss(Binary Cross Entropy Loss)는 이진 분류 문제에서 예측값과 실측값의 차이를 측정하는데 사용된다
  • 예측값과 실측값 간의 교차 엔트로피를 계산하여 손실을 산출한다
  • loss_function = nn.BCELoss() 일때
  • loss_function(예측값, 실측값) 순서로 작성해야한다
  • 예측값과 실측값 순서가 잘못된 경우의 문제점
    • 손실값의 왜곡
    • 훈련 오류
  • 수식적인 이유 
    • 수식에서 p는 예측값(0~1 사이의 확률값), y는 실측값(0 또는 1)을 의미한다
    • 참고로 log의 경우, log(0) = -infinity 이고 log(1) = log(1) 이다
    • 즉, 예측값과 실측값의 입력 순서가 바뀔경우, 계산상에 오류가 발생한다

import torch.nn as nn

loss_function = nn.BCELoss()

# pre: 예측값, gt: 실측값
loss = loss_function(pred, gt)

 

 

2. torch.max(t, 0) vs torch.max(t, torch.tensor(0.)) 비교

이슈: 원하는데로 양수 결과값이 반환되지 않는다

  • 텐서 t 가 있을때
  • torch.max(t, 0)은 t 텐서와 스칼라값 0을 비교한것이 아니라 t 텐서의 특정 차원에 대한 최대값을 계산한다
    • 0은 차원을 의미하며, t 텐서의 첫번째 차원에 대한 최대값을 계산한다
    • 이 연산은 다음 두개의 결과를 반환한다
      • 최대값 텐서: 각 위치에서 최다값을 포함하는 텐서
      • 인덱스 텐서: 각 위치에서 최대값을 가진 원소의 인덱스를 포함하는 텐서
  • torch.max(t, torch.tensor(0.))은 t 텐서의 각 요소와 스칼라값 0을 비교하여 최대값을 계산한다
    • t 텐서의 각 요소와 0을 비교하여 최대값을 포함하는 새로운 텐서를 반환한다

 

import torch

t = torch.tensor([1.2])

torch.max(t, 0)
'''
torch.return_types.max(
values=tensor(1.2000),
indices=tensor(0))
'''

torch.max(t, torch.tensor(0))
'''
tensor([1.2000])
'''