다층 퍼셉트론(MLP, Multi-Layer Perceptron): 딥러닝의 기초를 이해하다
- 인공지능과 머신러닝이 우리 일상 깊숙이 들어온 지금, 그 핵심 기술 중 하나인 다층 퍼셉트론(Multi-Layer Perceptron, MLP)에 대해 알아보겠습니다.
- 복잡해 보이는 이름이지만, 사실 MLP는 현재 우리가 사용하는 대부분의 AI 시스템의 기반이 되는 매우 중요한 개념입니다.
1. 퍼셉트론이란 무엇인가?
- 다층 퍼셉트론을 이해하기 전에, 먼저 퍼셉트론(Perceptron)이 무엇인지 알아야 합니다. 퍼셉트론은 1950년대 프랭크 로젠블라트가 개발한 최초의 인공 신경망 모델입니다.
- 간단히 말해, 퍼셉트론은 인간의 뉴런을 모방한 수학적 모델입니다. 여러 입력값을 받아서 가중치를 곱하고, 모든 값을 더한 후 특정 임계값을 넘으면 활성화되는 구조입니다.
단층 퍼셉트론의 한계
- 하지만 단일 퍼셉트론은 심각한 한계가 있었습니다. 바로 선형 분리 가능한 문제만 해결할 수 있다는 점입니다.
- 예를 들어, XOR 문제처럼 선으로 나눌 수 없는 복잡한 패턴은 학습할 수 없었죠.
2. 다층 퍼셉트론의 등장
- 이런 한계를 극복하기 위해 등장한 것이 바로 다층 퍼셉트론(MLP)입니다.
- MLP는 여러 개의 퍼셉트론 층을 쌓아 올린 구조로, 복잡한 비선형 문제도 해결할 수 있게 되었습니다.
MLP의 기본 구조
MLP는 크게 세 부분으로 구성됩니다.

1. 입력층(Input Layer)
- 데이터가 들어오는 첫 번째 층
- 각 노드는 입력 특성 하나를 담당
2. 은닉층(Hidden Layer)
- 입력층과 출력층 사이의 중간 층들
- 실제 학습과 패턴 인식이 일어나는 핵심 부분
- 여러 개의 은닉층을 가질 수 있음
3. 출력층(Output Layer)
- 최종 결과를 출력하는 층
- 분류 문제면 클래스 개수만큼, 회귀 문제면 보통 1개의 노드
3. MLP는 어떻게 학습하는가?
- MLP의 학습 과정은 역전파(Backpropagation) 알고리즘을 통해 이루어집니다.
- 이는 1980년대에 개발되어 현재까지도 널리 사용되는 핵심 기술입니다.
순전파(Forward Propagation)
- 입력 데이터가 네트워크를 통해 앞으로 전달됩니다
- 각 층에서 가중치와 편향을 적용하여 계산합니다
- 활성화 함수를 통과시켜 다음 층으로 전달합니다
- 최종적으로 출력층에서 예측값을 생성합니다
역전파(Backpropagation)
- 실제값과 예측값의 오차를 계산합니다
- 이 오차를 출력층부터 입력층까지 거꾸로 전파합니다
- 각 가중치가 오차에 미친 영향을 계산합니다
- 경사하강법을 사용하여 가중치를 업데이트합니다
4. 활성화 함수의 중요성
- MLP에서 활성화 함수(Activation Function)는 매우 중요한 역할을 합니다.
- 활성화 함수가 없다면 아무리 많은 층을 쌓아도 결국 선형 변환의 조합일 뿐이기 때문입니다.
주요 활성화 함수들
ReLU (Rectified Linear Unit)
- 현재 가장 널리 사용되는 활성화 함수
- 음수는 0으로, 양수는 그대로 출력
- 계산이 간단하고 기울기 소실 문제를 완화
Sigmoid
- 0과 1 사이의 값으로 출력을 제한
- 이진 분류 문제의 출력층에서 주로 사용
- 기울기 소실 문제가 있어 깊은 네트워크에서는 잘 사용하지 않음
Tanh
- 1과 1 사이의 값으로 출력
- Sigmoid보다 좋은 성능을 보이지만 여전히 기울기 소실 문제 존재
5. MLP 구현 시 고려사항
하이퍼파라미터 튜닝
- 층의 개수: 너무 적으면 복잡한 패턴을 학습하지 못하고, 너무 많으면 과적합 위험
- 노드 수: 각 층의 노드 수는 문제의 복잡성과 데이터 크기를 고려하여 결정
- 학습률: 너무 크면 수렴하지 못하고, 너무 작으면 학습이 매우 느림
정규화 기법
드롭아웃(Dropout)
- 학습 중 일부 노드를 무작위로 비활성화
- 과적합을 방지하는 효과적인 방법
배치 정규화(Batch Normalization)
- 각 층의 입력을 정규화하여 학습 안정성 향상
- 더 높은 학습률 사용 가능
6. tensorflow로 구현
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import pandas as pd
# 데이터셋을 불러옵니다.
df = pd.read_csv('./data/dataset.csv')
# 세부 정보를 X로 지정합니다.
X = df.iloc[:,0:8]
# 출력값을 y로 지정합니다.
y = df.iloc[:,8]
# 모델을 설정합니다.
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu', name='Dense_1'))
model.add(Dense(8, activation='relu', name='Dense_2'))
model.add(Dense(1, activation='sigmoid',name='Dense_3'))
model.summary()
# 모델을 컴파일합니다.
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 모델을 실행합니다.
history=model.fit(X, y, epochs=100, batch_size=5)
활성화 함수
- 은닉층 1, 2 모두 렐루 함수(은닉층 1층은 출력층을 겸함)
- 0과 1로 이루어진 데이터 이므로 출력층은 시그모이드 함수 사용
손실 함수
- 출력층이 0과 1로 나오므로 교차 엔트로피 오차를 활용
옵티마이저
- 경사하강법을 발전시켜 나온 아담 알고리즘 사용
Share article