0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: python, машинное обучение, machine learning, data scientist, bigdata, data science, em-алгоритм, scipy, logsumexp, апостериорное распределение на скрытые переменные</p>
1
<p>Теги: python, машинное обучение, machine learning, data scientist, bigdata, data science, em-алгоритм, scipy, logsumexp, апостериорное распределение на скрытые переменные</p>
2
<p>Очень часто в задачах машинного обучения у нас следующая задача. Дан массив чисел: Надо посчитать величину: Необходимость подсчёта такого выражения возникает например в EM-алгоритме на E-шаге, когда мы считаем апостериорное распределение на скрытые переменные. А числа представляют логарифм от плотности вероятности и являются большими по модулю отрицательными значениями.</p>
2
<p>Очень часто в задачах машинного обучения у нас следующая задача. Дан массив чисел: Надо посчитать величину: Необходимость подсчёта такого выражения возникает например в EM-алгоритме на E-шаге, когда мы считаем апостериорное распределение на скрытые переменные. А числа представляют логарифм от плотности вероятности и являются большими по модулю отрицательными значениями.</p>
3
<p>Если мы попробуем взять<em>экспоненту</em>большего по модулю отрицательного значения, то ввиду ограниченной точности вычислений на компьютерах мы получим ответ равный нулю. Таким образом, в нашем исходном выражении мы можем получить ноль под знаком логарифма и ошибку при вычислении или некорректный ответ.</p>
3
<p>Если мы попробуем взять<em>экспоненту</em>большего по модулю отрицательного значения, то ввиду ограниченной точности вычислений на компьютерах мы получим ответ равный нулю. Таким образом, в нашем исходном выражении мы можем получить ноль под знаком логарифма и ошибку при вычислении или некорректный ответ.</p>
4
<p>Например:</p>
4
<p>Например:</p>
5
import numpy as np a = np.array([-1000, -2000, -2000]) print(np.log(np.sum(np.exp(a)))) >>> -inf<h2>Существует достаточно простой и элегантный способ обойти эту проблему</h2>
5
import numpy as np a = np.array([-1000, -2000, -2000]) print(np.log(np.sum(np.exp(a)))) >>> -inf<h2>Существует достаточно простой и элегантный способ обойти эту проблему</h2>
6
<p>Обозначим и запишем искомое выражение:Заметим, что в правой части под знаком логарифма уже никак не может стоять ноль, так как по крайней мере одно слагаемое суммы равно 1, и мы можем корректно посчитать данное выражение.</p>
6
<p>Обозначим и запишем искомое выражение:Заметим, что в правой части под знаком логарифма уже никак не может стоять ноль, так как по крайней мере одно слагаемое суммы равно 1, и мы можем корректно посчитать данное выражение.</p>
7
<p>Данная функция реализована, например в пакете<strong>scipy</strong>:</p>
7
<p>Данная функция реализована, например в пакете<strong>scipy</strong>:</p>
8
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<p>Так мы рассмотрели очень простой, но эффективный способ для обхода ошибок округления, которые возникают в задачах машинного обучения.</p>
8
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<p>Так мы рассмотрели очень простой, но эффективный способ для обхода ошибок округления, которые возникают в задачах машинного обучения.</p>
9
9