모델은 어떻게 자신이 틀렸다는 사실을 알까
앞 장에서 우리는 신경망이 데이터를 더 좋은 표현으로 바꾸어 간다는 이야기를 했다. 처음에는 입력 숫자를 거의 그대로 뒤섞는 수준이지만, 학습이 진행될수록 중요한 특징은 더 또렷하게 살리고 덜 중요한 특징은 약하게 만든다. 그렇다면 이런 질문이 남는다.
무엇이 모델에게 "이 표현은 좋고, 저 표현은 나쁘다"고 알려 줄까?
그 역할을 하는 것이 손실 함수다. 손실 함수는 모델의 예측이 정답과 얼마나 다른지를 하나의 숫자로 바꾸는 함수다. 이 숫자가 크면 모델이 많이 틀렸다는 뜻이고, 작으면 비교적 잘 맞혔다는 뜻이다.
신경망은 스스로 "아, 이번에는 고양이 귀를 잘못 봤구나"라고 이해하지 못한다. 대신 아주 단순한 신호만 받는다.
"손실이 크다."
또는
"손실이 줄었다."
이 신호가 딥러닝 학습의 출발점이다. 모델은 예측하고, 손실 함수는 틀린 정도를 계산한다. 그다음 학습 알고리즘은 손실을 줄이는 방향으로 가중치와 편향을 조금씩 바꾼다. 딥러닝의 많은 과정은 결국 이 한 문장으로 압축할 수 있다.
모델은 손실을 줄이기 위해 학습한다.

왜 틀린 정도를 하나의 숫자로 바꿀까
사람은 모델의 예측을 보고 여러 가지 말을 할 수 있다. "방향은 맞는데 조금 부족하다", "정답과 완전히 다르다", "확신이 너무 강해서 위험하다", "결과는 맞았지만 이유가 이상하다"처럼 말이다.
하지만 컴퓨터가 가중치를 수정하려면 더 명확한 기준이 필요하다. 말로 된 평가는 바로 계산에 쓰기 어렵다. 신경망 안에는 수많은 가중치가 있고, 학습은 이 숫자들을 조금씩 바꾸는 과정이다. 그러려면 먼저 현재 상태가 얼마나 나쁜지를 숫자로 표현해야 한다.
예를 들어 집값을 예측하는 모델이 있다고 해 보자. 실제 집값은 5억 원인데 모델이 4억 8천만 원이라고 예측했다면 오차는 2천만 원이다. 다른 집에서는 실제 집값이 5억 원인데 모델이 3억 원이라고 예측했다면 오차는 2억 원이다. 두 예측 모두 틀렸지만, 틀린 정도는 다르다.
분류 문제에서도 마찬가지다. 손글씨 숫자 이미지를 보고 모델이 "이건 7일 확률이 90%"라고 했다면 꽤 좋은 예측이다. 반대로 정답이 7인데 "7일 확률은 2%, 1일 확률은 95%"라고 했다면 크게 틀린 예측이다. 둘 다 정답 여부만 보면 맞거나 틀린 결과로 정리할 수 있지만, 학습에는 그보다 더 섬세한 정보가 필요하다.
손실 함수가 하는 일은 이 섬세한 차이를 하나의 숫자로 압축하는 것이다. 이 숫자가 있어야 모델은 다음과 같은 질문에 답할 수 있다.
지금 예측이 얼마나 나쁜가?
이전보다 좋아졌는가, 나빠졌는가?
어떤 방향으로 가중치를 바꾸면 손실이 줄어드는가?
이때 중요한 점은 손실 함수가 단순한 성적표가 아니라는 것이다. 손실은 모델을 혼내기 위한 점수가 아니다. 손실은 모델이 다음에 어디로 움직여야 할지 알려 주는 나침반에 가깝다.
정답과 예측 사이의 거리
가장 직관적인 손실은 정답과 예측의 차이를 재는 것이다. 실제 값이 10이고 예측값이 8이면 차이는 2다. 실제 값이 10이고 예측값이 14이면 차이는 4다. 차이가 클수록 더 많이 틀린 것이다.
그런데 여기서 한 가지 문제가 생긴다. 오차는 방향을 가진다. 예측값이 정답보다 작으면 음수, 크면 양수가 될 수 있다. 실제 값이 10일 때 예측값이 8이면 예측값에서 정답을 뺀 값은 -2다. 예측값이 12이면 +2다.
만약 여러 데이터의 오차를 그냥 더하면 어떻게 될까? -2와 +2가 서로 상쇄되어 0이 된다. 그러면 모델이 완벽히 맞힌 것처럼 보일 수 있다. 실제로는 두 번 모두 틀렸는데 말이다.
그래서 손실 함수는 보통 오차의 부호를 없애는 방식으로 설계된다. 대표적인 방법은 두 가지다. 하나는 절댓값을 사용하는 것이고, 다른 하나는 제곱을 사용하는 것이다. 딥러닝에서 회귀 문제를 설명할 때 가장 자주 만나는 손실은 제곱을 사용하는 평균제곱오차다.
평균제곱오차: 크게 틀리면 더 크게 혼난다
평균제곱오차, 영어로는 Mean Squared Error, 줄여서 MSE라고 부른다. 회귀 문제에서 자주 쓰는 손실 함수다. 회귀 문제란 집값, 온도, 매출, 거리처럼 연속적인 숫자를 예측하는 문제를 말한다.
평균제곱오차의 생각은 단순하다.
예측값과 정답값의 차이를 구하고, 그 차이를 제곱한 뒤, 여러 데이터에 대해 평균을 낸다.
수식으로 쓰면 다음과 같다.
$$ MSE = frac{1}{n}sum_{i=1}^{n}(hat{y}_i - y_i)^2 $$
여기서 $y_i$는 실제 정답이고, $hat{y}_i$는 모델의 예측값이다. 위에 모자처럼 표시된 기호를 붙여 $hat{y}$라고 쓰면 "예측한 y"라는 뜻이다.
작은 예를 들어 보자. 어떤 모델이 세 개의 값을 예측했다.
| 데이터 | 정답 | 예측 | 오차 | 오차의 제곱 |
|---|---|---|---|---|
| A | 10 | 9 | -1 | 1 |
| B | 10 | 12 | 2 | 4 |
| C | 10 | 6 | -4 | 16 |
오차는 각각 -1, 2, -4다. 이것을 그대로 더하면 -3이 되지만, 이렇게 하면 틀린 정도를 제대로 표현하기 어렵다. 대신 오차를 제곱하면 1, 4, 16이 된다. 평균을 내면 $(1 + 4 + 16) / 3 = 7$이다. 이 모델의 평균제곱오차는 7이다.
여기서 눈여겨볼 점은 오차가 커질수록 손실이 훨씬 빠르게 커진다는 것이다. 오차가 1이면 제곱해도 1이다. 오차가 2이면 4가 된다. 오차가 4이면 16이 된다. 오차가 두 배가 되면 손실은 네 배가 된다.
이 성질 때문에 평균제곱오차는 크게 틀린 예측을 강하게 벌준다. 대체로 이 특성은 유용하다. 예를 들어 자율주행차가 앞차와의 거리를 예측할 때 1미터 틀리는 것과 10미터 틀리는 것은 위험도가 완전히 다르다. 크게 틀린 예측에 더 큰 벌점을 주는 편이 자연스럽다.
하지만 이 성질이 언제나 좋은 것은 아니다. 데이터에 이상치가 섞여 있을 때는 문제가 될 수 있다. 이상치란 대부분의 데이터와 매우 다른 값을 가진 데이터를 말한다. 예를 들어 일반적인 집값이 3억 원에서 10억 원 사이인데, 어떤 데이터 하나가 300억 원짜리 특수한 건물이라면 이 값은 학습에 지나치게 큰 영향을 줄 수 있다. 평균제곱오차는 큰 오차를 제곱해서 더 크게 만들기 때문에 이런 이상치에 민감하다.
즉 평균제곱오차는 "숫자를 예측하고 싶고, 큰 오차를 특히 줄이고 싶을 때" 잘 어울리는 손실 함수다. 그러나 데이터의 특성과 문제의 목적에 따라 다른 손실이 더 적절할 수도 있다.
손실 함수는 모델에게 선호를 가르친다
손실 함수는 단순히 틀린 정도를 재는 도구가 아니다. 더 깊게 보면, 손실 함수는 모델에게 "어떤 실수를 더 나쁘게 볼 것인가"를 알려 준다.
평균제곱오차는 큰 오차를 매우 싫어한다. 그래서 모델은 큰 오차를 줄이는 방향으로 강하게 압박받는다. 만약 절댓값 오차를 사용한다면 큰 오차도 제곱만큼 폭발적으로 커지지는 않는다. 그러면 이상치 하나에 덜 흔들리는 모델이 될 수 있다.
이 차이는 사람의 평가 방식과 비슷하다. 시험에서 작은 실수 여러 개보다 치명적인 실수 하나를 더 강하게 감점하는 선생님이 있을 수 있다. 반대로 모든 실수를 비교적 일정하게 감점하는 선생님도 있다. 어떤 채점 기준을 쓰느냐에 따라 학생의 공부 방식이 달라지듯, 어떤 손실 함수를 쓰느냐에 따라 모델이 학습하는 방식도 달라진다.
그래서 손실 함수를 고른다는 것은 단순히 공식을 고르는 일이 아니다. 모델에게 어떤 행동을 장려하고 어떤 실수를 피하게 할지 정하는 일이다.
분류 문제에서는 무엇을 벌줘야 할까
회귀 문제에서는 예측값과 정답값의 거리를 잴 수 있다. 그렇다면 분류 문제는 어떨까? 예를 들어 손글씨 숫자 이미지를 보고 0부터 9까지 중 하나를 맞히는 문제를 생각해 보자.
모델이 최종적으로 내는 값은 보통 각 클래스에 대한 점수다. 이 점수는 소프트맥스라는 함수를 거쳐 확률처럼 해석되는 값으로 바뀐다. 소프트맥스는 여러 점수를 받아서 모두 더하면 1이 되는 값들로 바꾸어 준다. 그래서 모델 출력은 다음처럼 볼 수 있다.
| 숫자 | 모델이 생각한 확률 |
|---|---|
| 0 | 0.01 |
| 1 | 0.03 |
| 2 | 0.02 |
| 3 | 0.04 |
| 4 | 0.01 |
| 5 | 0.02 |
| 6 | 0.01 |
| 7 | 0.80 |
| 8 | 0.05 |
| 9 | 0.01 |
정답이 7이라면 이 예측은 꽤 좋다. 정답 클래스인 7에 0.80, 즉 80%의 확률을 주었기 때문이다. 물론 완벽하지는 않지만 모델은 정답 쪽에 강하게 기울어져 있다.
이번에는 정답이 7인데 모델이 다음처럼 예측했다고 해 보자.
| 숫자 | 모델이 생각한 확률 |
|---|---|
| 0 | 0.01 |
| 1 | 0.70 |
| 2 | 0.03 |
| 3 | 0.04 |
| 4 | 0.01 |
| 5 | 0.02 |
| 6 | 0.01 |
| 7 | 0.05 |
| 8 | 0.12 |
| 9 | 0.01 |
이번에는 모델이 1이라고 강하게 믿고 있다. 정답인 7에는 5%밖에 주지 않았다. 이런 예측은 크게 벌줘야 한다.
분류 문제에서 우리가 원하는 것은 단순히 "가장 높은 확률의 클래스가 정답인가"만이 아니다. 정답 클래스의 확률을 높이고, 오답 클래스의 확률을 낮추는 것이다. 이때 자주 사용하는 손실 함수가 교차 엔트로피다.
교차 엔트로피: 정답 확률을 높이는 압력
교차 엔트로피는 분류 문제에서 매우 자주 쓰이는 손실 함수다. 직관적으로 말하면, 교차 엔트로피는 모델이 정답 클래스에 얼마나 낮은 확률을 주었는지를 벌준다.
정답 클래스에 높은 확률을 주면 손실은 작아진다. 정답 클래스에 낮은 확률을 주면 손실은 커진다. 특히 모델이 정답을 거의 불가능하다고 생각할수록 손실은 매우 커진다.
정답 클래스의 확률을 $p$라고 할 때, 가장 단순한 형태의 교차 엔트로피는 다음처럼 볼 수 있다.
$$ Loss = -log(p) $$
여기서 $log$는 로그 함수다. 로그를 깊게 알 필요는 없다. 지금은 이렇게 이해하면 충분하다.
정답 확률 $p$가 1에 가까우면 손실은 0에 가까워진다. 정답 확률 $p$가 0에 가까우면 손실은 급격히 커진다.
몇 가지 값을 보자.
| 정답 클래스에 준 확률 | 교차 엔트로피 손실의 느낌 |
|---|---|
| 0.90 | 매우 작다 |
| 0.70 | 작지만 개선 여지가 있다 |
| 0.30 | 꽤 크다 |
| 0.10 | 크다 |
| 0.01 | 매우 크다 |
이 구조는 분류 모델을 학습시키기에 아주 적절하다. 모델이 정답에 90%의 확률을 주었다면 손실은 작다. 아직 100%는 아니지만 방향은 좋다. 반대로 정답에 1%의 확률밖에 주지 않았다면 손실은 매우 커진다. 모델은 그 예측을 강하게 고쳐야 한다.
교차 엔트로피가 좋은 이유는 모델의 "확신"까지 평가한다는 점이다. 단순한 정답 여부만 보는 정확도와 비교하면 차이가 분명하다.
예를 들어 정답이 고양이인 이미지가 있다. 모델 A는 고양이 확률을 51%, 강아지 확률을 49%라고 했다. 모델 B는 고양이 확률을 99%, 강아지 확률을 1%라고 했다. 둘 다 최종 예측은 고양이이고, 정확도만 보면 둘 다 맞았다. 하지만 모델 B가 훨씬 더 확신 있는 좋은 예측을 했다. 교차 엔트로피는 이 차이를 손실값에 반영한다.
반대로 틀렸을 때도 확신의 차이를 본다. 정답이 고양이인데 모델이 강아지라고 예측했다고 해 보자. 고양이 확률을 49%로 두고 아슬아슬하게 틀린 모델과, 고양이 확률을 0.1%로 두고 강하게 틀린 모델은 다르게 평가되어야 한다. 교차 엔트로피는 후자를 훨씬 더 크게 벌준다.
정확도만으로는 학습하기 어렵다
그렇다면 이런 의문이 들 수 있다. "분류 문제라면 그냥 맞았는지 틀렸는지만 보면 안 될까? 정확도를 손실로 쓰면 되지 않을까?"
정확도는 모델을 평가할 때 매우 직관적인 지표다. 100개 중 90개를 맞히면 정확도는 90%다. 이해하기 쉽고 설명하기도 쉽다. 하지만 학습에 직접 사용하기에는 불편한 점이 있다.
가장 큰 문제는 정확도가 너무 둔감하다는 것이다.
정답이 7인 이미지에서 모델이 7의 확률을 40%, 1의 확률을 41%라고 했다고 해 보자. 최종 예측은 1이므로 틀렸다. 정확도 관점에서는 0점이다. 그런데 모델이 조금 개선되어 7의 확률을 40%에서 40.9%로 올리고, 1의 확률을 41%에서 40.95%로 낮췄다고 해 보자. 모델은 정답에 가까워지고 있지만 여전히 최종 예측은 1이다. 정확도는 여전히 0점이다.
정확도는 모델이 정답 쪽으로 움직이고 있는지 잘 알려 주지 못한다. 어느 순간 순위가 뒤집혀 정답 클래스가 1등이 되기 전까지는 변화가 보이지 않는다.
반면 교차 엔트로피는 정답 확률이 조금만 올라가도 손실이 줄어든다. 모델은 아주 작은 개선도 신호로 받을 수 있다. 딥러닝 학습은 이런 작은 신호를 계속 모아 가는 과정이다. 그래서 학습할 때는 교차 엔트로피 같은 손실 함수를 사용하고, 평가할 때는 정확도 같은 지표를 함께 보는 경우가 많다.
이 차이를 꼭 기억하자. 손실 함수는 학습을 위한 신호이고, 평가 지표는 사람이 성능을 이해하기 위한 기준인 경우가 많다. 둘은 서로 연결되어 있지만 같은 것은 아니다.
손실은 한 개의 데이터에서만 계산되지 않는다
실제로 학습할 때는 데이터 하나마다 손실을 계산한 뒤, 여러 데이터의 손실을 평균낸다. 딥러닝에서는 보통 전체 데이터를 한 번에 모두 사용하지 않고, 일부 묶음인 배치 단위로 학습한다. 배치는 몇 장의 이미지, 몇 개의 문장, 몇 개의 표본을 한 묶음으로 만든 것이다.
예를 들어 한 배치에 4개의 데이터가 있고 각각의 손실이 다음과 같다고 해 보자.
| 데이터 | 손실 |
|---|---|
| A | 0.2 |
| B | 0.5 |
| C | 1.1 |
| D | 0.6 |
이 배치의 평균 손실은 $(0.2 + 0.5 + 1.1 + 0.6) / 4 = 0.6$이다. 학습 알고리즘은 이 평균 손실을 줄이는 방향으로 모델의 가중치를 수정한다.
여기서 평균을 내는 이유는 데이터 하나에 너무 휘둘리지 않기 위해서다. 어떤 데이터는 우연히 쉽고, 어떤 데이터는 매우 어렵다. 한 개의 데이터만 보고 모델을 크게 바꾸면 학습이 불안정해질 수 있다. 여러 데이터의 손실을 함께 보면 조금 더 안정적인 방향을 잡을 수 있다.
물론 배치의 크기도 학습에 영향을 준다. 작은 배치는 빠르게 자주 업데이트할 수 있지만 방향이 흔들릴 수 있다. 큰 배치는 더 안정적인 평균을 제공하지만 계산 비용이 커진다. 배치와 학습 반복의 개념은 뒤에서 학습률, 배치, 에폭을 다룰 때 더 자세히 살펴볼 것이다.
손실이 줄어드는 장면을 상상해 보기
이제 학습 과정을 머릿속에서 한 번 그려 보자. 모델은 처음에 아무것도 모른다. 가중치는 대체로 무작위에 가깝게 시작한다. 그래서 처음 예측은 엉망일 가능성이 높다. 손실도 크다.
첫 번째 학습 단계에서 모델은 예측한다. 손실 함수는 정답과 예측을 비교해 숫자를 만든다. 그 숫자가 크다면 현재 가중치 조합이 좋지 않다는 뜻이다. 학습 알고리즘은 손실을 조금 줄일 수 있는 방향을 찾아 가중치를 살짝 바꾼다.
다음 단계에서 모델은 다시 예측한다. 운이 좋고 방향이 맞았다면 손실이 조금 줄어든다. 그러면 모델은 "방금 바꾼 방향이 나쁘지 않았구나"라는 계산적 신호를 얻는다. 물론 모델이 실제로 생각하는 것은 아니지만, 학습 과정은 그렇게 움직인다.
이 일이 수천 번, 수만 번, 때로는 수억 번 반복된다. 예측하고, 틀린 정도를 계산하고, 어느 방향으로 바꾸면 나아질지 찾고, 조금 수정한다. 손실 함수는 이 반복 과정의 중심에 있다.
앞으로 배울 경사하강법과 역전파는 모두 이 질문을 다룬다.
"손실을 줄이려면 각 가중치를 어느 방향으로 얼마나 바꿔야 할까?"
손실 함수가 없다면 이 질문 자체가 성립하지 않는다. 손실이 있어야 줄일 대상이 생기고, 줄일 대상이 있어야 학습 방향을 계산할 수 있다.
손실이 낮아지면 항상 좋은 모델일까
여기까지 들으면 손실이 낮을수록 언제나 좋은 모델이라고 생각하기 쉽다. 대체로는 맞다. 하지만 조심해야 한다. 손실이 낮아진다는 것이 실제로 우리가 원하는 성능 향상과 항상 같은 뜻은 아니다.
첫 번째 이유는 훈련 데이터에만 잘 맞을 수 있기 때문이다. 모델은 학습에 사용한 데이터의 손실을 줄인다. 그런데 훈련 데이터에 지나치게 맞춰지면 처음 보는 데이터에서는 성능이 떨어질 수 있다. 이것을 과적합이라고 부른다. 훈련 손실은 계속 내려가는데 검증 데이터의 손실은 어느 순간 다시 올라간다면, 모델이 문제의 일반적인 패턴이 아니라 훈련 데이터의 세부 사항을 외우고 있을 가능성이 있다.
두 번째 이유는 손실 함수가 우리가 진짜 원하는 목표를 완벽하게 표현하지 못할 수 있기 때문이다. 예를 들어 의료 진단 모델을 만든다고 해 보자. 어떤 병을 놓치는 것과 건강한 사람을 병이 있다고 잘못 판단하는 것은 둘 다 오류지만, 두 오류의 비용은 다를 수 있다. 단순한 교차 엔트로피만 사용하면 이런 현실적인 비용 차이를 충분히 반영하지 못할 수도 있다.
세 번째 이유는 데이터 분포가 불균형할 수 있기 때문이다. 예를 들어 전체 데이터의 99%가 정상 거래이고 1%만 사기 거래인 문제가 있다고 해 보자. 모델이 모든 거래를 정상이라고 예측해도 정확도는 99%가 된다. 손실도 겉보기에는 낮아질 수 있다. 하지만 이 모델은 우리가 진짜 찾고 싶은 사기 거래를 하나도 잡지 못한다. 이런 문제에서는 손실뿐 아니라 정밀도, 재현율 같은 다른 평가 지표도 함께 봐야 한다.
네 번째 이유는 확률이 잘 보정되지 않을 수 있기 때문이다. 어떤 모델은 정답을 자주 맞히지만 지나치게 자신만만한 확률을 낼 수 있다. 예를 들어 실제로는 70% 정도만 맞는 상황에서 항상 99%라고 말한다면 위험하다. 특히 추천, 금융, 의료처럼 확률 자체가 의사결정에 쓰이는 분야에서는 단순한 정답 여부보다 확률의 신뢰성이 중요하다.
그러므로 학습 중 손실이 줄어드는 것은 좋은 신호지만, 그것만으로 충분하지는 않다. 우리는 보통 훈련 손실, 검증 손실, 정확도, 문제별 평가 지표를 함께 보면서 모델을 판단한다.
훈련 손실과 검증 손실
딥러닝을 공부하다 보면 훈련 손실과 검증 손실이라는 말을 자주 듣게 된다. 둘의 차이는 간단하다.
훈련 손실은 모델이 실제로 학습에 사용한 데이터에서 계산한 손실이다. 검증 손실은 학습에 직접 사용하지 않은 데이터에서 계산한 손실이다. 검증 데이터는 모델에게 시험지 같은 역할을 한다.
훈련 손실이 내려가는 것은 모델이 공부한 문제를 더 잘 풀게 되었다는 뜻이다. 검증 손실이 내려가는 것은 처음 보는 비슷한 문제도 더 잘 풀게 되었다는 뜻이다. 우리가 진짜 원하는 것은 검증 손실이 잘 내려가는 모델이다.
처음에는 보통 훈련 손실과 검증 손실이 함께 내려간다. 모델이 데이터의 기본 패턴을 배우고 있기 때문이다. 그런데 학습을 너무 오래 하거나 모델이 지나치게 복잡하면 훈련 손실은 계속 내려가는데 검증 손실은 멈추거나 올라갈 수 있다. 이때 모델은 훈련 데이터를 외우는 쪽으로 가고 있을 가능성이 높다.
이 장에서는 손실 함수 자체에 집중하고 있지만, 좋은 모델을 만들려면 손실 곡선을 읽는 눈도 필요하다. 손실은 단순한 숫자가 아니라 학습 과정의 온도계다. 숫자가 내려가는지, 어디서 멈추는지, 훈련과 검증이 얼마나 벌어지는지를 보면 모델의 상태를 짐작할 수 있다.
손실 함수가 표현 학습을 이끈다
앞 장에서 우리는 신경망의 중간층이 데이터를 새로운 표현으로 바꾼다고 했다. 이제 그 표현이 어떻게 좋아지는지 조금 더 선명하게 볼 수 있다.
손실 함수는 출력층에서 계산된다. 예측값과 정답값을 비교해 하나의 숫자를 만든다. 하지만 그 영향은 출력층에만 머물지 않는다. 손실이 크면 모델은 마지막 층의 가중치뿐 아니라 그 앞의 층, 더 앞의 층까지 조정해야 한다. 왜냐하면 마지막 예측은 이전 층들이 만든 표현을 바탕으로 나오기 때문이다.
예를 들어 고양이와 강아지를 분류하는 모델을 생각해 보자. 처음에는 모델이 털 색깔 같은 단순한 단서에만 의존할 수 있다. 그런데 그런 방식으로 자꾸 틀리면 손실이 커진다. 학습이 반복되면서 모델은 손실을 줄이기 위해 귀 모양, 눈의 위치, 코 주변의 구조, 얼굴 윤곽 같은 더 유용한 특징을 표현에 담으려 한다.
물론 모델이 사람처럼 "귀를 봐야겠다"고 생각하는 것은 아니다. 하지만 손실을 줄이는 압력이 계속 전달되면, 결과적으로 중간층의 표현이 더 쓸모 있는 방향으로 바뀐다. 이것이 표현 학습의 중요한 감각이다.
좋은 손실 함수는 좋은 표현을 끌어낸다. 반대로 문제와 맞지 않는 손실 함수는 모델이 엉뚱한 표현을 배우게 만들 수 있다. 손실 함수가 학습의 기준점이라는 말은 바로 이런 뜻이다.
PyTorch에서는 손실 함수도 하나의 모듈처럼 쓴다
아직 본격적인 PyTorch 코드는 뒤에서 다루겠지만, 손실 함수가 실제 코드에서 어떤 위치에 놓이는지 미리 감각만 잡아 보자.
딥러닝 학습 코드는 대체로 다음 흐름을 가진다.
# 1. 모델이 예측한다
pred = model(x)
# 2. 손실을 계산한다
loss = loss_fn(pred, y)
# 3. 손실을 기준으로 가중치를 수정할 준비를 한다
loss.backward()
# 4. 최적화 알고리즘이 실제로 가중치를 업데이트한다
optimizer.step()여기서 loss_fn이 손실 함수다. 회귀 문제라면 평균제곱오차를 사용할 수 있고, 분류 문제라면 교차 엔트로피를 사용할 수 있다. loss는 하나의 숫자다. 그리고 loss.backward()는 이 손실이 각 가중치와 어떤 관계를 가지는지 계산하는 출발점이 된다.
지금은 backward()의 내부 원리를 몰라도 괜찮다. 다음 장들에서 경사하강법, 미분, 역전파를 차례로 살펴보면 이 한 줄이 훨씬 선명하게 보일 것이다. 중요한 것은 손실 함수가 학습 루프의 한가운데 있다는 점이다. 모델의 예측과 가중치 수정 사이를 이어 주는 다리가 바로 손실이다.
손실 함수를 고를 때의 기본 감각
처음 딥러닝을 공부할 때 모든 손실 함수를 외우려고 할 필요는 없다. 먼저 문제의 형태에 따라 대표적인 선택을 익히면 된다.
연속적인 숫자를 예측하는 회귀 문제에서는 평균제곱오차를 자주 사용한다.
여러 클래스 중 하나를 고르는 분류 문제에서는 교차 엔트로피를 자주 사용한다.
모델을 평가할 때는 손실뿐 아니라 정확도, 정밀도, 재현율 같은 지표를 함께 확인한다.
이 세 가지 감각만 있어도 많은 예제를 읽을 수 있다. 중요한 것은 공식 자체보다 왜 그런 손실을 쓰는지 이해하는 것이다. 평균제곱오차는 예측값과 정답값 사이의 숫자 거리, 특히 큰 오차를 줄이는 데 관심이 있다. 교차 엔트로피는 정답 클래스에 높은 확률을 주도록 모델을 압박한다.
손실 함수는 모델에게 문제의 규칙을 알려 주는 방식이다. "이런 예측은 좋다", "이런 예측은 나쁘다", "이런 실수는 특히 줄여야 한다"는 기준을 숫자로 표현한다. 딥러닝 모델은 이 숫자를 따라 움직인다.
이번 장의 핵심
손실 함수는 모델의 예측이 얼마나 틀렸는지 하나의 숫자로 바꾸는 함수다. 이 숫자가 있어야 학습 알고리즘은 가중치를 어떤 방향으로 수정해야 할지 계산할 수 있다.
회귀 문제에서는 평균제곱오차가 자주 쓰인다. 평균제곱오차는 예측값과 정답값의 차이를 제곱해 평균낸다. 오차가 클수록 손실이 빠르게 커지므로, 크게 틀린 예측을 강하게 줄이도록 모델을 이끈다.
분류 문제에서는 교차 엔트로피가 자주 쓰인다. 교차 엔트로피는 모델이 정답 클래스에 낮은 확률을 줄수록 큰 손실을 만든다. 그래서 모델은 정답 확률을 높이고 오답 확률을 낮추는 방향으로 학습된다.
하지만 손실이 낮아진다고 해서 언제나 우리가 원하는 좋은 모델이 되는 것은 아니다. 훈련 데이터에만 맞는 과적합이 생길 수 있고, 손실 함수가 실제 문제의 중요도를 완벽히 반영하지 못할 수도 있다. 그래서 손실은 학습의 핵심 신호이지만, 검증 성능과 다른 평가 지표도 함께 보아야 한다.
이제 우리는 모델이 무엇을 줄이려고 학습하는지 알게 되었다. 다음 질문은 자연스럽다.
모델은 손실을 줄이는 방향을 어떻게 찾을까?
그 질문에 답하는 첫 번째 도구가 바로 경사하강법이다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.