하나의 답을 고르는 분류에서도, 모델은 여러 가능성을 함께 계산한다. 입력이 각 클래스에 속할 가능성을 확률로 표현하고, 실제 정답에 부여한 확률을 높이는 방향으로 학습한다. 소프트맥스 회귀는 클래스별 점수를 확률로 바꾸어 이 과정을 연결하는 모델이다.
다중 클래스 분류(Multiclass Classification)는 세 개 이상의 클래스 중 하나를 정답으로 고르는 문제이다. 여기서는 각 표본의 정답이 정확히 하나라고 가정한다. 하나의 표본에 여러 정답을 동시에 붙이는 다중 레이블 분류(Multilabel Classification)와는 설정이 다르다.
소프트맥스 회귀(Softmax Regression)는 입력의 가중합과 편향으로 클래스별 점수를 만든 뒤, 소프트맥스 함수로 확률을 구하는 분류 모델이다. 이름에 회귀가 들어가지만 예측 대상은 클래스이다. 이진 로지스틱 회귀를 여러 클래스로 확장한 형태로 볼 수 있다.
입력 특성 수를 , 클래스 수를 라 하자. 입력을 열벡터 로 쓰면 클래스별 점수는 다음과 같다.
가중치 행렬의 각 행은 한 클래스의 점수를 계산한다. 편향도 클래스마다 하나씩 있으므로, 입력 특성 수와 관계없이 출력에는 개의 점수가 남는다. 소프트맥스에 넣기 전의 점수를 로짓(logit)이라고 한다. 로짓은 음수일 수도 있고 합이 1일 필요도 없다.
표본 개를 행으로 쌓은 배치에서는 다음과 같이 계산한다. 가중치를 출력별 행으로 저장하는 표기는 앞서 다룬 nn.Linear와 같다.
| 대상 | shape | 의미 |
|---|---|---|
| 입력 | (n, d) | 표본마다 특성 개 |
| 가중치 | (K, d) | 클래스마다 특성별 가중치 |
| 편향 | (K,) | 클래스마다 편향 하나 |
| 로짓 | (n, K) | 표본마다 클래스별 점수 |
편향은 모든 행에 같은 값이 더해지도록 브로드캐스팅된다. 표본마다 별도의 편향을 학습하는 것은 아니다.
소프트맥스 함수(Softmax Function)는 한 표본의 로짓 개를 양수로 바꾸고, 그 합으로 나누어 확률 분포를 만든다. 클래스 의 예측 확률을 라 하면 다음과 같다.
지수 함수는 음수인 로짓도 양수로 바꾼다. 분모에는 모든 클래스의 지수값을 더하므로, 각 확률은 전체에서 해당 클래스가 차지하는 비중이 된다. 유한한 로짓과 에 대해 수학적으로 이며, 모든 의 합은 1이다.
배치에서도 이 계산은 표본마다 클래스 축을 따라 수행한다. (n, K)의 로짓에 적용하면 결과도 (n, K)이며, 각 행의 합이 1이다. PyTorch에서는 이 구조에 dim=1을 지정한다. dim=0으로 계산하면 서로 다른 표본을 묶게 되어 의도한 클래스 확률이 되지 않는다.
두 클래스의 확률 비를 구하면 공통 분모가 사라진다.
따라서 두 클래스의 상대적인 가능성은 로짓의 차이로 정해진다. 한 클래스의 로짓만 커지면 그 클래스의 확률이 커지고, 공통 분모가 커지면서 다른 클래스의 확률은 작아진다.
지수 함수는 순서를 보존하므로, 가장 큰 확률의 클래스는 가장 큰 로짓의 클래스와 같다. 예측 클래스만 고를 때는 로짓에 바로 argmax를 적용할 수 있다. 확률값까지 해석하려면 소프트맥스가 필요하다. 다만 그 확률은 모델의 추정값이며, 합이 1이라는 사실만으로 추정의 정확성이 보장되지는 않는다.
모든 로짓에 같은 상수를 더하거나 빼도 차이는 유지된다. 이를 이용하면 큰 수의 지수값을 직접 계산하는 일을 피할 수 있다. 를 각 로짓에서 빼면 다음과 같다.
원래 식과 같은 확률이지만 지수에 들어가는 값은 모두 0 이하이다. 컴퓨터가 표현할 수 있는 범위를 넘는 큰 지수값이 생기는 것을 막는 방법이다.
예측 확률과 비교할 정답은 원-핫 인코딩(One-Hot Encoding)으로 표현할 수 있다. 정답 클래스의 성분만 1이고 나머지는 0인 벡터이다. 정답 클래스의 번호를 , 정답 벡터를 라 하면 다음과 같다.
클래스 번호는 크기나 거리를 나타내는 수치가 아니라 위치를 구분하는 표식이다. 정답 벡터와 예측 확률 벡터에서 같은 위치가 같은 클래스를 뜻하도록 순서를 맞춘다.
교차 엔트로피(Cross-Entropy)는 정답 분포로 가중한 예측 확률의 음의 로그를 합한 값이다. 이 글에서는 자연로그를 사용하며, 한 표본의 손실은 다음과 같다.
원-핫 정답에서는 만 1이므로 정답 클래스의 항만 남는다. 정답에 높은 확률을 주면 손실이 작고, 낮은 확률을 주면 손실이 크다. 가 1에 가까워지면 손실은 0에 가까워지고, 0에 가까워지면 손실은 제한 없이 커진다.
분류의 정답 여부와 손실값은 서로 다른 정보를 담는다. 가장 큰 확률의 클래스를 맞혔더라도 그 확률이 1보다 작으면 손실은 남는다. 교차 엔트로피는 선택한 답뿐 아니라, 정답에 어느 정도의 확률을 주었는지도 평가한다.
표본 개를 동일한 비중으로 학습하고 이 손실만 최소화한다면, 목적 함수는 표본별 손실의 평균이다.
여기서 는 현재 가중치와 편향으로 계산한 표본 의 클래스 확률이다. 학습에서는 이 목적 함수를 줄이도록 와 를 갱신한다.
한 표본의 교차 엔트로피에 소프트맥스 식을 대입하면 로짓에 대한 식으로 정리할 수 있다.
이를 로짓 로 미분하면 다음을 얻는다.
정답 클래스에서는 이므로 음수이고, 나머지 클래스에서는 이므로 양수이다. 해당 표본의 로짓을 직접 조절한다고 보면, 손실을 줄이는 방향은 정답 점수를 높이고 다른 점수를 낮추는 쪽이다. 실제 모델에서는 이 미분을 가중치와 편향까지 연결하고, 배치의 기울기를 모아 갱신한다.
클래스가 두 개일 때 한 클래스의 정답 표시를 , 그 클래스의 예측 확률을 라 하자. 정답 벡터는 , 예측 확률 벡터는 이므로 위 식은 다음과 같이 바뀐다.
이것이 이진 교차 엔트로피(Binary Cross-Entropy)이다. 이처럼 이진 교차 엔트로피는 클래스가 두 개인 경우의 교차 엔트로피이다.
수식에서는 확률 로 교차 엔트로피를 정의했지만, PyTorch의 nn.CrossEntropyLoss에는 소프트맥스를 적용하기 전의 로짓을 전달한다. 정수 정답을 사용하는 경우 내부 계산은 LogSoftmax와 NLLLoss를 결합한 것과 같다. LogSoftmax는 로그 확률을, NLLLoss는 정답 위치의 음의 로그 확률을 계산한다.
이렇게 결합하면 아주 작은 확률을 먼저 만든 뒤 로그를 취하는 대신, 로짓에서 로그 확률을 안정적으로 계산할 수 있다. CrossEntropyLoss 앞에 소프트맥스를 한 번 더 적용하면 이미 계산한 확률을 새로운 로짓으로 취급하므로 의도한 손실과 달라진다.
한 표본의 정답이 하나인 일반적인 배치에서는 입력 로짓을 (n, K), 정답을 (n,)의 정수 텐서로 전달한다. 정답의 자료형은 torch.long이고, 클래스 인덱스는 0부터 K-1까지이다. 수식의 원-핫 벡터를 코드에서 반드시 직접 만들 필요는 없다. 두 표현 모두 어느 클래스가 정답인지를 지정한다.
앞의 흐름을 확인하기 위해 입력 특성 두 개와 클래스 세 개를 가진 작은 예시를 구성하자. 클래스 번호는 수식의 순서대로 1, 2, 3을 사용하고, 정답은 클래스 2라고 하자. PyTorch의 0부터 시작하는 인덱스로 표현하면 이 정답은 1이다. 아래 가중치와 편향은 계산을 위해 정한 값이며 학습 결과가 아니다.
먼저 입력에 가중치와 편향을 적용한다.
배치 크기 1로 표현하면 입력 shape는 (1, 2), 로짓과 확률의 shape는 (1, 3)이다. 두 입력 특성이 클래스별 계산을 거쳐 세 점수로 바뀐다.
최대 로짓 2를 모두 빼면 소프트맥스 계산은 다음과 같다.
| 클래스 | 로짓 | 예측 확률 | 원-핫 정답 |
|---|---|---|---|
| 1 | 2 | 약 0.665241 | 0 |
| 2 | 1 | 약 0.244728 | 1 |
| 3 | 0 | 약 0.090031 | 0 |
모델이 선택하는 답은 확률이 가장 큰 클래스 1이다. 실제 정답은 클래스 2이므로 현재 예측은 틀렸다. 손실은 가장 큰 확률이 아니라 정답에 부여한 확률로 계산한다.
정답이 클래스 2라는 정보를 반영한 로짓별 기울기는 다음과 같다.
클래스 2의 성분만 음수이다. 이 표본에서는 정답 점수를 높이고 다른 두 점수를 낮추는 방향으로 손실이 줄어든다. 이 기울기가 입력과 가중치의 연산을 따라 전달되면서 매개변수 학습으로 이어진다. 계산에서는 반올림 전 값을 사용했고, 표시한 확률·손실·기울기는 소수 여섯째 자리까지 반올림했다.
소프트맥스 회귀는 입력에서 클래스별 로짓을 만들고, 이를 합이 1인 확률로 변환한다. 원-핫 정답에 대한 교차 엔트로피는 정답 확률의 음의 로그이며, 로짓에 대한 기울기는 예측 확률과 정답 벡터의 차이가 된다.
분류 모델을 읽을 때는 점수 계산, 확률 변환, 손실 평가, 최종 클래스 선택을 구분하면 된다. 특히 PyTorch에서는 확률이 필요할 때 소프트맥스를 사용하고, CrossEntropyLoss에는 로짓을 전달한다. 이 구분을 유지하면 수학적 정의와 실제 학습 코드가 어떻게 연결되는지 확인할 수 있다.
LogSoftmax·NLLLoss와의 관계.