다층 퍼셉트론 (MLP)

KangHo Lee's avatar
Jun 19, 2025
다층 퍼셉트론 (MLP)

다층 퍼셉트론(MLP, Multi-Layer Perceptron): 딥러닝의 기초를 이해하다

  • 인공지능과 머신러닝이 우리 일상 깊숙이 들어온 지금, 그 핵심 기술 중 하나인 다층 퍼셉트론(Multi-Layer Perceptron, MLP)에 대해 알아보겠습니다.
  • 복잡해 보이는 이름이지만, 사실 MLP는 현재 우리가 사용하는 대부분의 AI 시스템의 기반이 되는 매우 중요한 개념입니다.

1. 퍼셉트론이란 무엇인가?

  • 다층 퍼셉트론을 이해하기 전에, 먼저 퍼셉트론(Perceptron)이 무엇인지 알아야 합니다. 퍼셉트론은 1950년대 프랭크 로젠블라트가 개발한 최초의 인공 신경망 모델입니다.
  • 간단히 말해, 퍼셉트론은 인간의 뉴런을 모방한 수학적 모델입니다. 여러 입력값을 받아서 가중치를 곱하고, 모든 값을 더한 후 특정 임계값을 넘으면 활성화되는 구조입니다.

단층 퍼셉트론의 한계

  • 하지만 단일 퍼셉트론은 심각한 한계가 있었습니다. 바로 선형 분리 가능한 문제만 해결할 수 있다는 점입니다.
  • 예를 들어, XOR 문제처럼 선으로 나눌 수 없는 복잡한 패턴은 학습할 수 없었죠.

2. 다층 퍼셉트론의 등장

  • 이런 한계를 극복하기 위해 등장한 것이 바로 다층 퍼셉트론(MLP)입니다.
  • MLP는 여러 개의 퍼셉트론 층을 쌓아 올린 구조로, 복잡한 비선형 문제도 해결할 수 있게 되었습니다.

MLP의 기본 구조

MLP는 크게 세 부분으로 구성됩니다.
notion image
1. 입력층(Input Layer)
  • 데이터가 들어오는 첫 번째 층
  • 각 노드는 입력 특성 하나를 담당
2. 은닉층(Hidden Layer)
  • 입력층과 출력층 사이의 중간 층들
  • 실제 학습과 패턴 인식이 일어나는 핵심 부분
  • 여러 개의 은닉층을 가질 수 있음
3. 출력층(Output Layer)
  • 최종 결과를 출력하는 층
  • 분류 문제면 클래스 개수만큼, 회귀 문제면 보통 1개의 노드

3. MLP는 어떻게 학습하는가?

  • MLP의 학습 과정은 역전파(Backpropagation) 알고리즘을 통해 이루어집니다.
  • 이는 1980년대에 개발되어 현재까지도 널리 사용되는 핵심 기술입니다.

순전파(Forward Propagation)

  1. 입력 데이터가 네트워크를 통해 앞으로 전달됩니다
  1. 각 층에서 가중치와 편향을 적용하여 계산합니다
  1. 활성화 함수를 통과시켜 다음 층으로 전달합니다
  1. 최종적으로 출력층에서 예측값을 생성합니다

역전파(Backpropagation)

  1. 실제값과 예측값의 오차를 계산합니다
  1. 이 오차를 출력층부터 입력층까지 거꾸로 전파합니다
  1. 각 가중치가 오차에 미친 영향을 계산합니다
  1. 경사하강법을 사용하여 가중치를 업데이트합니다

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

devleekangho