지노랩 /JinoLab

4. 단일 입력·다중 출력(Single Input, Multiple Output) 신경망(perceptron) 구조 본문

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

4. 단일 입력·다중 출력(Single Input, Multiple Output) 신경망(perceptron) 구조

지노랩/JinoLab 2025. 7. 30. 09:42

 

1. 구조 설명

flowchart LR
    Input[감정 상태: sad] --> Mult0[× w_temp] --> Out0[온도 예측: y₀]
    Input --> Mult1[× w_humi] --> Out1[습도 예측: y₁]
    Input --> Mult2[× w_aq]  --> Out2[공기질 예측: y₂]
  • 입력(Input): 하나의 값(예: 사람의 기분 sad)
  • 가중치(Weights):
    • w_temp: 온도 예측용
    • w_humi: 습도 예측용
    • w_aq: 공기질 예측용
  • 출력(Outputs):
    • y₀ = sad × w_temp
    • y₁ = sad × w_humi
    • y₂ = sad × w_aq

이렇게 하나의 입력값을 각기 다른 가중치와 곱해서 3개의 예측값을 동시에 얻을 수 있습니다.


2. 의사코드(Pseudocode)

function predict_all(input, weights[3], outputs[3]):
    for i from 0 to 2:
        outputs[i] = input * weights[i]
    return outputs
  • input : 스칼라 값
  • weights : 길이 3 짜리 1차원 배열
  • outputs : 길이 3 짜리 1차원 배열 (결과 저장)

3. C 언어 구현

헤더 파일: simple_nn.h

#ifndef SIMPLE_NN_H
#define SIMPLE_NN_H

/**
 * @brief 단일 입력·다중 출력 퍼셉트론 예측 함수
 * @param input    입력값 (스칼라)
 * @param weights  가중치 배열 (크기 n_outputs)
 * @param outputs  결과 저장 배열 (크기 n_outputs)
 * @param n_outputs 출력 개수
 */
void predict_all(double input,
                 const double *weights,
                 double *outputs,
                 int n_outputs);

#endif // SIMPLE_NN_H

구현 파일: simple_nn.c

#include "simple_nn.h"

void predict_all(double input,
                 const double *weights,
                 double *outputs,
                 int n_outputs) {
    for (int i = 0; i < n_outputs; i++) {
        outputs[i] = input * weights[i];
    }
}

메인 파일: main.c

#include <stdio.h>
#include "simple_nn.h"

int main(void) {
    double mood   = 8.0;                   // 예시 입력: 기분(sad)을 스케일링한 값
    double weights[3] = {1.2, 0.5, 0.8};   // 순서대로 [온도, 습도, 공기질] 가중치
    double outputs[3];                     // 예측값 저장 배열

    // 3가지 예측 수행
    predict_all(mood, weights, outputs, 3);

    // 결과 출력
    const char *labels[3] = {"온도", "습도", "공기질"};
    for (int i = 0; i < 3; i++) {
        printf("%s 예측값: %.2f\n", labels[i], outputs[i]);
    }

    return 0;
}

4. 빌드 & 실행

gcc -o SimpleNN main.c simple_nn.c
./SimpleNN

예시 출력:

온도 예측값: 9.60
습도 예측값: 4.00
공기질 예측값: 6.40

5. 핵심 정리 및 확장 과제

  • 핵심 연산: outputs[i] = input × weights[i]
  • 확장 아이디어:
    1. 입력 벡터로 확장: 다차원 입력 x[j] × 가중치 행렬 w[j][i] → 다중 입력·다중 출력 네트워크
    2. 편향(bias) 추가: y = x·w + b 형태로 오프셋 보정
    3. 활성화 함수(ReLU, Sigmoid 등) 적용
    4. 경사하강법 구현하여 가중치 자동 학습

이 예제를 기반으로, 신경망의 기본 빌딩 블록을 차근차근 확장해 보세요. 다음에는 다층 퍼셉트론(MLP) 구조를 구현해 보고, 역전파(backpropagation) 알고리즘을 통해 가중치를 학습시키는 과정을 다룹니다!