이 장에서 배울 것
이 장의 목표는 딥러닝을 특별한 마법처럼 받아들이지 않는 것이다. 딥러닝도 결국 입력을 받고, 가중치를 사용해 출력을 만들고, 정답과 비교해 손실을 계산한 뒤, 그 손실을 줄이도록 가중치를 조금씩 바꾸는 과정이다.
이 장에서는 전통 머신러닝과 딥러닝을 다음 관점에서 비교한다.
사람이 특징을 설계하는 방식과 모델이 표현을 학습하는 방식
이미지, 음성, 텍스트 같은 비정형 데이터에서 딥러닝이 강한 이유
딥러닝 학습을 이루는 네 가지 최소 구성 요소
같은 데이터에 전통 머신러닝 모델과 간단한 신경망을 적용해 비교하는 방법
여기서 중요한 말은 표현 학습이다. 표현 학습이란 모델이 원본 데이터에서 문제 해결에 유용한 특징을 스스로 만들어 가는 과정을 뜻한다.

왜 이 주제가 중요한가
권2에서 다룬 전통 머신러닝은 주어진 특징을 바탕으로 규칙을 학습했다. 예를 들어 집값을 예측한다면 면적, 방 개수, 역과의 거리 같은 특징을 표 형태로 준비했다. 스팸 메일을 분류한다면 특정 단어의 등장 횟수, 문장 길이, 링크 개수 같은 특징을 만들었다.
이 방식은 여전히 강력하다. 데이터가 표 형태이고, 특징의 의미가 명확하며, 데이터 수가 많지 않을 때는 전통 머신러닝이 빠르고 해석하기 쉽다.
하지만 이미지, 음성, 텍스트처럼 원본 데이터가 복잡할 때는 문제가 달라진다. 고양이 사진을 분류한다고 생각해 보자. 사람이 직접 "고양이다움"을 숫자로 정의하기는 어렵다. 귀의 모양, 수염, 눈의 위치, 털의 질감, 배경과의 차이 등을 모두 규칙으로 만드는 것은 거의 불가능하다.
딥러닝은 이 지점에서 강점을 보인다. 사람이 모든 특징을 직접 설계하기보다, 모델이 데이터에서 여러 단계의 특징을 학습하게 한다. 이미지에서는 픽셀에서 선을, 선에서 모양을, 모양에서 객체의 일부를, 객체의 일부에서 전체 객체를 구분하는 식이다.
핵심 개념 설명
전통 머신러닝: 특징을 사람이 많이 준비한다
전통 머신러닝의 일반적인 흐름은 다음과 같다.
데이터를 수집한다.
사람이 문제에 맞는 특징을 만든다.
모델이 특징과 정답 사이의 관계를 학습한다.
새 데이터에 대해 예측한다.
예를 들어 손글씨 숫자 이미지를 분류한다고 하자. 이미지는 작은 칸마다 밝기 값이 들어 있는 숫자 배열이다. 전통적인 접근에서는 다음과 같은 특징을 사람이 만들 수 있다.
이미지의 위쪽에 잉크가 많은가
왼쪽과 오른쪽 중 어느 쪽이 더 진한가
가운데가 비어 있는가
세로선이 강한가
곡선이 많은가
이런 특징은 문제를 잘 이해한 사람이 직접 설계한다. 그래서 전통 머신러닝에서는 특징 공학이 중요했다. 특징 공학은 원본 데이터를 모델이 잘 배울 수 있는 숫자 정보로 바꾸는 작업이다.
딥러닝: 특징도 함께 학습한다
딥러닝은 특징을 완전히 없애는 기술이 아니다. 대신 특징을 사람이 모두 정하지 않고, 모델 내부의 여러 층이 점진적으로 학습하게 한다.
가장 단순하게 보면 신경망은 다음 흐름을 반복한다.
입력 → 가중치 계산 → 출력 → 손실 계산 → 가중치 업데이트여기서 가중치는 입력을 얼마나 중요하게 볼지 정하는 숫자다. 처음에는 가중치가 거의 아무 의미 없는 값에서 시작한다. 모델은 예측을 해 보고, 틀린 정도를 손실로 계산한다. 그리고 손실을 줄이는 방향으로 가중치를 조금씩 수정한다.
이 과정을 많이 반복하면 어떤 가중치는 특정 선이나 모양에 반응하고, 어떤 가중치는 더 복잡한 패턴에 반응하게 된다. 그래서 "모델이 특징을 배운다"고 말한다.
단, 이 표현을 오해하면 안 된다. 모델이 사람처럼 이미지를 이해한다는 뜻은 아니다. 모델은 수많은 숫자 계산을 통해 정답을 맞히는 데 도움이 되는 내부 표현을 조정한다.
계층적 특징 추출
딥러닝이 비정형 데이터에서 강한 이유는 계층적 특징 추출에 있다. 계층적이라는 말은 낮은 단계의 단순한 특징이 쌓여 높은 단계의 복잡한 특징이 된다는 뜻이다.
이미지 분류를 예로 들면 다음과 같다.
낮은 층: 밝기 차이, 선, 모서리
중간 층: 원형, 곡선, 질감, 작은 부품
높은 층: 눈, 바퀴, 귀, 글자 모양 같은 의미 있는 부분
출력 층: 고양이, 자동차, 숫자 3 같은 최종 분류
텍스트에서도 비슷한 일이 일어난다.
낮은 단계: 글자, 토큰, 단어
중간 단계: 구절, 문장 구조, 문맥
높은 단계: 감정, 의도, 주제
음성도 마찬가지다.
낮은 단계: 짧은 소리의 파형
중간 단계: 음소, 억양, 리듬
높은 단계: 단어, 문장, 화자의 의도
이처럼 딥러닝은 원본 데이터에서 바로 정답으로 뛰어가지 않는다. 여러 층을 거치며 점점 문제 해결에 유용한 표현을 만든다.
딥러닝 학습의 네 가지 구성 요소
딥러닝 학습은 최소한 네 가지 구성 요소로 볼 수 있다.
첫째, 데이터다. 데이터는 입력과 정답으로 이루어진다. 손글씨 숫자 분류에서는 이미지가 입력이고, 숫자 0부터 9까지의 라벨이 정답이다.
둘째, 모델이다. 모델은 입력을 받아 출력을 만드는 계산 구조다. 신경망에서는 층, 가중치, 활성화 함수 등이 모델을 이룬다. 활성화 함수는 모델이 단순한 직선 관계만 배우지 않고 더 복잡한 관계를 배울 수 있도록 돕는 함수다.
셋째, 손실 함수다. 손실 함수는 모델의 예측이 정답과 얼마나 다른지 숫자로 나타낸다. 손실이 크면 많이 틀렸다는 뜻이고, 손실이 작으면 정답에 가까워졌다는 뜻이다.
넷째, 최적화 알고리즘이다. 최적화 알고리즘은 손실을 줄이기 위해 가중치를 어떻게 바꿀지 결정한다. 대표적인 방법은 경사하강법이다. 경사하강법은 손실이 줄어드는 방향으로 가중치를 조금씩 이동시키는 방법이다.
정리하면 딥러닝은 다음 한 문장으로 설명할 수 있다.
데이터로 예측을 해 보고, 손실을 계산한 뒤, 손실을 줄이도록 모델의 가중치를 반복해서 업데이트하는 학습 방법이다.
쉬운 비유: 픽셀에서 숫자까지
손글씨 숫자 8을 분류하는 상황을 생각해 보자. 사람은 숫자 8을 보면 바로 알아본다. 하지만 컴퓨터가 처음 보는 것은 숫자가 아니라 픽셀 값이다. 어두운 칸, 밝은 칸, 중간 정도의 회색 칸이 있을 뿐이다.
전통 머신러닝에서는 사람이 먼저 힌트를 줄 수 있다.
"위와 아래에 둥근 부분이 있으면 8일 가능성이 높다."
"가운데가 잘록하고, 안쪽 빈 공간이 두 개 있으면 8일 가능성이 높다."
이 힌트를 숫자 특징으로 만들어 모델에 넣는다. 모델은 그 특징을 바탕으로 분류한다.
딥러닝에서는 힌트를 더 적게 준다. 원본 픽셀을 넣고, 여러 층이 스스로 유용한 패턴을 찾게 한다. 처음 층은 작은 선이나 경계에 반응할 수 있다. 다음 층은 선들이 모인 곡선에 반응할 수 있다. 더 높은 층은 위아래의 둥근 구조처럼 숫자 8을 구분하는 데 도움이 되는 형태에 반응할 수 있다.
그래서 딥러닝의 핵심은 "사람이 아무것도 하지 않아도 된다"가 아니다. 핵심은 사람이 모든 특징을 직접 설계하지 않아도, 모델이 학습 과정에서 유용한 표현을 만들어 갈 수 있다는 점이다.
직접 해보는 실습
이번 실습에서는 같은 손글씨 숫자 데이터에 두 가지 방식을 적용한다.
전통 머신러닝: 사람이 만든 간단한 특징 + 로지스틱 회귀
간단한 신경망: 원본 픽셀 + 다층 퍼셉트론
여기서는 PyTorch 대신 scikit-learn의 MLPClassifier를 사용한다. PyTorch 학습 루프는 PyTorch 학습 루프에서 직접 구현한다.
1단계: 데이터 준비
import time
import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, confusion_matrix
np.random.seed(42)
digits = load_digits()
X = digits.data # 8x8 이미지를 펼친 64개 픽셀
images = digits.images # 원래 8x8 이미지
y = digits.target
X_train, X_test, img_train, img_test, y_train, y_test = train_test_split(
X, images, y, test_size=0.2, random_state=42, stratify=y
)2단계: 사람이 만든 특징 만들기
아래 특징은 매우 단순하다. 이미지의 위, 아래, 왼쪽, 오른쪽, 가운데 부분에 잉크가 얼마나 많은지 계산한다.
def make_hand_features(images):
features = []
for img in images:
top = img[:4, :].sum()
bottom = img[4:, :].sum()
left = img[:, :4].sum()
right = img[:, 4:].sum()
center = img[2:6, 2:6].sum()
total = img.sum()
vertical_diff = abs(left - right)
horizontal_diff = abs(top - bottom)
features.append([
top, bottom, left, right, center,
total, vertical_diff, horizontal_diff
])
return np.array(features)
H_train = make_hand_features(img_train)
H_test = make_hand_features(img_test)3단계: 전통 머신러닝 모델 학습
scaler_h = StandardScaler()
H_train_scaled = scaler_h.fit_transform(H_train)
H_test_scaled = scaler_h.transform(H_test)
start = time.time()
log_reg = LogisticRegression(max_iter=1000)
log_reg.fit(H_train_scaled, y_train)
train_time_lr = time.time() - start
pred_lr = log_reg.predict(H_test_scaled)
acc_lr = accuracy_score(y_test, pred_lr)
print("Logistic Regression accuracy:", acc_lr)
print("Training time:", train_time_lr)4단계: 간단한 신경망 학습
scaler_x = StandardScaler()
X_train_scaled = scaler_x.fit_transform(X_train)
X_test_scaled = scaler_x.transform(X_test)
start = time.time()
mlp = MLPClassifier(
hidden_layer_sizes=(64, 32),
activation="relu",
max_iter=300,
random_state=42
)
mlp.fit(X_train_scaled, y_train)
train_time_mlp = time.time() - start
pred_mlp = mlp.predict(X_test_scaled)
acc_mlp = accuracy_score(y_test, pred_mlp)
print("MLP accuracy:", acc_mlp)
print("Training time:", train_time_mlp)5단계: 결과 비교하기
다음 항목을 표로 정리해 보자.
| 비교 항목 | 전통 머신러닝 | 간단한 신경망 |
|---|---|---|
| 입력 | 사람이 만든 8개 특징 | 원본 픽셀 64개 |
| 전처리량 | 특징 설계가 필요함 | 스케일 조정 중심 |
| 학습 시간 | 보통 짧음 | 상대적으로 길 수 있음 |
| 성능 | 특징 품질에 크게 의존 | 데이터에서 표현을 학습 |
| 오류 분석 | 어떤 특징이 부족한지 보기 좋음 | 내부 표현 해석이 더 어려움 |
오류 사례도 확인해 보자.
wrong_idx = np.where(pred_mlp != y_test)[0]
print("MLP wrong samples:", wrong_idx[:10])
cm = confusion_matrix(y_test, pred_mlp)
print(cm)혼동 행렬에서 특정 숫자끼리 자주 헷갈린다면 그 이유를 생각해 보자. 예를 들어 3과 8, 4와 9, 1과 7은 손글씨 모양에 따라 비슷해질 수 있다.
이 실습의 목적은 "신경망이 항상 이긴다"를 확인하는 것이 아니다. 데이터가 작거나 특징이 잘 설계되어 있으면 전통 머신러닝도 충분히 강하다. 중요한 것은 두 방식의 학습 관점이 다르다는 점이다.
흔한 실수와 오류 분석
실수 1: 딥러닝은 특징 공학이 전혀 필요 없다고 생각한다
딥러닝은 많은 특징을 스스로 학습할 수 있지만, 데이터 준비가 필요 없다는 뜻은 아니다. 이미지 크기를 맞추고, 텍스트를 토큰으로 나누고, 이상한 라벨을 정리하고, 학습 데이터와 평가 데이터를 나누는 작업은 여전히 중요하다.
좋은 딥러닝 모델도 나쁜 데이터에서는 좋은 결과를 내기 어렵다.
실수 2: 모델이 크면 무조건 좋다고 생각한다
모델이 커지면 더 복잡한 패턴을 배울 수 있다. 하지만 데이터가 적으면 훈련 데이터만 외우는 문제가 생긴다. 이를 과적합이라고 한다. 과적합된 모델은 훈련 데이터에서는 성능이 좋지만, 새 데이터에서는 성능이 떨어진다.
딥러닝에서는 모델 크기, 데이터 양, 정규화, 학습 시간 사이의 균형이 중요하다.
실수 3: 정확도 하나만 보고 판단한다
정확도는 중요한 지표지만 충분하지 않다. 어떤 숫자를 자주 틀리는지, 학습 시간이 얼마나 걸리는지, 전처리 비용이 얼마나 큰지, 모델을 설명할 수 있는지도 함께 봐야 한다.
특히 실제 프로젝트에서는 "조금 더 높은 정확도"보다 "운영 가능한 모델"이 더 중요할 때가 많다.
실수 4: 딥러닝을 사람의 이해와 같은 것으로 생각한다
신경망이 이미지를 분류한다고 해서 사람처럼 이미지를 이해하는 것은 아니다. 모델은 입력 숫자와 정답 사이의 통계적 패턴을 학습한다. 그래서 훈련 데이터와 다른 환경에서는 예상하지 못한 실수를 할 수 있다.
예를 들어 훈련 데이터에는 깨끗한 손글씨만 있었는데, 실제 입력은 기울어져 있거나 흐릿하다면 성능이 떨어질 수 있다.
요약
전통 머신러닝과 딥러닝의 가장 큰 차이는 특징을 다루는 방식에 있다. 전통 머신러닝은 사람이 설계한 특징에 많이 의존한다. 딥러닝은 여러 층을 통해 데이터에서 유용한 표현을 학습한다.
딥러닝이 이미지, 음성, 텍스트 같은 비정형 데이터에서 강한 이유는 낮은 수준의 단순한 패턴에서 높은 수준의 의미 있는 패턴으로 이어지는 계층적 특징 추출이 가능하기 때문이다.
하지만 딥러닝도 기본 흐름은 단순하다.
데이터 → 모델 → 손실 함수 → 최적화 알고리즘 → 업데이트 반복딥러닝을 이해하는 가장 좋은 출발점은 이 흐름을 놓치지 않는 것이다.
퀴즈
전통 머신러닝에서 특징 공학이 중요한 이유는 무엇인가?
표현 학습이란 무엇인가?
딥러닝이 이미지 데이터에서 강한 이유를 계층적 특징 추출 관점에서 설명해 보라.
딥러닝 학습의 네 가지 최소 구성 요소는 무엇인가?
손실 함수는 어떤 역할을 하는가?
모델이 훈련 데이터만 잘 맞히고 새 데이터에서 성능이 낮다면 어떤 문제가 의심되는가?
신경망이 "스스로 특징을 배운다"는 말을 오해하지 않으려면 어떻게 설명해야 하는가?
체크리스트
전통 머신러닝과 딥러닝의 차이를 특징 공학과 표현 학습으로 설명할 수 있다.
이미지에서 픽셀, 선, 모양, 객체로 특징이 발전한다는 비유를 이해했다.
데이터, 모델, 손실 함수, 최적화 알고리즘의 역할을 구분할 수 있다.
같은 데이터에 서로 다른 모델을 적용해 비교하는 실습을 실행할 수 있다.
정확도뿐 아니라 학습 시간, 전처리량, 오류 사례도 비교해야 함을 이해했다.
다음 장 연결
이번 장에서는 딥러닝의 큰 흐름을 보았다. 아직 신경망 내부가 어떻게 계산되는지는 자세히 다루지 않았다.
다음 장에서는 가장 단순한 신경망의 출발점인 퍼셉트론을 배운다. 입력에 가중치를 곱하고, 더하고, 활성화 함수를 통과시키는 계산이 어떻게 하나의 예측이 되는지 살펴본다. 이 계산을 이해하면 딥러닝의 나머지 구조도 훨씬 쉽게 따라갈 수 있다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.