지노랩 /JinoLab

10. 비교(compare) / 오차(error) 계산 본문

프로그래밍/C언어를 이용한 Deep Learning

10. 비교(compare) / 오차(error) 계산

지노랩/JinoLab 2025. 8. 5. 09:19

 

1. 학습 과정의 세 단계

  1. 예측(Predict)
    입력값과 현재 가중치를 이용해 모델이 출력을 생성
  2. 비교(Compare)
    모델 출력(예측값)과 실제 관측값(정답)을 비교해 오차(error) 를 계산
  3. 학습(Learn)
    오차를 줄이도록 가중치를 조정 (경사하강법 등)

이번 글에서는 ❷ 비교 단계, 즉 오차 계산에 집중합니다.


2. 오차(Error)란?

  • 예측값 y^
  • 실제값(정답, 레이블) y
  • 이 둘의 차이를 오차(error) 라고 부르며, 학습의 핵심은 이 오차를 최소화하는 가중치 w를 찾는 것

3. 오차 함수(Loss Function)

3.1 제곱 오차(Squared Error)

  • 절댓값 대신 제곱을 쓰는 이유
    1. 부호(양수·음수) 상관없이 오차를 양수로 취급
    2. 미분 시 연속·매끄러운 함수가 되어, 경사하강법 등 최적화 기법 적용 가능

3.2 평균 제곱 오차(Mean Squared Error, MSE)

  • NN개의 샘플에 대해 오차를 평균내면, 배치 학습(batch training) 시 사용

4. 단일 퍼셉트론 예제

4.1 예제 파라미터

  • 입력 x=25x = 25
  • 가중치 w=0.8w = 0.8
  • 실제값 y=26y = 26

4.2 오차 계산 과정

  1. 예측

  1. 차이(Residual)

  1. 제곱 오차

 

이 값(36)이 현재 모델의 오차이며, 학습 단계에서 이 값을 줄이도록 ww를 업데이트하게 됩니다.


5. 의사코드(Pseudocode)

function compute_error(x, w, y):
    y_pred = x * w
    e      = y_pred - y
    E      = e * e         # 제곱 오차
    return E

6. C 언어 예제 코드

#include <stdio.h>

/**
 * @brief 단일 입력·단일 출력용 제곱 오차 계산
 * @param x      입력값
 * @param w      가중치
 * @param y_true 실제값(정답)
 * @return       제곱 오차 (error)
 */
double compute_squared_error(double x, double w, double y_true) {
    double y_pred = x * w;        // 예측
    double diff   = y_pred - y_true;  // 차이
    return diff * diff;           // 제곱 오차
}

int main(void) {
    double x      = 25.0;
    double w      = 0.8;
    double y_true = 26.0;

    double error = compute_squared_error(x, w, y_true);
    printf("입력 x = %.1f, 가중치 w = %.2f, 실제 y = %.1f\n", x, w, y_true);
    printf("예측값 y_pred = %.1f\n", x * w);
    printf("제곱 오차 E = %.1f\n", error);

    return 0;
}

빌드 & 실행 예시:

gcc -o compute_error main.c
./compute_error
입력 x = 25.0, 가중치 w = 0.80, 실제 y = 26.0
예측값 y_pred = 20.0
제곱 오차 E = 36.0

7. 다음 단계: 학습(Learn)

  • 경사하강법(Gradient Descent) 을 이용해,

방식으로 가중치 조정

  • 학습률 η를 적절히 설정해 오차가 점차 줄어들도록 반복 학습 수행