소프트맥스

IT 위키

소프트맥스(softmax)는 다중 클래스 분류 문제에서 각 클래스에 대한 확률 분포를 계산하기 위해 사용되는 함수이다.

개요[편집 | 원본 편집]

소프트맥스 함수는 입력값 벡터를 받아 각 항목에 대해 0과 1 사이의 값으로 변환하며, 전체 출력값의 합이 1이 되도록 정규화한다. 이 함수는 주로 신경망의 출력층에서 사용되어, 각 클래스에 속할 확률을 추정하는 데 활용된다. 입력값이 클수록 해당 클래스의 확률이 높아지며, 이를 통해 모델이 어느 클래스를 선택할지를 결정한다.

소프트맥스(softmax)라는 이름은 "soft maximum"에서 유래하였으며, 이는 가장 큰 값을 선택하는 하드한(max) 결정 방식 대신 확률적으로 부드러운(soft) 선택을 수행한다는 의미를 담고 있다. 즉, 단일 최대값을 출력하는 argmax 함수와 달리, 모든 클래스에 대해 연속적인 확률값을 출력한다는 점에서 'soft'한 max 함수로 해석할 수 있다.

수식과 설명[편집 | 원본 편집]

소프트맥스 함수는 입력 벡터의 각 요소에 지수 함수를 적용한 뒤 전체 합으로 나누어 계산한다. 예를 들어, 입력 벡터가 [x1, x2, ..., xn]일 때, 소프트맥스 함수는 다음과 같이 정의된다:

각 클래스 i에 대한 출력값 = exp(xi) / (exp(x1) + exp(x2) + ... + exp(xn))

이로 인해 가장 큰 입력값에 해당하는 클래스가 가장 높은 확률을 갖게 된다.

특징[편집 | 원본 편집]

  • 출력값의 합이 항상 1이므로 확률 분포로 해석 가능하다.
  • 출력 간의 상대적인 크기를 강조한다.
  • 출력이 민감하게 변할 수 있어, 입력값이 큰 경우 수치적 불안정성 문제가 발생할 수 있다. 이를 보완하기 위해 종종 입력값에서 최대값을 빼는 방식으로 안정화를 도모한다.

활용[편집 | 원본 편집]

  • 다중 클래스 분류 모델의 출력층
  • 크로스 엔트로피 손실 함수와 함께 사용되어 학습 성능을 극대화
  • 자연어 처리(NLP)에서 단어 분포 예측 등 다양한 분야에 활용

소스코드 예제[편집 | 원본 편집]

다음은 Python으로 구현한 소프트맥스 함수의 예제이다:

import numpy as np

def softmax(x):
    e_x = np.exp(x - np.max(x))  # 수치적 안정성을 위한 최대값 보정
    return e_x / e_x.sum(axis=0)

# 예제 입력
logits = np.array([2.0, 1.0, 0.1])
probabilities = softmax(logits)

print(probabilities)  # 출력: [0.659, 0.242, 0.099] (소수점은 예시에 따라 다를 수 있음)

소프트맥스 함수는 지수 함수(exp)를 사용하기 때문에, 입력값이 매우 클 경우 오버플로우가 발생할 수 있다. 이를 방지하기 위해 입력값에서 그 중 최대값을 빼는 방식으로 계산한다. 이 보정은 전체 분모와 분자에 동일한 상수를 곱하는 것과 같아 결과에는 영향을 미치지 않는다. 예를 들어, 다음과 같이 전개된다:

exp(xi - max(x)) / Σ exp(xj - max(x)) = [exp(xi) / exp(max(x))] / Σ [exp(xj) / exp(max(x))] = exp(xi) / Σ exp(xj)

따라서 출력값은 본래의 소프트맥스와 동일하며, 수치적으로 더 안정된 계산을 제공한다.

같이 보기[편집 | 원본 편집]

참고 문헌[편집 | 원본 편집]

  • Goodfellow, Ian, et al. Deep Learning. MIT Press, 2016.
  • Bishop, Christopher M. Pattern Recognition and Machine Learning. Springer, 2006.

각주[편집 | 원본 편집]