LogSumExp трюк | OTUS
🔥 Успейте получить скидку!
Только до 27.01 можно приобрести курсы со скидкой 25%. Торопитесь!
Выбрать курс

Курсы

Программирование
Разработчик программных роботов (RPA) на базе UiPath и PIX
-25%
Разработчик C#
-25%
Алгоритмы и структуры данных
-25%
Backend-разработчик на PHP
-25%
JavaScript Developer. Professional
-25%
Team Lead
-25%
Golang Developer. Professional
-25%
Agile Project Manager
-25%
Flutter Mobile Developer
-25%
Android Developer. Professional
-11%
MS SQL Server Developer
-8%
C++ Developer. Professional Framework Laravel Cloud Solution Architecture Highload Architect Reverse-Engineering. Professional Kotlin Backend Developer React.js Developer VOIP инженер Нереляционные базы данных Scala-разработчик Супер-практикум по использованию и настройке GIT IoT-разработчик JavaScript Developer. Basic Advanced Fullstack JavaScript developer Unity Game Developer. Professional Супер-интенсив Azure
Инфраструктура
Супер-интенсив "Версионирование и командная работа с помощью Git"
-30%
Administrator Linux. Professional
-25%
Супер-интенсив «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-25%
Administrator Linux. Advanced
-25%
Infrastructure as a code in Ansible
-25%
Network engineer
-25%
MS SQL Server Developer
-8%
Cloud Solution Architecture Highload Architect Разработчик голосовых ассистентов и чат-ботов Мониторинг и логирование: Zabbix, Prometheus, ELK Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Архитектор сетей Супер-интенсив «IaC Ansible»
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

LogSumExp трюк

DS_Deep_8.08_site.png

Очень часто в задачах машинного обучения у нас следующая задача. Дан массив чисел: Снимок экрана 2018-08-01 в 16.11.16.pngНадо посчитать величину: Снимок экрана 2018-08-01 в 16.11.40.pngНеобходимость подсчёта такого выражения возникает например в EM-алгоритме на E-шаге, когда мы считаем апостериорное распределение на скрытые переменные. А числа Снимок экрана 2018-08-01 в 16.11.16.pngпредставляют логарифм от плотности вероятности и являются большими по модулю отрицательными значениями.

Если мы попробуем взять экспоненту большего по модулю отрицательного значения, то ввиду ограниченной точности вычислений на компьютерах мы получим ответ равный нулю. Таким образом, в нашем исходном выражении мы можем получить ноль под знаком логарифма и ошибку при вычислении или некорректный ответ.

Например:

import numpy as np

a = np.array([-1000, -2000, -2000])
print(np.log(np.sum(np.exp(a))))
>>> -inf

Существует достаточно простой и элегантный способ обойти эту проблему

Обозначим Снимок экрана 2018-08-01 в 16.14.59.pngи запишем искомое выражение:Снимок экрана 2018-08-01 в 16.15.29.pngЗаметим, что в правой части под знаком логарифма уже никак не может стоять ноль, так как по крайней мере одно слагаемое суммы равно 1, и мы можем корректно посчитать данное выражение.

Данная функция реализована, например в пакете scipy:

import numpy as np
from scipy.misc import logsumexp

a = np.array([-1000, -2000, -2000])
b = a.max()
print(b  + np.log(np.sum(np.exp(a - b)))
>>> -1000

print(logsumexp(a))
>>> -1000

Так мы рассмотрели очень простой, но эффективный способ для обхода ошибок округления, которые возникают в задачах машинного обучения.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
1 комментарий
Комментарий удален
Для комментирования необходимо авторизоваться
Только до 27 января!
🔥 СКИДКА 25% на курсы OTUS!