모든 챌린지
쉬움 0명 해결 정답률 0%

소프트맥스 함수

큰 값에서도 오버플로 없이 원시 점수를 합이 1인 확률로 바꿉니다.

배우게 될 내용

  • 점수를 확률로 바꾸기
  • 최댓값을 빼서 오버플로 피하기
  • 출력의 합을 1로 만들기

문제

원문 보기 (영어)

소프트맥스 함수는 점수(로짓) 리스트를 확률로 바꿉니다. 언어 모델은 다음 단어를 고를 때 이 함수를 씁니다.

softmax(x)_i = e^(x_i) / (e^(x_1) + e^(x_2) + … + e^(x_n))

점수가 크면 e^x가 오버플로되므로, 먼저 모든 점수에서 가장 큰 점수를 빼세요. 수학적으로 결과는 같습니다.

softmax(logits)를 구현하세요.

입력

logits: 점수 리스트.

출력

확률 리스트를 같은 순서로 반환하세요. 모두 0과 1 사이이며 합은 1입니다.

제약 조건

1 ≤ 길이 ≤ 1,000

-1,000 ≤ 각 점수 ≤ 1,000

예시

예시 1
입력:
logits = [1.0, 2.0, 3.0]

예상 출력:
expected = [0.090031, 0.244728, 0.665241]
입력:
std::vector<double> logits = {1.0, 2.0, 3.0};

예상 출력:
std::vector<double> expected = {0.090031, 0.244728, 0.665241};
입력:
double[] logits = new double[] {1.0, 2.0, 3.0};

예상 출력:
double[] expected = new double[] {0.090031, 0.244728, 0.665241};

설명

e¹ ≈ 2.718, e² ≈ 7.389, e³ ≈ 20.086의 합은 30.193이므로 확률은 약 [0.090031, 0.244728, 0.665241]입니다.

예시 2
입력:
logits = [1000.0, 1000.0]

예상 출력:
expected = [0.5, 0.5]
입력:
std::vector<double> logits = {1000.0, 1000.0};

예상 출력:
std::vector<double> expected = {0.5, 0.5};
입력:
double[] logits = new double[] {1000.0, 1000.0};

예상 출력:
double[] expected = new double[] {0.5, 0.5};

설명

e^1000을 바로 계산하면 오버플로됩니다. 최댓값을 빼면 [0, 0]이 되고, 둘 다 e⁰ / (e⁰ + e⁰) = 0.5입니다.

참고 자료

이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.

다른 사람의 풀이 보기

커뮤니티 솔루션

아직 공개된 풀이가 없습니다. 문제를 풀고 첫 풀이를 공유하세요.