AI 개발 공부 공간

AI, 머신러닝, 딥러닝, Python & PyTorch, 실전 프로젝트

딥러닝/딥러닝: 기초 개념

오차 역전파법과 손실함수

qordnswnd123 2025. 1. 14. 11:18

1. 오차 역전파법

1) 오차 역전파법

오차 역전파법은 신경망에서 가중치를 효율적으로 조정하기 위한 알고리즘입니다.

신경망의 출력과 실제 값 사이의 오차를 계산하고, 이 오차를 신경망을 거슬러 올라가며 각 뉴런의 가중치에 대한 손실 함수의 기울기(미분값)를 계산합니다.

이 기울기는 가중치를 조정하는 데 사용되며, 모델의 성능을 개선합니다.

이 과정에는 두 가지 주요 단계가 있습니다.

 

순전파: 이때는 데이터가 신경망의 시작점에서부터 끝점까지 흐릅니다. 각 층의 뉴런들이 신호를 받아 처리하고, 마지막에는 컴퓨터가 예측을 내놓습니다.

 

역전파: 이 단계에서는 신경망이 내놓은 예측이 얼마나 잘못됐는지, 즉 오차를 계산합니다. 그리고 나서 그 오차를 각 층을 거슬러 올라가며 전파합니다. 이때 각 뉴런의 가중치가 조금씩 조정되며 오차를 줄여나가게 됩니다.

 

2) 오차의 계산

신경망의 예측 결과와 실제 정답을 비교해서 차이를 측정합니다.

이 차이가 바로 오차이고, 이 오차를 줄여나가는 것이 신경망 학습의 목표입니다.

오차 역전파법은 이 오차를 줄여나가면서 신경망이 더 나은 예측을 할 수 있도록 돕습니다.

 

3) 오차 역전파의 중요성

이 오차 역전파법은 특히 복잡한 패턴을 학습하고 있는 신경망에서 중요합니다.

신경망이 많은 층으로 이루어져 있을수록, 각 층의 뉴런들의 가중치를 적절하게 조정하는 것이 중요하기 때문입니다.

결국, 오차 역전파법은 신경망이 우리가 마주한 문제를 잘 해결할 수 있도록 가르치는 데 필수적인 단계입니다.

그러나 이 모든 것은 신경망이 얼마나 잘못하고 있는지, 즉 오차의 크기를 어떻게 알 수 있는지로부터 시작합니다.

오차의 크기를 측정하기 위해 우리는 '손실 함수'라는 도구를 사용합니다.

 

4) 수식화

오차 역전파법에 사용되는 기본 수식은 연쇄법칙(Chain Rule)을 이용한 편미분입니다.

간단한 신경망을 예로 들면, 비용 함수 C에 대해 각 가중치 w의 편미분은 다음과 같이 표현됩니다.

∂C/∂w = (∂C/∂a) × (∂a/∂z) × (∂z/∂w)

  • ∂C/∂a는 비용 함수 C를 활성화 함수 a로 미분한 값입니다.
  • ∂a/∂z는 활성화 함수 a를 네트워크의 가중 입력 z로 미분한 값입니다.
  • ∂z/∂w는 가중 입력 z를 가중치 w로 미분한 값입니다.

이 수식은 신경망의 각 레이어를 거슬러 올라가며 가중치에 대한 비용 함수의 그래디언트를 계산하고, 그 결과를 이용하여 가중치를 업데이트합니다.

역전파법은 신경망의 모든 가중치에 대해 이러한 계산을 반복함으로써, 네트워크의 학습이 최소 비용 경로를 따라 효과적으로 진행됩니다.


2. 손실함수

1) 손실 함수

손실 함수, 때로는 비용 함수라고 불리는 이 용어는 신경망 학습에서 정말 중요한 역할을 합니다.

손실함수는 신경망의 예측이 실제와 얼마나 차이나는지를 알려주는 점수판과 같습니다.

점수가 낮을수록, 즉 손실이 적을수록 모델은 더 잘 학습하고 있다는 뜻입니다.

손실을 줄이기 위해, 모델은 스스로 조금씩 개선해 나가게 됩니다.

 

2) 손실 함수는 사용시기

손실 함수는 모델이 학습하는 순간부터 항상 함께합니다.

모델이 새로운 데이터를 보고 예측을 할 때마다, 손실 함수는 예측이 얼마나 정확한지를 점검합니다.

이 점검 결과를 바탕으로 모델은 자신이 어떤 부분을 개선해야 할지 알게 되고, 조금씩 더 나은 방향으로 발전해 나가게 됩니다.

이러한 과정을 통해, 모델은 점점 더 정확한 예측을 할 수 있게 됩니다.

 

3) 손실 함수의 장단점과 특징

손실 함수는 신경망의 학습 과정에 있어서 나침반과 같은 역할을 합니다.

이 나침반은 모델이 올바른 방향으로 나아가고 있는지, 아니면 조정이 필요하지를 알려줍니다.

 

장점:
손실 함수가 모델의 성능을 매우 직관적으로 나타내 준다는 점이 있습니다.

숫자 하나로, 모델이 얼마나 잘 또는 못하고 있는지를 파악할 수 있습니다.

또한, 여러 손실 함수가 있기 때문에, 사용자는 자신의 모델에 맞는 가장 적합한 손실 함수를 골라 사용할 수 있는 유연성도 제공합니다.

 

단점:
하지만 모든 모델에 가장 적합한 손실 함수는 없다는 점이 단점입니다.

각각의 모델, 각각의 데이터 특성에 따라 적합한 손실 함수가 다르기 때문에 프로그래머는 가장 적합한 손실 함수를 찾는 것이 도전적인 일이 될 수 있습니다.

또한, 여러 학습 과정을 비교하고 그 결과를 분석해야 할 수도 있습니다.

 

손실 함수를 선택할 때는 문제의 유형(예: 회귀, 분류), 데이터의 특성, 그리고 최종적으로 달성하고자 하는 목표를 고려해야 합니다.

결론적으로, 손실 함수는 모델의 성능 향상을 위한 중요한 도구이지만, 적절한 선택이 필수적입니다.

올바른 손실 함수를 선택하는 것은 때로는 복잡하고 시간이 걸릴 수 있지만, 이 과정을 통해 모델의 예측 능력을 크게 향상시킬 수 있습니다.

 

4) 손실 함수의 종류

손실 함수를 통한 학습 과정은 모델이 데이터를 '이해'하고, 주어진 테스트에 대해 더 정확한 예측을 할 수 있도록 만듭니다.

따라서, 손실 함수는 단순히 오차를 측정하는 도구를 넘어, 모델 성능 향상의 중심 축으로 작용합니다.

손실 함수에는 여러 유형이 있으며 각각은 다양한 유형의 예측 작업에 적합합니다.

  • 평균 제곱 오차(MSE): 회귀 문제에 일반적으로 사용되는 MSE는 예측 값과 실제 값 간의 평균 제곱 차이를 계산합니다. 작은 오차보다 큰 오차를 강조하여 모델이 큰 값을 정확하게 예측하도록 합니다.
  • 이진 교차 엔트로피(Binary Cross-Entropy): 이진 분류 작업에 사용되는 교차 엔트로피 손실의 특별한 경우입니다. 각 클래스 레이블(1 또는 0)에 대한 손실을 계산하고 결과를 활용하여 예측이 이진 클래스 레이블과 얼마나 떨어져 있는지 효과적으로 측정합니다.
  • 카테고리컬 교차 엔트로피(Categorical Cross-Entropy): 다중 클래스 분류 문제에 적합한 이 손실 함수는 모델의 출력이 여러 클래스에 대한 확률 분포일 때 사용합니다. 예측 확률 분포가 실제 레이블의 분포와 얼마나 다른지를 측정하여, 분류 모델 학습에 매우 효과적입니다.
  • 손실 함수의 선택은 학습 수행 중인 특정 작업과 데이터의 특성에 따라 달라집니다. 예를 들어 회귀 문제에서는 MSE 또는 MAE(평균 절대 오차)를 사용하는 경우가 많은 반면, 분류 작업에서는 일종의 교차 엔트로피를 선호하는 경우가 많습니다.

본질적으로 손실 함수는 신경망의 인식 예측과 우리가 예측하려는 실제 결과 사이를 연결하는 다리입니다.

손실 함수는 네트워크의 예측이 얼마나 '잘못' 또는 '어긋나는지를 효과적으로 정량화함으로써 학습 과정을 지시합니다.

순방향 및 역방향 전파의 반복을 통해 신경망은 손실 함수의 기울기를 사용하여 가중치를 업데이트하고 점차적으로 예측을 향상시킵니다.

손실 함수를 최적화하는 과정은 신경망이 실수로부터 학습하여 가중치를 점진적으로 조정하는 안내식 시행착오와 유사합니다.

시간이 지남에 따라 이러한 조정은 전체 오류를 줄여 예측 시 네트워크의 정확도를 향상시킵니다.

손실 함수에 의해 구동되는 이러한 반복적 최적화는 데이터로부터 학습하는 신경망 능력의 핵심입니다.


3. 평균 제곱 오차(MSE)

1) 평균 제곱 오차(MSE)

평균 제곱 오차(MSE)는 실제 값과 예측 값 사이의 차이를 제곱한 것의 평균입니다.

이는 회귀 문제에서 널리 사용되는 손실 함수로, 모델의 예측이 실제 데이터와 얼마나 잘 일치하는지를 측정하는 지표입니다.

MSE 값이 낮을수록 모델의 예측 정확도가 높다는 것을 의미합니다.

 

2) 언제 사용하는가?

MSE는 주로 회귀 문제에 사용됩니다.

예측값과 실제값 사이의 차이를 정량화하여 모델의 성능을 평가하고 개선하는 데 사용됩니다.

MSE를 사용하는 이유는 그 값이 최소화될 때, 모델이 실제 데이터를 가장 잘 예측하는 것으로 간주되기 때문입니다.

 

3) MSE의 장단점

장점

  • 오류의 크기를 강조하여 큰 오류에 더 큰 페널티를 부여합니다.
  • 결과적으로 모델이 큰 오류를 줄이는 데 더 집중하도록 합니다.
  • 계산이 간단하며, 최적화하기 용이합니다.

단점

  • 이상치(outliers)에 매우 민감합니다.
  • 작은 수의 이상치도 MSE를 크게 증가시켜 모델의 성능 평가를 왜곡할 수 있습니다.

4) 수식

MSE의 수식은 다음과 같습니다.

 

제곱을 사용하는 이유는 예측 오류의 크기를 강조하고, 오류의 방향(양수 또는 음수)이 결과에 영향을 미치지 않도록 하기 위함입니다.

 

5) 주의사항

  • 이상치(outliers)가 있을 경우, MSE 값이 크게 왜곡될 수 있습니다. 이는 이상치로 인해 발생하는 큰 오차가 전체 MSE 값을 크게 증가시키기 때문입니다.
  • 따라서, 이상치가 포함된 데이터를 사용할 때는 MSE를 손실 함수로 사용할 경우 그 영향력을 주의 깊게 고려해야 합니다.
  • 또한, MSE는 예측 값과 실제 값의 스케일에 민감하기 때문에, 다른 스케일을 가진 데이터를 비교할 때에는 이를 정규화하거나 조정해야 할 수 있습니다.

6) 코드

import torch
import torch.nn as nn

y = torch.tensor([2.5, 4.0, 1.5], dtype=torch.float)
y_hat = torch.tensor([3.0, 4.0, 2.0], dtype=torch.float)

mse_loss = nn.MSELoss()
loss = mse_loss(y_hat, y)

print(f'MSE Loss: {loss.item()}')
MSE Loss: 0.1666666716337204

 

※ 결과 해석

계산된 'MSE Loss: 0.1666666716337204' 결과는 예측 값과 실제 값 사이의 평균 제곱 오차(Mean Squared Error, MSE)가 약 0.167임을 나타냅니다.

이 값은 예측값과 실제값 사이의 차이를 제곱한 후, 그 값들의 평균을 취한 것입니다.

MSE를 계산하는 과정을 간단히 살펴보면, 실제 값과 예측 값의 차이는 다음과 같습니다.

  • 첫 번째 요소: (2.5 - 3.0 = -0.5)
  • 두 번째 요소: (4.0 - 4.0 = 0)
  • 세 번째 요소: (1.5 - 2.0 = -0.5)

이 차이를 각각 제곱하면:

  • 첫 번째 요소: (-0.5)^2 = 0.25
  • 두 번째 요소: (0)^2 = 0
  • 세 번째 요소: (-0.5)^2 = 0.25

결과적으로, 평균을 내면 MSE가 나옵니다.

MSE 값인 0.167은 모델이 실제 값과 평균적으로 얼마나 차이가 나는지를 수치화한 것입니다.

MSE 값이 이에 가까울수록 모델의 예측 정확도가 높은 것을 의미하며, 이 경우에는 모델의 예측이 실제 값에 상당히 가까웠음을 나타냅니다.


4. 이진 교차 엔트로피(Binary Cross-Entropy)

1) 이진 교차 엔트로피(Binary Cross-Entropy)

이진 교차 엔트로피(Binary Cross-Entropy, BCE)는 이진 분류 문제에서 사용되는 손실 함수입니다.

이 함수는 실제 레이블과 모델이 예측한 확률 사이의 차이를 측정하며, 모델이 얼마나 정확하게 예측했는지를 나타냅니다.

실제 레이블이 1 또는 0인 경우, 모델의 예측 확률이 실제와 어떻게 다른지를 계산하여 손실값을 제공합니다.

이 값이 작을수록 모델의 예측이 실제 레이블과 일치한다는 의미입니다.

 

2) 언제 사용하는가?

이진 교차 엔트로피는 주로 이진 분류 문제에 사용됩니다.

즉, 결과가 두 가지 중 하나만을 가질 때(예: 스팸 메일 분류, 질병 유무 판단 등) 이 손실 함수가 적용됩니다.
모델이 각 클래스에 속할 확률을 예측하며, 이 손실 함수를 통해 모델의 성능을 평가하고 개선합니다.

 

3) 이진 교차 엔트로피의 장단점

장점

  • 이진 분류 문제에서 예측 정확도를 높이는 데 매우 효과적입니다.
  • 모델이 예측한 확률과 실제 레이블 사이의 차이를 직접적으로 계산하여, 성능 개선에 도움을 줍니다.

단점

  • 이상치에 민감할 수 있으며, 특히 확률이 0 또는 1에 가까울 때 민감합니다.
  • 주로 이진 분류 문제에 한정되어 사용됩니다.

4) 수식

이진 교차 엔트로피의 수식은 다음과 같습니다.

 

5) 주의사항

이진 교차 엔트로피를 사용할 때는 모델이 0 또는 1에 가까운 확률을 예측할 때 무한대로 가는 손실을 방지하기 위해 예측 확률값에 작은 값을 더하거나 빼는 등의 조치가 필요할 수 있습니다.
또한, 데이터셋의 레이블이 잘 균형이 맞는지 확인해야 하며, 불균형한 경우 적절한 샘플링 기법이나 가중치를 적용해야 할 수 있습니다.

 

6) 코드

import torch
import torch.nn as nn

y_pred = torch.tensor([0.2, 0.8, 0.0], dtype=torch.float)
y_true = torch.tensor([0, 1, 0], dtype=torch.float)

bce_loss = nn.BCELoss()
y_pred_sigmoid = torch.sigmoid(y_pred)
loss = bce_loss(y_pred_sigmoid, y_true)

print(f'Binary Cross-Entropy Loss: {loss.item()}')
Binary Cross-Entropy Loss: 0.6207955479621887

 

※ 결과 해석

계산된 'Binary Cross-Entropy Loss: 0.6207955479621887' 결과는 모델의 이진 교차 엔트로피(Binary Cross-Entropy, BCE) 손실이 약 0.621임을 나타냅니다.

이 값은 모델의 예측 확률과 실제 레이블 사이의 차이를 기반으로 하며, 손실 함수의 계산 결과입니다.

이진 교차 엔트로피 손실은 다음과 같은 특징을 가집니다:

  • 손실 값이 낮을수록 모델의 예측이 실제 레이블에 더 가깝다는 것을 의미합니다. 즉, 모델의 예측 정확도가 높음을 나타냅니다.
  • 손실 값이 높을수록 모델의 예측과 실제 레이블 사이에 더 큰 차이가 있음을 나타냅니다. 이는 모델이 개선될 여지가 많음을 의미할 수 있습니다.

계산된 손실 값 0.621은 모델이 완벽하게 예측하는 상태(손실 값이 0)에 가까운 거리가 있음을 나타냅니다. 그러나 손실 값이 얼마나 "좋은" 또는 "나쁜"지는 상황에 따라 다를 수 있습니다. 이 값의 의미를 정확하게 해석하기 위해서는 다음과 같은 사항을 고려해야 합니다:

  • 문제의 복잡성: 분류해야 하는 문제가 복잡하거나 데이터가 모호한 경우, 높은 손실 값이 나타날 수 있습니다.
  • 데이터셋의 특성: 데이터셋에 불균형이 있거나 특정 클래스에 비중을 두는 샘플이 있는 경우 손실 값이 크게 나타날 수 있습니다.
  • 기준점(baseline): 다른 모델이나 기존 연구에서 보고된 손실 값과 비교하여 이 모델의 성능을 평가할 수 있습니다.

마지막으로, 이 손실 값이 모델 성능의 최종 평가 지표가 될 수 있으나, 모델을 개선하거나 다른 모델과 비교 분석하기 위한 출발점으로 삼을 수 있습니다.

모델을 더 개선하려면 하이퍼파라미터 조정, 더 많은 데이터 사용, 모델 구조 변경 등 다양한 방법을 시도할 수 있습니다.


5. 다중 분류 교차 엔트로피 손실 (Categorical Cross-Entropy Loss)

1) 다중 분류 교차 엔트로피 손실

다중 분류 교차 엔트로피 손실(Categorical Cross-Entropy Loss)은 세 개 이상의 클래스를 가진 분류 문제에서 사용되는 손실 함수입니다.

이 손실 함수는 모델의 예측이 실제 레이블과 얼마나 잘 일치하는지를 측정하여, 각 클래스에 대한 확률 분포와 실제 레이블 분포 사이의 차이를 계산하여 이 차이가 작을수록 모델의 예측이 정확하다는 것을 의미합니다.

 

2) 언제 사용하는가?

다중 분류 교차 엔트로피 손실은 다중 클래스 분류 문제에 사용됩니다.

예를 들어, 사진에 있는 동물이 고양이, 개, 새와 같은 여러 개의 클래스 중 하나로 분류될 때 이 손실 함수가 매우 효과적입니다.

이 손실 함수는 모델이 각 클래스에 대한 확률을 학습하도록 하며, 가장 높은 확률을 가진 클래스를 모델의 예측으로 선택하게 합니다.

 

3) 다중 분류 교차 엔트로피 손실의 장단점

장점

  • 다중 클래스 분류 문제에서 모델의 성능을 정량화해 평가할 수 있습니다.
  • 모델이 각 클래스에 속할 확률을 학습하도록 하여, 예측의 불확실성을 줄일 수 있습니다.

단점

  • 레이블이 one-hot 인코딩 되어야 하며, 클래스가 많을수록 계산 비용이 증가합니다.
  • 불균형한 데이터셋에서는 특정 클래스에 대한 모델의 성능이 과대평가되거나 과소평가될 수 있습니다.

4) 수식

다중 분류 교차 엔트로피 손실의 수식은 다음과 같습니다.

 

5) 주의사항

다중 분류 교차 엔트로피 손실을 사용할 때는 각 레이블을 one-hot 인코딩 형태로 변환해야 합니다.

이는 각 클래스가 독립적인 범주로 표현되어야 하기 때문입니다.

또한, 클래스 간 불균형이 있을 경우, 적절한 샘플링 기법이나 가중치를 적용하여 데이터의 불균형 영향을 줄이는 방안을 마련해야 합니다.

 

6) 코드

import torch
import torch.nn as nn
import torch.nn.functional as F

# 실제 레이블과 예측값 정의
# 실제 레이블은 클래스 인덱스로 제공됩니다.
y_true = torch.tensor([1, 0, 2])  # 클래스 인덱스 형태의 실제 레이블

# 모델 예측값 (로짓 값, 즉 softmax를 적용하기 전의 값)
y_pred_logits = torch.tensor([[2.0, 1.0, 0.1], 
                              [0.1, 1.5, 1.2], 
                              [1.0, 0.2, 3.0]])

# CrossEntropyLoss는 내부적으로 softmax를 적용하므로, 로짓 값을 직접 넘깁니다.
cross_entropy_loss = nn.CrossEntropyLoss()

# 손실 계산
loss = cross_entropy_loss(y_pred_logits, y_true)

print(f'Categorical Cross-Entropy Loss: {loss.item()}')
Categorical Cross-Entropy Loss: 1.227656364440918

 

결과 해석

계산된 손실 값은 "Categorical Cross-Entropy Loss: 1.227656364440918"로, 이는 모델의 예측값과 실제 레이블 사이의 평균 손실을 나타냅니다.

손실 값 1.2276은 모델이 각 샘플에 대해 올바른 클래스를 예측하는 데 있어 어느 정도의 오차가 있음을 의미합니다.

범주형 교차 엔트로피 손실은 모델이 실제 클래스에 대해 얼마나 확신을 가지고 올바르게 예측했는지를 측정합니다.

손실 값이 낮을수록 모델의 예측이 더 정확하다는 것을 의미하며, 높은 손실 값은 예측의 정확성이 낮음을 나타냅니다.

이 경우의 손실 값은 다음과 같은 과정을 통해 계산됩니다:

  1. 모델이 각 클래스에 대한 로짓(softmax를 적용하기 전의 출력) 값을 예측합니다.
  2. nn.CrossEntropyLoss는 이 로짓 값을 받아 내부적으로 softmax 함수를 적용하여 확률 분포로 변환합니다. 이후, 실제 레이블에 해당하는 확률에 대해 음의 로그 값을 취하여 손실을 계산합니다.
  3. 모든 샘플에 대한 손실의 평균을 구하여 최종 손실 값을 도출합니다.

계산된 손실 값(1.2276)은 모델이 샘플에 대한 예측을 수행하는 과정에서 발생한 평균적인 오차를 나타냅니다.

이 값을 통해 모델의 성능을 평가할 수 있으며, 손실 값을 줄이기 위한 방안을 찾을 수 있습니다.

예를 들어, 손실 값을 낮추기 위해 모델 구조를 조정하거나, 학습을 변경하거나, 데이터를 추가로 제공하는 등의 조치를 취할 수 있습니다.

손실 값이 얼마나 좋은지는 문제의 맥락, 모델의 사용 목적, 그리고 비교 기준(baseline)에 따라 달라질 수 있습니다.

이 손실 값만을 가지고 모델의 전체적인 성능을 종합적으로 판단하는 것은 어렵고, 다른 지표들과 함께 고려되어야 합니다.

'딥러닝 > 딥러닝: 기초 개념' 카테고리의 다른 글

경사하강법과 학습률  (0) 2025.01.14
손실 함수의 미분  (0) 2025.01.14
활성화 함수  (1) 2025.01.13
퍼셉트론  (0) 2025.01.13
딥러닝 입문  (0) 2025.01.13