다층 퍼셉트론(MLP) 모델 구현
1. 다층 퍼셉트론(MLP)이란?
다층 퍼셉트론(Multi-Layer Perceptron, MLP)은 인공신경망(ANN)에서 가장 기본적인 형태의 신경망 구조입니다. MLP는 최소한 하나 이상의 은닉층(hidden layer)을 가지며, 비선형 활성화 함수를 활용하여 복잡한 패턴을 학습할 수 있습니다.
1.1. MLP의 구조
MLP는 입력층(input layer), 은닉층(hidden layer), 출력층(output layer)으로 구성됩니다. 각 층에서는 뉴런들이 가중치(weight)와 편향(bias)을 학습하며, 활성화 함수(Activation Function)를 적용하여 비선형성을 도입합니다.
- 입력층: 모델이 학습할 데이터를 받는 층
- 은닉층: 비선형 변환을 통해 데이터의 특징을 추출하는 층 (1개 이상 존재)
- 출력층: 최종 예측 값을 출력하는 층
MLP에서는 모든 뉴런이 이전 층의 모든 뉴런과 연결되는 완전연결층(Fully Connected Layer, Dense Layer) 형태를 가집니다.
1.2. MLP의 동작 원리
MLP는 다음과 같은 과정을 통해 학습을 진행합니다.
- 순전파(Forward Propagation): 입력 데이터가 신경망을 따라 전달되면서 가중치와 활성화 함수를 통해 변환됩니다.
- 오차 계산(Loss Calculation): 예측값과 실제 정답값 간의 차이를 손실 함수(Loss Function)를 사용하여 계산합니다.
- 역전파(Backpropagation): 손실 값을 바탕으로 가중치와 편향을 조정합니다.
- 가중치 업데이트(Weight Update): 경사 하강법(Gradient Descent) 등의 최적화 기법을 이용하여 가중치를 업데이트합니다.
2. MLP 모델 구현하기
Python의 TensorFlow
와 Keras
라이브러리를 활용하여 MLP 모델을 구현해 보겠습니다.
2.1. 데이터 준비
MNIST 데이터셋을 활용하여 숫자 손글씨 분류 모델을 구현하겠습니다.
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# MNIST 데이터 로드
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 데이터 정규화 및 변환
x_train = x_train.reshape(-1, 28*28).astype('float32') / 255.0
x_test = x_test.reshape(-1, 28*28).astype('float32') / 255.0
# 레이블을 원-핫 인코딩으로 변환
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
2.2. MLP 모델 설계
입력층, 은닉층(2개), 출력층으로 구성된 MLP 모델을 Sequential
API를 사용하여 설계합니다.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# MLP 모델 정의
model = Sequential([
Dense(128, activation='relu', input_shape=(28*28,)),
Dense(64, activation='relu'),
Dense(10, activation='softmax')
])
# 모델 컴파일
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
Dense(128, activation='relu')
: 첫 번째 은닉층, 뉴런 수는 128개, 활성화 함수는 ReLUDense(64, activation='relu')
: 두 번째 은닉층, 뉴런 수는 64개, 활성화 함수는 ReLUDense(10, activation='softmax')
: 출력층, 클래스 수는 10개, 활성화 함수는 Softmaxcategorical_crossentropy
: 다중 클래스 분류 문제에서 사용하는 손실 함수adam
: 가중치 최적화를 위한 Adam 옵티마이저
2.3. 모델 학습
훈련 데이터로 모델을 학습시키고, 검증 데이터로 평가를 진행합니다.
# 모델 학습
model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_test, y_test))
epochs=10
: 총 10번의 학습 반복batch_size=32
: 미니배치 크기 32validation_data=(x_test, y_test)
: 테스트 데이터로 검증 수행
2.4. 모델 평가 및 예측
학습된 모델의 정확도를 평가하고 예측을 수행합니다.
# 모델 평가
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"테스트 정확도: {test_acc:.4f}")
# 예측 수행
predictions = model.predict(x_test)
3. 최적화 및 개선 방법
MLP 모델의 성능을 향상시키기 위해 다음과 같은 기법을 적용할 수 있습니다.
3.1. 가중치 초기화 개선
He 초기화(He Initialization)
: ReLU 활성화 함수와 함께 사용하면 학습이 안정적으로 진행됩니다.Xavier 초기화(Glorot Initialization)
: Sigmoid, Tanh 활성화 함수와 함께 사용하면 효과적입니다.
Dense(128, activation='relu', kernel_initializer='he_normal')
3.2. 과적합 방지
- 드롭아웃(Dropout): 일부 뉴런을 랜덤하게 제거하여 일반화를 돕습니다.
- 정규화(L2 Regularization): 가중치 값이 과도하게 커지는 것을 방지합니다.
from tensorflow.keras.layers import Dropout
model = Sequential([
Dense(128, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.001), input_shape=(28*28,)),
Dropout(0.3),
Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.001)),
Dropout(0.3),
Dense(10, activation='softmax')
])
3.3. 최적의 하이퍼파라미터 찾기
- 학습률 조정 (Learning Rate Scheduling)
- 배치 크기 변경 (Batch Size Tuning)
- 옵티마이저 비교 (Adam, RMSprop, SGD 등)
4. 결론
이번 포스팅에서는 다층 퍼셉트론(MLP)의 개념과 구조를 살펴보고, MNIST 데이터셋을 활용하여 실제로 MLP 모델을 구현하는 과정을 다루었습니다. MLP는 기본적인 신경망 구조이지만, 다양한 최적화 기법을 적용하여 성능을 개선할 수 있습니다.
'Python DeepLearning' 카테고리의 다른 글
CNN(Convolutional Neural Network)의 개념 및 동작 원리 (0) | 2025.04.16 |
---|---|
역전파 알고리즘(Backpropagation)과 손실 최소화 원리 (0) | 2025.04.15 |
단순 퍼셉트론 구현 및 개념 정리 (0) | 2025.04.13 |
PyTorch Lightning을 이용한 모델 트레이닝 효율화 (0) | 2025.04.12 |
TensorFlow 및 Keras의 콜백 함수 활용법 (0) | 2025.04.11 |