소프트맥스와 교차 엔트로피란? 로짓을 확률과 학습 손실로 바꾸는 방법
소프트맥스와 교차 엔트로피는 다중분류 신경망이 여러 후보 중 어느 클래스가 정답인지 확률로 표현하고, 그 예측이 정답과 얼마나 다른지 수치로 평가하도록 하는 조합입니다. 소프트맥스는 모델의 원시 출력인 로짓을 합이 1인 확률분포로 바꾸고, 교차 엔트로피는 그 확률분포가 정답 분포에 가까운지를 손실로 계산합니다. 학습은 이 손실을 작게 만드는 방향으로 모델의 가중치를 조정하는 과정입니다.
예를 들어 사진을 고양이·개·새 중 하나로 분류한다고 가정해 보겠습니다. 모델은 처음부터 ‘고양이일 확률 70%’처럼 답하지 않는 경우가 많습니다. 대신 세 클래스에 대한 비교 점수인 로짓을 내놓습니다. 소프트맥스는 이 점수를 비교 가능한 확률로 정규화하고, 교차 엔트로피는 실제 정답에 모델이 얼마나 높은 확률을 주었는지에 따라 벌점을 부여합니다. 이 둘을 함께 이해하면 마지막 출력층, 레이블 형식, 손실 함수 설정에서 자주 생기는 혼동을 줄일 수 있습니다.
소프트맥스는 무엇을 하는 함수인가요?
소프트맥스(softmax)는 개 클래스의 로짓 벡터 를 클래스별 확률 로 변환하는 함수입니다. 클래스 의 확률은 다음과 같이 계산합니다.
여기서 지수함수 는 점수가 큰 클래스의 상대적 비중을 더 크게 만듭니다. 분모는 모든 클래스의 지수화된 점수를 더한 값이므로, 각 결과는 0과 1 사이에 놓이고 전체 확률의 합은 1이 됩니다. 따라서 소프트맥스 출력은 ‘이 입력이 각 클래스일 상대적 가능성’을 하나의 확률분포로 표현합니다. PyTorch 문서도 소프트맥스를 입력의 각 요소를 0부터 1 범위로 재조정하고 합이 1이 되게 하는 함수로 설명합니다. docs.pytorch.org
소프트맥스가 특히 잘 맞는 상황은 후보들이 상호 배타적일 때입니다. 즉, 하나가 참이면 다른 하나들은 정답이 아닌 문제입니다. 한 장의 이미지에 대표 동물이 고양이·개·새 중 정확히 하나라는 분류, 한 문장을 정해진 하나의 감정 범주로 고르는 분류 등이 여기에 해당합니다.
반대로 소프트맥스의 확률은 서로 독립적이지 않습니다. 고양이 확률을 올리면 세 확률의 합을 1로 유지하기 위해 개나 새의 확률은 상대적으로 낮아져야 합니다. 이 특성은 ‘사람’과 ‘자전거’가 한 사진에 함께 있을 수 있는 문제처럼 여러 레이블이 동시에 참일 수 있는 경우에는 보통 적합하지 않습니다. 이 경우에는 각 클래스에 독립적으로 시그모이드를 적용하는 방식을 검토합니다.
로짓은 확률과 어떻게 다른가요?
로짓(logit)은 마지막 선형층 등이 산출한 정규화되지 않은 점수입니다. 로짓은 음수일 수도 있고 1보다 클 수도 있으며, 클래스별 로짓의 합도 특별한 의미를 갖지 않습니다. 예를 들어 은 세 클래스의 로짓일 수 있지만 확률 벡터는 아닙니다.
로짓의 중요한 특징은 절대값보다 클래스 간 차이에 있습니다. 모든 로짓에 같은 상수 를 더해도 소프트맥스 결과는 변하지 않습니다.
분자와 분모에 공통으로 가 곱해져 약분되기 때문입니다. 따라서 로짓 과 은 서로 다른 원시 점수처럼 보이지만 같은 소프트맥스 확률을 만듭니다. 소프트맥스는 ‘점수의 기준점’이 아니라 후보들 사이의 상대적 차이를 확률화합니다.
교차 엔트로피는 무엇을 측정하나요?
교차 엔트로피(cross-entropy)는 실제 정답 분포 와 모델이 예측한 분포 가 얼마나 다른지를 나타내는 손실입니다. 다중분류의 기본 형태는 다음과 같습니다.
는 실제 레이블이 클래스 에 부여하는 비중이고, 는 모델이 예측한 클래스 의 확률입니다. 손실값이 작을수록 예측 분포가 정답 분포에 가깝다는 뜻입니다. 자연로그를 사용하면 값의 단위는 nat입니다.
이 식은 단순히 정답과 오답을 0 또는 1로 가르는 계산이 아닙니다. 모델이 정답을 맞혔는지뿐 아니라, 정답이라고 얼마나 확신했는지도 반영합니다. 정답 클래스에 0.51을 준 예측과 0.99를 준 예측은 모두 최댓값 클래스가 정답이라면 정확도상으로는 같을 수 있습니다. 그러나 교차 엔트로피는 후자에 더 작은 손실을 줍니다. 학습 과정에서 모델이 단지 순위만 맞추는 것이 아니라 정답에 더 높은 확률을 배정하도록 유도하는 이유입니다.
원-핫 레이블에서는 왜 식이 단순해지나요?
상호 배타적인 분류의 정답은 흔히 원-핫(one-hot) 벡터로 표현합니다. 세 클래스에서 첫 번째 클래스가 정답이라면 레이블은 입니다. 정답 클래스 에만 이고 나머지는 0이므로, 교차 엔트로피는 다음처럼 줄어듭니다.
즉, 손실은 정답 클래스의 예측 확률 만으로 결정됩니다. 가 1에 가까우면 는 0에 가까워집니다. 반면 가 작아질수록 손실은 빠르게 커집니다. 이 성질 때문에 정답을 낮은 확률로 예측하거나, 특히 오답을 매우 높은 확신으로 예측한 사례가 학습에서 큰 벌점을 받습니다.
이론적으로 정답 클래스 확률이 정확히 0이면 은 정의되지 않아 손실이 무한대로 발산합니다. 실제 신경망 구현은 보통 로짓을 이용한 안정적 계산을 사용하므로, 확률을 직접 0으로 만들어 로그를 취하는 방식은 피합니다.
소프트맥스와 교차 엔트로피는 어떻게 이어지나요?
전형적인 다중분류 모델의 마지막 부분은 세 단계로 이해할 수 있습니다.
- 마지막 선형층이 클래스별 로짓 를 출력합니다.
- 소프트맥스가 로짓을 확률 로 변환합니다.
- 교차 엔트로피가 확률 와 정답 레이블 를 비교해 손실 을 계산합니다.
원-핫 정답에서 이 연결을 수식으로 전개하면 다음과 같습니다.
이 식은 흔히 소프트맥스 교차 엔트로피 또는 범주형 교차 엔트로피라고 부릅니다. 앞부분의 는 정답 클래스 로짓을 키울수록 작아지고, 뒤의 는 모든 경쟁 클래스의 점수도 함께 고려합니다. 따라서 모델은 정답 클래스 점수를 올리는 동시에, 상대적으로 오답 클래스보다 정답 클래스가 우세하도록 학습합니다.
여기서 ‘소프트맥스’와 ‘교차 엔트로피’는 개념상 구별해야 합니다. 소프트맥스는 출력의 표현을 바꾸는 함수이고, 교차 엔트로피는 학습 목표를 수치화하는 손실입니다. 다만 실무 프레임워크에서는 두 단계를 결합한 손실 함수로 제공하는 일이 많아서, 둘이 하나의 함수라는 인상을 줄 수 있습니다.
숫자로 계산하면 어떤 의미가 드러나나요?
로짓이 인 세 클래스 문제를 보겠습니다. 소프트맥스를 적용하면 확률은 대략 이 됩니다. TensorFlow의 소프트맥스 예시도 이 로짓에 대해 같은 근사 확률을 제시합니다. docs.pytorch.org
첫 번째 클래스가 정답이라면 원-핫 레이블은 이고 손실은 다음과 같습니다.
첫 번째 클래스는 세 후보 중 가장 높은 확률을 받았고, 그 확률도 약 0.665이므로 손실은 비교적 작습니다. 그러나 ‘작다’는 말은 절대적인 합격선을 뜻하지 않습니다. 손실의 적절한 크기는 클래스 수, 데이터의 난이도, 레이블의 불확실성, 배치에서 손실을 합산하는지 평균내는지에 따라 달라질 수 있습니다.
같은 로짓에서 세 번째 클래스가 실제 정답이었다고 가정하면 손실은 이므로 훨씬 커집니다. 모델은 세 번째 클래스를 가장 가능성이 낮은 후보로 보았기 때문입니다. 이처럼 교차 엔트로피는 오답 여부뿐 아니라 오답의 확신 정도를 민감하게 반영합니다.
확률 순위와 손실값을 함께 봐야 하는 이유는 무엇인가요?
정확도는 보통 확률이 가장 큰 클래스 하나를 골라 정답과 일치하는지 셉니다. 따라서 예측이 이고 첫 번째 클래스가 정답인 경우와, 이고 첫 번째 클래스가 정답인 경우는 둘 다 정답 한 건으로 계산됩니다.
교차 엔트로피는 이 둘을 동일하게 취급하지 않습니다. 첫 예측은 세 클래스 사이에서 거의 구분하지 못한 상태이고, 둘째 예측은 정답에 매우 높은 확률을 부여한 상태입니다. 반대로 최댓값이 오답일 때도 정답 확률이 얼마나 낮았는지에 따라 손실은 달라집니다. 그래서 학습 중에는 일반적으로 교차 엔트로피를 최소화하고, 평가할 때는 과제 목적에 따라 정확도 같은 별도 지표를 함께 확인합니다.
왜 학습 함수에는 로짓을 직접 넣어야 하나요?
많은 딥러닝 프레임워크의 결합 손실 함수는 입력으로 소프트맥스 확률이 아니라 로짓을 받습니다. 예를 들어 TensorFlow의 softmax_cross_entropy_with_logits는 이름 그대로 로짓을 받아 내부적으로 소프트맥스와 교차 엔트로피에 해당하는 계산을 수행하며, 문서에서는 미리 소프트맥스를 적용한 출력을 넣지 말라고 안내합니다. www.tensorflow.org
이를 어기고 모델 끝에서 소프트맥스를 적용한 뒤 다시 로짓용 손실 함수에 전달하면, 의도했던 한 번의 소프트맥스가 아니라 확률값을 다시 로짓처럼 해석하는 계산이 될 수 있습니다. 손실의 의미와 기울기가 달라져 학습 설정이 어긋납니다. ‘소프트맥스가 내부 포함된 손실’인지, ‘이미 확률로 변환된 입력을 받는 손실’인지는 함수 이름이 아니라 해당 API의 입력 규약으로 확인해야 합니다.
추론이나 화면 표시의 목적은 다릅니다. 학습이 끝난 뒤 클래스별 확률을 보여 주거나, 확률 기준으로 후처리하려면 로짓에 소프트맥스를 적용할 수 있습니다. 요점은 소프트맥스를 쓰지 말라는 것이 아니라, 학습 손실이 기대하는 입력 단계에 맞춰 한 번만 적용해야 한다는 것입니다.
수치 안정성은 왜 중요한가요?
소프트맥스 수식에는 지수함수와 로그가 들어갑니다. 로짓의 크기가 매우 크거나 작으면 계산이 컴퓨터의 표현 범위를 넘어서 오버플로 또는 언더플로 위험이 생길 수 있습니다. 확률을 먼저 계산하고 그 결과에 로그를 따로 적용하는 방식은 이런 문제에 취약할 수 있습니다.
결합 손실 함수나 log_softmax 계열 구현은 보통 를 안정적으로 계산하는 방식을 사용합니다. PyTorch 문서도 log_softmax가 소프트맥스와 로그를 각각 계산하는 것보다 더 나은 수치적 성질을 가진다고 설명합니다. docs.pytorch.org
앞에서 본 상수 이동 성질도 안정화에 활용할 수 있습니다. 모든 로짓에서 최댓값 를 빼고 계산해도 소프트맥스 결과는 같습니다.
이렇게 하면 가장 큰 지수항이 이 되어 불필요하게 큰 수를 다루는 일을 줄일 수 있습니다. 다만 실전 코드에서는 직접 분리 구현하기보다, 프레임워크가 제공하는 로짓 기반 결합 손실이나 안정적인 로그 소프트맥스 연산을 사용하는 편이 일반적입니다.
레이블은 원-핫과 정수 중 무엇을 써야 하나요?
레이블 표현은 손실 함수의 입력 규약과 연결됩니다. 대표적인 형식은 원-핫 또는 확률 레이블, 그리고 희소(sparse) 정수 레이블입니다.
| 레이블 형식 | 세 클래스에서 첫 번째가 정답인 예 | 특징 |
|---|---|---|
| 원-핫 레이블 | [1, 0, 0] | 클래스 수와 같은 길이의 벡터이며 정답 위치만 1입니다. |
| 확률 레이블 | [0.8, 0.1, 0.1] | 각 원소가 비음수가 되고 전체 합이 1인 정답 분포입니다. |
| 희소 정수 레이블 | 0 | 정답 클래스의 인덱스 하나만 저장합니다. |
원-핫 레이블은 교차 엔트로피의 기본 수식과 형태가 바로 대응됩니다. 희소 정수 레이블은 같은 정보를 더 간결하게 저장할 수 있어 클래스 수가 많을 때 유용할 수 있습니다. 그러나 두 형식은 텐서의 모양과 자료형이 다르므로, 특정 손실 함수가 어느 형식을 요구하는지 맞춰야 합니다.
TensorFlow의 로짓 기반 소프트맥스 교차 엔트로피 문서는 레이블 벡터가 유효한 확률분포여야 한다고 설명하며, 상호 배타적 분류를 위한 관련 레이블 형식을 구분해 제공합니다. www.tensorflow.org 예컨대 원-핫 손실 함수에 정수 하나를 그대로 넣거나, 희소 정수 레이블 함수에 원-핫 벡터를 넣으면 원하는 의미로 계산되지 않을 수 있습니다.
확률 레이블은 꼭 한 클래스만 1이어야 한다는 전제를 완화합니다. 다만 이것이 여러 클래스가 동시에 독립적으로 참인 다중 레이블 문제와 같은 뜻은 아닙니다. 확률 레이블도 소프트맥스 분류에서는 여전히 원소 합이 1인 하나의 분포를 나타냅니다.
이진분류·다중분류·다중 레이블은 어떻게 구분하나요?
출력 함수와 손실은 클래스 수만 보고 고르는 것이 아니라, 정답 사건들이 동시에 일어날 수 있는지를 먼저 판단해야 합니다. 다음 구분이 실용적입니다.
| 문제 구조 | 예시 | 일반적인 출력 표현 | 일반적인 손실 |
|---|---|---|---|
| 상호 배타적 다중분류 | 고양이·개·새 중 하나 | 클래스 전체에 소프트맥스 | 소프트맥스 교차 엔트로피 |
| 이진분류 | 참·거짓, 승인·거절 | 시그모이드 1개 또는 2클래스 소프트맥스 | 이진 교차 엔트로피 또는 소프트맥스 교차 엔트로피 |
| 다중 레이블 분류 | 사진에 사람과 자전거가 함께 존재 | 클래스별 시그모이드 | 클래스별 이진 교차 엔트로피 |
다중분류에서는 클래스 확률을 합쳐 1로 만드는 것이 자연스럽습니다. ‘고양이일 확률’이 올라가면 같은 이미지가 ‘개일 확률’이나 ‘새일 확률’은 상대적으로 내려가야 하기 때문입니다. TensorFlow 문서도 레이블이 상호 배타적인 경우 소프트맥스 교차 엔트로피를 사용하고, 독립적인 다중 레이블 상황에서는 다른 설정을 고려해야 함을 구분합니다. www.tensorflow.org
다중 레이블에서는 각 출력이 별개의 질문에 가깝습니다. ‘사람이 있는가?’, ‘자전거가 있는가?’, ‘나무가 있는가?’가 동시에 예일 수 있습니다. 이때 소프트맥스로 전체 합을 1로 묶으면 한 라벨의 확률을 올릴 때 다른 라벨을 낮추도록 강제하므로 문제 구조와 맞지 않을 수 있습니다. 클래스마다 시그모이드를 적용하면 각 항목의 확률을 독립적으로 다룰 수 있습니다.
이진분류는 두 방식이 모두 가능해 보이므로 특히 혼동하기 쉽습니다. 출력 하나에 시그모이드를 적용하는 방식은 ‘양성일 확률’을 직접 표현합니다. 두 개 로짓에 소프트맥스를 적용하는 방식은 양성과 음성을 합계 1인 두 클래스 분포로 표현합니다. 어느 쪽을 택하든 레이블 인코딩과 손실 함수가 그 출력 형식에 맞아야 합니다.
교차 엔트로피 최소화는 분포를 맞춘다는 뜻인가요?
정답 와 예측 가 모두 유효한 확률분포일 때, 교차 엔트로피는 엔트로피와 KL 발산의 관계로 다음처럼 쓸 수 있습니다.
여기서 는 실제 분포 자체의 불확실성을 나타내는 엔트로피이고, 는 실제 분포 와 예측 분포 의 차이를 나타내는 KL 발산입니다. 학습 데이터에서 정답 분포 가 고정돼 있다고 보면 는 모델 파라미터에 따라 바뀌지 않습니다. 따라서 교차 엔트로피를 줄이는 일은 그 상수를 제외하면 와 사이의 KL 발산을 줄이는 일로 해석할 수 있습니다.
이 해석은 교차 엔트로피가 왜 확률분포의 학습 목표로 널리 쓰이는지 보여 줍니다. 모델은 정답 클래스를 단순히 최상위에 올려놓는 데 그치지 않고, 관측된 정답 분포와 가까운 확률 배분을 하도록 압력을 받습니다.
다만 이 식을 사용할 때는 전제가 있습니다. 와 는 확률분포여야 하며, 각 성분은 적절한 범위에 있고 합은 1이어야 합니다. 로짓 자체는 확률분포가 아니므로 이 관계에 바로 대입하는 대상이 아닙니다. 로짓은 소프트맥스 또는 로짓 기반 결합 손실을 거쳐 확률분포 계산에 연결됩니다.
자주 생기는 오해와 오류는 무엇인가요?
첫째, 로짓이 곧 확률이라는 오해입니다. 로짓이 가장 큰 클래스는 소프트맥스 확률도 가장 크지만, 로짓 값 자체를 퍼센트로 읽을 수는 없습니다. 로짓 2와 1의 차이가 확률에서 어느 정도의 차이로 보이는지는 다른 모든 로짓과 함께 소프트맥스를 적용한 뒤에야 정해집니다.
둘째, 모델 마지막에 소프트맥스를 넣어야만 분류 학습이 된다는 오해입니다. 로짓을 받는 결합 교차 엔트로피 손실을 쓴다면 학습 단계에서는 마지막 소프트맥스를 명시적으로 넣지 않는 구성이 일반적입니다. 내부 계산과 수치 안정성을 위해서입니다. www.tensorflow.orgdocs.pytorch.org
셋째, 소프트맥스 교차 엔트로피가 모든 분류 문제에 맞는다는 오해입니다. 이 손실 조합은 클래스가 상호 배타적일 때 자연스럽습니다. 하나의 샘플에 여러 정답 태그가 공존한다면, 전체 클래스 확률을 1로 제한하는 소프트맥스는 데이터의 의미를 제대로 표현하지 못할 수 있습니다.
넷째, 교차 엔트로피와 정확도가 같은 지표라는 오해입니다. 정확도는 보통 최댓값 클래스 하나만 보지만, 교차 엔트로피는 정답 확률 전체를 반영합니다. 따라서 정확도가 같은 두 모델이라도 교차 엔트로피는 다를 수 있습니다. 학습 손실이 줄어도 정확도가 매 단계마다 단조롭게 오르지 않을 수 있는 이유 중 하나이기도 합니다.
다섯째, 손실값 하나만으로 모델이 좋고 나쁨을 단정하는 오류입니다. 교차 엔트로피 값은 클래스 수와 과제 난이도, 레이블 형태, 집계 방식의 영향을 받습니다. 같은 과제와 같은 설정에서의 변화, 검증 데이터에서의 손실, 과제에 맞는 별도 평가 지표를 함께 보는 편이 더 타당합니다.
설정 전에 무엇을 확인하면 되나요?
소프트맥스와 교차 엔트로피를 적용하기 전에는 다음 질문을 순서대로 확인하면 도움이 됩니다.
- 한 샘플에 정답 클래스가 정확히 하나인가요? 그렇다면 소프트맥스 기반 다중분류가 후보가 됩니다. 여러 레이블이 동시에 참일 수 있다면 클래스별 시그모이드와 이진 손실을 우선 검토합니다.
- 모델의 마지막 출력이 로짓인가요, 이미 확률인가요? 로짓은 제한 없는 원시 점수이고, 확률은 정규화된 값입니다. 로짓 입력을 요구하는 결합 손실이라면 미리 소프트맥스를 적용하지 않습니다.
- 레이블 형식은 손실 함수와 맞나요? 원-핫 또는 확률 벡터를 받는지, 정수 인덱스를 받는지 확인합니다. 형식뿐 아니라 배치 차원과 클래스 차원의 위치도 함께 확인해야 합니다.
- 학습과 추론의 목적을 구분했나요? 학습 시에는 안정적인 로짓 기반 손실로 계산하고, 추론 시 확률을 표시하거나 확률 기반 규칙을 적용해야 할 때 소프트맥스를 사용합니다.
- 손실과 평가 지표를 분리해 해석하나요? 교차 엔트로피는 확률 예측의 품질을 반영하는 학습 목표이며, 정확도는 최종 선택의 일치 여부를 보는 지표입니다. 과제에 따라 둘을 함께 해석합니다.
이 점검은 특정 라이브러리에만 해당하지 않습니다. 다만 실제 API 이름은 비슷해도 입력으로 로짓·확률·정수 레이블 중 무엇을 요구하는지가 다를 수 있습니다. 구현 직전에는 사용하는 함수의 공식 문서에서 입력 형태와 내부 활성화 함수 포함 여부를 확인하는 것이 필요합니다.
결론: 확률 변환과 손실 계산을 역할별로 이해하기
소프트맥스는 여러 로짓을 합이 1인 확률분포로 바꾸어 상호 배타적인 클래스들의 상대적 가능성을 표현합니다. 교차 엔트로피는 그 예측 분포와 정답 분포의 차이를 손실로 계산하며, 정답에 낮은 확률을 준 예측일수록 더 큰 벌점을 부여합니다. 원-핫 정답에서는 손실이 로 단순해져, 정답 클래스 확률을 높이는 학습 목표가 명확하게 드러납니다.
실무에서는 소프트맥스와 교차 엔트로피를 별도로 계산하기보다 로짓을 받는 결합 손실 함수를 쓰는 경우가 많습니다. 이는 수학적 목적은 유지하면서 수치적으로 더 안정적인 계산을 하기 위해서입니다. 다만 이 조합은 ‘정답이 하나인 다중분류’라는 문제 구조에 맞을 때 가장 자연스럽습니다. 출력과 손실을 선택할 때는 클래스 수보다 먼저, 레이블들이 서로 배타적인지와 손실 함수가 어떤 입력을 기대하는지를 확인하는 것이 핵심입니다.