이 글에서 다루는 것
머신러닝에서 “학습한다”는 말은 막연하게 똑똑해진다는 뜻이 아니다.
정확히는 다음 과정을 반복한다는 뜻이다.
입력 데이터를 넣는다
→ 모델이 예측값을 만든다
→ 정답과 비교해서 얼마나 틀렸는지 숫자로 계산한다
→ 그 숫자를 줄이는 방향으로 모델 내부 값을 조금 바꾼다
→ 이 과정을 여러 번 반복한다
이 글의 목표는 다음 개념을 하나의 흐름으로 연결하는 것이다.
| 개념 | 의미 |
| 모델 | 입력을 받아 예측을 만드는 함수 |
| 파라미터 | 모델 내부에서 학습으로 바뀌는 숫자 |
| 예측값 | 모델이 낸 답 |
| 손실함수 | 예측이 얼마나 틀렸는지 계산하는 함수 |
| 경사 | 손실을 줄이려면 어느 방향으로 움직여야 하는지 알려주는 값 |
| 경사하강법 | 경사를 따라 손실이 작아지는 쪽으로 파라미터를 갱신하는 방법 |
| 옵티마이저 | 파라미터를 실제로 어떻게 갱신할지 정하는 알고리즘 |
| 학습 | 손실이 작아지도록 파라미터를 반복적으로 조정하는 과정 |
사람의 학습과 모델의 학습은 다르다
사람이 “학습한다”고 하면 보통 의미를 이해하고, 기억하고, 응용하는 과정을 떠올린다.
머신러닝의 학습은 손실함수 값을 줄이도록 파라미터를 조정하는 과정이다.
모델은 스스로 “아, 배송 지연 문의는 이런 의미구나”라고 깨닫지 못한다.
- 현재 파라미터로 예측한다
- 예측값과 정답을 비교한다
- 틀린 정도를 숫자로 만든다
- 그 숫자가 작아지도록 파라미터를 바꾼다
이를 반복하며 학습한다.
아주 작은 예시
CS 문의 문장을 보고 문의 유형을 분류하는 모델이 있다고 하자.
입력: "배송이 너무 늦어요"
정답: 배송 지연
처음 모델은 아무것도 모른다. 그래서 이렇게 예측할 수 있다.
예측: 환불 문의
정답: 배송 지연
틀렸다. 이때 모델은 “내가 왜 틀렸지?”라고 사람처럼 생각하지 않는다.
대신 다음 질문을 숫자로 바꾼다.
정답 클래스의 확률을 너무 낮게 줬는가?
틀린 클래스의 확률을 너무 높게 줬는가?
그 차이를 줄이려면 어떤 파라미터를 어느 방향으로 바꿔야 하는가?
이 숫자 조정이 반복되면, 모델은 점점 이런 문장에 높은 확률을 준다.
"배송이 너무 늦어요" → 배송 지연
"택배가 아직 안 왔어요" → 배송 지연
"상품이 도착하지 않았습니다" → 배송 지연
모델은 함수다
머신러닝 모델은 입력을 받아 출력을 내는 함수로 볼 수 있다.
입력 x → 모델 f → 예측값 ŷ
수식으로 쓰면:
$$
\hat{y} = f(x; \theta)
$$
| 기호 | 의미 |
| $x$ | 입력 데이터 |
| $\hat{y}$ | 모델의 예측값 |
| $f$ | 모델 함수 |
| $\theta$ | 모델 파라미터 |
여기서 중요한 건 $\theta$다.
모델 구조가 같아도 파라미터 값이 다르면 예측이 달라진다.
학습 전 파라미터 → 엉뚱한 예측
학습 후 파라미터 → 더 나은 예측
파라미터란 무엇인가
파라미터는 모델 내부의 숫자다.
이 숫자들이 입력을 어떻게 해석할지 결정한다.
선형 모델 예시
가장 단순한 모델을 보자.
$$
\hat{y} = wx + b
$$
| 요소 | 의미 |
| $x$ | 입력값 |
| $\hat{y}$ | 예측값 |
| $w$ | 가중치(weight) |
| $b$ | 편향(bias) |
여기서 학습으로 바뀌는 값은 $w$와 $b$다.
모델 구조: ŷ = wx + b
학습 전: w = 0.1, b = 0.0
학습 후: w = 2.3, b = 1.7
입력 공식 자체가 바뀌는 게 아니다. 공식 안의 숫자가 바뀐다.
신경망도 결국 파라미터의 묶음
신경망은 훨씬 복잡하지만 원리는 같다.
입력
→ 여러 층의 계산
→ 예측값
각 층에는 가중치와 편향이 있다.
1층 가중치
2층 가중치
3층 가중치
...
학습은 이 많은 숫자를 조금씩 바꾸는 과정이다.
손실함수란 무엇인가
손실함수 = 예측이 얼마나 틀렸는지 숫자로 계산하는 함수
모델이 예측을 했다면, 그 예측이 좋은지 나쁜지 판단해야 한다. 사람은 다음처럼 눈으로 판단할 수 있다.
예측: 환불 문의
정답: 배송 지연
→ 틀렸네
그러나 모델을 학습시키려면 “틀렸다”를 숫자로 바꿔야 하는데, 그 역할을 하는 게 손실함수(loss function)다.
-> 즉, 손실이 작을수록 예측이 정답에 가깝다.
손실 0.02 → 잘 맞힘
손실 1.84 → 많이 틀림
회귀 문제의 손실함수
회귀는 숫자를 예측하는 문제다.
e.g.
집 면적 → 집값 예측
공부 시간 → 시험 점수 예측
광고비 → 매출 예측
평균제곱오차(MSE)
대표적인 회귀 손실함수는 평균제곱오차다.
$$
MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2
$$
| 기호 | 의미 |
| $y_i$ | 실제 정답 |
| $\hat{y}_i$ | 모델 예측값 |
| $y_i - \hat{y}_i$ | 예측 오차 |
| 제곱 | 오차가 음수여도 양수로 만들고, 큰 오차를 더 강하게 벌점 |
손으로 계산해보기
모델이 시험 점수를 예측한다고 하자.
| 학생 | 실제 점수 | 예측 점수 | 오차 | 오차 제곱 |
| A | 80 | 70 | 10 | 100 |
| B | 60 | 65 | -5 | 25 |
| C | 90 | 85 | 5 | 25 |
MSE는 다음과 같다.
$$
MSE = \frac{100 + 25 + 25}{3} = 50
$$
모델은 이 50이라는 숫자가 줄어들도록 파라미터를 바꾼다.
분류 문제의 손실함수
분류는 여러 클래스 중 하나를 고르는 문제다.
e.g.
문의 문장 → 배송 / 환불 / 교환 / 기타
리뷰 문장 → 긍정 / 부정
이미지 → 고양이 / 강아지 / 자동차
분류 모델은 보통 각 클래스의 확률을 출력한다.
입력: "배송이 너무 늦어요"
모델 출력:
배송 지연: 0.70
환불 문의: 0.20
교환 문의: 0.07
기타: 0.03
정답이 배송 지연이라면 좋은 예측이다.
반대로 이렇게 나오면 나쁜 예측이다.
배송 지연: 0.05
환불 문의: 0.80
교환 문의: 0.10
기타: 0.05
교차엔트로피(Cross Entropy)
분류 문제에서 자주 쓰는 손실함수는 교차엔트로피다.
정답 클래스에 모델이 부여한 확률이 높을수록 손실이 작다.
정답 클래스 확률이 낮을수록 손실이 커진다.
단일 샘플 기준으로 보면:
$$
Loss = -\log(p_{correct})
$$
| 정답 클래스 확률 | 손실 |
| 0.90 | 낮음 |
| 0.50 | 중간 |
| 0.01 | 매우 큼 |
왜 로그를 쓰는가
로그를 쓰면 확률이 아주 낮을 때 강한 벌점을 준다.
e.g.
정답 확률 0.9 → 조금 틀림
정답 확률 0.1 → 많이 틀림
정답 확률 0.001 → 심각하게 틀림
모델이 정답을 거의 불가능하다고 판단하면 큰 손실을 받는다.
그래서 학습 과정에서 정답 클래스의 확률을 높이는 방향으로 파라미터가 조정된다.
손실을 줄인다는 것은 무엇인가
모델이 한 번 예측하고 끝나면 학습이 아니다. 학습은 반복이다.
처음 예측 → 손실 큼
파라미터 수정
다시 예측 → 손실 조금 작아짐
파라미터 수정
다시 예측 → 손실 더 작아짐 ...
손실이 줄어드는 예
| 반복 | 정답 클래스 확률 | 손실 느낌 |
| 1회 | 0.12 | 많이 틀림 |
| 10회 | 0.38 | 조금 나아짐 |
| 100회 | 0.71 | 꽤 잘 맞힘 |
| 1000회 | 0.88 | 안정적으로 맞힘 |
모델은 정답을 직접 “이해”해서 바뀌는 게 아니다.
손실이 줄어드는 방향으로 숫자가 계속 조정되기 때문에 예측이 좋아진다.
경사란 무엇인가
경사: 파라미터를 조금 바꿨을 때 손실이 얼마나 변하는지 알려주는 값
손실을 줄이려면 파라미터를 어느 방향으로 바꿔야 하는데,
문제는 파라미터가 많다는 것이다.
이 가중치를 키워야 하나?
줄여야 하나?
얼마나 바꿔야 하나?
다른 가중치는 어떻게 해야 하나?
이 방향 정보를 알려주는 것이 경사(gradient)다.
산을 내려가는 비유
손실함수를 산의 높이라고 생각하자.
- 높은 곳 = 손실 큼 = 예측이 많이 틀림
- 낮은 곳 = 손실 작음 = 예측이 잘 맞음
우리는 가장 낮은 곳으로 가고 싶다.
경사는 현재 위치에서 어느 방향이 오르막인지 알려준다.
손실을 줄이려면 오르막의 반대 방향으로 움직이면 된다.
- 경사 방향 = 손실이 커지는 방향
- 경사의 반대 방향 = 손실이 작아지는 방향
경사하강법이란 무엇인가
경사하강법(Gradient Descent)은 경사의 반대 방향으로 파라미터를 조금씩 움직이는 방법이다.
$$
\theta_{new} = \theta_{old} - \eta \nabla L(\theta)
$$
| 기호 | 의미 |
| $\theta$ | 파라미터 |
| $L(\theta)$ | 손실함수 |
| $\nabla L(\theta)$ | 손실의 경사 |
| $\eta$ | 학습률(learning rate) |
핵심은 빼기 기호다. 경사 방향으로 가면 손실이 커지기 때문에, 반대 방향으로 가야 한다.

학습률이란 무엇인가
학습률은 한 번에 얼마나 크게 움직일지 정하는 값이다.
- 학습률 작음 → 조금씩 조심스럽게 이동
- 장점: 안정적
- 단점: 너무 느림
- -> 손실은 줄어들지만 너무 오래 걸린다.
- 학습률 큼 → 한 번에 크게 이동
- 장점: 빠르게 이동할 수 있음
- 단점: 최저점을 지나쳐 튈 수 있음.
- -> 손실이 줄어들지 않고 오히려 흔들릴 수 있다.
따라서 적절한 학습률일 때 좋은 학습률, 즉 손실을 안정적으로 줄이게 된다.
배치, 스텝, 에폭
학습 관련 글에서 자주 나오는 단어가 있다.
batch
step
epoch
처음 보면 비슷해 보이지만 서로 다르다.
| 용어 | 의미 |
| batch | 한 번에 처리하는 데이터 묶음 |
| step | 파라미터를 한 번 업데이트하는 단위 |
| epoch | 전체 학습 데이터를 한 번 다 보는 단위 |
배치(batch)
배치는 한 번에 모델에 넣는 데이터 묶음이다.
데이터가 10만 건 있다고 해서 한 번에 전부 넣지 않는다.
e.g)
전체 학습 데이터: 10,000개
batch size: 100
그러면 100개씩 잘라서 학습한다.
스텝(step)
스텝은 파라미터를 한 번 업데이트하는 단위다.
배치 하나로 예측 → 손실 계산 → 경사 계산 → 파라미터 업데이트
= 1 step
위 예시에서는 전체 데이터 10,000개를 batch size 100으로 나누므로:
1 epoch = 100 steps
에폭(epoch)
에폭은 전체 학습 데이터를 한 번 다 본 것이다.
전체 데이터 10,000개를 모두 한 번 사용하면 1 epoch,이를 10번 반복하면 10 epochs가 된다.

옵티마이저란 무엇인가
경사하강법은 기본 아이디어지만, 실제 학습에서는 단순히 경사의 반대 방향으로만 움직이지 않는다.
옵티마이저는 다음을 조절한다.
- 어느 방향으로 움직일지
- 얼마나 크게 움직일지
- 과거의 경사를 얼마나 참고할지
- 파라미터마다 다른 속도로 움직일지
대표 옵티마이저
| 옵티마이저 | 특징 |
| SGD | 가장 기본적인 경사하강법 계열 |
| Momentum | 이전 이동 방향을 일부 기억해서 관성처럼 사용 |
| RMSProp | 파라미터별 경사 크기에 따라 학습률 조정 |
| Adam | Momentum + RMSProp 계열 아이디어를 결합한 방식 |
실무에서는 Adam 계열이 자주 쓰인다. 물론 “Adam을 쓰면 무조건 좋다”는 뜻은 아니다.
모델, 데이터, 학습률, 배치 크기에 따라 결과가 달라진다.
역전파란 무엇인가
신경망은 입력층 → 은닉층1 → 은닉층2 → 출력층 으로 이루어져 있는데,
예측은 입력 → 계산 → 계산 → 예측값으로 앞에서 뒤로 진행한다.
이걸 순전파(forward propagation)라고 한다.
손실을 계산한 뒤에는 반대로,
손실 → 출력층 → 은닉층2 → 은닉층1 → 입력 쪽으로 간다.
이걸 역전파(backpropagation)라고 한다.
역전파가 하는 일
역전파는 각 파라미터가 손실에 얼마나 영향을 줬는지 계산한다.
이 가중치를 조금 키우면 손실이 커지는가?
줄이면 손실이 작아지는가?
얼마나 민감하게 변하는가?
즉, 역전파는 경사를 계산하는 방법이다.
순전파: 예측값을 만든다
손실 계산: 얼마나 틀렸는지 계산한다
역전파: 각 파라미터가 손실에 미친 영향을 계산한다
옵티마이저: 그 정보를 바탕으로 파라미터를 갱신한다
학습 루프 의사코드
실제 학습 코드는 복잡해 보이지만 핵심 흐름은 단순하다.
for epoch in range(num_epochs):
for batch_x, batch_y in train_loader:
# 1. 예측
y_pred = model(batch_x)
# 2. 손실 계산
loss = loss_function(y_pred, batch_y)
# 3. 이전 경사 초기화
optimizer.zero_grad()
# 4. 역전파로 경사 계산
loss.backward()
# 5. 파라미터 갱신
optimizer.step()
이 코드는 다음 문장을 그대로 옮긴 것이다.
예측한다
→ 틀린 정도를 계산한다
→ 틀린 원인을 파라미터별로 계산한다
→ 손실이 줄어드는 방향으로 파라미터를 바꾼다
학습과 추론의 차이
- 학습(training)
- 정답이 있는 데이터 사용
- 입력 + 정답 → 예측 → 손실 계산 → 파라미터 업데이트
- 학습 중 파라미터 바뀜
- 추론(inference)
- 이미 학습된 모델을 사용하는 단계
- 새 입력 → 예측 → 결과 반환
- 정답이 없고, 손실도 계산하지 않음
- 파라미터도 바뀌지 않음
| 학습 | 추론 | |
| 정답 데이터 | 필요 | 불필요 |
| 손실 계산 | 함 | 보통 안 함 |
| 역전파 | 함 | 안 함 |
| 파라미터 업데이트 | 함 | 안 함 |
| 목적 | 모델 개선 | 예측 결과 사용 |
손실이 낮으면 항상 좋은 모델인가
그렇지는 않다.
훈련 데이터의 손실이 낮다는 건, 훈련 데이터에 대해서 잘 맞는다는 뜻이다.
문제는 실제로 중요한 데이터는 훈련 데이터가 아니라 처음 보는 데이터다.
훈련 손실 낮음
검증 손실 높음
→ 과적합 가능성
모델이 훈련 데이터를 거의 외워버리면, 훈련 손실은 낮아도 새 데이터에는 약할 수 있다.
그래서 학습할 때는 손실만 보지 않고 검증 데이터 성능도 함께 본다.
작은 전체 예시
문장 분류 모델을 학습한다고 하자.
데이터
입력: "배송이 지연됐어요"
정답: 배송 지연
입력: "환불하고 싶어요"
정답: 환불 문의
입력: "상품을 교환하고 싶습니다"
정답: 교환 문의
모델 출력
처음에는 엉뚱하다.
"배송이 지연됐어요"
배송 지연: 0.20
환불 문의: 0.60
교환 문의: 0.20
정답 클래스인 배송 지연 확률이 낮다. 손실이 크다.
학습 후
"배송이 지연됐어요"
배송 지연: 0.86
환불 문의: 0.10
교환 문의: 0.04
정답 클래스 확률이 높아졌다. 손실이 작아졌다.
모델이 학습했다는 건 이런 변화가 일어났다는 뜻이다.
흔한 오해
오해 1. 손실이 0이면 완벽한 모델이다
훈련 데이터에서 손실이 0에 가까워도 실제 데이터에서 잘한다는 보장은 없다.
과적합일 수 있다.
오해 2. 정확도만 높으면 된다
분류 문제에서는 정확도만 보면 위험할 수 있다.
불균형 데이터에서는 대부분 클래스를 찍어도 정확도가 높게 나올 수 있다.
오해 3. 학습률은 크면 클수록 빠르다
너무 큰 학습률은 최저점 근처를 지나쳐서 손실을 불안정하게 만든다.
오해 4. 에폭을 늘리면 무조건 좋아진다
처음에는 좋아질 수 있지만, 너무 오래 학습하면 과적합될 수 있다.
정리
머신러닝의 학습은 예측이 틀린 정도를 손실함수로 계산하고,
그 손실이 줄어드는 방향으로 파라미터를 반복적으로 조정하는 과정이다.
- 입력: 데이터를 모델에 넣음
- 예측: 현재 파라미터로 답을 냄
- 손실 계산: 정답과 비교해 틀린 정도를 숫자로 만듦
- 역전파 각 파라미터가 손실에 미친 영향을 계산
- 갱신: 손실이 줄어드는 방향으로 파라미터 수정
- 반복: 여러 배치와 에폭 동안 반복
GitHub 댓글