Теория информации

ELBO

Нижняя граница, которую максимизируют вместо недоступного правдоподобия

Шаг 59 из 117 · ~34 мин

Задача, которую нельзя решить прямо

Модель со скрытой переменной задаёт p(x,z)p(x, z), а нужно нам p(x)p(x) — правдоподобие данных. Оно получается маргинализацией:

p(x)=p(x,z)dzp(x) = \int p(x, z)\,dz

и этот интеграл в общем случае не берётся. Для смеси из блока 3 сумма по KK компонентам ещё считалась; для VAE, где zz — вектор из сотни непрерывных чисел, интеграл неподъёмен.

Обходной путь — не считать p(x)p(x), а ограничить его снизу величиной, которую считать умеем.

Вывод в три строки

Возьмём любое распределение q(z)q(z) с подходящим носителем и вставим его так, чтобы получилось ожидание:

logp(x)=logp(x,z)dz=logq(z)p(x,z)q(z)dz=logEq ⁣[p(x,z)q(z)]\log p(x) = \log \int p(x,z)\,dz = \log \int q(z)\frac{p(x,z)}{q(z)}\,dz = \log \mathbb{E}_q\!\left[\frac{p(x,z)}{q(z)}\right]

Это importance sampling из блока 3, урок 150 — тот же вес p/qp/q. Теперь по неравенству Йенсена (log\log вогнут, поэтому знак противоположен тому, что был в уроке про KL):

logp(x)  Eq ⁣[logp(x,z)q(z)] = ELBO(q)\htmlData{k=evidence}{\log p(x)} \ \ge \ \htmlData{k=elbo}{\mathbb{E}_{q}\!\left[\log \frac{p(x, z)}{q(z)}\right]} \ = \ \text{ELBO}(q)

Всё. Один шаг Йенсена — и вместо интеграла у нас ожидание по qq, которое считается методом Монте-Карло, потому что из qq мы умеем сэмплировать (мы его сами выбрали).

Зазор — это ровно KL

Насколько граница неточна? Посчитаем разность честно:

logp(x)ELBO(q)=Eq ⁣[logq(z)p(zx)]=KL(q(z)p(zx))\log p(x) - \text{ELBO}(q) = \mathbb{E}_q\!\left[\log \frac{q(z)}{p(z \mid x)}\right] = \text{KL}\big(q(z) \,\|\, p(z \mid x)\big)

Отсюда центральное тождество блока:

 logp(x)=ELBO(q)+KL(qp(zx)) \boxed{\ \log p(x) = \text{ELBO}(q) + \text{KL}\big(q \,\|\, p(z\mid x)\big)\ }

от qq не зависит вообще — это свойство модели и данных. Значит, максимизируя по qq, вы автоматически минимизируете KL до истинного posterior. Одно действие, две цели, и никакого компромисса между ними.

Подвигайте qq в виджете. Потолок стоит на месте, а зелёная и красная части обмениваются высотой.

log p(x) = -0.9943зазор = KLELBO

веса q(z)

z = 1 0.25
z = 2 0.25
z = 3 0.25
z = 4 0.25
log p(x)
-0.99425
ELBO(q)
-1.31865
KL(q‖posterior)
0.3244

Кнопка «взять qq = истинный posterior» закрывает зазор ровно: KL становится нулём, а ELBO садится на logp(x)=0.9943\log p(x) = -0.9943. Равномерная qq даёт ELBO 1.3187-1.3187 и зазор 0.32440.3244 ната. Сумма в обоих случаях одна и та же — потому что это тождество, а не приближение.

Второе прочтение: реконструкция и регуляризация

Разложим ELBO иначе, подставив p(x,z)=p(xz)p(z)p(x,z) = p(x \mid z)p(z):

ELBO=Eq[logp(xz)]реконструкция  KL(q(zx)p(z))регуляризация\text{ELBO} = \underbrace{\mathbb{E}_q\big[\log p(x \mid z)\big]}_{\text{реконструкция}} \ - \ \underbrace{\text{KL}\big(q(z\mid x) \,\|\, p(z)\big)}_{\text{регуляризация}}

Это та форма, в которой ELBO появляется в коде VAE, и в ней читается напряжение между двумя целями:

  • первый член хочет, чтобы zz содержал как можно больше информации об xx — иначе восстановить xx не выйдет;
  • второй член хочет, чтобы q(zx)q(z \mid x) был похож на prior — то есть чтобы zz содержал как можно меньше информации об xx.

Крайние случаи объясняют обе типичные поломки. Если второй член побеждает, наступает posterior collapse: q(zx)=p(z)q(z\mid x) = p(z) для всех xx, KL равна нулю, латент не несёт ничего, а декодер выучивает безусловное распределение. Если побеждает первый — латентное пространство становится дырявым, и сэмплы из prior декодируются в мусор.

Отсюда и β\beta-VAE: коэффициент перед KL, которым это равновесие сдвигают вручную. Заметьте, что при β1\beta \ne 1 вы оптимизируете уже не нижнюю границу правдоподобия — тождество перестаёт работать, и это осознанный обмен, а не улучшение.

EM — это тот же ELBO

Обещание из блока 3 (урок 200) можно теперь выполнить. EM — координатный подъём по ELBO:

шаг EMчто делает с ELBO
E-шагмаксимизирует по qq при фиксированных параметрах
M-шагмаксимизирует по параметрам при фиксированном qq

E-шаг доступен в закрытой форме именно потому, что оптимальное qq — это истинный posterior p(zx)p(z \mid x), который для смеси считается правилом Байеса. После него зазор равен нулю, и ELBO совпадает с logp(x)\log p(x).

Отсюда монотонность EM становится очевидной, а не удивительной: каждый из двух шагов не уменьшает ELBO, а после E-шага ELBO равна правдоподобию — значит правдоподобие тоже не уменьшается.

И отсюда же видно, чем VAE отличается от EM: там posterior недоступен, поэтому E-шаг заменяется на «подвинуть qq градиентом в сторону posterior», зазор никогда не закрывается полностью, и монотонности нет.

Что ещё стоит знать

Reparametrisation trick. Чтобы взять градиент ELBO по параметрам qq, нужно дифференцировать через операцию сэмплирования. Приём из блока 3 (урок 110): z=μ+σεz = \mu + \sigma\varepsilon, где εN(0,I)\varepsilon \sim \mathcal{N}(0, I) не зависит от параметров. После этого Eq\mathbb{E}_q становится обычным ожиданием по ε\varepsilon, и градиент проходит.

ELBO — плохая оценка правдоподобия. Это нижняя граница с неизвестным зазором, поэтому сравнивать по ней модели рискованно: модель с более высокой ELBO может иметь более низкое logp(x)\log p(x), если её зазор меньше. Для честного сравнения используют importance-weighted оценки (IWAE), которые дают более тугую границу за счёт нескольких сэмплов.

Один сэмпл достаточно. На практике Eq\mathbb{E}_q оценивают одним сэмплом zz на пример. Оценка получается шумной, но несмещённой — и этого хватает, ровно по тому же аргументу, по которому хватает одного минибатча в SGD (блок 3, урок 150).

Источники

Проверки

0 из 2
  1. Что такое ELBO

    Отметьте все верные утверждения об ELBO и вариационном выводе.

  2. ELBO, зазор и их сумма

    Скрытая переменная дискретна. Дан список joint — значения p(x,z)p(x, z) для одного наблюдённого xx, по одному на каждое значение zz — и ненормированные веса q_weights.

    Реализуйте elbo_parts(joint, q_weights) — верните [log_evidence, elbo, gap, total] в натах:

    • log_evidence = logzp(x,z)\log \sum_z p(x, z);
    • elbo = zq(z)logp(x,z)q(z)\sum_z q(z)\log\dfrac{p(x,z)}{q(z)}, слагаемые с q(z)=0q(z) = 0 пропускаются;
    • gap = KL(qp(zx))\text{KL}(q \,\|\, p(z\mid x)), где p(zx)=p(x,z)/p(x)p(z \mid x) = p(x,z) / p(x);
    • total = elbo + gap.

    Последнее число — проверка: оно обязано совпасть с log_evidence до последней цифры, потому что это тождество, а не приближение. Считайте gap независимо от elbo, а не как их разность, иначе проверка ничего не проверит.

    Гарантируется, что q_weights не кладёт массу туда, где joint равен нулю.

    функция elbo_parts

    Загрузка редактора…

    Ctrl/⌘ + Enter