지노랩 /JinoLab

12. 학습(Learn) / 단일 입력·단일 출력 퍼셉트론에서 오차를 줄이기 위해 가중치 본문

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

12. 학습(Learn) / 단일 입력·단일 출력 퍼셉트론에서 오차를 줄이기 위해 가중치

지노랩/JinoLab 2025. 8. 7. 09:34

 

1. 용어 정리

  • xx: 입력 값 (스칼라)
  • w: 현재 가중치
  • y^=x×w 예측값
  • y: 실제값(정답)
  • 순수 오차 δ=y^−y
    • 부호를 갖는 차이로, “예측이 얼마나, 어느 방향으로 벗어났는지” 알려 줌
  • 학습률 α
    • 가중치 업데이트 크기를 조절하는 상수 (예: 0.01)
  • 델타 가중치 Δw=α δ x
  • 업데이트:


2. 의사코드(Pseudocode)

initialize w randomly or to 0
set learning rate α (e.g. 0.01)

for each training sample (x, y):
    y_pred = x * w
    δ      = y_pred - y           # 순수 오차 (signed error)
    Δw     = α * δ * x            # 델타 룰
    w      = w - Δw               # 가중치 업데이트

3. C 언어 구현 예제

#include <stdio.h>

/**
 * @brief 단일 퍼셉트론 한 스텝 학습 함수 (델타 룰)
 * @param x   입력 값
 * @param y   실제 값 (정답)
 * @param w   가중치 (포인터로 전달하여 업데이트)
 * @param alpha 학습률
 */
void train_step(double x, double y, double *w, double alpha) {
    double y_pred = x * (*w);         // 1) 예측값
    double delta  = y_pred - y;       // 2) 순수 오차 δ
    double dw     = alpha * delta * x;// 3) 델타 가중치 Δw
    *w           -= dw;               // 4) 가중치 업데이트
}

int main(void) {
    // 학습 데이터 1개 예시 (x, y)
    double x = 25.0;
    double y = 26.0;

    // 1) 가중치 초기화
    double w = 0.0;        // 또는 작은 랜덤 값

    // 2) 학습률 설정
    double alpha = 0.01;

    // 3) 여러 에포크(epoch) 동안 반복 학습
    for (int epoch = 1; epoch <= 10; epoch++) {
        train_step(x, y, &w, alpha);
        double y_pred = x * w;
        double error  = (y_pred - y) * (y_pred - y);  // 제곱 오차
        printf("Epoch %2d: w = %.4f, y_pred = %.4f, MSE = %.4f\n",
               epoch, w, y_pred, error);
    }

    return 0;
}

4. 실행 결과 예시

gcc -o perceptron_train perceptron_train.c
./perceptron_train
Epoch  1: w = 0.0500, y_pred = 1.2500, MSE = 615.0625
Epoch  2: w = 0.0996, y_pred = 2.4900, MSE = 569.5121
Epoch  3: w = 0.1485, y_pred = 3.7125, MSE = 499.2191
Epoch  4: w = 0.1969, y_pred = 4.9213, MSE = 436.4271
Epoch  5: w = 0.2448, y_pred = 6.1201, MSE = 393.4432
Epoch  6: w = 0.2921, y_pred = 7.3030, MSE = 356.0879
Epoch  7: w = 0.3389, y_pred = 8.4725, MSE = 311.2642
Epoch  8: w = 0.3852, y_pred = 9.6294, MSE = 271.1934
Epoch  9: w = 0.4310, y_pred = 10.7750, MSE = 238.2160
Epoch 10: w = 0.4763, y_pred = 11.9107, MSE = 203.5559
  • Epoch별 변화
    • 가중치 ww가 점차 커지며, 예측값 y^ 이 실제값 y=26 쪽으로 가까워집니다.
    • MSE(제곱 오차)가 줄어드는 모습을 확인할 수 있습니다.

5. 다음 과제

  1. 여러 데이터 샘플을 배열로 저장하고, 배치 학습 또는 온라인 학습 구현
  2. 편향(bias) 항 추가
  3. 비선형 활성화 함수 (예: 시그모이드) 적용
  4. 다층 퍼셉트론(MLP) 에도 동일한 델타 룰(역전파) 적용

이 예제를 통해 “학습” 단계에서 오차를 줄이기 위해 가중치를 어떻게 업데이트하는지 이해하시길 바랍니다.