Все задачи
Легко Решено: 0 Процент решений: 0%

Функция softmax

Превратите исходные оценки в вероятности с суммой 1 без переполнения на больших значениях.

Чему вы научитесь

  • Превращать оценки в вероятности
  • Вычитать максимум, чтобы избежать переполнения
  • Делать сумму выходов равной 1

Условие

Функция softmax превращает список оценок (логитов) в вероятности. Языковые модели используют её, чтобы выбрать следующее слово:

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

При больших оценках e^x переполняется, поэтому сначала вычтите из каждой оценки наибольшую. Математически результат тот же.

Реализуйте softmax(logits).

Входные данные

logits: список оценок.

Выходные данные

Верните список вероятностей в том же порядке. Все они лежат между 0 и 1 и в сумме дают 1.

Ограничения

1 ≤ длина ≤ 1000

-1000 ≤ каждая оценка ≤ 1000

Примеры

Пример 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. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

Пока нет опубликованных решений. Решите задание, чтобы поделиться первым.