04 / 33 · Основы
Подгонка распределений с помощью KL
Обучение среднего и ковариации гауссианы минимизацией выборочной оценки KL(P‖Q), допущения, на которые неявно опирается KL-дивергенция, и поведение KL, обратной KL, JS и функции потерь наименьших квадратов, когда одна гауссиана должна описать две моды.
Энтропия, кросс-энтропия и KL-дивергенция · Многомерные гауссовские распределения · Градиентный спуск
На этой странице 6
В заметке об энтропии мы вывели KL-дивергенцию (KL divergence) из неожиданности и показали, что минимизация по модели — то же самое, что максимизация правдоподобия. В этой заметке мы применяем её к гауссовской модели: градиентный спуск притягивает с обучаемыми параметрами к целевому распределению . Заметка построена вокруг трёх вопросов:
- Как обучаются параметры? Что на самом деле происходит за одну итерацию цикла подгонки?
- Что предполагает KL? Что должно выполняться, чтобы формула имела смысл, и где каждое допущение проявляется в коде?
- Что, если модель не может представить целевое распределение? Одна гауссиана, подогнанная к двум модам, показывает, чем различаются KL, обратная KL (reverse KL), дивергенция Йенсена–Шеннона (Jensen–Shannon divergence, JS) и функция потерь наименьших квадратов (least-squares loss).
Обозначения. — истинное (целевое) распределение с плотностью , — модель с плотностью и параметрами , — шаг обучения (learning rate). В одномерном случае : хранится через свой логарифм, чтобы оставалось положительным. В двумерном случае среднее равно , а ковариация — , где — нижнетреугольный множитель Холецкого (Cholesky factor) из заметки о гауссианах.
Как обучаются параметры#
Одна итерация цикла, шаг за шагом:
- Оптимизатор получает список обучаемых тензоров. Каждый из них создан с
requires_grad=True, чтобыbackward()заполнял его.grad. В одномерном случае это среднее и ; в двумерном — среднее и три исходных элемента множителя Холецкого из заметки о гауссианах. У параметров целевого распределения нет градиента, и они остаются фиксированными. Qзаново строится из текущих параметров на каждой итерации: с .qxсодержит плотность модели в точках выборки, ;pxсодержит — плотность истинного распределения в тех же точках.loss— выборочная оценка KL-дивергенции, построенная поpxиqx.loss.backward()вычисляет градиенты и методом обратного распространения ошибки и сохраняет их в.grad.optimizer.step()сдвигает параметры против градиента. Для обычного SGD это
Adam (Kingma and Ba, 2015) движется в похожем направлении, но масштабирует шаг по каждой координате скользящими оценками среднего и величины градиента. Подгонки по KL ниже выполняются с помощью Adam.
Одна итерация цикла подгонки
Одномерная подгонка в коде:
# вспомогательные функции: kl_loss (оценка ниже), get_parameters_1d (mu = 0, log_std = 0),
# create_distr_1d и target_1d — одномерная смесь с двумя модами, определённая ниже
train_mu, train_log_std = get_parameters_1d() # requires_grad=True
optimizer = torch.optim.Adam([train_mu, train_log_std], lr=0.01)
x = target_1d.sample((1000,)) # фиксированные сэмплы x_i ~ P
px = target_1d.log_prob(x).exp() # p(x_i), известна для игрушечной цели
for i in range(2000):
optimizer.zero_grad() # очищаем .grad от предыдущего шага
Q = create_distr_1d(train_mu, train_log_std) # Normal(mu, exp(log_std))
qx = Q.log_prob(x).exp() # q(x_i); может обратиться в 0, см. «В коде»
loss = kl_loss(px, qx) # mean(log2 p(x_i) - log2 q(x_i))
loss.backward() # d loss / d mu, d loss / d log_std
optimizer.step() # шаг против градиента
Функция потерь — оценка KL методом Монте-Карло#
KL — математическое ожидание по , поэтому её можно оценить усреднением по сэмплам :
По закону больших чисел с ростом среднее сходится к математическому ожиданию. Код выше усредняет , так что его функция потерь измеряется в битах; смена основания лишь умножает функцию потерь и её градиенты на константу .
Выборочная оценка KL(P‖Q), используемая в ноутбуке
Сэмплы из другого распределения. Если сэмплы взяты не из , а из распределения с плотностью , каждое слагаемое перевзвешивается множителем (выборка по значимости (importance sampling)):
что требует всюду, где . При все веса равны , и мы возвращаемся к обычной оценке.
Оценка может быть отрицательной. KL никогда не бывает отрицательной, но её оценка на конечной выборке может. При подгонке двумерной гауссианы с полной ковариацией (пять параметров) к цели с помощью Adam на 1000 фиксированных сэмплах функция потерь после 4800 шагов равна бита. Причина в том, что подгоняется на тех же сэмплах, на которых вычисляется функция потерь. Сама цель входит в число гауссиан-кандидатов, поэтому в точке максимального правдоподобия среднее по сэмплам не меньше среднего , и оценка . Насколько она опускается ниже нуля, следует из теоремы Уилкса (Wilks’ theorem): удвоенный прирост суммарного логарифма правдоподобия подогнанной модели по сравнению с истинными параметрами приближённо имеет распределение с степенями свободы, где — число подгоняемых параметров (Wilks, 1938), так что в среднем оценка лежит на ната ниже нуля. Здесь это ната, или бита. В симуляции 2000 таких подгонок оценка в среднем равна бита со стандартным отклонением бита, так что — типичное значение. Честная оценка дивергенции подогнанной модели требует новых сэмплов — так же, как любой модели нужны отложенные данные (held-out data).
Чему равны градиенты#
Для одномерной гауссианы . Слагаемое не зависит от параметров, поэтому вклад даёт только (натуральные логарифмы):
Оба градиента обращаются в ноль, когда — выборочное среднее, а — (смещённая) выборочная дисперсия. Это оценки максимального правдоподобия, как и предсказывала заметка об энтропии. Градиенту плотность вообще не нужна: значения лишь делают выдаваемое число равным KL. На реальных данных, где неизвестна, мы отбрасываем эту константу и вместо KL минимизируем отрицательный логарифм правдоподобия .
Направление шагов проще всего увидеть на точной KL между двумя одномерными гауссианами:
Она следует из , если подставить выражение для выше и такое же выражение для (с ) и учесть, что и . Константы сокращаются, а слагаемое — это из .
Подгонка Q = 𝒩(μ, σ²) к P = 𝒩(3, 1) градиентным спуском по KL(P‖Q)
При обычном градиентном спуске по , как на рисунке, траектория показывает приоритеты прямой KL (forward KL). Пока узкое и находится далеко, большая часть массы лежит там, где , и там огромно. Дешевле всего расширить : на первых шагах резко растёт, а едва сдвигается. Когда накрывает , смещается к цели, а сжимается обратно до ширины . Порядок определяется величиной градиентов: из формулы в замкнутом виде растёт как , тогда как растёт лишь как . Adam, который нормирует шаг по каждой координате, сдвигает оба параметра примерно с одинаковой скоростью и приходит к тому же оптимуму другим путём.
Что предполагает KL#
Начнём с формулы для непрерывных распределений (Kullback and Leibler, 1951):
Чтобы она была осмысленным конечным числом, должны выполняться условия (a)–(c); (d) и (e) — это выбор, который нужно делать согласованно (Cover and Thomas, 2006, §8.5; Murphy, 2023, §5.1).
(a) Общий носитель#
Носитель (support) распределения — множество его возможных значений, . Если , но на области, которой даёт положительную вероятность, то там и дивергенция бесконечна.
Формально конечна, только если абсолютно непрерывно относительно , что записывается как : каждое множество, которому даёт нулевую вероятность, имеет нулевую и -вероятность. Где у есть масса, она должна быть и у . Это одна из причин, по которым модели, обучаемые методом максимального правдоподобия, используют всюду положительные плотности, например гауссианы: плотность без «дыр» избавляет от бесконечностей из-за несовпадения носителей: потеря на сэмпле конечна в каждой наблюдённой точке. Конечности ожидаемой потери или KL положительность не гарантирует: в условии (b) ниже обе плотности всюду положительны, и всё же . Сама по себе положительность не делает модель размытой. Но в сочетании с прямой KL, которая наказывает за любую пропущенную массу, модель, неспособная представить данные, размазывает вероятность между модами и вокруг них (см. раздел «Одна гауссиана, две моды»). Это одно из предлагаемых объяснений размытых сэмплов у моделей изображений, обученных по правдоподобию (Theis, van den Oord and Bethge, 2016).
Общий носитель: у Q не должно быть дыр там, где живёт P
Условие одностороннее. Точки, где , но , вносят в вклад ; они важны только для обратного направления.
(b) Интегрируемость#
Интеграл должен сходиться. Совпадения носителей для этого недостаточно. Пусть, например, — стандартное распределение Коши, а . Обе плотности всюду положительны, но растёт как , а , поэтому . Модель с лёгкими хвостами не может подогнать по KL данные с тяжёлыми хвостами.
(c) Нормированные плотности#
и должны быть плотностями вероятности (или функциями вероятности): неотрицательными и с интегралом (или суммой), равным . KL не определена для ненормированных значений, например логитов классификатора; их сначала нужно пропустить через softmax. Объект torch.distributions возвращает из log_prob нормированные логарифмы плотности.
(d) Направление#
KL не симметрична, , поэтому нужно решить, какое распределение играет роль истины, а какое — приближения:
- , прямая KL, усредняет по и наказывает за пропущенные моды: должно покрывать всё, где живёт . Это направление максимального правдоподобия.
- , обратная KL, усредняет по и наказывает за лишнюю массу: не должно растекаться туда, где . Это направление используется в вариационном выводе (variational inference), в том числе в VAE.
Какое направление что наказывает: пропущенные моды и лишняя масса
(e) Непрерывные и дискретные распределения#
Для дискретных распределений интеграл становится суммой, . Смешение двух случаев даёт бесконечную дивергенцию. Если у есть атом в точке , то для любого распределения с плотностью, поэтому не абсолютно непрерывно относительно и по условию (a). Вот почему для непрерывных данных максимальное правдоподобие понимают как выборочную оценку для лежащей в основе плотности , а не как KL эмпирического распределения сэмплов (ср. заметку об энтропии, где для дискретных исходов такое прочтение точно).
Допущения моделирования#
Когда KL используется как функция потерь при обучении, на веру принимается ещё несколько вещей:
- Представимость. Семейство способно выразить нужную форму. Одна гауссиана может точно совпасть с целевым распределением из одной гауссианы, но не со смесью двух компонент; что происходит тогда, показывает последний раздел.
- Дифференцируемость. должна быть дифференцируема по , чтобы можно было применить градиентный спуск. Репараметризация к тому же снимает ограничения с параметров, так что шаг градиента никогда не даст отрицательное .
- Вычислимость. Прямой KL нужны сэмплы из и значения в них. Обратной KL нужны сэмплы из (репараметризованные, чтобы получить градиенты) и значения и в них. Для реальных данных доступно только первое, поэтому максимальное правдоподобие использует прямое направление.
В коде. У каждого допущения есть конкретное место в коде. — это Normal или MultivariateNormal, всюду положительное, поэтому (a) математически выполняется при любом целевом распределении. Численно оно всё же может нарушиться. Код вычисляет qx = Q.log_prob(x).exp(), а затем qx.log2(), и в 32-битной арифметике с плавающей точкой экспонента обращается в (underflow), как только опускается ниже примерно : при это около стандартных отклонений от , а порог сдвигается вместе с . Из-за этого функция потерь становится бесконечной, когда стартует далеко от . Работа напрямую с log_prob позволяет этого избежать. Та же осторожность нужна и для двухкомпонентных целевых распределений ниже. Их логарифм плотности вычисляется из логарифмов плотности компонент и как ; экспонента большого отрицательного числа в этой формуле никогда не стоит отдельно, поэтому результат остаётся конечным вдали от обеих компонент. Ковариация с экспоненцированной диагональю сохраняет корректной нормированной плотностью, как требует (c). Целевое распределение — известная гауссиана или смесь, поэтому px можно вычислить. Наконец, функция потерь усредняет по x ~ P, что фиксирует направление .
Одна гауссиана, две моды#
Если целевое распределение — одна гауссиана, подгонка по KL просто восстанавливает его. Интересен случай, когда семейство моделей не может представить целевое распределение. В двумерном случае целевое распределение — смесь с равными весами и . В одномерном оно равно
а модель стартует с . Сравниваются четыре функции потерь: прямая KL, обратная KL, JS и функция потерь наименьших квадратов на значениях плотности. Ни одна из них не удовлетворительна, и у каждой на то своя причина. Те же компромиссы снова возникают в разных генеративных моделях, поэтому эту игрушечную задачу стоит разобрать подробно (Huszár, 2015; Theis, van den Oord and Bethge, 2016).
Вдали от цели доминирует пропущенная мода#
Начальное едва достаёт до дальней моды в . Гауссиана никогда не равна нулю в точности, но в восьми стандартных отклонениях от среднего она практически равна нулю. Там огромен, и дальняя мода доминирует во всей дивергенции. Если бы было там в точности нулём, дивергенция была бы бесконечной, как говорит условие (a). Для гауссовского прямая KL тем не менее остаётся конечной, и её градиент по , , здесь велик. Перекрытие важно, во-первых, численно, потому что в 32-битной арифметике с плавающей точкой обращается в (см. В коде выше), а во-вторых, для ограниченных функций потерь — JS и наименьших квадратов, — градиенты которых без перекрытия исчезают (см. таблицу ниже).
Когда Q не покрывает часть носителя P
Прямая KL покрывает обе моды, обратная выбирает одну#
Минимизация заставляет одну гауссиану покрыть обе моды с большим разбросом. Функция потерь усредняет по сэмплам , поэтому любая область, где у есть масса, а мало, наказывается очень сильно. Для гауссовского оптимум — точное сопоставление моментов (moment matching). Если записать прямую KL как
то от зависит только второе слагаемое, а для гауссианы зависит от только через и . Приравнивая нулю производные по и , получаем
(Bishop, 2006, §10.7). Для одномерной цели это даёт и , так что : каждая компонента вносит собственную дисперсию , а разброс двух средних вокруг добавляет . Для двумерной цели получаются среднее и ковариация : одна вытянутая гауссиана вдоль диагонали, проходящей через обе моды, с самой плотной частью в пустом промежутке между ними. В этом оптимуме дивергенция равна ната ( бита). Подгонка с Adam (шаг обучения , 2000 фиксированных сэмплов, старт с ) приходит именно к этой картине с оценкой бита после 4800 шагов; разрыв в бита меньше стандартного отклонения оценки по 2000 сэмплам — около бита.
Обратная дивергенция усредняет по сэмплам . Она наказывает за массу там, где мало, и не обращает внимания на те части , которые игнорирует, поэтому захватывает одну моду (Bishop, 2006, §10.1.2, рисунок 10.3; Minka, 2005). Для двух равных, хорошо разделённых мод положение точно на одной из них стоит всего : на этой моде , поэтому всюду, где у есть масса.
Подгонка одной гауссианы к двум модам: прямая и обратная KL
JS тоже не покрывает моды#
JS никогда не обращается в бесконечность, но проблему покрытия мод не решает. JS-подгонка двумерной смеси с Adam (шаг обучения , 5000 итераций), начатая с , заканчивается на с почти единичной ковариацией при значении функции потерь бита. Это гауссиана на моде в ; мода в отброшена. Функция потерь в этом запуске — взвешенный вариант, в битах. Для него точный захват одной моды даёт бита, что близко к достигнутому значению; для симметричной JS получилось бы бита. С одномерной целью всё заканчивается так же. Обычный градиентный спуск (шаг обучения , 5000 новых сэмплов каждого распределения на каждом шаге) из после 1800 шагов находится в , , на ближней моде в , с тем же значением взвешенной функции потерь бита. Пиковая плотность там, , вдвое больше, чем у цели, : вся масса сосредоточена на моде, которая содержит половину массы . Симметричная JS ведёт себя так же: для одномерной цели её лучшая одиночная гауссиана тоже располагается на одной моде (см. таблицу ниже).
Оценка JS по сэмплам. Каждая половина JS — математическое ожидание по своему распределению,
поэтому для оценки нужны две выборки: для первого слагаемого и для второго, и каждое слагаемое усредняется так же, как в оценке KL выше. Плотность смеси вычисляется в логарифмической шкале, , как и для двухкомпонентной цели. Второе слагаемое зависит от параметров ещё и через сэмплы . Чтобы его градиент был верным, сэмплы нужно брать с помощью трюка репараметризации (reparameterization trick), с : тогда обратное распространение ошибки учитывает, как они смещаются при изменении и . В приведённых выше запусках JS сэмплы берутся без него, поэтому их градиенты эту зависимость не учитывают.
У ограниченности есть и вторая цена. Когда и почти не перекрываются, JS уже близка к своему максимуму и почти плоская, поэтому её градиент слаб. Для одномерной цели при начальном она равна ната — уже от . То же насыщение — причина, по которой исходная минимаксная целевая функция GAN, равная при оптимальном дискриминаторе, даёт затухающие градиенты генератора (Arjovsky and Bottou, 2017, теорема 2.4; см. заметку о GAN и GAN Вассерштейна).
Функция потерь наименьших квадратов на плотностях чувствительна к масштабу#
Наивная альтернатива — напрямую сравнивать значения плотности:
Значения плотности зависят от масштаба данных. Если растянуть каждую координату в раз, все плотности в измерениях делятся на . Тогда квадраты разностей, а с ними и функция потерь, уменьшаются в раз, а градиенты — в сопоставимое число раз. При обычном SGD шаг обучения, подходящий для одного масштаба, не годится для другого. Адаптивные оптимизаторы вроде Adam компенсируют постоянный множитель, но не решают вторую проблему: когда не перекрывается с , в точках данных , и функция потерь остаётся около константы , что почти не даёт градиента. У KL нет ни одной из этих проблем. Отношение , а значит, и KL не меняются при изменении масштаба. А вдали от растёт как , так что при удалении от градиент KL растёт, а не исчезает ( при начальном в таблице ниже).
У функции потерь наименьших квадратов к тому же несколько минимумов. Для одномерной цели её глобальный минимум — широкая гауссиана из таблицы ниже (), но гауссиана на одной моде, , — локальный минимум (значение против ). В двумерном случае гауссиана на одной моде, , — локальный минимум со значением ; наименьшее значение, которое находит численный поиск, равно , у гауссианы с центром в , вытянутой вдоль диагонали (стандартное отклонение вдоль неё и поперёк). К какому минимуму придёт градиентный спуск, зависит от начальной точки. Подгонка с Adam (шаг обучения , 5000 итераций, 1000 сэмплов), начатая с , которое перекрывается только с модой в , заканчивается гауссианой с центром на этой моде, более широкой, чем сама мода; мода в игнорируется. Её сэмплы почти ничего не вносят в градиент, потому что там . получается шире компоненты, потому что гауссиана, вся масса которой сосредоточена на моде с весом , была бы там вдвое плотнее , а расширение понижает её пик. Больший шаг обучения или вчетверо большее число итераций приводят к той же моде.
Сравнение четырёх функций потерь#
Одномерная цель выше, натуральные логарифмы. Функция потерь наименьших квадратов измеряется не в натах: её единица — квадрат плотности, поэтому её значение зависит от масштаба данных.
| Одна гауссиана | LS | |||
|---|---|---|---|---|
| начальная | ||||
| с сопоставленными моментами , | ||||
| одна мода | ||||
| при начальном |
Жирным для каждой функции потерь выделен лучший из трёх кандидатов. Для KL, обратной KL и JS выделенное значение — также глобальный оптимум функции потерь по всем , найденный перебором по сетке; оптимум наименьших квадратов находится при , то есть практически совпадает с гауссианой с сопоставленными моментами. Значения вычислены численным интегрированием. Прямая KL и наименьшие квадраты предпочитают широкую гауссиану, обратная KL и JS — одну моду. Последняя строка показывает, насколько сильно каждая функция потерь тянет начальное к данным: KL даёт сильный сигнал, а JS и наименьшие квадраты почти плоские.
Подгонка по прямой KL с Adam (шаг обучения , 1000 фиксированных сэмплов) приходит к гауссиане с сопоставленными моментами: , , с оценкой бита. Точное значение в оптимуме — ната, или бита; разница в бита меньше двух стандартных отклонений оценки по 1000 сэмплам (каждое около бита).
Как ведут себя градиенты во время обучения#
Дополнительный материал: как меняются модули градиентов в двух запусках обучения, один из которых использует неполную оценку JS. Остальная часть заметки на него не опирается.
Последняя строка таблицы — снимок в начальной точке. На протяжении всей подгонки градиенты KL и JS ведут себя по-разному (одномерная цель, модули в битах на единицу и на единицу ):
- Прямая KL на фиксированных сэмплах: большие и гладкие, в конце нулевые. При начальном градиенты равны по и по (по формулам для градиентов выше это и ната, делённые на ). Градиент по , намного больший, обваливается первым — как только становится достаточно широким, чтобы накрыть обе моды. Градиент по убывает медленнее и держится на уровне нескольких десятых бита, пока перемещается к цели. Поскольку сэмплы фиксированы, функция потерь — детерминированная функция от , и по мере приближения к её минимуму оба градиента стремятся к нулю.
- JS с новыми сэмплами: маленькие и шумные. Этот запуск — диагностика, а не измерение настоящего градиента JS: он сэмплирует без приёма репараметризации, поэтому его градиенты не учитывают зависимость второго слагаемого от сэмплов. В описанном выше запуске обычного градиентного спуска (шаг обучения , 5000 новых сэмплов и на каждом шаге) ни один градиент не превышает примерно бита. Модули дважды достигают пика: около шага 40, пока расширяется, и около шага 720, когда оно сжимается к моде в . После этого они не затухают, а колеблются между и примерно бита вплоть до последнего из 2000 шагов. На каждом шаге функция потерь оценивается по новым сэмплам, поэтому её градиент несёт шум оценки Монте-Карло, который не исчезает в оптимуме, и при постоянном шаге обучения параметры продолжают на него реагировать.
Здесь смешаны три эффекта, и их стоит разделять. Геометрия целевой функции: JS почти плоская вдали от цели, что показывает последняя строка таблицы по точным интегралам, а KL даёт там сильный сигнал и чистую остановку в оптимуме. Оценка: градиенты запуска с JS неполны, поэтому точная форма его траектории мало говорит о настоящем градиенте JS. Сэмплирование: при новых сэмплах на каждом шаге (resampling) любой оценённый градиент сохраняет шум Монте-Карло и в оптимуме, так что подгонка с постоянным шагом обучения никогда точно не останавливается.
Ноутбук#
Эксперименты следуют ноутбуку Distances between distributions (HSE-LAMBDA Deep Generative Models, закреплённый коммит; ячейки нумеруются с 1, считая все ячейки, включая текстовые). Результаты запусков, приведённые выше, взяты из его сохранённых выходов ячеек; точные значения дивергенций и градиентов, минимумы функции потерь наименьших квадратов и симуляция отрицательных оценок вычислены отдельно, как и запуски с функцией потерь наименьших квадратов с пересчитанным px и возобновлённая кривая градиентов KL. Ячейки 1–11 (вспомогательные функции, целевое распределение из одной гауссианы и начальное ) описаны в заметке о гауссианах.
- Ячейки 12–15: выборочная оценка (
kl_loss, в битах; её аргументweightsпринимает веса значимости (importance weights) и по умолчанию состоит из единиц) и подгонка двумерной модели с Adam (шаг обучения 0.1, 5000 итераций) к одиночной цели на 1000 сэмплахxиз ячейки 8. Последний график, на шаге 4800, озаглавленKL = -0.0020. - Ячейки 16–19: двухкомпонентная двумерная смесь со средними и и та же подгонка по KL, применённая к ней, на 2000 фиксированных сэмплах.
log_prob_mixtureиспользуетtorch.logaddexp.sample_from_mixtureберёт ровно половину сэмплов из каждой компоненты, то есть строит стратифицированную выборку (stratified sample); при независимых одинаково распределённых (i.i.d.) сэмплах из смеси их число в каждой компоненте распределялось бы по биномиальному закону. Последний график, на шаге 4800, показываетKL mixture = 1.6688. - Ячейки 20–23: JS-дивергенция и её оценка методом Монте-Карло (
js_div:x = P.sample(...)для первого слагаемого,y = sample(Q, ...)для второго,torch.logaddexpдля ), а также JS-подгонка смеси, начатая с , с 5000 сэмплами на каждом шаге. В последней распечатке, на шаге 4900, стоятJS loss = 0.2734иmu = tensor([-4.9879, -5.0583]). При повторном запуске важны две детали реализации.js_divвозвращает взвешенную комбинацию , а не симметричную JS с весами ½–½. Кроме того, сэмплы она берёт черезsample(), а неrsample(), поэтому градиент не учитывает, как эти сэмплы смещаются при изменении . - Ячейки 24–26:
LSE_loss— среднеквадратичная ошибка между и — и подгонка с Adam (шаг обучения 0.001, 5000 итераций), начатая с . Для контекста ноутбук ссылается на статью о GAN с наименьшими квадратами (least-squares GAN; Mao et al., 2017), хотя в ней наименьшие квадраты применяются к выходам дискриминатора, а не к плотностям. Ячейка обучения берёт новые сэмплыx, но повторно используетpx, оставшееся от ячейки с JS, — плотности цели в 1000 других точках, поэтомуpxнужно пересчитать, чтобы функция потерь сравнивала две плотности в одних и тех же точках. Последний график, на шаге 4800, показываетLSE = 0.0013, и находится на моде в . С пересчитаннымpxта же подгонка всё равно заканчивается на этой моде, со значением функции потерь около в повторной реализации. - Ячейки 27–38: вспомогательные функции кода выше (
get_parameters_1dиcreate_distr_1dв ячейке 29,target_1dв ячейках 30–31) и одномерная смесь , к которой гауссиана подгоняется по KL (Adam, шаг обучения 0.01, 2000 итераций, 1000 фиксированных сэмплов) и, начиная с , по JS (SGD, шаг обучения 0.1, 2000 итераций); модули градиентов по и построены на графиках по ходу обучения (ячейки 35 и 38). JS-подгонка использует ту же взвешеннуюjs_divс 5000 новыми сэмплами на каждом шаге. Сохранённые графики показывают подгонку по KL на шаге 1500 (Loss (KL) = 1.3001, mu = -5.494, std = 2.566) и JS-подгонку на шаге 1800 (JS = 0.2698,mu = -2.995, std = 0.495). В легенде ячейки 35 написано|grad sigma|, но кривая — это градиент по , как и подписано в ячейке 38. - Сохранённая кривая градиентов KL начинается не с . Ячейка 33 создаёт параметры, соответствующие ; ячейка 34 не создаёт их заново. Кривая ячейки 35 начинается с и бита, тогда как старт с даёт и . Таких значений новый запуск достигает примерно через 200 шагов, при , , а в номерах выполнения (execution count) между ячейками 33 и 34 пропущено одно число: сохранённый запуск продолжился с того места, где параметры оставил более ранний, прерванный запуск ячейки 34. Повторная реализация, которая возобновляет обучение с этой точки с новым оптимизатором, воспроизводит сохранённую кривую: падает почти до примерно за 100 шагов, держится около примерно до шага 400 и достигает к шагу 750 или около того, а к шагу 1500 подгонка находится в , . Новый запуск медленнее: к шагу 1500 он всё ещё в . Чтобы получить задуманный старт, ячейку 33 нужно выполнить заново перед ячейкой 34.
Дальше#
До сих пор у модели было пять параметров и плотность в замкнутом виде. Реальные генеративные модели заменяют эти пять параметров нейронной сетью, а многие отказываются и от плотности в замкнутом виде. Обучение таких сетей требует собственного инструментария. Следующая заметка собирает элементы, которые используются на протяжении всего курса: батч-нормализацию (batch normalization), то, как градиенты проходят через глубокие стеки слоёв, и размерности свёрток.
Литература#
- S. Kullback, R. A. Leibler. On Information and Sufficiency. Annals of Mathematical Statistics, 22(1), 1951.
- T. M. Cover, J. A. Thomas. Elements of Information Theory, 2nd ed. Wiley, 2006. §8.5: относительная энтропия для непрерывных распределений.
- C. M. Bishop. Pattern Recognition and Machine Learning. Springer, 2006. §10.1.2 и рисунок 10.3: прямая и обратная KL на бимодальном целевом распределении; §10.7: сопоставление моментов.
- K. P. Murphy. Probabilistic Machine Learning: Advanced Topics. MIT Press, 2023. §5.1: KL-дивергенция, её свойства и различие прямого и обратного направлений.
- T. Minka. Divergence measures and message passing. Microsoft Research Technical Report MSR-TR-2005-173, 2005.
- F. Huszár. How (not) to train your generative model: scheduled sampling, likelihood, adversary? arXiv:1511.05101, 2015.
- L. Theis, A. van den Oord, M. Bethge. A note on the evaluation of generative models. ICLR, 2016.
- M. Arjovsky, L. Bottou. Towards principled methods for training generative adversarial networks. ICLR, 2017. §2, теорема 2.4: затухающие градиенты минимаксной функции потерь генератора.
- D. P. Kingma, J. Ba. Adam: A method for stochastic optimization. ICLR, 2015.
- S. S. Wilks. The large-sample distribution of the likelihood ratio for testing composite hypotheses. Annals of Mathematical Statistics, 9(1), 60–62, 1938.
- X. Mao, Q. Li, H. Xie, R. Y. K. Lau, Z. Wang, S. P. Smolley. Least squares generative adversarial networks. ICCV, 2017.
- HSE-LAMBDA, репозиторий курса Deep Generative Models:
distances.ipynb.