지노랩 /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. 다음 과제
- 여러 데이터 샘플을 배열로 저장하고, 배치 학습 또는 온라인 학습 구현
- 편향(bias) 항 추가
- 비선형 활성화 함수 (예: 시그모이드) 적용
- 다층 퍼셉트론(MLP) 에도 동일한 델타 룰(역전파) 적용
이 예제를 통해 “학습” 단계에서 오차를 줄이기 위해 가중치를 어떻게 업데이트하는지 이해하시길 바랍니다.
'프로그래밍 > C언어를 이용한 Deep Learning' 카테고리의 다른 글
| 14. 경사하강법(Gradient Descent) (3) | 2025.08.09 |
|---|---|
| 13. 브루트 포스 학습(Brute‑Force Learning) (1) | 2025.08.08 |
| 11. 텐서(Tensor) 기본 개념 (2) | 2025.08.06 |
| 10. 비교(compare) / 오차(error) 계산 (1) | 2025.08.05 |
| 9. 은닉층(hidden layer) (4) | 2025.08.04 |