[ML]Softmax 소프트맥스 함수

A Ydobon
4 min readSep 26, 2019

--

소프트맥스란?

소프트맥스는 인풋값을 여러개 갖는 일종의 함수로, 확률처럼 모든 아웃풋 값을 더했을 때 1이 총합이라는 특징이 있습니다.

소프트맥스 함수에 인풋값을 넣으면, 그 값들을 모두 0과 1사이의 값으로 정규화해주는데, 이는 각 확률이 마이너스 값을 가지지 않고 더했을 때 총합이 1이 되는 것과 매우 흡사합니다.

만약 인풋값이 하나밖에 없다면? 그런 함수는 소프트맥스 함수라는 표현 대신 시그모이드 함수라고합니다. 시그모이드 함수는 로지스틱 함수의 일종으로, 아래와 같은 형태입니다.

시그모이드 함수(sigmoid function)

그래프가 0과 1사이를 지난다는 것을 확인할 수 있습니다. 이번엔 식으로 각 함수 간의 관계를 확인해볼까요?

로지스틱 / 시그모이드 / 소프트맥스 함수

정리하자면, 시그모이드 함수는 로지스틱 함수의 한 케이스라 볼 수 있고, 인풋이 하나일 때 사용되는 시그모이드 함수를 인풋이 여러개일 때도 사용할 수 있도록 일반화 한 것이 소프트맥스 함수입니다.

소프트맥스 함수의 공식을 코드로 한 번 볼까요?

\[
\sigma (\bold{z})_j = \frac{e^{z_j}}{\sum_{k=1}^{K} e^{z_k}} \\\nonumber
\]

소프트맥스 함수를 조금 더 자세히 살펴보면,

j는 1부터 K까지의 범위를 가지고, z는 K차원 벡터입니다. 이렇게 말씀드리면 감이 잘 안 오실텐데요, 한 번 예시를 살펴볼까요? 좀 작은 숫자, 3과 5를 예로 들어 봅시다. 숫자가 두 개이기 때문에, K는 2가 되고, z는 2차원벡터, 즉 [3, 5]가 됩니다. 소프트맥스 식에 대입함으로써, 우리는 두 숫자를 확률처럼 만들 수 있습니다.

그런데 [3, 5]가 아니라 [3, 5100]같은 경우에는 어떻게 될까요? 두 숫자 중 한 숫자가 다른 숫자에 비해 월등히 큰데요, 이 경우 e⁵¹⁰⁰의 값이 너무 크기 때문에 컴퓨터는 아마 이 숫자를 거의 무한대라고 간주해버릴 것입니다. 물론 요즘의 성능 좋은 컴퓨터는 이 문제를 잘 해결하겠지만 과거엔 그렇지 못했기 때문에 해결책이 필요했습니다. 해결책 중 하나는 제일 큰 값을 0으로 바꾸어버리는 것입니다.

최댓값 0으로 바꾸기

예를 들면, 첫 번째 (Z1, Z2)에서 Z2에서 Z2를 빼서 0으로 만들어주고, Z1에서도 역시 Z1-Z2로 만들어주는 것입니다.
두 번째에서도 Z3를 Z1, Z2, Z3에 각각 빼주어 최댓값 Z3을 0으로 만들어버리는 것이 해결하는 방법이었습니다. 이렇게 제일 큰 값을 0으로 만들어주었는데요, 새로 얻은 값을 식에 대입해보면:

위와 같습니다. 조금 더 계산하기 편해졌죠?

지금까지 시그모이드 함수부터 출발해 함수의 식, 그리고 여러 예시와 식의 변형을 살펴보며 소프트맥스 함수에 대해 알아보았습니다.

도움이 많이 되셨나요?

궁금하신 점이나 개선할 점 등 댓글은 언제나 환영하고,

CLAP은 항상 큰 힘이 됩니다.

읽어주셔서 감사합니다.

--

--