# 소프트맥스(Softmax) 함수
소프트맥스(Softmax) 함수는 다항식 확률 분포를 생성하는 비선형 변환으로, 주로 다중 클래스 분류에서 신경망의 마지막 출력층에 사용된다. 입력 벡터의 각 컴포넌트를 양의 확률로 바꾼 뒤 합이 1이 되도록 정규화한다. 이로써 모델이 각 클래스에 속할 사후 확률을 추정하도록 돕는다.
- 용도: 다중 클래스 분류의 확률 분포 생성
- 입력: 실수 벡터 \(\boldsymbol{z} \in \mathbb{R}^K\)
- 출력: 확률 벡터 \(\boldsymbol{\hat{p}} \in [0,1]^K\) 로 합이 1
- 특징: 연속적이고 미분 가능하며, 각 성분은 입력의 상대적 크기에 민감하게 반응한다
---
## 정의
소프트맥스 함수는 벡터 형태의 입력 \(\boldsymbol{z} = [z_1, z_2, \dots, z_K]\)에 대해 다음과 같이 정의된다.
- 벡터 형태: \(\boldsymbol{\hat{p}} = \text{softmax}(\boldsymbol{z})\)
- 성분별 표현: \(\hat{p}_i = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}}\) (i = 1, 2, ..., K)
따라서 출력 벡터의 각 원소는 양수이며 모든 원소의 합은 1이 된다: \(\sum_{i=1}^K \hat{p}_i = 1\).
벡터 형태의 간단한 표기: \(\boldsymbol{\hat{p}} = \left[ \hat{p}_1, \hat{p}_2, \dots, \hat{p}_K \right]\) 이고, 각 성분은 위의 식으로 계산된다.
---
## 수식 및 성질
- 입력에 대한 민감도: 소프트맥스는 입력의 상대적 차이에 민감하게 반응한다. 큰 z_i일수록 해당 클래스의 확률이 증가하고, 다른 클래스의 확률은 감소한다.
- 다항 분포로의 해석: 출력 벡터 \(\boldsymbol{\hat{p}}\)는 다항 분포의 매개변수로 해석된다.
- 수치적 안정성: 지수 함수의 크기로 인해 수치적 불안정이 생길 수 있다. 이를 방지하기 위해 일반적으로 최대값을 빼고 계산한다.
수치적 안정성 처리 예시(표현): 입력 벡터의 최대값 \(m = \max_j z_j\)를 뺀 뒤 계산하면
- \(\hat{p}_i = \frac{e^{z_i - m}}{\sum_{j=1}^K e^{z_j - m}}\)
벡터 형태의 표현: \(\boldsymbol{\hat{p}} = \text{softmax}(\boldsymbol{z})\) 이고, 성분별로는 \( \hat{p}_i = \frac{e^{z_i}}{\sum_{j} e^{z_j}} \) 이다.
- 미분 특성: 소프트맥스의 각 성분에 대한 편미분은 다음과 같다.
\[
\frac{\partial \hat{p}_k}{\partial z_i} =
\hat{p}_k (\delta_{ik} - \hat{p}_i)
\]
여기서 \(\delta_{ik}\)는 크로너 델타로, \(i=k\)일 때는 1, 그렇지 않을 때는 0이다.
- 소프트맥스와 손실의 조합(크로스 엔트로피와의 결합): 다중 클래스 분류의 손실 함수로 자주 사용되는 크로스 엔트로피 손실과 함께 사용할 때의 그레이디언트는 매우 간단해진다.
- 손실 정의: \(L = -\sum_{i=1}^K y_i \log \hat{p}_i\), 여기서 \(y_i\)는 실제 레이블의 원-핫 벡터 성분
- 그레이디언트: \( \frac{\partial L}{\partial z_i} = \hat{p}_i - y_i \)
---
## 예시
다중 클래스 분류에서 로짓 벡터 \(\boldsymbol{z} = [2.0,\; 1.0,\; 0.1]\)를 소프트맥스에 입력하면 다음과 같이 계산된다.
- \(\hat{p}_i = \frac{e^{z_i}}{e^{2.0} + e^{1.0} + e^{0.1}} \)
- \(e^{2.0} \approx 7.389,\; e^{1.0} \approx 2.718,\; e^{0.1} \approx 1.105\)
- 합계 \(\approx 11.212\)
- 따라서 \(\hat{p} \approx [0.659,\; 0.243,\; 0.099]\)
출력 확률의 합은 항상 1이며, 가장 큰 입력에 해당하는 클래스의 확률이 가장 크게 나타난다.
---
## 구현 및 주의점
- 수치적 안정성: 앞서 언급한 최대값 뺄셈 기법을 활용하면 지수의 폭발을 방지할 수 있다.
- 다차원 입력 처리: 소프트맥스는 보통 마지막 축(axis)에 대해 계산한다. 예를 들어 배치(batch) 형태의 데이터에서 각 샘플별로 axis=-1에 대해 소프트맥스를 적용한다.
- 파이썬 예시(NumPy):
```python
import numpy as np
def softmax(z, axis=None):
z_max = np.max(z, axis=axis, keepdims=True)
e = np.exp(z - z_max)
return e / np.sum(e, axis=axis, keepdims=True)
```
- PyTorch 예시:
- `F.softmax(logits, dim=-1)` 또는 `torch.softmax(logits, dim=-1)`는 내부적으로 수치적 안정성을 고려한 구현을 제공한다.
- 주의점: 소프트맥스 단독으로 사용했을 때의 손실을 다룰 때는 보통 크로스 엔트로피 손실과 함께 사용한다. 단일 소프트맥스 출력만으로는 학습에 필요한 비교 기준이 부족하다.
---
## 응용 분야
- 다중 클래스 분류의 출력층: 각 클래스의 사후 확률 추정
- 신경망의 마지막 활성화 함수: 로짓 벡터를 확률 분포로 변환
- Attention 메커니즘: 키-값-질의 구조에서 가중치를 소프트맥스로 계산하여 가중합을 산출
- 네트워크 해석: 각 클래스에 할당된 확률을 통해 예측의 불확실성 파악
---
## 관련 개념과 연결 고리
- Cross-Entropy Loss: 소프트맥스와 함께 사용되며, 두 함수의 결합으로 간단하고 안정적인 그레이디언트를 제공한다.
- 로지스틱 회귀(Logistic Regression): 이진 분류에 사용되는 시그모이드와의 비슷한 원리이나, 다중 클래스에서는 소프트맥스가 사용된다.
- 로짓(Logit): 소프트맥스의 입력으로 사용되는 미분 가능한 선형 변환의 출력.
---
관련 문서: [[소프트맥스 함수 소개]], [[크로스 엔트로피 손실(Cross-Entropy Loss)]]
---