손실 함수
손실 함수
손실 함수(loss function)는 모델의 예측과 정답이 얼마나 다른지 하나의 값으로 나타내는 함수. 훈련에서는 손실의 그래디언트를 계산하고, 손실이 감소하는 방향으로 모델 파라미터를 수정.
손실은 모델이 최소화하는 대상이고, 정확도 같은 평가 지표는 성능을 해석하는 기준. 훈련 손실이 감소해도 새로운 데이터의 성능이 반드시 좋아지는 것은 아니므로 검증 지표도 함께 확인해야 함.
평균 제곱 오차
평균 제곱 오차(mean squared error, MSE)는 실제값과 예측값의 차이를 제곱한 뒤 평균.
MSE=N1i=1∑N(yi−y^i)2- 연속적인 수치를 예측하는 회귀 문제에 주로 사용
- 오차를 제곱하므로 큰 오차에 더 큰 벌점 부여
- 모든 예측이 정답과 같을 때 0
이항 교차 엔트로피
이항 교차 엔트로피(binary cross-entropy)는 두 클래스 중 하나를 예측하는 문제에 사용. 정답 yi는 0 또는 1이고, y^i는 클래스 1의 예측 확률.
L=−N1i=1∑N[yilog(y^i)+(1−yi)log(1−y^i)]정답 클래스에 높은 확률을 부여할수록 손실 감소. 교차 엔트로피는 확률 분포 사이의 대칭적인 거리가 아니라, 예측 분포가 정답에 부여한 확률을 평가하는 값.
다항 교차 엔트로피
다항 교차 엔트로피(multiclass cross-entropy)는 서로 배타적인 여러 클래스 중 하나를 예측할 때 사용. 클래스가 C개이고 정답을 원-핫 벡터 yi로 표현하면 다음과 같이 계산.
L=−N1i=1∑Nc=1∑Cyi,clog(p^i,c)p^i,c는 사례 i가 클래스 c에 속할 예측 확률. 원-핫 벡터에서는 정답 클래스의 원소만 1이므로, 결국 정답 클래스에 부여한 확률의 음의 로그를 계산.
Keras에서는 레이블 표현에 따라 두 클래스를 구분.
- 범주형 교차 엔트로피(
CategoricalCrossentropy):[0, 0, 1]같은 원-핫 레이블 사용 - 희소 범주형 교차 엔트로피(
SparseCategoricalCrossentropy):2같은 정수 클래스 번호 사용
두 손실은 레이블 표현만 다르고 정답 클래스의 예측 확률을 평가한다는 원리는 같음. 각 사례의 정답 클래스가 ki인 희소 표현에서는 다음과 같음.
L=−N1i=1∑Nlog(p^i,ki)Keras에서 손실 함수 지정
model.compile()의 loss에는 내장 손실 함수의 문자열 식별자 또는 keras.losses.Loss 클래스의 인스턴스를 전달 가능.
실습 준비
import os
os.environ["KERAS_BACKEND"] = "torch"
import keras
| 목적 | 문자열 식별자 | 손실 클래스 |
|---|---|---|
| 평균 제곱 오차 | "mse" |
keras.losses.MeanSquaredError() |
| 이항 교차 엔트로피 | "binary_crossentropy" |
keras.losses.BinaryCrossentropy() |
| 원-핫 다항 레이블 | "categorical_crossentropy" |
keras.losses.CategoricalCrossentropy() |
| 정수 다항 레이블 | "sparse_categorical_crossentropy" |
keras.losses.SparseCategoricalCrossentropy() |
문자열은 기본 설정을 간결하게 사용할 때 적합.
loss_fn = "sparse_categorical_crossentropy"
손실 클래스는 from_logits, reduction 같은 인수를 직접 설정할 때 사용. label_smoothing처럼 특정 손실 클래스만 지원하는 인수도 클래스에서 지정.
loss_fn = keras.losses.SparseCategoricalCrossentropy(
from_logits=True # 소프트맥스를 거치지 않은 로짓 입력
)
from_logits=False가 기본값. 출력층이 소프트맥스 확률을 반환하면 기본값을 사용하고, 활성화 함수 없이 로짓을 반환하면 from_logits=True로 지정.
퀴즈
모델 훈련에서 손실 함수의 역할로 올바른 것은?
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.