신경망의 기초
왜 신경망을 공부하게 됐나
이미지 분류 프로젝트를 진행하는데, 기존 머신러닝 방법(SVM, Random Forest)으로는 정확도가 낮았습니다. 주변에서 "신경망(Neural Network)을 써보라"는 조언을 들었지만, 솔직히 막막했습니다.
구글에 검색해보니 "인간 뇌의 뉴런을 모방한 것"이라는 설명만 가득했습니다. 하지만 개발자인 저에게 그 말은 하나도 와닿지 않았습니다. "그래서 코드로 어떻게 생겼는데? 뉴런이 어떻게 고양이랑 강아지를 구분하는데?"
결국 바닥부터 파보면서, 실제로 간단한 신경망을 만들어보고 나서야 이해했습니다. 신경망은 마법이 아니라, "여러 단계의 계산을 거쳐 답을 찾아가는 거대한 함수"였습니다.
처음엔 뭐가 이해가 안 갔나
- 가중치(Weight)? 편향(Bias)?: 숫자들을 곱하고 더하는 게 왜 '학습'인 걸까?
- 역전파(Backpropagation)?: 오차를 뒤로 던진다는데, 그게 어떻게 앞의 수정 사항을 알려주는 걸까?
- 활성화 함수(Activation Function)?: 그냥 곱하고 더하기만 하면 안 되나? 왜 중간에 비선형 함수를 끼워넣지?
어떤 포인트에서 이해가 됐나 - "공장 조립 라인"
저에게 깨달음을 준 비유는 "공장 조립 라인"이었습니다.
신경망 = 거대한 공장 조립 라인
- 입력(Input): 원자재 (예: 철판, 나사)
- 은닉층(Hidden Layers): 각 공정 단계 (절단 → 용접 → 도색)
- 출력(Output): 완제품 (자동차)
- 가중치(Weights): 각 기계의 설정값 (압력, 온도, 시간)
예: 이미지(고양이) 판별 공장
- 원자재 투입: 이미지의 픽셀 데이터가 들어옵니다.
- 1단계 공정 (Layer 1): 픽셀들을 조합해 직선이나 곡선을 찾아냅니다. (가중치: 선의 기울기 등)
- 2단계 공정 (Layer 2): 선들을 조립해 눈, 귀, 꼬리 같은 형태를 만듭니다.
- 3단계 공정 (Layer 3): 부위들을 합쳐 "이건 고양이다"라고 판단합니다.
학습(Training)이란? 처음 공장을 가동하면(초기화), 설정값이 엉망이라 고철 덩어리(틀린 답)가 나옵니다. 품질 관리자(Loss Function)가 "야! 이거 자동차가 아니라 찌그러진 깡통이잖아!" 라고 소리칩니다. 그러면 공장장(Optimizer)이 출구에서부터 입구 쪽으로 거슬러 올라가며(역전파), 각 기계의 설정값(가중치)을 조금씩 수정합니다. "도색 기계 압력이 너무 셌네, 좀 줄여." "용접 온도가 너무 낮았네, 좀 올려."
이 과정을 수만 번 반복하면, 결국 완벽한 자동차를 만드는 공장이 됩니다. 이것이 신경망 학습입니다.
신경망 구조
기본 구성
입력층(Input) → 은닉층(Hidden) → ... → 은닉층(Hidden) → 출력층(Output)
실제 예시: 손글씨 숫자 인식 (MNIST)
- 입력층: 784개 뉴런 (28x28 픽셀 이미지)
- 은닉층 1: 128개 뉴런 (특징 추출)
- 은닉층 2: 64개 뉴런 (더 복잡한 특징 추출)
- 출력층: 10개 뉴런 (숫자 0~9 각각의 확률)
뉴런 (Neuron) 코드 구현
하나의 뉴런은 아주 단순한 연산을 수행합니다.
# 하나의 뉴런의 동작
def neuron(inputs, weights, bias):
# 1. 가중합 (Weighted Sum): 입력과 가중치를 곱하고 편향을 더함
# y = w1*x1 + w2*x2 + ... + b
weighted_sum = sum(i * w for i, w in zip(inputs, weights)) + bias
# 2. 활성화 함수 (Activation): 결과를 변환
output = activation(weighted_sum)
return output
핵심 요소 3가지
1. 가중치(Weights)와 편향(Bias)
- 가중치: 입력 신호의 중요도입니다. 어떤 픽셀이 "고양이의 귀"를 판단하는 데 중요하다면 그 가중치는 커집니다.
- 편향: 뉴런이 얼마나 쉽게 활성화될지(발화할지) 결정하는 임계값 조절 장치입니다.
2. 활성화 함수 (Activation Function)
단순 선형 계산만 반복하면 아무리 층을 깊게 쌓아도 하나의 선형 함수와 같아집니다. 비선형성(구부러짐)을 줘야 복잡한 패턴을 배울 수 있습니다.
- ReLU (Rectified Linear Unit):
max(0, x). 음수면 0, 양수면 그대로. 가장 많이 쓰입니다. 학습이 빠릅니다. - Sigmoid: 0과 1 사이 값으로 압축. 이진 분류의 출력층에 주로 쓰입니다.
- Softmax: 출력값들의 합이 1이 되도록 변환. 다중 분류(개, 고양이, 새)의 출력층에 쓰입니다.
3. 손실 함수 (Loss Function)
현재 모델이 얼마나 틀렸는지를 측정하는 지표입니다.
- MSE (Mean Squared Error): 회귀 문제(집값 예측 등)에 사용.
- Cross-Entropy: 분류 문제(이 사진이 뭐냐?)에 사용.
학습 과정 (Backpropagation)
이게 마법의 핵심입니다.
- 순전파 (Forward): 입력을 넣고 예측값을 뽑습니다. (예: "이건 70% 확률로 강아지입니다.")
- 오차 계산: 정답(고양이)과 비교합니다. (오차 발생!)
- 역전파 (Backward): 오차를 줄이기 위해 각 가중치를 어떻게 조절해야 할지 미분(기울기)을 통해 계산합니다. 출력층에서 입력층 방향으로 거슬러 올라갑니다.
- 업데이트 (Optimizer): 계산된 기울기만큼 가중치를 실제로 수정합니다. (예:
기존 가중치 - 학습률 * 기울기)
팁 - 하이퍼파라미터 튜닝
모델의 구조만큼 중요한 것이 하이퍼파라미터(설정값) 튜닝입니다.
1. 학습률 (Learning Rate)
가중치를 한 번에 얼마나 수정할지 결정합니다.
- 너무 크면: 정답을 못 찾고 발산합니다. (공장 기계를 망치로 때려 부수는 격)
- 너무 작으면: 학습이 너무 느립니다. (나사 하나를 1년 동안 조이는 격)
- 추천:
0.001이나0.0001부터 시작해서 조정하세요. Adam Optimizer를 쓰면 알아서 조절해줍니다.
2. 배치 크기 (Batch Size)
한 번에 몇 개의 데이터를 보고 수정할지 결정합니다.
- 너무 작으면(1): 매번 수정해서 불안정합니다.
- 너무 크면(All): 메모리가 터지거나, 학습이 둔해집니다.
- 추천: 32, 64, 128 같은 2의 거듭제곱을 주로 씁니다.
3. 과적합(Overfitting) 방지
모델이 학습 데이터만 달달 외워서 실제로 엉망이 되는 현상입니다.
- Dropout: 학습할 때 뉴런의 일부(예: 50%)를 랜덤하게 꺼버립니다. 특정 뉴런에 의존하는 것을 막아 강인한 모델을 만듭니다.
- Early Stopping: 성능이 더 이상 좋아지지 않으면 학습을 조기 종료합니다.
한 줄 요약
신경망은 입력 데이터를 여러 층의 필터(가중치)를 거치게 하여 원하는 출력으로 변환하는 함수이며, 틀린 답이 나오면 그 오차를 역추적(역전파)하여 필터를 미세 조정하는 방식으로 똑똑해진다.