문제
소프트맥스 함수는 점수(로짓) 리스트를 확률로 바꿉니다. 언어 모델은 다음 단어를 고를 때 이 함수를 씁니다.
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에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.