손실 함수
고친 사람 github-actions[bot]
손실 함수는 모델의 답이 얼마나 틀렸는지 숫자 하나로 매겨 줍니다. 모델의 답과 정답을 넣으면 많이 틀릴수록 큰 수가 나옵니다. 머신러닝은 이 숫자가 작아지도록 모델을 고쳐 가며 학습합니다.
쉽고 빠른 이해
모델이 낸 답과 정답의 차이를 점수 하나로 바꿔 줍니다. 집값을 3억으로 예측했다고 해 봅니다. 실제 값이 3억 5천이면 그 차이를 숫자 하나로 매깁니다. 억 단위로 차이 0.5 를 제곱해 매기면 손실은 0.25 입니다.
틀린 정도가 숫자로 나와야 모델을 어느 쪽으로 고칠지 정할 수 있습니다. 「좀 틀렸다」로는 고칠 방향이 나오지 않습니다.
- 모델이 예제를 보고 답을 냅니다.
- 손실 함수가 그 답과 정답을 견줘 숫자 하나를 냅니다.
- 이 숫자가 줄어드는 쪽으로 모델 안의 숫자들을 조금 고칩니다.
- 1 부터 3 까지를 수없이 되풀이합니다.
대가는 손실 함수가 「무엇을 얼마나 틀렸다고 칠지」를 정해 버린다는 것입니다. 잘못 고르면 모델이 엉뚱한 것을 배웁니다.
또 학습에 쓰는 손실은 고칠 방향을 계산할 수 있는 식이어야 합니다. 그래서 사람이 보는 점수를 바로 손실로 쓰지 못할 때가 많습니다.
상세
이 절은 손실 함수가 무엇을 받아 무엇을 내는지부터 봅니다. 그다음 학습에서 이 숫자가 어떻게 쓰이는지 봅니다. 가장 흔한 손실 함수 둘을 손으로 계산해 본 뒤, 고르는 기준과 사람이 보는 점수와의 차이로 마칩니다.
다트를 던진다고 해 봅니다. 화살이 과녁 한가운데서 멀리 꽂힐수록 벌점을 크게 매깁니다. 벌점표가 있으면 던질 때마다 얼마나 빗나갔는지가 숫자로 남습니다. 그 숫자를 보며 팔의 각도를 조금씩 바꿉니다.
손실 함수가 이 벌점표입니다. 과녁 한가운데가 정답입니다. 화살이 꽂힌 곳이 모델의 답입니다. 이름의 손실은 틀려서 잃은 만큼을 뜻합니다.
이 이름은 통계학에서도 씁니다. 추정한 값이 참값에서 벗어난 만큼 매기는 벌점이라는 뜻이 같습니다. 이 문서는 머신러닝에서 모델을 학습시킬 때의 손실 함수를 중심으로 봅니다.
넣는 것과 나오는 것
모델은 입력을 받아 답을 내는 함수입니다. 집 넓이를 넣으면 집값을 내는 식이 한 예입니다. 모델이 낸 답을 예측이라고 부릅니다.
모델을 가르치려면 입력마다 정답을 알고 있어야 합니다. 입력 하나와 그 정답 하나를 짝지은 것을 예제라고 부릅니다. 예제에 붙은 정답을 레이블이라고 합니다.
손실 함수는 예측과 레이블을 받아 숫자 하나를 냅니다. 이 숫자를 손실이라고 부릅니다. 예측이 레이블과 같으면 손실은 0 입니다. 예측이 레이블에서 멀어질수록 손실이 커집니다.
손실은 예제 하나마다 나옵니다. 데이터 전체가 얼마나 틀렸는지 볼 때는 예제마다 나온 손실을 평균 냅니다. 이 평균을 따로 비용 함수라고 부르기도 합니다.
학습이 줄이려는 값을 통틀어 목적 함수라고 합니다. 머신러닝에서는 대개 손실의 평균이 목적 함수입니다. 여기에 손실과는 별도로 계산한 벌점을 더하기도 합니다. 그 벌점은 아래 「훈련 손실과 검증 손실」에서 봅니다.
| 이름 | 가리키는 값 |
|---|---|
| 손실 | 예제 하나에서 매긴 틀린 정도 |
| 비용 함수 | 데이터 전체의 손실을 평균 낸 값 |
| 목적 함수 | 학습이 줄이려는 값 전체. 손실 평균에 별도로 더한 벌점까지 |
글마다 세 이름을 섞어 씁니다. 셋을 모두 손실이라고 부르는 글도 흔합니다. 대개 문맥을 보면 예제 하나의 값인지 전체 평균인지 갈립니다.
학습에서 맡는 일
이 소절은 손실이라는 숫자가 학습을 어떻게 움직이는지 봅니다.
모델 안에는 답을 정하는 숫자가 들어 있습니다. 이 숫자를 파라미터라고 합니다. 집값 모델을
집값 = a × 넓이 + b 라는 직선으로 두면 a 와 b 가 파라미터입니다.
파라미터가 바뀌면 예측이 바뀝니다. 예측이 바뀌면 손실도 바뀝니다. 그래서 손실은 파라미터를 넣으면 숫자가 나오는 함수로도 볼 수 있습니다. 훈련은 이 값이 가장 작아지는 파라미터를 찾는 일입니다.
파라미터를 아주 조금 바꿨을 때 손실이 어느 쪽으로 얼마나 변하는지를 기울기라고 합니다. 기울기를 알면 손실이 줄어드는 쪽이 어디인지 압니다.
손실이 줄어드는 쪽으로 파라미터를 조금씩 옮기기를 되풀이하는 방법이 경사 하강법입니다. 파라미터를 찾는 방법으로 가장 흔히 씁니다.
신경망은 머신러닝 모델의 한 갈래입니다. 큰 신경망은 파라미터가 수백만 개에 이르기도 합니다. 이렇게 많으면 기울기를 하나씩 따로 구해서는 감당이 안 됩니다.
역전파는 모든 파라미터의 기울기를 한꺼번에 구하는 계산 방법입니다. 아래 그림은 예제를 한 번 볼 때마다 도는 한 바퀴입니다.
flowchart TD
A["모델이 예제를 보고 예측을 낸다"] --> B["손실 함수가 예측과 레이블을 견준다"]
B --> C["손실 · 숫자 하나"]
C --> D["역전파가 기울기를 구한다"]
D --> E["경사 하강법이 파라미터를 고친다"]
E --> A
이 고리에서 잘했는지 못했는지를 말하는 부품은 손실 함수 하나뿐입니다. 모델은 손실 함수가 매긴 점수 말고는 아무것도 보지 못합니다.
평균 제곱 오차
이 소절은 숫자를 맞히는 문제에서 가장 흔한 손실 함수를 계산으로 봅니다. 집값·기온·수요처럼 답이 연속된 숫자인 문제를 회귀라고 합니다.
예제마다 예측과 레이블의 차이를 제곱합니다. 그 값들을 평균 낸 것이 평균 제곱 오차입니다. 영어 줄임말로 MSE(Mean Squared Error)라고 씁니다.
제곱하는 까닭은 둘입니다. 차이가 음수여도 손실은 양수가 됩니다. 그리고 값이 끊기거나 계단처럼 뛰지 않고 조금씩 이어서 변합니다. 이런 매끄러운 식이라야 기울기를 구하기 쉽습니다.
예제 셋으로 계산해 봅니다. 아래 코드는 예측과 레이블의 차이를 제곱한 뒤 평균을 냅니다.
preds = [3.0, 5.0, 2.0]
labels = [2.5, 5.0, 4.0]
sq = [(p - y) ** 2
for p, y in zip(preds, labels)]
print(sq) # [0.25, 0.0, 4.0]
mse = sum(sq) / len(sq)
print(round(mse, 3)) # 1.417
셋째 예제 하나가 손실 대부분을 차지합니다. 차이가 2 라서 제곱하면 4 가 됐습니다. 차이가 0.5 인 첫 예제는 0.25 만 보탭니다.
교차 엔트로피
이 소절은 정답이 몇 가지 보기 중 하나인 문제의 손실 함수를 봅니다. 메일이 스팸인지 아닌지, 사진 속 동물이 고양이·개·새 중 무엇인지 고르는 문제를 분류라고 합니다.
분류 모델은 답을 하나만 내지 않습니다. 보기마다 그것이 정답일 확률을 냅니다. 고양이 0.7, 개 0.2, 새 0.1 처럼 모두 더하면 1 이 되는 숫자들입니다. 보기 가운데 확률이 가장 큰 것을 모델의 답으로 칩니다.
교차 엔트로피는 모델이 정답 보기에 준 확률만 봅니다. 그 확률이 1 에 가까우면 손실을 작게 매깁니다. 0 에 가까울수록 손실을 크게 매깁니다.
이렇게 매기는 데 로그를 씁니다. 로그는 1 을 넣으면 0 이 나오는 함수입니다. 1 보다 작은 수를 넣으면 음수가 나옵니다. 넣는 수가 0 에 가까울수록 그 음수의 절댓값이 끝없이 커집니다.
그래서 정답에 준 확률에 로그를 씌우고 부호를 뒤집으면 손실이 됩니다. 식으로 적으면
손실 = −log(정답에 준 확률) 입니다. 식 앞의 빼기가 음수를 양수로 뒤집습니다.
아래 코드의 p 는 모델이 정답 보기에 준 확률입니다. math.log 는 위에서 말한 로그를 구하는 함수입니다.
import math
def ce(p):
return -math.log(p)
print(round(ce(0.9), 3)) # 0.105
print(round(ce(0.5), 3)) # 0.693
print(round(ce(0.1), 3)) # 2.303
정답에 0.9 를 준 모델은 손실이 0.105 로 작습니다. 0.1 만 준 모델은 손실이 2.303 입니다. 정답에 0.1 을 줬다는 것은 틀린 보기에 0.9 를 몰아줬다는 뜻입니다. 틀린 답을 자신 있게 낼수록 손실이 가파르게 커집니다.
고르는 기준
같은 예측이라도 손실 함수가 다르면 매기는 점수가 달라집니다. 이 소절은 먼저 문제마다 흔히 쓰는 손실 함수를 봅니다. 그다음 차이를 다르게 벌하는 두 함수를 견줘 봅니다.
분류는 보기 수로 다시 나눕니다. 보기가 둘이면 이진 분류, 셋 이상이면 다중 분류라고 합니다.
이진 분류 모델은 확률을 하나만 냅니다. 「스팸이다」처럼 정해 둔 한쪽 보기가 정답일 확률 p 입니다. 다른 쪽 보기의 확률은 1 − p 로 저절로 정해집니다.
이진 분류에 쓰는 교차 엔트로피를 따로 이진 교차 엔트로피라고 부릅니다. 레이블이 「스팸」이면 p 를, 「스팸 아님」이면 1 − p 를 정답에 준 확률로 넣습니다. 나머지 계산은 앞 소절과 같습니다.
회귀에는 평균 제곱 오차 말고 평균 절대 오차도 흔히 씁니다. 차이를 제곱하지 않고 절댓값을 평균 냅니다. 영어 줄임말로 MAE(Mean Absolute Error)라고 씁니다. 차이가 −2 든 2 든 똑같이 2 로 칩니다.
아래 표는 문제마다 흔히 쓰는 손실 함수를 모은 것입니다.
| 문제 | 모델이 내는 것 | 흔히 쓰는 손실 함수 |
|---|---|---|
| 회귀 | 숫자 하나 | 평균 제곱 오차 · 평균 절대 오차 |
| 이진 분류 | 정한 쪽이 정답일 확률 하나 | 이진 교차 엔트로피 |
| 다중 분류 | 보기마다 확률 | 교차 엔트로피 |
회귀에는 후보가 둘입니다. 두 함수는 큰 차이를 벌하는 세기가 다릅니다. 아래 표는 차이 하나가 두 손실에 얼마를 보태는지 보입니다.
| 예측과 레이블의 차이 | 평균 제곱 오차에 보태는 값 | 평균 절대 오차에 보태는 값 |
|---|---|---|
| 0.5 | 0.25 | 0.5 |
| 1 | 1 | 1 |
| 2 | 4 | 2 |
| 10 | 100 | 10 |
차이가 1 보다 크면 제곱 쪽이 훨씬 무겁게 벌합니다. 차이가 10 인 예제 하나가 100 을 보태 나머지 예제를 압도합니다. 그래서 평균 제곱 오차로 학습한 모델은 크게 틀린 예제 하나를 맞추려고 전체가 끌려갑니다.
큰 실수를 특히 피해야 하는 문제라면 제곱이 그 뜻을 담습니다. 반대로 잘못 적힌 값이 데이터에 섞여 있으면 모델이 그 값에 끌려갑니다. 무리에서 동떨어진 이런 값을 이상치라고 합니다. 이상치가 많으면 평균 절대 오차가 덜 휘둘립니다.
손실 함수를 고르는 일은 무엇을 얼마나 틀렸다고 칠지를 정하는 일입니다. 모델은 손실이 작아지는 쪽으로만 배웁니다. 손실 함수가 사람의 의도와 어긋나면 모델도 어긋난 것을 배웁니다.
손실과 평가 지표
사람이 모델을 볼 때 쓰는 점수와 손실 함수는 따로 둡니다. 이 소절은 둘을 왜 따로 두는지 봅니다.
사람이 모델을 평가하려고 보는 점수를 평가 지표라고 합니다. 모델을 실제로 써도 될지 사람이 판단하는 데 씁니다.
분류에서 흔한 평가 지표는 정확도입니다. 전체 예제 가운데 맞힌 비율입니다. 확률이 가장 큰 보기가 레이블과 같으면 맞힌 것으로 칩니다.
기울기를 구하려면 손실 함수를 미분할 수 있어야 합니다. 미분은 입력을 아주 조금 바꿨을 때 값이 얼마나 빨리 변하는지 알려 주는 계산입니다. 값이 끊기거나 계단처럼 뛰는 함수는 이 계산이 막힙니다.
정확도는 파라미터를 조금 바꿔도 대개 변하지 않습니다. 고양이일 확률이 0.71 에서 0.72 로 올라도 답은 여전히 「고양이」이기 때문입니다. 값이 계단처럼 머물다가 한 번에 뛰므로 기울기가 거의 언제나 0 입니다. 기울기가 0 이면 어느 쪽으로 고칠지가 나오지 않습니다.
교차 엔트로피는 정답 확률이 0.71 에서 0.72 로 오르기만 해도 손실이 조금 줄어듭니다. 이렇게 매끄럽게 움직여서 고칠 방향을 줍니다. 그래서 학습은 교차 엔트로피로 합니다. 결과는 사람이 정확도로 읽습니다.
훈련 손실과 검증 손실
같은 손실 함수라도 어느 데이터로 재느냐에 따라 알려 주는 것이 달라집니다. 이 소절은 두 데이터에서 잰 손실을 견줍니다.
학습에 쓴 데이터로 잰 손실을 훈련 손실이라고 합니다. 학습은 이 값을 줄이므로 훈련 손실은 대개 계속 내려갑니다.
학습에 쓰지 않고 따로 떼어 둔 데이터를 검증 데이터라고 합니다. 여기서 잰 손실이 검증 손실입니다. 모델이 처음 보는 데이터에서 얼마나 틀릴지를 미리 가늠하게 해 줍니다.
훈련 손실은 계속 내려갈 수 있습니다. 그때 검증 손실이 오르기 시작하면 모델이 학습 데이터를 외우고 있다는 신호입니다. 이런 현상을 과적합이라고 합니다. 과적합한 모델은 처음 보는 데이터에서 더 많이 틀립니다.
과적합을 막는 가장 단순한 방법은 검증 손실이 오르기 시작할 때 학습을 멈추는 것입니다. 이 방법을 조기 종료라고 부릅니다.
과적합을 줄이려고 목적 함수에 손실과는 별도로 계산한 벌점을 더하기도 합니다. 파라미터 값이 커질수록 커지는 벌점입니다. 이것을 규제라고 합니다. 앞에서 목적 함수에 더한다고 한 벌점이 이 규제입니다.
파라미터가 크면 입력이 조금만 달라져도 예측이 크게 흔들립니다. 그런 모델은 학습 데이터의 우연한 무늬까지 따라가기 쉽습니다. 규제는 파라미터를 작게 묶어 모델을 단순하게 만듭니다. 그래서 과적합이 줄어듭니다.
관련 항목
손실 함수가 속하는 상위 분류
손실 함수를 가리키는 다른 이름
비용 함수 · 목적 함수 · 오차 함수
회귀 문제에 쓰는 손실 함수
평균 제곱 오차 · 평균 절대 오차 · 후버 손실 · 분위수 손실
분류 문제에 쓰는 손실 함수
교차 엔트로피 · 이진 교차 엔트로피 · 로그 손실 · 힌지 손실 · 쿨백-라이블러 발산
손실 함수가 받는 입력과 그 입력을 만드는 함수
모델 · 예측 · 레이블 · 확률 · 소프트맥스 · 시그모이드 함수 · 로그 함수
손실을 줄여 가는 학습 절차
훈련 · 파라미터 · 기울기 · 미분 · 경사 하강법 · 역전파 · 학습률
손실 함수의 모양이 정하는 최적화 지형
볼록 함수 · 지역 최솟값 · 전역 최솟값 · 안장점
손실 함수와 따로 두는 평가 지표
평가 지표 · 정확도 · 정밀도 · 재현율 · F1 점수
손실의 흐름으로 진단하는 현상
다른 이름: loss function · 손실함수 · 로스 함수