Содержание курса 23 / 33

23 / 33 · Нормализующие потоки

Архитектуры потоков

Как строить обратимые слои с дешёвыми определителями Якоби: слои связи (NICE, RealNVP), маскированные авторегрессионные слои (MAF, IAF), обратимые свёртки 1×1 из Glow, рационально-квадратичные сплайновые слои связи, ActNorm, многомасштабные потоки на изображениях, а также более ранние планарные и радиальные потоки.

На этой странице 13

Заметка о замене переменных закончилась проблемой вычислительной стоимости. Каждый слой потока вносит в логарифм правдоподобия слагаемое ±log⁡∣det⁡J∣\pm\log\lvert\det J\rvert (со знаком плюс, когда JJ — матрица Якоби отображения из данных в латентное пространство). Для произвольной матрицы Якоби размера d×dd\times d вычисление этого определителя стоит O(d3)O(d^3). Для треугольной матрицы Якоби это просто произведение диагональных элементов, которое стоит O(d)O(d). Поэтому вопрос в том, как придать JJ структуру, определитель которой дёшев по построению: треугольную, линейное отображение, хранимое в виде произведения множителей, или единичную матрицу плюс слагаемое малого ранга.

Ответ дают три конструкции: слои связи (coupling layers, часть А) и авторегрессионные слои (часть Б), у которых матрица Якоби треугольная, и обратимые свёртки 1×11\times1 (invertible 1×1 convolutions, часть В), у которых она блочно-диагональная с плотными блоками, хранимыми как произведения треугольных множителей. Каждая из них сохраняет обратимость слоя и дешевизну его определителя, а основную работу внутри слоя по-прежнему выполняют произвольные нейронные сети. На них опираются ещё три части. Часть Г заменяет аффинное отображение внутри слоя связи монотонным сплайном, часть Д добавляет ActNorm — слой нормализации из Glow, а часть Е собирает всё это в потоки для изображений. Часть Ж показывает более ранний путь к дешёвому определителю, на котором треугольные матрицы вообще не нужны: планарные и радиальные потоки. При первом чтении достаточно частей А, Б, В и Е; части Г и Ж — расширения.

Обозначения. Один слой потока отображает z∈Rdz\in\mathbb R^d в z′∈Rdz'\in\mathbb R^d. Его матрица Якоби — J=∂z′/∂zJ = \partial z'/\partial z с элементами Jij=∂zi′/∂zjJ_{ij} = \partial z'_i/\partial z_j: строка ii соответствует выходной координате, а столбец jj — входной. ⊙\odot — поэлементное произведение, а exp⁡\exp от вектора применяется поэлементно. Здесь неважно, в каком направлении используется слой: из данных в латентное пространство или из латентного пространства в данные. Определитель обратного слоя равен обратной величине определителя прямого, поэтому определитель, дешёвый в одном направлении, дёшев и в другом. Нижний индекс нумерует координаты одного вектора (ziz_i, z<iz_{<i}), а не слои потока, как в предыдущей заметке. Тензор-изображение имеет высоту hh, ширину ww и CC каналов.

А. Слои связи (NICE, RealNVP)#

Разобьём вход на две части,

z=(za,  zb),za∈Rk,zb∈Rd−k,z = (z_a,\; z_b), \qquad z_a\in\mathbb R^{k},\quad z_b\in\mathbb R^{d-k},

и зададим преобразование

za′=za,zb′=zb⊙exp⁡(s(za))+t(za),\begin{aligned} z'_a &= z_a, \\ z'_b &= z_b \odot \exp\bigl(s(z_a)\bigr) + t(z_a), \end{aligned}

где s,t:Rk→Rd−ks, t:\mathbb R^{k}\to\mathbb R^{d-k} — произвольные нейронные сети, которые называют сетью масштаба (scale) и сетью сдвига (translation). Конструкция работает благодаря двум фактам:

  • za′z'_a вообще не зависит от zbz_b;
  • zb′z'_b зависит от zbz_b лишь аффинно и к тому же поэлементно: в ii-ю координату zb,i′z'_{b,i} входит только zb,iz_{b,i}, умноженная на exp⁡(si(za))\exp(s_i(z_a)) и сдвинутую на ti(za)t_i(z_a).
Рисунок

Аффинный слой связи и обратный к нему

Блок-схема слоя связи: прямой и обратный проходыВерхняя панель, прямой проход: входной вектор z разбивается на z_a и z_b. z_a проходит прямо на выход как z штрих a и, кроме того, подаётся на два блока сетей s и t. z_b поэлементно умножается на exp от s, затем к нему прибавляется t, что даёт z штрих b. Выходные половины объединяются в z штрих. Нижняя панель, обратный проход, нарисована с обращёнными стрелками: z штрих a копируется обратно в z_a, его читают те же сети s и t, из z штрих b вычитается t, и результат умножается на exp от минус s, что даёт z_b.⊙+zazbz′az′bzz′Прямой проход: z → z′тождественно: z′a = zas(·)t(·)exp(s)tzb ⊙ exp(s(za))+ t(za)s(·), t(·): произвольные нейронные сети от za−⊙zazbz′az′bzz′Обратный проход: z′ → zтождественно: za = z′as(·)t(·)exp(−s)tz′b − t(za)⊙ exp(−s(za))те же s и t, вычисленные заново на za: ни одна сеть не обращаетсяБлок-схема слоя связи: прямой и обратный проходы (вертикальная компоновка)Прямой проход сверху вниз: z разбивается на z_a и z_b. z_a идёт прямо вниз в z штрих a и подаётся на сети s и t. z_b умножается на exp от s и сдвигается на t, что даёт z штрих b. Обратный проход снизу вверх: z штрих b минус t, умноженное на exp от минус s, даёт z_b, а z штрих a копируется обратно в z_a.⊙+Прямой: z → z′zazbz′az′bz′a = zas(·)t(·)exp(s)ts, t: произвольные нейросети от za⊙−Обратный: z′ → zzazbz′az′bza = z′as(·)t(·)exp(−s)tте же s и t; ни одна сеть не обращается
Первая половина копируется без изменений и подаётся на вход двух сетей s и t. Вторая половина поэлементно умножается на exp(s) и сдвигается на t, причём обе величины вычисляются по первой половине. При обращении слоя обращается только этот дешёвый поэлементный шаг: s и t снова вычисляются на той же первой половине и никогда не обращаются.

Матрица Якоби. Эти два факта задают блочную структуру JJ:

J=∂z′∂z=[Ik0∂zb′∂zadiag⁡(exp⁡(s(za)))].J = \frac{\partial z'}{\partial z} = \begin{bmatrix} I_k & 0 \\[4pt] \dfrac{\partial z'_b}{\partial z_a} & \operatorname{diag}\bigl(\exp(s(z_a))\bigr) \end{bmatrix}.
  • Левый верхний блок: ∂za′/∂za=I\partial z'_a/\partial z_a = I, потому что za′=zaz'_a = z_a.
  • Правый верхний блок: ∂za′/∂zb=0\partial z'_a/\partial z_b = 0, потому что za′z'_a не зависит от zbz_b.
  • Правый нижний блок: ∂zb′/∂zb=diag⁡(exp⁡(s(za)))\partial z'_b/\partial z_b = \operatorname{diag}(\exp(s(z_a))), потому что зависимость от zbz_b поэлементная с угловым коэффициентом exp⁡(si(za))\exp(s_i(z_a)).
  • Левый нижний блок: ∂zb′/∂za\partial z'_b/\partial z_a — плотная матрица, в которую входят производные ss и tt. Она сложна, но это неважно.

Значит, JJ нижнетреугольная, и её определитель равен произведению диагональных элементов:

det⁡J=1k⋅∏i=1d−kexp⁡(si(za))=exp⁡(∑i=1d−ksi(za)),log⁡∣det⁡J∣=∑i=1d−ksi(za).\begin{aligned} \det J &= 1^k\cdot\prod_{i=1}^{d-k} \exp\bigl(s_i(z_a)\bigr) \\ &= \exp\Bigl(\sum_{i=1}^{d-k} s_i(z_a)\Bigr), \\[4pt] \log\lvert\det J\rvert &= \sum_{i=1}^{d-k} s_i(z_a). \end{aligned}

Здесь ii пробегает d−kd-k координат zbz_b, а sis_i — ii-й выход сети ss.

Определитель всегда положителен, так что модуль не нужен. Слой обратим при любом выборе сетей ss и tt, и не потому, что det⁡J≠0\det J\ne0 (само по себе это гарантирует лишь локальную обратимость), а потому, что обратное отображение можно выписать явно, как показано ниже. Плотный блок никогда не входит в определитель: ss и tt могут быть сколь угодно глубокими, и det⁡J\det J от этого не становится дороже.

Рисунок

Почему матрица Якоби слоя связи нижнетреугольная

Блочная структура матрицы Якоби слоя связиМатрица шесть на шесть со строками z штрих a, z штрих b и столбцами z_a, z_b, разбитыми на три и три. Левый верхний блок: единичный, с единицами на диагонали. Правый верхний блок: заштрихованные нули, потому что z штрих a не зависит от z_b. Левый нижний блок: плотный, заполненный звёздочками, — производная z штрих b по z_a. Правый нижний блок: диагональный, с элементами e в степени s1, e в степени s2, e в степени s3. Всё, что выше главной диагонали, заштриховано. Определитель равен произведению exp от s_i, то есть exp от суммы s_i.Jij = ∂z′i / ∂zjzazbz′az′b101001∗∗∗es1∗∗∗0es2∗∗∗00es30единичныйблокz′a = zaнулевой блок:z′a не зависитот zbдиагональный блок:z′b зависит от zbпоэлементно, аффинно∂z′b / ∂za: плотныйs, t видят весь zadet J = ∏ᵢ exp(si(za))= exp(Σᵢ si(za))Блочная структура матрицы Якоби слоя связи (компактный вариант)Та же матрица Якоби шесть на шесть: единичный блок слева вверху, заштрихованный нулевой блок справа вверху, плотный блок слева внизу, диагональный блок с e в степени s_i справа внизу. Легенда ниже объясняет каждый блок, а определитель равен произведению exp от s_i.Jij = ∂z′i / ∂zjzazbz′az′b101001∗∗∗es1∗∗∗0es2∗∗∗00es301единичный: z′a = zaнули: z′a не зависит от zbплотный ∂z′b/∂za: s, t видят весь zaдиагональ: поэлементно по zbdet J = ∏ᵢ exp(si) = exp(Σᵢ si)
Матрица Якоби слоя связи при d = 6 с разбиением на три и три координаты; элемент (i, j) — производная выходной координаты i по входной координате j. Всё, что выше диагонали (штриховка), равно нулю, поэтому определитель — произведение диагональных элементов: три единицы из единичного блока и exp(sᵢ) из поэлементного блока. Плотный блок никогда не входит в определитель, поэтому s и t могут быть сколь угодно сложными.

Например, при d=6d = 6 и разбиении 3+33+3 пусть в некоторой точке s(za)=(0.2, −0.5, 0.1)s(z_a) = (0.2,\,-0.5,\,0.1). Тогда log⁡∣det⁡J∣=0.2−0.5+0.1=−0.2\log\lvert\det J\rvert = 0.2 - 0.5 + 0.1 = -0.2 и det⁡J=e−0.2≈0.819\det J = e^{-0.2}\approx 0.819. Вблизи этой точки слой уменьшает малые объёмы примерно на 18%, что бы ни содержал плотный блок.

Обратное отображение обращает только поэлементный шаг. Поскольку za′=zaz'_a = z_a, сети можно снова вычислить на том же входе:

za=za′,zb=(zb′−t(za′))⊙exp⁡(−s(za′)),log⁡∣det⁡Jinv∣=−∑i=1d−ksi(za′).\begin{aligned} z_a &= z'_a, \\ z_b &= \bigl(z'_b - t(z'_a)\bigr)\odot\exp\bigl(-s(z'_a)\bigr), \\[4pt] \log\lvert\det J_{\text{inv}}\rvert &= -\sum_{i=1}^{d-k} s_i(z'_a). \end{aligned}

Ни ss, ни tt обращать не нужно. Каждое направление требует одного прохода через обе сети.

Б. Авторегрессионные слои (MAF, IAF)#

Потребуем, чтобы каждая выходная координата зависела только от предыдущих:

zi′=fi(z1,…,zi),i=1,…,d.z'_i = f_i(z_1, \dots, z_i), \qquad i = 1,\dots,d.

Теперь JJ автоматически нижнетреугольная:

  • зависимости от координат с номерами >i> i нет, поэтому Jij=∂zi′/∂zj=0J_{ij} = \partial z'_i/\partial z_j = 0 для всех j>ij > i;
  • диагональные элементы равны Jii=∂fi/∂ziJ_{ii} = \partial f_i/\partial z_i.
J=[∂f1∂z10⋯0∗∂f2∂z2⋯0⋮⋱⋮∗∗⋯∂fd∂zd],J = \begin{bmatrix} \frac{\partial f_1}{\partial z_1} & 0 & \cdots & 0 \\ \ast & \frac{\partial f_2}{\partial z_2} & \cdots & 0 \\ \vdots & & \ddots & \vdots \\ \ast & \ast & \cdots & \frac{\partial f_d}{\partial z_d} \end{bmatrix},

так что

det⁡J=∏i=1d∂fi∂zi.\det J = \prod_{i=1}^{d} \frac{\partial f_i}{\partial z_i}.

Снова определитель — произведение диагональных элементов. Слой связи — частный случай всего с двумя блоками: zaz_a служит условием для zbz_b.

Конкретный слой. В MAF, маскированном авторегрессионном потоке (masked autoregressive flow; Papamakarios, Pavlakou and Murray, 2017) каждое fif_i аффинно по своей координате, а масштаб и сдвиг вычисляются по координатам, стоящим строго перед ней:

zi′=zi exp⁡(si(z<i))+ti(z<i),Jii=exp⁡(si(z<i)),log⁡∣det⁡J∣=∑i=1dsi(z<i).\begin{aligned} z'_i &= z_i\,\exp\bigl(s_i(z_{<i})\bigr) + t_i(z_{<i}), \\[4pt] J_{ii} &= \exp\bigl(s_i(z_{<i})\bigr), \\[4pt] \log\lvert\det J\rvert &= \sum_{i=1}^{d} s_i(z_{<i}). \end{aligned}

Здесь z<i=(z1,…,zi−1)z_{<i} = (z_1,\dots,z_{i-1}). Поскольку sis_i и tit_i не видят ziz_i, диагональный элемент равен просто exp⁡(si)>0\exp(s_i) > 0, и слой можно обращать по одной координате за раз. Тот же слой часто записывают как f(xi)=(xi−μ(x<i))/exp⁡(α(x<i))f(x_i) = (x_i - \mu(x_{<i}))/\exp(\alpha(x_{<i})); это та же форма, что и выше, с s=−αs = -\alpha и t=−μ e−αt = -\mu\,e^{-\alpha}.

Маскирование. Можно было бы дать каждой координате собственную сеть, которая читает z<iz_{<i}, ценой dd сетей и dd последовательных проходов. MAF вместо этого использует одну сеть и маскирует её веса, так что

∂zi′∂zj=0для всех j>i.\frac{\partial z'_i}{\partial z_j} = 0 \qquad \text{для всех } j > i .

Эта сеть — MADE, маскированный автоэнкодер для оценивания распределений (masked autoencoder for distribution estimation; Germain et al., 2015). Маски строятся по степеням (degrees), которые здесь обозначены m(⋅)m(\cdot), чтобы не путать их с размерностью dd:

  • вход zjz_j имеет степень m(j)=jm(j) = j;
  • каждый скрытый нейрон uu получает степень m(u)∈{1,…,d−1}m(u)\in\{1,\dots,d-1\} (Germain et al., 2015, §4). Нейрону разрешено зависеть от z1,…,zm(u)z_1,\dots,z_{m(u)} и ни от чего более позднего. Степень dd была бы бесполезна: такой нейрон мог бы передавать сигнал только выходам, идущим после zdz_d, а их нет;
  • выходной нейрон, который вычисляет (si,ti)(s_i, t_i), имеет степень m(i)=im(i) = i.

В скрытом слое скрытый нейрон uu может читать нейрон jj нижележащего слоя, только если степень отправителя не больше степени получателя:

Muj={1если m(j)≤m(u),0иначе,h=Wx+b    ⟶    h=(W⊙M) x+b.\begin{gathered} M_{uj} = \begin{cases} 1 & \text{если } m(j) \le m(u), \\ 0 & \text{иначе,} \end{cases} \\[6pt] h = Wx + b \;\;\longrightarrow\;\; h = (W\odot M)\,x + b . \end{gathered}

Маска имеет ту же форму, что и матрица весов слоя WW, и W⊙MW\odot M просто обнуляет запрещённые веса. Выходной слой использует строгое неравенство: его маска Miuout=1M^{\text{out}}_{iu} = 1, если m(u)<im(u) < i, и 00 иначе, так что выход ii может читать скрытый нейрон uu, только если m(u)<im(u) < i. Именно поэтому (si,ti)(s_i, t_i) зависят от z<iz_{<i}, а не от самого ziz_i.

Разобранный пример. Возьмём d=3d = 3 входа, один скрытый слой из четырёх нейронов со степенями (1,2,1,2),(1, 2, 1, 2), и выходы степеней (1,2,3)(1, 2, 3). В обеих масках строки соответствуют принимающим нейронам, а столбцы — отправляющим. Маска скрытого слоя (правило m(j)≤m(u)m(j)\le m(u)) и маска выходного слоя (правило m(u)<im(u) < i) равны

M(1)=[100110100110],M(2)=[000010101111].\begin{gathered} M^{(1)} = \begin{bmatrix} 1&0&0\\ 1&1&0\\ 1&0&0\\ 1&1&0 \end{bmatrix}, \\[6pt] M^{(2)} = \begin{bmatrix} 0&0&0&0\\ 1&0&1&0\\ 1&1&1&1 \end{bmatrix}. \end{gathered}

Элемент (i,j)(i, j) их произведения равен числу путей от входа jj к выходу ii:

M(2)M(1)=[000200420].M^{(2)}M^{(1)} = \begin{bmatrix} 0&0&0\\ 2&0&0\\ 4&2&0 \end{bmatrix}.

Произведение строго нижнетреугольное. Нелинейность вроде ReLU не может создать путь, который удалили маски, поэтому si,tis_i, t_i зависят только от z<iz_{<i}. Затем поэлементный шаг добавляет диагональ exp⁡(si).\exp(s_i). Выход 1 вообще не получает связей, так что s1,t1s_1, t_1 — обучаемые константы (смещения), как и должно быть: перед z1z_1 ничего нет. Вход z3z_3 никуда не передаётся, потому что ни одной более поздней координате он не нужен.

Рисунок

Маскирование весов делает сеть авторегрессионной

Маски MADE и получающаяся структура матрицы ЯкобиМаскированная сеть со входами z1, z2, z3 степеней 1, 2, 3, четырьмя скрытыми нейронами степеней 1, 2, 1, 2 и тремя выходами (s1, t1), (s2, t2), (s3, t3) степеней 1, 2, 3. Скрытые нейроны степени 1 читают только z1; скрытые нейроны степени 2 читают z1 и z2; z3 никуда не передаётся. У выхода 1 нет входящих связей, выход 2 читает скрытые нейроны степени 1, выход 3 читает все скрытые нейроны. Справа — матрица Якоби z штрих по z размера три на три: на диагонали e в степени s_i, элементы под диагональю ненулевые, элементы над диагональю — заштрихованные нули.входыскрытые (степень m)выходыz1m = 1z2m = 2z3m = 31212s1, t1m = 1s2, t2m = 2s3, t3m = 3константане нуженm(j) ≤ m(u)m(u) < iмаскаскрытого слоямаска выходногослоя (строгая)z′i = zi esi + tiпоэлементноJ = ∂z′ / ∂zz1z2z3z′1z′2z′3es1∗es2∗∗es3нижнетреугольнаяМаски MADE и получающаяся структура матрицы Якоби (вертикальная компоновка)Та же маскированная сеть, нарисованная сверху вниз: входы z1, z2, z3, четыре скрытых нейрона со степенями 1, 2, 1, 2 и выходы (s1, t1), (s2, t2), (s3, t3). Под ней — поэлементный шаг: z штрих i равно z_i, умноженному на e в степени s_i, плюс t_i, и получающаяся нижнетреугольная матрица Якоби три на три.входыскрытыевыходыm(j) ≤ m(u)m(u) < iz1m = 1z2m = 2z3m = 31212s1, t1m = 1s2, t2m = 2s3, t3m = 3константане нуженz′i = zi esi + tiJ = ∂z′ / ∂zz1z2z3z′1z′2z′3es1∗es2∗∗es3нижне-треугольная
Степени: вход с номером j имеет степень j; каждый скрытый нейрон получает степень от 1 до d − 1 = 2. Скрытый нейрон u может читать вход j, только если m(j) ≤ m(u), а выход i может читать скрытый нейрон u, только если m(u) < i. Нарисованы только сохранившиеся связи. Выход 1 ничего не получает, поэтому s₁ и t₁ — просто обучаемые константы, а вход z₃ никуда не передаётся. Прослеживание путей показывает, что sᵢ и tᵢ зависят только от z₁, …, zᵢ₋₁; поэлементный шаг z′ᵢ = zᵢ·exp(sᵢ) + tᵢ добавляет диагональ, и матрица Якоби получается нижнетреугольной.

MAF и IAF. Маскированная сеть выдаёт все si,tis_i, t_i за один проход, когда известны переменные, от которых они зависят. В MAF они известны в направлении от данных к латентному пространству, поэтому плотность точки данных вычисляется дёшево. При сэмплировании слой приходится обращать координата за координатой: для zi=(zi′−ti(z<i)) e−si(z<i)z_i = (z'_i - t_i(z_{<i}))\,e^{-s_i(z_{<i})} сначала нужно z<iz_{<i}, что занимает dd последовательных проходов. IAF, обратный авторегрессионный поток (inverse autoregressive flow; Kingma et al., 2016), меняет два направления местами: его si,tis_i, t_i читают латентные координаты с номерами меньше ii. Сэмплирование занимает один проход, зато вычисление плотности произвольной заданной точки последовательно. При этом IAF может за один проход вычислить плотность собственных сэмплов, потому что их латентные векторы известны, а именно это и нужно вариационному выводу (variational inference). Слои связи дёшевы в обоих направлениях, потому что ss и tt читают только zaz_a, который проходит без изменений и известен в обоих направлениях. Плата за это — каждый слой меняет только половину координат.

В. Обратимые свёртки (Glow)#

В слоях Glow используются обратимые свёртки 1×11\times1:

z′=Wz.z' = W z .

Для тензора-изображения высоты hh, ширины ww с CC каналами свёртка 1×11\times1 применяет одну и ту же матрицу WW размера C×CC\times C к вектору из CC значений каналов в каждом пикселе. Она перемешивает каналы и ничего не делает по пространству. Перемешивание каналов — именно то, что нужно между слоями связи: это обучаемое обобщение фиксированной перестановки каналов (например, обращения их порядка), которую RealNVP использует между слоями связи (Kingma and Dhariwal, 2018, §3.2). Матрица Якоби всего слоя блочно-диагональная, на её диагонали стоят h⋅wh\cdot w копий WW, поэтому

log⁡∣det⁡J∣=h⋅w⋅log⁡∣det⁡W∣.\log\lvert\det J\rvert = h\cdot w\cdot\log\lvert\det W\rvert .

WW должна быть обратимой, а вычисление det⁡W\det W в общем случае стоит O(C3)O(C^3). Поэтому WW обучают через её LU-разложение. Не у всякой обратимой матрицы есть LU-разложение без выбора ведущего элемента (pivoting): у перестановки [0110]\left[\begin{smallmatrix}0&1\\1&0\end{smallmatrix}\right] его нет, потому что (LU)11=U11(LU)_{11} = U_{11} должно было бы равняться 00, и тогда (LU)21=L21U11=0≠1(LU)_{21} = L_{21}U_{11} = 0 \ne 1. Поэтому Glow добавляет фиксированную матрицу перестановки PP:

W=PLU,L=[10⋮⋱LC1⋯1],U=[U11⋯U1C⋱⋮0UCC].\begin{gathered} W = PLU, \\[6pt] L = \begin{bmatrix} 1 & & 0 \\ \vdots & \ddots & \\ L_{C1} & \cdots & 1 \end{bmatrix}, \\[6pt] U = \begin{bmatrix} U_{11} & \cdots & U_{1C} \\ & \ddots & \vdots \\ 0 & & U_{CC} \end{bmatrix}. \end{gathered}

Элементы LijL_{ij} и UijU_{ij} — вещественные числа. PP остаётся фиксированной; обучаемые параметры — свободные элементы LL (под её единичной диагональю) и UU (на её диагонали и выше). Поскольку det⁡P=±1\det P = \pm1, det⁡L=1\det L = 1 и det⁡U=∏i=1CUii\det U = \prod_{i=1}^{C} U_{ii},

log⁡∣det⁡W∣=∑i=1Clog⁡∣Uii∣.\log\lvert\det W\rvert = \sum_{i=1}^{C} \log\lvert U_{ii}\rvert .

Слой обратим ровно тогда, когда все Uii≠0U_{ii}\neq 0, а обратная матрица — W−1=U−1L−1P⊤W^{-1} = U^{-1}L^{-1}P^{\top}: перестановка и решение двух треугольных систем. В отличие от exp⁡(si)\exp(s_i), свободный параметр UiiU_{ii} сам по себе ничем не защищён от обращения в ноль.

Рисунок

Обратимая свёртка 1×1 в Glow

Свёртка один на один как попиксельное матричное произведение W = LUСлева: карта признаков в виде параллелепипеда высоты h, ширины w и глубины C, в котором выделен один пиксель по всем каналам. Стрелка переносит вектор каналов этого пикселя z длины C в блок с подписью W = P L U при P = I, содержащий нижнетреугольную матрицу L с единицами на диагонали и верхнетреугольную матрицу U с выделенной диагональю. Выходной вектор z штрих возвращается в тот же пиксель. Внизу: det L = 1, det U равен произведению U_ii, а логарифм модуля det W равен сумме логарифмов модулей U_ii; поскольку слой применяется во всех h на w пикселях, логарифм определителя слоя равен этой сумме, умноженной на h и на w.h × wCодин пиксель, все каналы:z ∈ ℝCzW = P L U (здесь P = I)LU1111·z′ = W zв тот жепиксельdet L = 1det U = ∏ Uiilog |det W| = Σᵢ log |Uii|одна и та же W во всех h·w позициях, поэтому log|det J| слоя равен h·w · log|det W|Свёртка один на один как попиксельное матричное произведение (вертикальная компоновка)Карта признаков с одним выделенным пикселем; его вектор каналов z идёт вниз в блок W = P L U (P = I) с нижнетреугольной L с единичной диагональю и верхнетреугольной U и выходит из него как z штрих. Внизу: логарифм модуля det W равен сумме логарифмов модулей U_ii.h × wCz ∈ ℝCW = P L U (P = I)LU1111·z′ = W zdet L = 1, det U = ∏ Uiilog |det W| = Σᵢ log |Uii|
В каждой пространственной позиции вектор из C значений каналов умножается на одну и ту же обучаемую матрицу W размера C × C, которая перемешивает каналы. W хранится как произведение P L U: P — фиксированная перестановка (|det P| = 1; здесь нарисован случай P = I), у L на диагонали стоят единицы (det L = 1), а U верхнетреугольная, поэтому log|det W| — просто сумма log|Uᵢᵢ|. Для всей карты h × w логарифм определителя слоя равен этой сумме, умноженной на h·w. На рисунке C = 4.

Например, возьмём C=3C = 3 и P=IP = I с

L=[1000.510−121],U=[21−10−0.53001.5]⟹W=LU=[21−1102.5−2−28.5].\begin{gathered} L = \begin{bmatrix} 1&0&0\\ 0.5&1&0\\ -1&2&1 \end{bmatrix},\quad U = \begin{bmatrix} 2&1&-1\\ 0&-0.5&3\\ 0&0&1.5 \end{bmatrix} \\[6pt] \Longrightarrow\quad W = LU = \begin{bmatrix} 2&1&-1\\ 1&0&2.5\\ -2&-2&8.5 \end{bmatrix}. \end{gathered}

Непосредственное вычисление det⁡W\det W даёт −1.5-1.5, что равно 2⋅(−0.5)⋅1.52\cdot(-0.5)\cdot1.5. Отсюда log⁡∣det⁡W∣=log⁡1.5≈0.405\log\lvert\det W\rvert = \log 1.5 \approx 0.405. Отрицательный ведущий элемент U22=−0.5U_{22} = -0.5 показывает, зачем нужен модуль: log⁡(−0.5)\log(-0.5) не определён.

Г. Сплайновые слои связи: нейросетевые сплайновые потоки#

Дополнительный материал: более гибкое поэлементное отображение и вывод его обратного. Остальная часть заметки на него не опирается.

Внутри слоя связи или авторегрессионного слоя каждая преобразуемая координата проходит через одномерное отображение, параметры которого выдаёт сеть: zb,i↦zb,i esi+tiz_{b,i}\mapsto z_{b,i}\,e^{s_i}+t_i в части А. Аффинное отображение может сдвинуть и растянуть условное распределение, но не может изменить его форму: одномодальное условное распределение после одного слоя остаётся одномодальным. Рассуждению о треугольной матрице Якоби не нужно, чтобы отображение было аффинным. Подойдёт любая строго возрастающая дифференцируемая функция gθg_\theta с вычислимой обратной. Диагональным элементом JJ становится gθ′(zb,i)g_\theta'(z_{b,i}), а θ\theta выдаёт сеть того же рода, что и раньше: θ=NN(za)\theta = \mathrm{NN}(z_a) в слое связи, θi=NN(z<i)\theta_i = \mathrm{NN}(z_{<i}) в авторегрессионном слое.

Рационально-квадратичный сплайн (rational-quadratic spline). Нейросетевые сплайновые потоки (neural spline flows; Durkan et al., 2019, §3.1) используют монотонный сплайн из рационально-квадратичных кусков (отношений двух квадратичных многочленов), построенный по схеме Gregory and Delbourgo (1982). В этой части xx — скалярный вход отображения, а не точка данных. Сплайн отображает [−B,B][-B, B] на себя и тождествен вне этого отрезка. Внутри он задаётся KK бинами (bins) с K+1K + 1 узлами (knots) (xk,yk)(x_k, y_k), возрастающими от (x0,y0)=(−B,−B)(x_0, y_0) = (-B, -B) до (xK,yK)=(B,B)(x_K, y_K) = (B, B), и положительными производными δk\delta_k в узлах. Две крайние производные фиксированы, δ0=δK=1\delta_0 = \delta_K = 1, чтобы наклон совпадал с наклоном тождественных хвостов. В бине kk положим

sk=yk+1−ykxk+1−xk,ξ=x−xkxk+1−xk∈[0,1]s_k = \frac{y_{k+1} - y_k}{x_{k+1} - x_k}, \qquad \xi = \frac{x - x_k}{x_{k+1} - x_k}\in[0, 1]

(sks_k — наклон хорды, стягивающей бин, а не сеть масштаба из части А). Сплайн в бине kk имеет вид

g(x)=yk+(yk+1−yk)[sk ξ2+δk ξ(1−ξ)]sk+(δk+1+δk−2sk) ξ(1−ξ).g(x) = y_k + \frac{(y_{k+1} - y_k)\bigl[s_k\,\xi^2 + \delta_k\,\xi(1-\xi)\bigr]}{s_k + (\delta_{k+1} + \delta_k - 2s_k)\,\xi(1-\xi)} .

При ξ=0\xi = 0 он даёт yky_k, а при ξ=1\xi = 1 дробь равна sk/sk=1s_k/s_k = 1, так что он даёт yk+1y_{k+1}: каждый кусок соединяет два соседних узла. Знаменатель можно переписать как sk(ξ2+(1−ξ)2)+(δk+δk+1) ξ(1−ξ)s_k\bigl(\xi^2 + (1-\xi)^2\bigr) + (\delta_k + \delta_{k+1})\,\xi(1-\xi), и он положителен. Производная сплайна равна

g′(x)=sk2[δk+1ξ2+2sk ξ(1−ξ)+δk(1−ξ)2][sk+(δk+1+δk−2sk) ξ(1−ξ)]2,g'(x) = \frac{s_k^2\bigl[\delta_{k+1}\xi^2 + 2s_k\,\xi(1-\xi) + \delta_k(1-\xi)^2\bigr]}{\bigl[s_k + (\delta_{k+1} + \delta_k - 2s_k)\,\xi(1-\xi)\bigr]^2} ,

причём все слагаемые числителя положительны, поэтому gg строго возрастает. При ξ=0\xi = 0 производная равна δk\delta_k, а при ξ=1\xi = 1 — δk+1\delta_{k+1}: соседние куски стыкуются с одинаковым наклоном, а с хвостами сплайн стыкуется с наклоном 1. Логарифм определителя слоя равен ∑ilog⁡g′(zb,i)\sum_i\log g'(z_{b,i}) по преобразуемым координатам; координаты в хвостах дают вклад log⁡1=0\log 1 = 0.

Параметры. Для каждой преобразуемой координаты сеть выдаёт 3K−13K - 1 чисел без ограничений (Durkan et al., 2019, §3.1): KK для ширин бинов и KK для их высот, которые проходят через softmax и умножаются на 2B2B, чтобы быть положительными и заполнять отрезок, и K−1K - 1 для внутренних производных, которые проходят через softplus. Кумулятивные суммы ширин и высот, начиная с −B-B, дают узлы.

Обратное отображение — корень квадратного уравнения. Поскольку gg возрастает, бин выхода yy находится сравнением yy со значениями yky_k. Приравняв g(x)=yg(x) = y и избавившись от знаменателя, получаем aξ2+bξ+c=0a\xi^2 + b\xi + c = 0, где

a=(yk+1−yk)(sk−δk)+(y−yk)(δk+1+δk−2sk),b=(yk+1−yk) δk−(y−yk)(δk+1+δk−2sk),c=−sk (y−yk).\begin{aligned} a &= (y_{k+1} - y_k)(s_k - \delta_k) + (y - y_k)(\delta_{k+1} + \delta_k - 2s_k), \\ b &= (y_{k+1} - y_k)\,\delta_k - (y - y_k)(\delta_{k+1} + \delta_k - 2s_k), \\ c &= -s_k\,(y - y_k). \end{aligned}

Ровно один корень лежит в [0,1][0, 1] (Durkan et al., 2019, приложение A.3):

ξ=2c−b−b2−4ac,\xi = \frac{2c}{-b - \sqrt{b^2 - 4ac}},

это обычная формула (−b+b2−4ac)/(2a)(-b + \sqrt{b^2 - 4ac})/(2a), переписанная так, чтобы не терять точность при малом 4ac4ac. Затем x=xk+ξ (xk+1−xk)x = x_k + \xi\,(x_{k+1} - x_k). И вычисление, и обращение стоят одного поиска бина и нескольких арифметических операций, так что сплайновый слой связи, как и аффинный, требует одного прохода сети в каждую сторону.

Рисунок

Монотонный рационально-квадратичный сплайн и его производная

Монотонный рационально-квадратичный сплайн и его производнаяСлева: возрастающая кривая через пять узлов, отмеченных точками, внутри пунктирного квадрата от −3 до 3; под каждым куском заштрихован прямоугольник его бина. Вне квадрата кривая продолжается диагональю y = x. Справа: производная той же функции, положительная везде, с пиком около 4.25 во втором бине и значением 1 на краях и в хвостах. Точка x = −0.6 отмечена на обоих графиках: g = −1.025, g′ = 4.04.сплайн g(x)x−333−3x = −0.6g = −1.025тождественный хвостузел (0, 1.2)K = 4 бинапроизводная g′(x)01234x−303g′ = 4.04δ = 1 на краяхδk в узлахМонотонный рационально-квадратичный сплайн и его производнаяСлева: возрастающая кривая через пять узлов, отмеченных точками, внутри пунктирного квадрата от −3 до 3; под каждым куском заштрихован прямоугольник его бина. Вне квадрата кривая продолжается диагональю y = x. Справа: производная той же функции, положительная везде, с пиком около 4.25 во втором бине и значением 1 на краях и в хвостах. Точка x = −0.6 отмечена на обоих графиках: g = −1.025, g′ = 4.04.сплайн g(x)x−333−3x = −0.6g = −1.025тождественный хвостузел (0, 1.2)K = 4 бинапроизводная g′(x)01234x−303g′ = 4.04δ = 1 на краях
Игрушечный сплайн с K = 4 бинами на [−B, B], B = 3. Узлы (x_k, y_k): (−3, −3), (−1.2, −2.4), (0, 1.2), (1.5, 2.2), (3, 3); производные во внутренних узлах δ = (0.4, 2.5, 0.5), на краях δ = 1. Вместе это 3K − 1 = 11 чисел на координату: K ширин, K высот и K − 1 производных. Слева: каждый кусок сплайна соединяет противоположные углы своего прямоугольника (ширина бина × высота бина) и монотонно возрастает; вне [−3, 3] преобразование тождественное. Справа: производная g′(x), логарифм которой входит в log|det J|; на краях она равна 1, поэтому стыкуется с хвостами без скачка. Отмеченная точка x = −0.6 (середина второго бина) переходит в g = −1.025, g′ = 4.04.

Разобранный пример (игрушечные числа, сплайн с рисунка). K=4K = 4 бина на [−3,3][-3, 3] с узлами (−3,−3)(-3,-3), (−1.2,−2.4)(-1.2,-2.4), (0,1.2)(0, 1.2), (1.5,2.2)(1.5, 2.2), (3,3)(3, 3), внутренними производными (δ1,δ2,δ3)=(0.4,2.5,0.5)(\delta_1, \delta_2, \delta_3) = (0.4, 2.5, 0.5) и δ0=δ4=1\delta_0 = \delta_4 = 1. Вход x=−0.6x = -0.6 лежит в бине k=1k = 1: x1=−1.2x_1 = -1.2, ширина 1.21.2, ξ=0.5\xi = 0.5, высота y2−y1=3.6y_2 - y_1 = 3.6 и s1=3s_1 = 3. Тогда ξ(1−ξ)=0.25\xi(1-\xi) = 0.25 и

g(−0.6)=−2.4+3.6 (3⋅0.25+0.4⋅0.25)3+(2.5+0.4−6)⋅0.25=−2.4+3.062.225≈−1.025,g′(−0.6)=9 (2.5⋅0.25+2⋅3⋅0.25+0.4⋅0.25)2.2252≈4.04.\begin{aligned} g(-0.6) &= -2.4 + \frac{3.6\,(3\cdot0.25 + 0.4\cdot0.25)}{3 + (2.5 + 0.4 - 6)\cdot0.25} \\ &= -2.4 + \frac{3.06}{2.225} \approx -1.025, \\[4pt] g'(-0.6) &= \frac{9\,(2.5\cdot0.25 + 2\cdot3\cdot0.25 + 0.4\cdot0.25)}{2.225^2} \approx 4.04 . \end{aligned}

Эта координата добавляет log⁡4.04≈1.40\log 4.04 \approx 1.40 к log⁡∣det⁡J∣\log\lvert\det J\rvert. Обратим y=−1.0247y = -1.0247: y−y1=1.3753y - y_1 = 1.3753, поэтому a≈5.097a \approx 5.097, b≈5.703b \approx 5.703, c≈−4.126c \approx -4.126, b2−4ac≈116.6b^2 - 4ac \approx 116.6 и ξ=2c/(−b−b2−4ac)≈−8.252/−16.503=0.500\xi = 2c/(-b - \sqrt{b^2 - 4ac}) \approx -8.252/-16.503 = 0.500, что возвращает x=−1.2+0.5⋅1.2=−0.6x = -1.2 + 0.5\cdot1.2 = -0.6.

Версии со слоями связи и авторегрессионная. Сплайн заменяет аффинное отображение в любой из двух конструкций. Durkan et al. называют результаты RQ-NSF (C) и RQ-NSF (AR) (§3.2): версия со слоями связи — это Glow, в котором аффинные слои связи заменены сплайновыми, а авторегрессионная — это MAF или IAF, в которых аффинные отображения заменены сплайнами. В их слое связи тождественная половина тоже проходит через поэлементные сплайны, параметры которых обучаются напрямую, а не предсказываются сетью. При достаточном числе бинов монотонный сплайн приближает любую дифференцируемую монотонную функцию на [−B,B][-B, B]; на практике авторы фиксируют B=3B = 3 и K=8K = 8, не обнаружив большой разницы при BB от 1 до 5 (§5).

Д. ActNorm: поканальные масштаб и сдвиг с инициализацией по данным#

Глубокие потоки лучше обучаются со слоем нормализации, а в потоке такой слой должен быть обратимым с известным определителем. RealNVP использует батч-нормализацию (batch normalization; Dinh, Sohl-Dickstein and Bengio, 2017, §3.7): со статистиками батча μ~,σ~2\tilde\mu, \tilde\sigma^2 отображение x↦(x−μ~)/σ~2+ϵx\mapsto(x - \tilde\mu)/\sqrt{\tilde\sigma^2 + \epsilon} — покоординатное масштабирование с логарифмом определителя −12∑ilog⁡(σ~i2+ϵ)-\tfrac12\sum_i\log(\tilde\sigma_i^2 + \epsilon). Эта формула считает μ~\tilde\mu и σ~2\tilde\sigma^2 константами, заданными извне примера, как в RealNVP, где они берутся из скользящего среднего по последним мини-батчам (прил. E). Обычная батч-нормализация во время обучения, которую дифференцируют как функцию текущего батча, — другое отображение: каждый выход зависит от всех примеров батча, а стандартизация убирает собственное среднее и масштаб батча, так что по одним выходам входы не восстанавливаются. Батч-нормализация вносит шум через статистики батча, этот шум растёт по мере уменьшения батча на одно устройство, а Glow обучается на больших изображениях по одному изображению на устройство (§3.1). Его слой ActNorm сохраняет аффинную форму и отказывается от статистик батча (Kingma and Dhariwal, 2018, §3.1, таблица 1). С логарифмом масштаба γc\gamma_c и сдвигом τc\tau_c для каждого канала cc

zijc′=eγc zijc+τc,log⁡∣det⁡J∣=h⋅w⋅∑c=1Cγc.\begin{gathered} z'_{ijc} = e^{\gamma_c}\,z_{ijc} + \tau_c, \\[4pt] \log\lvert\det J\rvert = h\cdot w\cdot\sum_{c=1}^{C}\gamma_c . \end{gathered}

Матрица Якоби диагональна: элемент eγce^{\gamma_c} повторяется в каждой из h⋅wh\cdot w позиций канала cc. Glow записывает сам масштаб scs_c и логарифм определителя h⋅w∑clog⁡∣sc∣h\cdot w\sum_c\log\lvert s_c\rvert; логарифм масштаба автоматически делает масштаб положительным. Обратное отображение — zijc=(zijc′−τc) e−γcz_{ijc} = (z'_{ijc} - \tau_c)\,e^{-\gamma_c}. На плоских векторах у того же слоя своя пара (γi,τi)(\gamma_i, \tau_i) для каждой координаты и h=w=1h = w = 1; он обобщает слой диагонального масштабирования, который NICE ставит в конце своего потока (Dinh, Krueger and Bengio, 2015, §3.3).

Инициализация по данным (data-dependent initialization). Параметры задаются по первому мини-батчу так, чтобы каждый канал выхода слоя имел на нём нулевое среднее и единичную дисперсию:

γc=−log⁡std⁡c(z),τc=−mean⁡c(eγcz),\gamma_c = -\log\operatorname{std}_c(z), \qquad \tau_c = -\operatorname{mean}_c\bigl(e^{\gamma_c} z\bigr),

что даёт zijc′=(zijc−mean⁡c)/std⁡cz'_{ijc} = (z_{ijc} - \operatorname{mean}_c)/\operatorname{std}_c на этом батче. Дальше γ\gamma и τ\tau — обычные обучаемые параметры, которые, в отличие от батч-нормализации, не зависят от данных. Поэтому каждый слой нового потока начинает с хорошо отмасштабированных активаций, какой бы ни была глубина.

Например (игрушечные числа), ActNorm с логарифмами масштаба γ=(0.5,−0.2,0.1)\gamma = (0.5, -0.2, 0.1) на тензоре 32×32×332\times32\times3 даёт log⁡∣det⁡J∣=1024⋅0.4=409.6\log\lvert\det J\rvert = 1024\cdot0.4 = 409.6 ната (nats).

Один шаг Glow — это ActNorm, затем свёртка 1×11\times1, затем аффинный слой связи (Kingma and Dhariwal, 2018, §3). Последняя свёртка каждой сети слоя связи инициализируется нулями, так что каждый слой связи начинает как тождественное отображение (§3.3). Обе инициализации преследуют одну цель: глубокая стопка обратимых слоёв должна начинать с отображения, близкого к хорошо отмасштабированному тождественному.

Е. Потоки на изображениях: squeeze, маски и многомасштабность#

RGB-изображение размером 64×6464\times64 пикселя имеет d=64⋅64⋅3=12288d = 64\cdot64\cdot3 = 12288 координат. Слои выше работают с любым вектором, но поток для изображений должен использовать в качестве ss и tt свёрточные сети, а значит, разбиение на zaz_a и zbz_b должно учитывать сетку пикселей.

Маски на сетке пикселей#

RealNVP записывает слой связи с бинарной маской bb той же формы, что и тензор-изображение (Dinh, Sohl-Dickstein and Bengio, 2017, §3.4):

z′=b⊙z+(1−b)⊙(z⊙exp⁡(s(b⊙z))+t(b⊙z)),log⁡∣det⁡J∣=∑(1−b)⊙s(b⊙z),\begin{gathered} z' = b\odot z + (1 - b)\odot\Bigl(z\odot\exp\bigl(s(b\odot z)\bigr) + t(b\odot z)\Bigr), \\[4pt] \log\lvert\det J\rvert = \sum (1 - b)\odot s(b\odot z), \end{gathered}

где сумма берётся по всем элементам тензора. Элементы с b=1b = 1 проходят без изменений и служат условием для остальных, ровно как zaz_a в части А, а ss, tt — свёрточные сети, отображающие тензор h×w×Ch\times w\times C в тензор той же формы. Используются две маски:

  • шахматная (checkerboard): bij=1b_{ij} = 1 там, где i+ji + j нечётно, одинаково во всех каналах, так что четыре непосредственных соседа каждого преобразуемого пикселя входят в число условных пикселей;
  • поканальная (channel-wise): b=1b = 1 на первой половине каналов и 00 на второй.

Последовательные слои чередуют bb и 1−b1 - b, чтобы преобразовывался каждый элемент.

Squeeze: обмен пространства на каналы#

Операция squeeze разрезает каждый канал на квадраты 2×22\times2 и укладывает четыре значения каждого квадрата в четыре канала, превращая тензор h×w×Ch\times w\times C в тензор h2×w2×4C\tfrac h2\times\tfrac w2\times 4C (§3.6). Если канал 4c+2p+q4c + 2p + q выхода хранит пиксели со смещением (p,q)∈{0,1}2(p, q)\in\{0,1\}^2 из канала cc, то вход 4×4×14\times4\times1 превращается в

[12345678910111213141516]  ⟶  [13911],  [241012],  [571315],  [681416].\begin{bmatrix} 1&2&3&4\\ 5&6&7&8\\ 9&10&11&12\\ 13&14&15&16 \end{bmatrix} \;\longrightarrow\; \begin{bmatrix} 1&3\\ 9&11 \end{bmatrix},\; \begin{bmatrix} 2&4\\ 10&12 \end{bmatrix},\; \begin{bmatrix} 5&7\\ 13&15 \end{bmatrix},\; \begin{bmatrix} 6&8\\ 14&16 \end{bmatrix}.

Squeeze лишь переставляет координаты, поэтому её матрица Якоби — матрица перестановки, а логарифм определителя равен 00. Эта операция объясняет и то, почему две маски дополняют друг друга. С индексами от 0 шахматная маска этого входа 4×44\times4 равна

b=[0101101001011010],b = \begin{bmatrix} 0&1&0&1\\ 1&0&1&0\\ 0&1&0&1\\ 1&0&1&0 \end{bmatrix},

и после squeeze её единицы заполняют каналы 1 и 2 (смещения (0,1)(0,1) и (1,0)(1,0)), а нули — каналы 0 и 3. Поканальная маска делит каналы после squeeze на {0,1}\{0, 1\} и {2,3}\{2, 3\} — это другое разбиение: каналы 0 и 3, которые шахматная маска относила к одной стороне, попадают в разные половины, как и каналы 1 и 2, поэтому у слоёв связи после squeeze в условии каждой группы оказываются пиксели, которые шахматные слои связи держали вместе.

Выделение половины переменных на каждом масштабе#

Многомасштабная архитектура (multi-scale architecture) RealNVP (§3.6) повторяет один блок на каждом масштабе: три слоя связи с чередующимися шахматными масками, squeeze и три слоя связи с чередующимися поканальными масками. После каждого блока половина переменных выделяется (factored out): эти переменные покидают поток и становятся частью латентного zz, а к следующему масштабу переходит только другая половина. В направлении от данных к латентному пространству, где Φ(i)\Phi^{(i)} — блок масштаба ii и h(0)=xh^{(0)} = x,

(z(i), h(i))=Φ(i)(h(i−1)),i=1,…,L−1,z(L)=Φ(L)(h(L−1)),z=(z(1),…,z(L)).\begin{aligned} \bigl(z^{(i)},\, h^{(i)}\bigr) &= \Phi^{(i)}\bigl(h^{(i-1)}\bigr), \qquad i = 1,\dots,L-1, \\ z^{(L)} &= \Phi^{(L)}\bigl(h^{(L-1)}\bigr), \\ z &= \bigl(z^{(1)}, \dots, z^{(L)}\bigr). \end{aligned}

На последнем масштабе четыре шахматных слоя связи и нет squeeze, а рекурсия останавливается, когда её вход имеет размер 4×4×C4\times4\times C (§4.1). Плотность каждой выделенной части вычисляется по гауссовской базовой плотности сразу, как только часть покидает поток, так что функция потерь распределена по всей сети, а поздние масштабы дешевле, потому что обрабатывают меньше переменных. Для изображения 64×64×364\times64\times3 этот рецепт даёт пять масштабов:

МасштабВходПосле squeezeВыделеноИдёт дальше
164×64×364\times64\times332×32×1232\times32\times12614432×32×632\times32\times6
232×32×632\times32\times616×16×2416\times16\times24307216×16×1216\times16\times12
316×16×1216\times16\times128×8×488\times8\times4815368×8×248\times8\times24
48×8×248\times8\times244×4×964\times4\times967684×4×484\times4\times48
54×4×484\times4\times48нет768

Выделенные части в сумме дают 6144+3072+1536+768+768=12288=d6144 + 3072 + 1536 + 768 + 768 = 12288 = d: многомасштабный поток по-прежнему сохраняет все измерения. Его 28 слоёв связи обрабатывают 6⋅(1+12+14+18)+4⋅116=11.56\cdot(1 + \tfrac12 + \tfrac14 + \tfrac18) + 4\cdot\tfrac1{16} = 11.5 полных изображений в пересчёте на число переменных, около 41% того, что обработали бы 28 слоёв связи на всех 1228812288 переменных. Переменные, выделенные рано, прошли через меньшее число слоёв, и RealNVP описывает их как более мелкие, более локальные признаки (§3.6, приложение D). В RealNVP сеть масштаба заканчивается tanh⁡\tanh, умноженным на обучаемый множитель, а сеть сдвига имеет аффинный выход (§4.1).

Шаг Glow на тензорах-изображениях#

Glow сохраняет многомасштабный каркас с LL уровнями: каждый уровень — это squeeze, за которым идут KK шагов из ActNorm, свёртки 1×11\times1 и аффинного слоя связи, и каждый уровень, кроме последнего, заканчивается разделением (split), которое выделяет половину переменных (Kingma and Dhariwal, 2018, §3, рисунок 2). Его слои связи делят тензор только по каналам — это упрощение по сравнению с RealNVP (§3.3), а обучаемые свёртки 1×11\times1 заменяют фиксированное обращение порядка каналов между слоями связи. Все три слоя действуют на тензоры h×w×Ch\times w\times C с поканальными параметрами, и их логарифмы определителей содержат множитель h⋅wh\cdot w (части В и Д). Свёртка 1×11\times1 после одного squeeze RGB-изображения имеет C=12C = 12 и всего 122=14412^2 = 144 веса. Сети слоёв связи состоят из трёх свёрток (3×33\times3, 1×11\times1, 3×33\times3) с 512 скрытыми каналами, а в сравнениях на CIFAR-10 используются K=32K = 32 и L=3L = 3 (§5). Лучшие результаты Glow — 3.35 бита на размерность (bits per dimension) на CIFAR-10 против 3.49 у RealNVP и 3.81 против 3.98 на ImageNet 64×6464\times64 (§5, таблица 2). Для лиц CelebA-HQ размером 256×256256\times256 он использует K=32K = 32 и L=6L = 6 на 5-битных изображениях (§6).

Альтернатива: развернуть изображение в вектор#

Простейший поток для изображений превращает изображение в вектор из d=12288d = 12288 чисел и применяет слои частей А–Г с полносвязными сетями. Это работает и не требует ни масок, ни squeeze, но структура сетки теряется. Разбиение по индексам развёрнутого тензора с каналами на первой оси (channel-first) помещает в zaz_a весь красный канал и верхнюю половину зелёного; сетям приходится с нуля учиться, какие координаты соседние; а первый слой сети слоя связи с 1024 скрытыми нейронами уже имеет 6144⋅1024≈6.36144\cdot1024\approx6.3 миллиона весов. Обучаемая плотная матрица перемешивания между слоями связи имела бы d2≈1.5⋅108d^2\approx1.5\cdot10^8 элементов, поэтому на практике выбирают фиксированную перестановку, например случайную. На CIFAR-10 NICE, слои связи которого — полносвязные сети на развёрнутом изображении, достигает 4.48 бита на размерность против 3.49 у свёрточного многомасштабного RealNVP (таблица). Эти две модели различаются также глубиной и видом слоёв связи (аддитивные или аффинные), так что не весь разрыв объясняется сеткой.

Правдоподобие потоков для изображений сообщают в битах на размерность после отмены всех шагов предобработки, то есть к логарифму определителя самой модели добавляется логарифм определителя предобработки; раздел Изображения: деквантование, масштабирование и биты на размерность разбирает это для распространённых способов масштабирования и для логит-преобразования RealNVP.

Интерполяция и кодирование с точным обратным отображением#

У потока есть точный энкодер: у любого изображения xx, в том числе не из обучающей выборки, ровно один латентный вектор z=f−1(x)z = f^{-1}(x), и f(z)f(z) возвращает xx с точностью до ошибок округления. VAE же кодирует изображение в параметры qϕ(z∣x)q_\phi(z\mid x), и его восстановление точно настолько, насколько точен декодер: распространённый попиксельный гауссовский декодер или декодер с квадратичной ошибкой возвращает среднее pθ(x∣z)p_\theta(x\mid z), которое обычно размыто, а более выразительное правдоподобие декодера может давать резкие сэмплы (VAE; варианты — в заметке Варианты VAE). Отсюда три применения.

Интерполяция. Закодируем два изображения, пройдём по пути между z1z_1 и z2z_2 и декодируем. Прямая zλ=(1−λ)z1+λz2z_\lambda = (1-\lambda)z_1 + \lambda z_2 выходит из области, где базовое распределение сосредоточивает свою массу. Для z∼N(0,Id)z \sim \mathcal N(0, I_d) длина ∥z∥\lVert z\rVert сосредоточена около d\sqrt d с разбросом около 0.70.7 (оболочка гауссианы). Если z1z_1 и z2z_2 ведут себя как независимые сэмплы, длина их середины — около d/2\sqrt{d/2}. При d=12288d = 12288 это 78.478.4 вместо 110.9110.9, примерно на 46 разбросов ниже типичной длины. Веса, квадраты которых в сумме дают единицу, сохраняют длину типичной. Пути RealNVP между латентными векторами используют такие веса cos⁡\cos и sin⁡\sin (§4.2, формула 19), и середина cos⁡π4 z1+sin⁡π4 z2\cos\tfrac\pi4\,z_1 + \sin\tfrac\pi4\,z_2 имеет длину около d\sqrt d. Glow интерполирует линейно между латентными векторами настоящих лиц и всё же сообщает о реалистичных промежуточных изображениях (§6).

Температура. Glow сэмплирует из модели с пониженной температурой: он умножает стандартное отклонение базового распределения на T=0.7T = 0.7, жертвуя разнообразием ради качества (§6). Для потока, сохраняющего объём, z∼N(0,T2I)z\sim\mathcal N(0, T^2 I) даёт плотность ∝exp⁡(−∥f−1(x)∥2/(2T2))∝pθ(x)1/T2\propto\exp\bigl(-\lVert f^{-1}(x)\rVert^2/(2T^2)\bigr) \propto p_\theta(x)^{1/T^2} — заострённую версию модели (в статье показатель степени записан как T2T^2).

Кодирование внешнего изображения. Предобработаем его точно так же, как обучающие данные, вычислим z=f−1(x)z = f^{-1}(x) и сравним с латентными векторами обучающих изображений, например по евклидову расстоянию. Здесь две оговорки. Если латентные векторы ведут себя как независимые сэмплы из базового распределения, все попарные расстояния близки к 2d\sqrt{2d}, так что ближайшие соседи лишь немного ближе типичных точек. А точное правдоподобие внешнего изображения не говорит, похоже ли оно на обучающие данные: Glow, обученный на CelebA, даёт номерам домов SVHN — набору данных, которого он никогда не видел, — более высокое правдоподобие, чем лицам CelebA (Nalisnick et al., 2019, §3, рисунок 2).

Ж. Планарные и радиальные потоки: дешёвые определители без треугольных матриц#

Дополнительный материал: более ранний путь к дешёвому определителю через матрицу ранга один. Остальная часть заметки на него не опирается.

Первые потоки из работы Rezende and Mohamed (2015), §4.1, приходят к дешёвому определителю другим путём. Их матрица Якоби — единичная матрица плюс матрица ранга один, и лемма об определителе матрицы (matrix determinant lemma) даёт её определитель за O(d)O(d) (Papamakarios et al., 2021, §3.3.2): для a,c∈Rda, c\in\mathbb R^d

det⁡(I+a c⊤)=1+c⊤a.\det\bigl(I + a\,c^\top\bigr) = 1 + c^\top a .

Любой вектор, ортогональный cc, матрица I+ac⊤I + ac^\top оставляет без изменений, поэтому собственное значение 11 имеет кратность не меньше d−1d - 1; тогда след d+c⊤ad + c^\top a фиксирует последнее собственное значение равным 1+c⊤a1 + c^\top a, а определитель — произведение собственных значений.

Планарные потоки (planar flows). С u,w∈Rdu, w\in\mathbb R^d и скалярным смещением bb (это не маска из части Е)

f(z)=z+u tanh⁡(w⊤z+b),J=I+tanh⁡′(w⊤z+b) u w⊤,det⁡J=1+tanh⁡′(w⊤z+b) w⊤u.\begin{gathered} f(z) = z + u\,\tanh(w^\top z + b), \\[4pt] J = I + \tanh'(w^\top z + b)\,u\,w^\top, \\[4pt] \det J = 1 + \tanh'(w^\top z + b)\,w^\top u . \end{gathered}

Rezende и Mohamed допускают вместо tanh⁡\tanh любую гладкую поэлементную нелинейность; условие обратимости ниже относится к tanh⁡\tanh.

Отображение сдвигает zz только вдоль uu, на величину, которая зависит от знакового расстояния до гиперплоскости w⊤z+b=0w^\top z + b = 0, так что оно растягивает или сжимает плотность поперёк этой гиперплоскости.

Когда оно обратимо? Разложим zz на часть, ортогональную ww, и часть η w/∥w∥2\eta\,w/\lVert w\rVert^2 вдоль него, так что w⊤z=ηw^\top z = \eta. Умножив y=f(z)y = f(z) слева на w⊤w^\top, получим скалярное уравнение

w⊤y=η+w⊤u tanh⁡(η+b)=:g(η),w^\top y = \eta + w^\top u\,\tanh(\eta + b) =: g(\eta),

а когда η\eta известно, z=y−utanh⁡(η+b)z = y - u\tanh(\eta + b). Значит, отображение ff обратимо ровно тогда, когда обратима функция gg. Поскольку 0<tanh⁡′≤10 < \tanh' \le 1, причём tanh⁡′=1\tanh' = 1 только при η=−b\eta = -b, получаем g′(η)=1+w⊤u tanh⁡′(η+b)≥1+min⁡(w⊤u,0)g'(\eta) = 1 + w^\top u\,\tanh'(\eta + b)\ge 1 + \min(w^\top u, 0). Если w⊤u≥−1w^\top u\ge -1, то gg строго возрастает и принимает все значения из R\mathbb R, и ff — биекция (Rezende and Mohamed, 2015, приложение A.1). Если w⊤u<−1w^\top u < -1, то g′(−b)=1+w⊤u<0g'(-b) = 1 + w^\top u < 0, а вдали g′→1g' \to 1, так что gg не монотонна и ff складывает пространство само на себя. Диффеоморфизму нужно ещё, чтобы det⁡J>0\det J > 0 всюду, а это выполняется при w⊤u>−1w^\top u > -1; Rezende и Mohamed обеспечивают это, заменяя uu на u+[m(w⊤u)−w⊤u] w/∥w∥2u + [m(w^\top u) - w^\top u]\,w/\lVert w\rVert^2, где m(x)=−1+log⁡(1+ex)>−1m(x) = -1 + \log(1 + e^x) > -1. Даже у обратимого планарного потока обратное отображение не выписывается в замкнутом виде: для каждого слоя нужен одномерный поиск корня η\eta.

Например (игрушечные числа), возьмём d=2d = 2, w=(1,0)w = (1, 0), u=(−0.5,1)u = (-0.5, 1), b=0b = 0, так что w⊤u=−0.5w^\top u = -0.5. В точке z=(0.5,0)z = (0.5, 0): tanh⁡′(0.5)≈0.786\tanh'(0.5) \approx 0.786, det⁡J≈1−0.5⋅0.786≈0.607\det J \approx 1 - 0.5\cdot0.786 \approx 0.607 и y=f(z)≈(0.269,0.462)y = f(z) \approx (0.269, 0.462). Для обращения нужен корень уравнения η−0.5tanh⁡η=0.269\eta - 0.5\tanh\eta = 0.269, то есть η=0.5\eta = 0.5, а затем z=y−utanh⁡0.5=(0.5,0)z = y - u\tanh 0.5 = (0.5, 0). Если же взять u=(−2,1)u = (-2, 1), то w⊤u=−2w^\top u = -2, и g(η)=η−2tanh⁡ηg(\eta) = \eta - 2\tanh\eta обращается в ноль при η=0\eta = 0 и η≈±1.915\eta\approx\pm1.915: у каждой точки yy с w⊤y=0w^\top y = 0 три прообраза.

Радиальные потоки (radial flows). С центром z0∈Rdz_0\in\mathbb R^d, α>0\alpha > 0, β∈R\beta\in\mathbb R и r=∥z−z0∥r = \lVert z - z_0\rVert

f(z)=z+βα+r (z−z0).f(z) = z + \frac{\beta}{\alpha + r}\,(z - z_0).

Отображение сохраняет направление от z0z_0 и меняет только расстояние, r↦ρ(r)=r (1+βα+r)r\mapsto\rho(r) = r\,\bigl(1 + \tfrac{\beta}{\alpha + r}\bigr). Матрица Якоби такого радиального отображения — это (ρ(r)/r) I(\rho(r)/r)\,I плюс слагаемое ранга один вдоль z−z0z - z_0: она растягивает d−1d - 1 направлений, ортогональных z−z0z - z_0, с коэффициентом ρ(r)/r=1+β/(α+r)\rho(r)/r = 1 + \beta/(\alpha + r), а радиальное направление — с коэффициентом ρ′(r)=1+β/(α+r)−βr/(α+r)2=1+αβ/(α+r)2\rho'(r) = 1 + \beta/(\alpha + r) - \beta r/(\alpha + r)^2 = 1 + \alpha\beta/(\alpha + r)^2. Определитель — произведение этих коэффициентов растяжения:

det⁡J=(1+βα+r)d−1(1+αβ(α+r)2).\det J = \Bigl(1 + \frac{\beta}{\alpha + r}\Bigr)^{d-1}\Bigl(1 + \frac{\alpha\beta}{(\alpha + r)^2}\Bigr).

Оба множителя положительны при всех r≥0r\ge 0, когда β>−α\beta > -\alpha, и тогда ρ\rho возрастает от 00 до ∞\infty, так что ff — биекция; Rezende и Mohamed формулируют условие β≥−α\beta\ge-\alpha и обеспечивают его заменой β=−α+log⁡(1+eβ^)\beta = -\alpha + \log(1 + e^{\hat\beta}) (приложение A.2). В отличие от планарного потока, радиальный поток обращается в замкнутом виде: расстояние R=∥y−z0∥R = \lVert y - z_0\rVert выхода удовлетворяет уравнению R(α+r)=r(α+β+r)R(\alpha + r) = r(\alpha + \beta + r), квадратному относительно rr,

r2+(α+β−R) r−αR=0,r^2 + (\alpha + \beta - R)\,r - \alpha R = 0,

произведение корней которого равно −αR≤0-\alpha R\le 0, так что ровно один корень неотрицателен; затем z=z0+(y−z0)/(1+βα+r)z = z_0 + (y - z_0)/\bigl(1 + \tfrac{\beta}{\alpha + r}\bigr). Например (игрушечные числа), при d=2d = 2, α=1\alpha = 1, β=−0.8\beta = -0.8 у точки на расстоянии r=1r = 1 от центра det⁡J=(1−0.4)⋅(1−0.2)=0.48\det J = (1 - 0.4)\cdot(1 - 0.2) = 0.48, и она переходит на расстояние R=0.6R = 0.6; уравнение r2−0.4r−0.6=0r^2 - 0.4r - 0.6 = 0 имеет неотрицательный корень r=1r = 1.

Где они применяются. Каждый слой меняет форму плотности вдоль одного направления или вокруг одной точки, поэтому слоёв нужно много, а обращение планарного слоя итеративно. Ни то ни другое не мешает вариационному выводу, для которого эти потоки и создавались: там берут сэмпл ε\varepsilon из простого q0q_0, проводят его вперёд через KK слоёв до zKz_K и накапливают log⁡qK(zK)=log⁡q0(ε)−∑klog⁡∣det⁡Jk∣\log q_K(z_K) = \log q_0(\varepsilon) - \sum_k\log\lvert\det J_k\rvert, используя только прямые матрицы Якоби, как в IAF. Планарные и радиальные потоки в основном так и применяли — как гибкие апостериорные распределения для VAE (Papamakarios et al., 2021, §3.3.2), тогда как слои частей А–Е создавались для точных плотностей данных.

Как слои деформируют пространство и остаются обратимыми#

Матрица Якоби описывает, как поток деформирует пространство. Каждый из слоёв выше растягивает одни области и сжимает другие, а ∣det⁡J∣\lvert\det J\rvert в точке — локальный множитель, на который слой умножает малые объёмы. Это становится видно, если пропустить регулярную сетку через обученный поток по одному слою за раз и нарисовать изогнутые линии сетки. Рисунок ниже делает это для одного слоя связи с простыми, выбранными вручную ss и tt.

Рисунок

Матрица Якоби измеряет, как слой деформирует пространство

Квадратная сетка до и после одного слоя связиСлева: квадратная сетка на плоскости z с одной выделенной ячейкой. Справа: та же сетка после слоя связи. Вертикальные линии остаются вертикальными, а горизонтальные становятся волнистыми кривыми, расстояние между которыми растёт вправо, где exp(s) больше 1, и уменьшается влево. Выделенная ячейка превращается в более высокий криволинейный четырёхугольник, площадь которого в 1.37 раза больше исходной.до: zпосле: z′ = f(z)z1z2z′1z′2слой связиz′2 = z2 es(z1) + t(z1)площадь× 1.37вертикальные линии на месте; каждая полоса растянута в exp(s(z₁)) раз и сдвинута на t(z₁)Квадратная сетка до и после одного слоя связи (вертикальная компоновка)Сверху: квадратная сетка с одной выделенной ячейкой. Снизу: сетка после слоя связи; вертикальные линии не изменились, а горизонтальные изогнуты и растянуты; площадь выделенной ячейки в 1.37 раза больше исходной.до: zz1z2слой связиz′2 = z2 es(z1) + t(z1)z′1z′2после: z′ = f(z)площадь× 1.37вертикальные линии на месте; полосырастянуты в exp(s(z₁)) раз, сдвинуты на t(z₁)
Один двумерный аффинный слой связи, применённый к квадратной сетке, с s(z₁) = 0.5 tanh z₁ и t(z₁) = 0.5 sin 1.5z₁. Вертикальные линии остаются на месте, потому что z′₁ = z₁; каждая вертикальная полоса растягивается в exp(s(z₁)) раз и сдвигается на t(z₁). Площадь выделенной ячейки увеличивается в 1.37 раза — это среднее значение |det J| = exp(s(z₁)) по её полосе. Обученный поток визуализируют так же: сетку пропускают через каждый слой по очереди.

Обратимость по построению. Точному методу максимального правдоподобия нужны единственная латентная точка f−1(x)f^{-1}(x) для каждой точки данных и матрица Якоби, которая нигде не схлопывает объём; общее рассуждение приведено в разделе о замене переменных предыдущей заметки, а раздел о треугольной матрице Якоби показывает, когда треугольное отображение обратимо. Для слоёв этой заметки:

  • Аффинные слои связи и авторегрессионные слои обратимы при любых ss и tt: их диагональные элементы exp⁡(si)\exp(s_i) положительны, а обратные отображения выписываются явно.
  • Сплайновые слои обратимы при любом выходе сети: каждый кусок строго возрастает, а обратное отображение — корень квадратного уравнения.
  • ActNorm обратим, потому что его масштабы eγce^{\gamma_c} положительны; слою, который обучает сам масштаб scs_c, как в статье о Glow, нужно sc≠0s_c \ne 0.
  • Squeeze и фиксированные перестановки каналов лишь переставляют координаты.
  • Свёртка 1×11\times1 обратима, пока все ведущие элементы Uii≠0U_{ii}\ne0, что гарантирует параметризация через log⁡∣Uii∣\log\lvert U_{ii}\rvert с фиксированными знаками (часть В). У s\mathbf s из статьи о Glow такой страховки нет; там Uii≠0U_{ii}\ne0 выполняется лишь на практике.
  • Планарные и радиальные потоки — диффеоморфизмы только при ограничении w⊤u>−1w^\top u > -1 или β>−α\beta > -\alpha, которое обеспечивается репараметризацией.

Ограничения#

  • Нет сжатия. Латентный вектор имеет размерность данных: 1228812288 чисел для изображения 64×64×364\times64\times3, каким бы простым ни было изображение. Многомасштабное выделение упорядочивает латентный вектор, но не уменьшает его.
  • Ограниченные слои. Каждый слой должен быть обратимым с легко вычислимым якобианом, поэтому потоку нужно много простых слоёв, и в каждом шаге Glow два слоя из трёх лишь масштабируют или перемешивают каналы. Glow использует до 320 подпреобразований (Papamakarios et al., 2021, §3.4), и на CIFAR-10 его 3.35 бита на размерность всё ещё уступают 2.92 у авторегрессионной модели PixelCNN++.
  • Нет «дыр» в плотности. Диффеоморфизм Rd\mathbb R^d, применённый к гауссиане, даёт плотность, положительную всюду. Данные, лежащие в отдельных кластерах или вблизи поверхности меньшей размерности, можно лишь приблизить, с очень большими якобианами в промежутках.
  • Правдоподобие — не качество. Точное правдоподобие измеряет сжатие, а не то, как выглядят сэмплы, и может ставить незнакомые изображения выше знакомых (часть Е).

Итоги#

Нормализующие потоки (normalizing flows) — обратимые нейронные сети, которые перемещают массу вероятности контролируемым образом. Каждый слой через свой определитель Якоби сообщает, насколько он растянул или сжал пространство. Авторегрессионные потоки, у которых поэлементное преобразование — достаточно гибкая монотонная функция (нейросетевые или сплайновые преобразователи, neural or spline transformers), при мягких условиях являются универсальными аппроксиматорами плотности (universal density approximators; Huang et al., 2018, §4, теорема 1; Papamakarios et al., 2021, §3.1). Аффинные слои тоже универсальны, хотя и в более слабом смысле. Композиции аффинных слоёв связи и обратимых линейных отображений (достаточно перестановок) приближают любой C2C^2-диффеоморфизм в LpL^p на компактах, если сети ss и tt — универсальные аппроксиматоры функций, а образ базовой плотности под действием таких композиций в пределе даёт любое целевое распределение в смысле сходимости по распределению (Teshima et al., 2020, теоремы 2 и 3). Теорема отвечает на вопрос «могут ли аффинные потоки выразить всё?», но практические вопросы оставляет открытыми. Она не оценивает число слоёв; её конструкция преобразует по одной координате в каждом слое связи и относится к плоским векторам, а не прямо к свёрточным сетям Glow; а приближающие потоки могут быть сколь угодно плохо обусловлены. Koehler, Mehta и Risteski (2021) показывают, что неглубокие сети из аффинных слоёв связи универсальны в расстоянии Вассерштейна, если такая плохая обусловленность допускается, а Draxler et al. (2024) доказывают теорему универсальности, в смысле, построенном на KL-дивергенции, для хорошо обусловленных потоков на слоях связи вроде RealNVP.

Слои различаются тем, откуда берётся дешёвый определитель:

СлойПочему det⁡J\det J дёшевlog⁡∣det⁡J∣\log\lvert\det J\rvertСтоимость двух направлений
Слой связи (NICE, RealNVP)za′=zaz'_a = z_a; zb′z'_b поэлементно зависит от zbz_b∑i=1d−ksi(za)\sum_{i=1}^{d-k} s_i(z_a) (NICE: 00)по одному проходу в каждую сторону
Авторегрессионный (MAF)zi′z'_i зависит только от z1,…,ziz_1,\dots,z_i (маски)∑i=1dsi(z<i)\sum_{i=1}^{d} s_i(z_{<i})плотность: один проход; сэмплирование: dd проходов
Авторегрессионный (IAF)то же, но si,tis_i, t_i читают латентные координаты с номерами меньше ii∑i=1dsi\sum_{i=1}^{d} s_i (от латентных координат с номерами меньше ii)сэмплирование: один проход; плотность: dd проходов
Свёртка 1×11\times1 (Glow)W=PLUW = PLU, PP фиксирована, L,UL, U треугольныеh⋅w⋅∑i=1Clog⁡∣Uii∣h\cdot w\cdot\sum_{i=1}^{C}\log\lvert U_{ii}\rvertодно матричное произведение в каждую сторону
Сплайновый слой связи (NSF)как у слоя связи, но с монотонным сплайном gg вместо аффинного отображения∑ilog⁡g′(zb,i)\sum_i \log g'(z_{b,i})по одному проходу в каждую сторону; обращение решает квадратное уравнение для каждой координаты
ActNormдиагональная матрицаh⋅w⋅∑c=1Cγch\cdot w\cdot\sum_{c=1}^{C}\gamma_cодно аффинное отображение в каждую сторону
Squeeze, перестановкапереупорядочение координат00бесплатно
ПланарныйII плюс матрица ранга один (лемма об определителе)log⁡∣1+tanh⁡′(w⊤z+b) w⊤u∣\log\lvert 1 + \tanh'(w^\top z + b)\,w^\top u\rvertпрямое направление: O(d)O(d); обратное: поиск корня скалярного уравнения
РадиальныйII с множителем плюс матрица ранга один(d−1)log⁡(1+βα+r)+log⁡(1+αβ(α+r)2)(d-1)\log\bigl(1 + \tfrac{\beta}{\alpha + r}\bigr) + \log\bigl(1 + \tfrac{\alpha\beta}{(\alpha + r)^2}\bigr)прямое направление: O(d)O(d); обратное: квадратное уравнение относительно rr
  • На изображениях слои связи используют шахматные и поканальные маски, squeeze обменивает пространство на каналы, а на каждом масштабе выделяется половина переменных; шаг Glow — это ActNorm, свёртка 1×11\times1 и аффинный слой связи.
  • Поток точно кодирует любое изображение, что позволяет интерполировать и кодировать внешние изображения; прямые пути между латентными векторами выходят из типичной оболочки базового распределения.

Ноутбук#

Ноутбук о нормализующих потоках и его библиотека nflib (HSE-LAMBDA Deep Generative Models, ветка spring-2025-long) реализуют слои частей А–Д на плоских векторах. Ячейки нумеруются с 1, считая все ячейки подряд, включая текстовые. В ноутбуке нет сохранённых выходов ячеек, поэтому он документирует процедуры, а не результаты. В nflib метод forward каждого слоя идёт в направлении данные → латентное пространство и возвращает выход вместе с логарифмом определителя.

  • flows.py, слои связи. AffineHalfFlow — это часть А: прямой проход вычисляет x_b * exp(s) + t и log_det = sum(s), обратный — (z_b - t) * exp(-s) и log_det = sum(-s). Его флаг parity меняет, какая половина служит условием для другой, так что слои в стопке чередуются, а scale=False даёт аддитивный слой связи NICE. При нечётном dd преобразуется бо́льшая половина.
  • flows.py, авторегрессионные слои. SlowMAF даёт каждой координате собственный MLP (первой — обучаемую константу, LeafParam) и в обоих направлениях проходит циклом по координатам. MAF использует один ARMLP, который за один проход возвращает (s,t)(s, t) для всех координат: MAF.forward работает параллельно, а MAF.inverse проходит циклом по координатам. IAF просто меняет эти два метода местами. У обоих классов MAF есть флаг parity, который обращает порядок координат на выходе, но с противоположным смыслом: MAF переворачивает порядок при parity=True (z.flip), а SlowMAF — при parity=False.
  • made.py. MaskedLinear вычисляет F.linear(input, mask * weight, bias), то есть h=(W⊙M)x+bh = (W\odot M)x + b, а MADE.update_masks применяет правила степеней из части Б: self.m[l-1][:, None] <= self.m[l][None, :] для скрытых слоёв и self.m[L-1][:, None] < self.m[-1][None, :] для выходного слоя. Они строятся как массивы (вход × выход) со степенями, отсчитываемыми от 0, и транспонируются в MaskedLinear.set_mask.
  • nets.py. У MLP три скрытых слоя ширины nh с LeakyReLU(0.2). ARMLP — это MADE с тремя скрытыми слоями ширины nh, одной маской и естественным порядком координат. PosEncMLP подаёт в MLP признаки sin⁡\sin и cos⁡\cos на частотах 0.5, 1, 2, 4 и 8; в ноутбуке он нигде не используется.
  • flows.py, слои масштабирования. AffineConstantFlow — покоординатный аффинный слой, z = x * exp(s) + t с log_det = sum(s), обобщение слоя масштабирования NICE; его s и t инициализируются сэмплами из стандартного нормального распределения. ActNorm наследует от него и реализует часть Д на плоских векторах: при первом вызове прямого прохода он задаёт s = -log(x.std(0)) и t = -mean(x * exp(s)), а затем обучает их как обычные параметры. Флаг data_dep_init_done, который за этим следит, — обычный атрибут, не входящий в state_dict, поэтому модель, заново собранная и загруженная из чекпойнта, при первом прямом проходе снова выполняет инициализацию и перезаписывает загруженные s и t. После загрузки флаг нужно установить в True.
  • flows.py, Invertible1x1Conv. Этот слой следует параметризации из статьи (часть В) и обучает s\mathbf s напрямую, без страховки от si→0s_i\to0. Он начинает со случайной ортогональной матрицы, раскладывает её с помощью torch.linalg.lu, хранит PP как фиксированный буфер, обучает LL, s\mathbf s и UU, применяет матрицу к векторам-строкам (z = x @ W, что не меняет определитель) и возвращает log_det = sum(log(abs(S))). Обратное отображение использует torch.linalg.inv(W).
  • spline_flows.py. unconstrained_RQS и RQS реализуют часть Г: тождественное отображение вне [−B,B][-B, B] с нулевым логарифмом определителя, крайние производные, равные 1, минимальные ширины и высоты бинов и минимальные производные 10−310^{-3}, поиск бина подсчётом узлов ниже входа и обратное отображение 2c / (-b - sqrt(discriminant)) с -logabsdet. NSF_CL — сплайновый слой связи с двумя MLP: f1 читает первую половину и выдаёт 3K−13K - 1 параметров на каждую координату второй половины, которую он преобразует; затем f2 читает новую вторую половину и преобразует первую. Таким образом, каждый слой обновляет обе половины, тогда как в слое связи Durkan et al. (2019), формулы 9–11, условная половина получает сплайны с напрямую обучаемыми параметрами. Изменения формы тензоров (reshape) в нём предполагают чётное dd. NSF_AR — авторегрессионная версия с обучаемым вектором параметров для первой координаты и отдельным MLP для каждой следующей; как и SlowMAF, он проходит циклом по координатам в обоих направлениях.
  • Две особенности spline_flows.py. NSF_CL и NSF_AR уже пропускают ширины и высоты через softmax и умножают на 2B2B, а RQS применяет softmax ещё раз. Поэтому итоговые ширины пропорциональны exp⁡(2B pk)\exp(2B\,p_k), где pkp_k — вектор вероятностей, и ширины двух бинов могут различаться не более чем в e2B≈403e^{2B}\approx403 раза при B=3B = 3. Производные тоже дважды проходят через softplus, поэтому производная во внутреннем узле никогда не бывает меньше ln⁡2+10−3≈0.694\ln 2 + 10^{-3}\approx 0.694. Сплайн остаётся монотонным и обратимым, но он менее гибок, чем в статье, где каждое преобразование применяется один раз.
  • Ячейка 2 ноутбука перечисляет планарные и радиальные потоки, RealNVP, MAF (в форме f(xi)=(xi−μ(x<i))/exp⁡(α(x<i))f(x_i) = (x_i - \mu(x_{<i}))/\exp(\alpha(x_{<i})) из части Б), свёртку 1×11\times1, ActNorm (как f(x)=Wx+bf(x) = Wx + b с диагональной WW) и NSF. nflib не реализует ни планарные, ни радиальные потоки. Ячейка 3 импортирует AffineConstantFlow, ActNorm, AffineHalfFlow, SlowMAF, MAF, IAF, Invertible1x1Conv, NSF_AR и NSF_CL, но ячейка 7 использует только ActNorm, Invertible1x1Conv и NSF_CL (K=8K = 8, B=3B = 3, ширина скрытого слоя 16): три блока из них на двумерных данных с логистическим базовым распределением. Каждый блок — это шаг Glow из части Д со сплайновым слоем связи, то есть слой RQ-NSF (C); при C=2C = 2 и без пространственной сетки «свёртка» — это обучаемая обратимая матрица перемешивания 2×22\times2.
  • Ячейка 15 пропускает сетку 20×2020\times20 через обученный поток в обратном направлении (model.inverse) и для каждого слоя рисует перемещения точек и деформацию сетки; именно этот эксперимент рисунок с деформацией сетки имитирует для одного слоя связи. Ячейка 17 готовит ещё 500 шагов обучения с перерисовкой каждые 10 шагов (перемещения точек не более чем для девяти слоёв и деформация сетки одного слоя), но её цикл заканчивается break после первой перерисовки, так что в нынешнем виде она делает один шаг оптимизатора и рисует один раз.

Ноутбук домашнего задания 03_hw_vapnev из того же репозитория просит построить три модели CelebA и сравнить их. Его единственные сохранённые выходы ячеек — устройство (mps), форма изображения [3, 64, 64] и сетка из 25 обучающих изображений; ячейки с моделями оставлены пустыми.

  • Ячейки 3–6: данные. CelebADataset из файла репозитория seminars/utils/datasets/celeba.py с Resize(64), CenterCrop(64), ToTensor() и x * 2 - 1, то есть x′=x/127.5−1∈[−1,1]x' = x/127.5 - 1\in[-1, 1] и d=12288d = 12288. Шум деквантования этот конвейер не добавляет. Поток, обученный на таких значениях, видит лишь 256 различных значений на координату и может неограниченно повышать правдоподобие, сосредоточивая массу на них. Перед обучением нужно добавить равномерный шум ширины 1/127.51/127.5, а к сообщаемому отрицательному логарифму правдоподобия прибавить log⁡2127.5≈6.99\log_2 127.5\approx 6.99 бита на размерность (откуда берётся этот сдвиг).
  • Ячейка 10, задание 1: нормализующий поток на CelebA с оценкой качества по FID и отрицательному логарифму правдоподобия. Допускаются любые слои: свёрточные потоки (часть Е) или потоки на развёрнутом изображении, которые, как предполагает текст задания, проще и слабее.
  • Ячейка 12, задание 2: VAE на CelebA с оценкой качества по FID.
  • Ячейка 14, задание 3: VAPNEV (Agrawal and Dukkipati, 2016) — VAE, правдоподобие которого p(x∣z)p(x\mid z) точно вычисляет real NVP вместо попиксельного гауссовского или бернуллиевского распределения, и его условная версия; см. Варианты VAE.
  • Ячейка 16, задание 4: анализ латентного пространства. Какая модель лучше интерполирует, кодирование изображения не из CelebA с поиском ближайших к нему латентных векторов и самый интересный сэмпл. Сторона потоков разобрана в разделе Интерполяция и кодирование с точным обратным отображением.
  • Ячейка 18 просит письменно сравнить модели, приведя сэмплы каждой из них.

Дальше#

Потоки получают точное правдоподобие ценой ограничений на архитектуру: каждый слой должен быть обратимым, с дешёвым в вычислении определителем Якоби, а латентный вектор должен сохранять размерность данных. Модель, основанная на энергии (energy-based model), снимает все эти ограничения. Любая сеть Eθ(x)E_\theta(x), выдающая число, задаёт плотность pθ(x)=e−Eθ(x)/Zθp_\theta(x) = e^{-E_\theta(x)}/Z_\theta, если ZθZ_\theta конечна, но сама нормирующая константа Zθ=∫e−Eθ(x) dxZ_\theta = \int e^{-E_\theta(x)}\,dx неизвестна, поэтому ни сэмплирование, ни градиент правдоподобия нельзя вычислить напрямую. И для того и для другого тогда нужны марковские методы Монте-Карло (MCMC). Следующая заметка, сэмплирование ненормированных плотностей, строит сэмплеры, которым плотность нужна лишь с точностью до константы: MALA, гамильтонов Монте-Карло и NUTS.

Литература#