ecole42

multilayer-perceptron

multilayer-perceptron은 ecole42의 머신러닝 프로젝트로, 위스콘신 유방암 진단 데이터셋을 사용하여 암이 악성(malignant)인지 양성(benign)인지를 예측하기 위해 다층 퍼셉트론을 직접 구현하는 프로젝트. 순전파(feedforward), 역전파(backpropagation), 경사 하강법을 포함한 신경망의 핵심 알고리즘을 외부 라이브러리 없이 순수 Python으로 구현하며, ReLU, Sigmoid, Softmax 활성화 함수와 조기 종료 기능을 포함한다

Python
Machine Learning
Neural Networks

개요

multilayer-perceptron은 ecole42의 머신러닝 프로젝트로, 인공 신경망을 소개하는 프로젝트다. 이 프로젝트의 목표는 위스콘신 유방암 진단 데이터셋을 사용하여 암이 악성(malignant)인지 양성(benign)인지를 예측하기 위해 다층 퍼셉트론을 구현하는 것이다.

프로젝트 제한사항

  • 머신러닝 라이브러리 사용 금지: 신경망 모델, 활성화 함수, 역전파 알고리즘 등 모든 머신러닝 관련 기능은 외부 라이브러리(예: TensorFlow, PyTorch, scikit-learn, Keras 등)를 사용하지 않고 직접 구현해야 한다.
  • 모든 수학적 연산(행렬 연산, 활성화 함수, 손실 함수 등)과 최적화 알고리즘은 순수 Python과 NumPy 같은 기본 수학 라이브러리만 사용하여 작성해야 한다.

데이터셋

32개의 열을 가진 CSV 파일로, diagnosis 열이 예측하고자 하는 레이블이며, 나머지 모든 특성(features)을 기반으로 학습한다. diagnosis 값은 M(악성) 또는 B(양성) 중 하나다.

설치 및 실행

pip install -r requirements.txt
# 데이터 전처리
python 01.prepare.py
# 모델 학습
python 02.train.py
# 예측
python 03.predict.py

용어 설명

1. 다층 퍼셉트론 (Multilayer Perceptron)

다층 퍼셉트론(MLP)은 여러 층의 노드(뉴런)로 구성된 인공 신경망(ANN)의 한 유형으로, 각 층이 다음 층과 완전히 연결되어 있다. 복잡한 함수를 근사하고 선형적으로 분리할 수 없는 문제를 해결하기 위해 설계되었다.

구성 요소:

  • 입력층(Input Layer): 입력 데이터를 받는 층
  • 은닉층(Hidden Layers): 계산이 수행되는 하나 이상의 중간 층. 이러한 층을 통해 네트워크가 데이터의 복잡한 패턴을 학습하고 모델링할 수 있다.
  • 출력층(Output Layer): 최종 예측 결과를 생성하는 마지막 층

활성화 함수:

각 뉴런은 가중치가 적용된 입력 합에 활성화 함수(예: ReLU, sigmoid, tanh)를 적용하여 모델에 비선형성을 도입하고, 복잡한 관계를 학습할 수 있도록 한다.

2. 순전파 (Feedforward)

순전파는 입력 데이터가 신경망을 통해 입력층에서 출력층으로 한 방향으로 전달되는 과정을 의미한다.

  • 입력: 입력 데이터가 입력층에 공급된다.
  • 전파: 데이터는 가중치와 활성화 함수를 적용하여 각 후속 층(은닉층)을 통해 전파된다.
  • 출력: 최종 층이 출력 예측을 생성한다.

3. 역전파 (Backpropagation)

역전파(오차의 역방향 전파)는 신경망을 학습시키기 위해 사용되는 지도 학습 알고리즘이다. 순전파와 역전파라는 두 가지 주요 단계를 포함한다.

과정

  1. 순전파: 입력을 층을 통해 전파하여 네트워크의 출력을 계산한다.
  2. 손실 계산: 손실 함수(예: 평균 제곱 오차, 교차 엔트로피)를 사용하여 예측된 출력과 실제 목표 값을 비교하여 손실(오차)을 계산한다.
  3. 역전파: 미적분의 연쇄 법칙을 적용하여 손실에 대한 각 가중치의 기울기를 계산하기 위해 오차를 네트워크를 통해 역방향으로 전파한다.
  4. 가중치 업데이트: 계산된 기울기를 사용하여 가중치를 업데이트하여 손실을 최소화한다.

역전파의 목표는 오차를 줄이고 예측의 정확도를 향상시키기 위해 신경망의 가중치를 최적화하는 것이다.

4. 경사 하강법 (Gradient Descent)

경사 하강법은 손실 함수의 최급강하 방향으로 가중치를 반복적으로 조정하여 신경망의 손실 함수를 최소화하는 데 사용되는 최적화 알고리즘이다.

  • 가중치 초기화: 무작위 초기 가중치로 시작한다.
  • 기울기 계산: 가중치에 대한 손실 함수의 기울기를 계산한다.
  • 가중치 업데이트: **학습률(learning rate)**이라는 단계 크기만큼 기울기의 반대 방향으로 가중치를 조정한다.
  • 반복: 손실 함수가 최소값으로 수렴할 때까지 과정을 반복한다.

5. 신경망에서 경사 하강법을 계산하는 방법

역전파 단계는 네트워크의 각 가중치에 대한 손실 함수의 기울기를 계산하는 것을 포함한다. 이는 미적분의 연쇄 법칙을 적용하여 출력층에서 입력층으로 오차를 역방향으로 전파함으로써 수행된다.

notation

역전파 단계

backpropagation

출력층 (softmax)과 교차 엔트로피 손실

softmax gradient descent with cross-entropy loss

은닉층 (ReLU 및 sigmoid)

Hidden layer gradient descent

프로젝트 구조

multilayer-perceptron/
├── 01.prepare.py          # 데이터셋을 학습용과 검증용으로 분리
├── 02.train.py            # 신경망 모델 학습
├── 03.predict.py          # 학습된 모델로 예측 수행
├── evaluation.py          # 평가 스크립트
├── data.csv               # 원본 데이터셋
├── lib/
│   ├── activation.py      # 활성화 함수 (ReLU, sigmoid, softmax)
│   ├── data.py            # 데이터 로딩 및 전처리
│   ├── layer.py           # 신경망 층 구현 (InputLayer, DenseLayer)
│   ├── model.py           # 신경망 모델 클래스
│   └── print.py           # 콘솔 출력 유틸리티
└── requirements.txt       # 필요한 패키지 목록

주요 기능

  • 다층 신경망 구조: 입력층, 은닉층, 출력층으로 구성된 완전 연결 신경망
  • 활성화 함수: ReLU, Sigmoid, Softmax 지원
  • 역전파 알고리즘: 효율적인 가중치 업데이트를 위한 역전파 구현
  • 조기 종료 (Early Stopping): 과적합 방지를 위한 조기 종료 기능
  • 다중 평가 지표: 손실(loss), 정확도(accuracy), 평균 제곱 오차(MSE) 추적
  • 모델 저장/로드: JSON 형식으로 학습된 모델 저장 및 불러오기
  • 시각화: 학습 과정의 손실, 정확도, MSE 그래프 생성

학습 파라미터

기본 학습 설정 (02.train.py):

  • 에포크(Epochs): 30,000
  • 학습률(Learning Rate): 0.003
  • 배치 크기(Batch Size): 전체 데이터셋 크기
  • 조기 종료: 활성화됨
  • 네트워크 구조:
    • 입력층: 데이터 특성 수
    • 은닉층 1: 30개 뉴런 (ReLU)
    • 은닉층 2: 28개 뉴런 (ReLU)
    • 출력층: 2개 뉴런 (Softmax)

참고 자료

보너스 기능

  • 조기 종료 (Early Stop)

  • 학습 단계를 여러 지표로 평가: 손실, 정확도, MSE

  • ReLU 및 Sigmoid 활성화 함수 지원