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

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

Нормализующие потоки: замена переменных

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

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

GAN порождает сэмплы, но не может сказать, насколько вероятно данное изображение. VAE может, но только через нижнюю оценку. Нормализующие потоки (normalizing flows) идут третьим путём (Rezende and Mohamed, 2015; Papamakarios et al., 2021; Kobyzev, Prince and Brubaker, 2021): берут простую плотность, пропускают её через обратимое отображение и точно вычисляют плотность результата по формуле замены переменных. В этой заметке мы выводим эту формулу, собираем из неё поток, сравниваем потоки с другими семействами моделей и заканчиваем приёмом, который делает потоки вычислимыми: треугольной матрицей Якоби. Как строить слои с этим свойством, разбирается в следующей заметке, Архитектуры потоков.

Обозначения. Отображение ff всегда идёт из латентного пространства в пространство данных, f:Z→Xf: \mathcal Z \to \mathcal X, так что x=f(z)x = f(z) порождает данные, а z=f−1(x)z = f^{-1}(x) их кодирует. pZp_Z — базовая (латентная) плотность, pθ(x)p_\theta(x) — плотность данных в модели. Для отображения gg через Jg(u)=∂g(u)/∂uJ_g(u) = \partial g(u)/\partial u обозначена его матрица Якоби в точке uu.

Модель: обратимые отображения гауссианы#

Возьмём непрерывную случайную величину zz с простой плотностью — сферической гауссианой (spherical Gaussian):

z∼pZ(z)=N(z; 0, I).z \sim p_Z(z) = \mathcal N(z;\, 0,\, I).

«Сферическая» означает, что ковариационная матрица пропорциональна единичной (здесь в точности равна II): разброс одинаков во всех направлениях, а линии уровня — сферы. Данные получаются цепочкой из KK отображений,

x=fθ(z)=fK∘⋯∘f2∘f1(z),x = f_\theta(z) = f_K \circ \dots \circ f_2 \circ f_1 (z),

и каждое fif_i обратимо (биективно): каждая точка выходного пространства — образ ровно одной входной точки. Для формулы плотности ниже каждое fif_i должно быть ещё и дифференцируемым с дифференцируемым обратным (диффеоморфизмом). Тогда обратима и вся цепочка, причём f−1=f1−1∘f2−1∘⋯∘fK−1f^{-1} = f_1^{-1} \circ f_2^{-1} \circ \dots \circ f_K^{-1}. Для диффеоморфизма нужно dim⁡z=dim⁡x\dim z = \dim x. Цепное правило, применённое к f−1∘f=idf^{-1}\circ f = \mathrm{id} и f∘f−1=idf\circ f^{-1} = \mathrm{id}, даёт Jf−1Jf=IJ_{f^{-1}}J_f = I и JfJf−1=IJ_fJ_{f^{-1}} = I, а ранг произведения матриц размеров m×nm\times n и n×mn\times m не больше min⁡(m,n)\min(m, n), поэтому оба тождества могут выполняться, только когда m=nm = n. Значит, в отличие от VAE, латентный вектор имеет ту же размерность, что и данные.

Рисунок

У каждой точки Z ровно одна парная точка в X

Точки, отображаемые между латентным пространством Z и пространством данных XДве системы координат рядом: Z слева, X справа. Каждая из трёх точек в Z соединена с одной точкой в X парой параллельных стрелок: синяя стрелка с подписью f ведёт из Z в X, а зелёная стрелка с подписью «f обратное» ведёт обратно из X в Z. Три точки в Z — типичные латентные точки (z имеет стандартное нормальное распределение), и каждый x равен f от z.Zz ~ N(0, I)Xx = f(z)ff−1zxТочки, отображаемые между латентным пространством Z и пространством данных XДве системы координат рядом: Z слева, X справа. Каждая из трёх точек в Z соединена с одной точкой в X парой параллельных стрелок: синяя стрелка с подписью f ведёт из Z в X, а зелёная стрелка с подписью «f обратное» ведёт обратно из X в Z. Три точки в Z — типичные латентные точки (z имеет стандартное нормальное распределение), и каждый x равен f от z.Zz ~ N(0, I)Xx = f(z)ff−1zx
Поток f переводит каждую латентную точку z в точку данных x = f(z) (синие стрелки, слева направо), а обратное отображение f⁻¹ возвращает её назад (зелёные стрелки, справа налево). Поскольку каждое fᵢ в цепочке — биекция, никакие две точки Z не попадают в один и тот же x и ни один x не остаётся без прообраза. Положения точек в X вычислены по тому же обратимому двумерному отображению, которое дальше используется, чтобы показать матрицу Якоби как локальную геометрию.

Почему нельзя просто взять базовую плотность?#

Нам нужна pθ(x)p_\theta(x). Первая догадка — отобразить xx обратно и взять значение базовой плотности, pθ(x)=?pZ(f−1(x))p_\theta(x) \overset{?}{=} p_Z(f^{-1}(x)). Это неверно, потому что ответ зависит от того, как ведёт себя ff: насколько оно растягивает или сжимает пространство вокруг каждой точки.

Контрпример в одну строку: в одном измерении пусть z∼N(0,1)z \sim \mathcal N(0, 1) и x=f(z)=2zx = f(z) = 2z. Наивная догадка даёт pZ(x/2)p_Z(x/2); интеграл этой функции по всей прямой равен 22, так что это даже не плотность. Истинное распределение — x∼N(0,4)x \sim \mathcal N(0, 4) с плотностью pZ(x/2)/2p_Z(x/2)/2. В точке x=1x = 1 наивное значение равно 0.3520.352, а правильное — 0.1760.176: ff распределяет ту же вероятность по вдвое большей длине, поэтому плотность должна уменьшиться вдвое.

Замена переменных#

Пусть отображение f:Z→Xf: \mathcal Z \to \mathcal X обратимо, дифференцируемо и имеет дифференцируемое обратное, а pZ(z)p_Z(z) — плотность, заданная на z∈Zz \in \mathcal Z.

Одно измерение. Масса вероятности сохраняется. Маленький интервал ширины ∣dz∣|dz| вокруг zz содержит массу pZ(z) ∣dz∣p_Z(z)\,|dz|, и ff переводит его в интервал ширины ∣dx∣|dx| вокруг x=f(z)x = f(z), который должен содержать ту же массу:

pθ(x) ∣dx∣=pZ(z) ∣dz∣,p_\theta(x)\,|dx| = p_Z(z)\,|dz|,

откуда

pθ(x)=pZ(z)∣dzdx∣=pZ(f−1(x))∣f′(f−1(x))∣.p_\theta(x) = p_Z(z)\left|\frac{dz}{dx}\right| = \frac{p_Z(f^{-1}(x))}{\left|f'(f^{-1}(x))\right|}.

Любая размерность. Ширины превращаются в объёмы, и нам нужно знать, во сколько раз ff меняет малый объём. Вблизи точки zz отображение приблизительно линейно, f(z+δ)≈f(z)+Jf(z) δf(z + \delta) \approx f(z) + J_f(z)\,\delta, с матрицей Якоби

Jf(z)=[∂f(1)∂z1⋯∂f(1)∂zd⋮⋱⋮∂f(d)∂z1⋯∂f(d)∂zd],J_f(z) = \begin{bmatrix} \dfrac{\partial f^{(1)}}{\partial z_1} & \cdots & \dfrac{\partial f^{(1)}}{\partial z_d} \\ \vdots & \ddots & \vdots \\ \dfrac{\partial f^{(d)}}{\partial z_1} & \cdots & \dfrac{\partial f^{(d)}}{\partial z_d} \end{bmatrix},

где f(1),…,f(d)f^{(1)},\dots,f^{(d)} — выходные координаты ff: строка kk матрицы JfJ_f содержит частные производные выхода kk, столбец jj — производные по входу zjz_j. Поэтому крошечный куб со стороной ε\varepsilon в точке zz, натянутый на векторы εe1,…,εed\varepsilon e_1,\dots,\varepsilon e_d, переходит в крошечный параллелепипед, натянутый на εJf(z)e1,…,εJf(z)ed\varepsilon J_f(z) e_1, \dots, \varepsilon J_f(z) e_d, то есть на столбцы Jf(z)J_f(z), умноженные на ε\varepsilon. Объём параллелепипеда, натянутого на столбцы матрицы AA, равен ∣det⁡A∣\lvert\det A\rvert, так что ff умножает малые объёмы вблизи zz на ∣det⁡Jf(z)∣\lvert\det J_f(z)\rvert. В двух измерениях маленький квадрат становится маленьким параллелограммом, площадь которого в ∣det⁡Jf(z)∣\lvert\det J_f(z)\rvert раз больше площади квадрата.

Рисунок

Матрица Якоби — это локальная геометрия

Сетка, деформированная нелинейным потокомСлева или сверху: правильная квадратная сетка в Z с двумя выделенными ячейками. Справа или снизу: та же сетка после отображения f, теперь искривлённая и расходящаяся веером вправо. Янтарная ячейка слева сжата до 0.65 от исходной площади, что соответствует модулю определителя Якоби 0.65 в её центре. Красная ячейка справа растянута в 1.55 раза, что соответствует определителю 1.55.ZXfсжатие:|det J| ≈ 0.65растяжение:|det J| ≈ 1.55Сетка, деформированная нелинейным потокомСлева или сверху: правильная квадратная сетка в Z с двумя выделенными ячейками. Справа или снизу: та же сетка после отображения f, теперь искривлённая и расходящаяся веером вправо. Янтарная ячейка слева сжата до 0.65 от исходной площади, что соответствует модулю определителя Якоби 0.65 в её центре. Красная ячейка справа растянута в 1.55 раза, что соответствует определителю 1.55.ZXfсжатие:|det J| ≈ 0.65растяжение:|det J| ≈ 1.55
Квадратная сетка в Z, пропущенная через обратимое нелинейное отображение f. Здесь f(z) = (z₁ + 0.35·sin(1.2·b), b), где b = z₂·e^(0.35·z₁) + 0.2·z₁, так что det J_f(z) = e^(0.35·z₁). Каждая маленькая ячейка становится почти параллелограммом. Её площадь умножается на |det J_f| в этой точке: янтарная ячейка (z₁ ≈ −1.25) сжимается до 0.65 от исходной площади (det ≈ 0.65), а красная ячейка (z₁ ≈ 1.25) вырастает в 1.55 раза (det ≈ 1.55).

Масса сохраняется так же, как в одном измерении: куб объёма εd\varepsilon^d содержит массу pZ(z) εdp_Z(z)\,\varepsilon^d, и его образ объёма ∣det⁡Jf(z)∣ εd\lvert\det J_f(z)\rvert\,\varepsilon^d должен содержать ту же массу. Следовательно, при z=f−1(x)z = f^{-1}(x)

pθ(x)=pZ(f−1(x)) ∣det⁡∂f−1(x)∂x∣=pZ(z) ∣det⁡∂z∂x∣=pZ(z) ∣det⁡∂f(z)∂z∣−1.\begin{aligned} p_\theta(x) &= p_Z\big(f^{-1}(x)\big)\,\left|\det \frac{\partial f^{-1}(x)}{\partial x}\right| \\ &= p_Z(z)\,\left|\det \frac{\partial z}{\partial x}\right| \\ &= p_Z(z)\,\left|\det \frac{\partial f(z)}{\partial z}\right|^{-1}. \end{aligned}

Две формы говорят одно и то же. Матрица Якоби обратного отображения вычисляется в точке данных, а матрица Якоби ff — в латентной точке z=f−1(x)z = f^{-1}(x). Их связывают теорема об обратной функции, Jf−1(x)=[Jf(z)]−1J_{f^{-1}}(x) = \big[J_f(z)\big]^{-1}, и равенство det⁡(A−1)=1/det⁡A\det(A^{-1}) = 1/\det A. Множитель ∣det⁡Jf∣|\det J_f| измеряет расширение или сжатие пространства вокруг точки (Papamakarios et al., 2021, §2.1). Там, где ff расширяет пространство, та же вероятность распределяется по большему объёму и плотность падает; там, где ff сжимает пространство, плотность растёт:

  • ∣det⁡Jf∣=2|\det J_f| = 2: объёмы удваиваются, а плотность уменьшается вдвое;
  • ∣det⁡Jf∣=0.5|\det J_f| = 0.5: объёмы уменьшаются вдвое, а плотность удваивается;
  • ∣det⁡Jf∣=1|\det J_f| = 1: объёмы сохраняются (форма при этом может меняться), а с ними и плотность;
  • det⁡Jf=0\det J_f = 0: объём схлопывается в ноль. Линейное отображение Jf(z)J_f(z) необратимо, и тогда у ff нет дифференцируемого обратного в точке f(z)f(z), поскольку дифференцируемое обратное давало бы Jf−1Jf=IJ_{f^{-1}}J_f = I. Множитель плотности 1/∣det⁡Jf∣1/|\det J_f| здесь бесконечен, и формула выше неприменима. Поэтому слои потоков строят так, чтобы всюду было det⁡Jf≠0\det J_f \neq 0.
Рисунок

Что |det J| делает с маленьким квадратом

Изменение площади при определителях 2, 0.5, 1 и 0Четыре панели в сетке два на два, на каждой штриховой единичный квадрат и его образ при матрице 2 на 2. Слева вверху: матрица со строками 2 0 и 0 1, определитель 2, площадь удваивается. Справа вверху: строки 1 0.4 и 0 0.5, определитель 0.5, площадь уменьшается вдвое. Слева внизу: сдвиг со строками 1 0.8 и 0 1, определитель 1, площадь сохраняется, хотя форма меняется. Справа внизу: строки 1 0.5 и 0.6 0.3, определитель 0, квадрат схлопывается в отрезок, и отображение необратимо.det J = 2 ⇒ удвоена2001det J = 0.5 ⇒ сжата вдвое10.400.5det J = 1 ⇒ сохранена10.801det J = 0 ⇒ схлопнута10.50.60.3необратимо ⇒ не годится для потоков
Штриховой единичный квадрат и его образ (с заливкой) при четырёх линейных отображениях. |det J| — множитель, на который умножаются площади, а в d измерениях — объёмы. Сдвиг может полностью изменить форму и при этом иметь det = 1. При det = 0 квадрат схлопывается в отрезок: два измерения сжимаются в одно, и линейное отображение нельзя обратить. У слоя с det J = 0 в некоторой точке там нет дифференцируемого обратного, поэтому формула замены переменных к нему неприменима; вот почему в слоях потоков всюду det J ≠ 0.

Разобранный одномерный пример#

Рисунок

Замена переменных в одном измерении

Полоса массы вероятности, проходящая через одномерный потокВ центре: возрастающая кривая x = f(z) = z + 0.8 tanh(2z), крутая вблизи начала координат и с наклоном, близким к 1, в хвостах. Под ней — стандартная нормальная плотность p_Z(z), на которой закрашена полоса z от 0.1 до 0.5; её масса вероятности около 0.152. Бледные полосы переносят её вверх до кривой и вправо до правой панели, где плотность модели p_theta(x) нарисована набок. Образ полосы, x от 0.258 до 1.109, шире, и закрашенная область там имеет ту же массу, но меньшую высоту. У p_theta два горба, потому что f растягивает область вокруг нуля.-2-1012-3-2-10123zxx = f(z)zpZ(z)Δz = 0.4pθ(x)Δx ≈ 0.851та же масса вероятности,другая ширинамасса ≈ 0.152Полоса массы вероятности, проходящая через одномерный потокВ центре: возрастающая кривая x = f(z) = z + 0.8 tanh(2z), крутая вблизи начала координат и с наклоном, близким к 1, в хвостах. Под ней — стандартная нормальная плотность p_Z(z), на которой закрашена полоса z от 0.1 до 0.5; её масса вероятности около 0.152. Бледные полосы переносят её вверх до кривой и вправо до правой панели, где плотность модели p_theta(x) нарисована набок. Образ полосы, x от 0.258 до 1.109, шире, и закрашенная область там имеет ту же массу, но меньшую высоту. У p_theta два горба, потому что f растягивает область вокруг нуля.-2-1012-3-2-10123zxx = f(z)zpZ(z)Δz = 0.4pθ(x)Δx ≈ 0.851та же массавероятности,другая ширинамасса ≈ 0.152
Базовая плотность p_Z = N(0, 1) (внизу), монотонный поток x = f(z) = z + 0.8·tanh(2z) (в центре) и получающаяся плотность модели p_θ(x) = p_Z(f⁻¹(x)) / f′(f⁻¹(x)) (справа, повёрнута набок). Полоса z ∈ [0.1, 0.5] содержит вероятность 0.152; f растягивает её до отрезка x ∈ [0.258, 1.109], примерно в 2.13 раза более широкого, поэтому плотность там должна быть во столько же раз ниже. Вблизи начала координат f′(0) = 2.6, и это превращает один горб гауссианы в два.

Возьмём pZ=N(0,1)p_Z = \mathcal N(0, 1) и отображение с рисунка,

f(z)=z+0.8tanh⁡(2z),f′(z)=1+1.6 sech⁡2(2z)>0.\begin{gathered} f(z) = z + 0.8\tanh(2z), \\ f'(z) = 1 + 1.6\,\operatorname{sech}^2(2z) > 0 . \end{gathered}

Производная всюду положительна, поэтому ff строго возрастает и, значит, обратимо (обратное не выражается в замкнутой форме, но легко находится численно). Тогда pθ(x)=pZ(z)/f′(z)p_\theta(x) = p_Z(z)/f'(z) при z=f−1(x)z = f^{-1}(x):

zzx=f(z)x = f(z)f′(z)f'(z)pZ(z)p_Z(z)pθ(x)=pZ(z)/f′(z)p_\theta(x) = p_Z(z)/f'(z)
00002.6002.6000.39890.39890.15340.1534
0.50.51.1091.1091.6721.6720.35210.35210.21060.2106
111.7711.7711.1131.1130.24200.24200.21740.2174
222.7992.7991.0021.0020.05400.05400.05390.0539

Вблизи начала координат ff растягивает пространство в 2.62.6 раза, поэтому плотность там опускается намного ниже пика гауссианы; в хвостах f′≈1f' \approx 1 и плотность почти не меняется. Один горб превращается в два с максимумами в x≈±1.50x \approx \pm 1.50 (то есть z≈±0.77z \approx \pm 0.77), pθ≈0.234p_\theta \approx 0.234. Даже одно гладкое обратимое отображение может превратить унимодальное базовое распределение в бимодальную модель. В логарифмической форме при z=0.5z = 0.5: log⁡pθ(x)=log⁡pZ(z)−log⁡f′(z)=−1.044−0.514=−1.558\log p_\theta(x) = \log p_Z(z) - \log f'(z) = -1.044 - 0.514 = -1.558.

Полоса z∈[0.1,0.5]z \in [0.1, 0.5] содержит вероятность Φ(0.5)−Φ(0.1)=0.152\Phi(0.5) - \Phi(0.1) = 0.152. Её образ — x∈[0.258,1.109]x \in [0.258, 1.109], в 2.132.13 раза шире, поэтому средняя плотность на нём падает с 0.3790.379 до 0.1780.178, в то же число раз: та же масса вероятности, другая ширина.

Пример: растяжение пространства в 2 раза#

Простейший многомерный случай — линейное отображение x=Jzx = Jz, матрица Якоби которого ∂x/∂z=J\partial x/\partial z = J всюду одна и та же. При

J=[2002]J = \begin{bmatrix} 2 & 0 \\ 0 & 2 \end{bmatrix}

каждое направление растягивается в 2 раза, и det⁡J=2⋅2−0⋅0=4\det J = 2\cdot 2 - 0\cdot 0 = 4. Единичный квадрат в Z\mathcal Z становится квадратом 2×22\times 2 в X\mathcal X, так что

pθ(x)=pZ(z)∣1det⁡(∂x∂z)∣=pZ(z)4.p_\theta(x) = p_Z(z)\left|\frac{1}{\det\left(\frac{\partial x}{\partial z}\right)}\right| = \frac{p_Z(z)}{4}.

Проверим на z∼N(0,I)z \sim \mathcal N(0, I) в двух измерениях: x=2z∼N(0,4I)x = 2z \sim \mathcal N(0, 4I), и действительно pθ(0)=12π⋅4=0.0398=14⋅12πp_\theta(0) = \frac{1}{2\pi\cdot 4} = 0.0398 = \frac14\cdot\frac{1}{2\pi}.

Ориентация не важна. Для

J=[200−2],det⁡J=−4,J = \begin{bmatrix} 2 & 0 \\ 0 & -2 \end{bmatrix}, \qquad \det J = -4,

квадрат ещё и отражается, но его площадь по-прежнему равна 44. Знак определителя фиксирует ориентацию; изменение объёма, а значит и плотности, зависит только от ∣det⁡J∣=4|\det J| = 4. Поэтому в формуле стоит модуль.

Рисунок

Матрица Якоби, растягивающая каждое направление в 2 раза

Единичный квадрат под действием двух диагональных матриц ЯкобиДве строки. В каждой строке единичный квадрат в латентном пространстве Z с янтарной стрелкой в четверть оборота против часовой стрелки внутри отображается матрицей J в пространство данных X. В первой строке у J диагональные элементы 2 и 2; образ — квадрат 2 на 2 над осью, det J равен 4, площадь умножается на 4, а плотность делится на 4. Во второй строке у J диагональные элементы 2 и минус 2; образ — квадрат 2 на 2 под горизонтальной осью, стрелка в четверть оборота теперь идёт по часовой стрелке, det J равен минус 4, но модуль определителя по-прежнему равен 4 и площадь та же.Zплощадь 1J =2002det J = 2·2 − 0·0 = 4площадь 4X|det J| = 4растяжение в 2 раза:площадь × 4,плотность ÷ 4Zплощадь 1J =200−2det J = −4площадь 4X|det J| = 4квадрат отражён,та же площадь × 4,плотность ÷ 4Единичный квадрат под действием двух диагональных матриц ЯкобиДве строки. В каждой строке единичный квадрат в латентном пространстве Z с янтарной стрелкой в четверть оборота против часовой стрелки внутри отображается матрицей J в пространство данных X. В первой строке у J диагональные элементы 2 и 2; образ — квадрат 2 на 2 над осью, det J равен 4, площадь умножается на 4, а плотность делится на 4. Во второй строке у J диагональные элементы 2 и минус 2; образ — квадрат 2 на 2 под горизонтальной осью, стрелка в четверть оборота теперь идёт по часовой стрелке, det J равен минус 4, но модуль определителя по-прежнему равен 4 и площадь та же.Zплощадь 1J =2002det J = 2·2 − 0·0 = 4площадь4X|det J| = 4: растяжение в 2 разаплощадь × 4, плотность ÷ 4Zплощадь 1J =200−2det J = −4площадь4X|det J| = 4: квадрат отражён,та же площадь × 4, плотность ÷ 4
Вверху: J = diag(2, 2) переводит единичный квадрат из Z в квадрат 2 × 2 в X. Площадь растёт с 1 до det J = 4, поэтому та же вероятность распределяется по вчетверо большей площади и плотность падает вчетверо: p_θ(x) = p_Z(z) / |det J|. Внизу: J = diag(2, −2) ещё и отражает вторую ось. Янтарная стрелка в четверть оборота теперь идёт по часовой стрелке, det J = −4, но площадь и множитель плотности зависят только от |det J| = 4.

Композиция отображений: нормализующий поток#

Теперь применим формулу ко всей цепочке z∼pZ(z)z \sim p_Z(z), x=fθ(z)=fK∘⋯∘f2∘f1(z)x = f_\theta(z) = f_K\circ\dots\circ f_2\circ f_1(z). Обозначим промежуточные точки

z0=z,zi=fi(zi−1)    (i=1,…,K),z_0 = z, \quad z_i = f_i(z_{i-1}) \;\; (i = 1,\dots,K),

так что zK=xz_K = x. Обратное отображение проходит цепочку в обратном порядке, f−1=f1−1∘⋯∘fK−1f^{-1} = f_1^{-1}\circ\dots\circ f_K^{-1}, и по цепному правилу его матрица Якоби — произведение матриц Якоби слоёв, каждая из которых берётся в своей промежуточной точке: Jf−1(x)=Jf1−1(z1) Jf2−1(z2)⋯JfK−1(zK)J_{f^{-1}}(x) = J_{f_1^{-1}}(z_1)\,J_{f_2^{-1}}(z_2)\cdots J_{f_K^{-1}}(z_K). Поскольку det⁡(AB)=det⁡A det⁡B\det(AB) = \det A\,\det B,

pθ(x)=pZ(z0) ∣det⁡∂f−1(x)∂x∣=pZ(z0)∏i=1K∣det⁡∂fi−1(zi)∂zi∣=pZ(z0)∏i=1K∣det⁡∂fi(zi−1)∂zi−1∣−1.\begin{aligned} p_\theta(x) &= p_Z(z_0)\,\left|\det\frac{\partial f^{-1}(x)}{\partial x}\right| \\ &= p_Z(z_0)\prod_{i=1}^{K}\left|\det\frac{\partial f_i^{-1}(z_i)}{\partial z_i}\right| \\ &= p_Z(z_0)\prod_{i=1}^{K}\left|\det\frac{\partial f_i(z_{i-1})}{\partial z_{i-1}}\right|^{-1}. \end{aligned}

Чтобы вычислить её, мы проводим xx через слои в обратном направлении, zK=x→zK−1→⋯→z0z_K = x \to z_{K-1} \to \dots \to z_0, и собираем по одному определителю на слой. Эта конструкция и есть нормализующий поток: плотность перетекает через последовательность обратимых отображений, а цепочка, прочитанная в обратную сторону, нормализует данные, превращая их (приближённо, когда модель обучена) в выборку из стандартного нормального базового распределения. Название популяризовали в машинном обучении Rezende and Mohamed (2015), опираясь на более ранние работы по оцениванию плотности через преобразование данных к гауссиане (Tabak and Vanden-Eijnden, 2010). Потоки Rezende и Mohamed состояли из планарных и радиальных отображений, определители которых дёшевы по другой причине, чем у треугольных слоёв ниже (Архитектуры потоков, часть Ж).

Для сэмплирования нужно только прямое направление: берём z∼N(0,I)z \sim \mathcal N(0, I) и вычисляем x=fθ(z)x = f_\theta(z); для вычисления плотности нужно обратное. Какое из двух направлений вычисляется дёшево, зависит от архитектуры: маскированные авторегрессионные потоки (masked autoregressive flows, MAF; Papamakarios, Pavlakou and Murray, 2017) быстро вычисляют плотность и медленно сэмплируют, обратные авторегрессионные потоки (inverse autoregressive flows, IAF; Kingma et al., 2016) — наоборот, а слои связи (coupling layers) делают дешёвым и то и другое (см. Архитектуры потоков). Сэмплирование превращает простое zz в сэмпл из сложного распределения; формула плотности — то, что позволяет обучить fθf_\theta так, чтобы это распределение совпало с данными.

Метод максимального правдоподобия#

Возьмём логарифм, и произведение станет суммой, где Jfi−1(zi)=∂fi−1(zi)/∂ziJ_{f_i^{-1}}(z_i) = \partial f_i^{-1}(z_i)/\partial z_i:

log⁡pθ(x)=log⁡pZ(z0)+∑i=1Klog⁡∣det⁡Jfi−1(zi)∣.\begin{aligned} \log p_\theta(x) &= \log p_Z(z_0) \\ &\quad + \sum_{i=1}^{K}\log\big|\det J_{f_i^{-1}}(z_i)\big| . \end{aligned}

Это точное вычисление логарифма правдоподобия, без оценок снизу и без сэмплирования. Обучение — обычный метод максимального правдоподобия, который минимизирует прямую KL-дивергенцию (forward KL) от распределения данных к модели (почему мы минимизируем именно кросс-энтропию). Как и в заметке о подгонке распределений, плотность данных неизвестна, поэтому мы минимизируем отрицательный логарифм правдоподобия по набору данных x(1),…,x(N)x^{(1)},\dots,x^{(N)}, теперь уже с нейросетевой моделью:

L(θ)=−1N∑n=1N[log⁡pZ(z0(n))+∑i=1Klog⁡∣det⁡∂fi−1(zi(n))∂zi(n)∣],\begin{aligned} \mathcal L(\theta) &= -\frac1N\sum_{n=1}^{N}\Bigg[\log p_Z\big(z_0^{(n)}\big) \\ &\qquad + \sum_{i=1}^{K}\log\left|\det\frac{\partial f_i^{-1}(z_i^{(n)})}{\partial z_i^{(n)}}\right|\Bigg], \end{aligned}

где zi(n)z_i^{(n)} — промежуточные точки для x(n)x^{(n)}: zK(n)=x(n)z_K^{(n)} = x^{(n)} и zi−1(n)=fi−1(zi(n))z_{i-1}^{(n)} = f_i^{-1}(z_i^{(n)}), так что z0(n)=fθ−1(x(n))z_0^{(n)} = f_\theta^{-1}(x^{(n)}).

Два слагаемых тянут в разные стороны. Первое хочет, чтобы каждая закодированная точка лежала вблизи центра гауссианы. Второе штрафует обратное отображение за сжатие пространства, поэтому модель не может улучшить целевую функцию, схлопнув все данные в z=0z = 0.

Изображения: деквантование, масштабирование и биты на размерность#

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

Формула даёт плотность, поэтому она точна для непрерывных данных. Изображения дискретны, например 8-битные значения пикселей x∈{0,…,255}dx \in \{0,\dots,255\}^d, и непрерывная плотность могла бы принимать в этих точках сколь угодно большие значения: поток, обученный на исходных значениях, может неограниченно повышать своё правдоподобие, стягивая массу вероятности на эти точки. Поэтому потоки обучают на деквантованных (dequantized) данных x~=x+u\tilde x = x + u с равномерным шумом u∼U[0,1)du \sim \mathcal U[0, 1)^d. Вероятность, которую модель даёт дискретному значению xx, равна P(x)=∫[0,1)dpθ(x+u) duP(x) = \int_{[0,1)^d} p_\theta(x + u)\,du, и неравенство Йенсена даёт Eu[log⁡pθ(x+u)]≤log⁡P(x)\mathbb E_u\big[\log p_\theta(x + u)\big] \le \log P(x): непрерывный логарифм правдоподобия деквантованных данных — нижняя оценка дискретного логарифма правдоподобия (Theis, van den Oord and Bethge, 2016).

Биты на размерность (bits per dimension). Правдоподобие моделей изображений сообщают как −log⁡2P(x)/d-\log_2 P(x)/d — число бит на координату, которое нужно коду без потерь, построенному по модели (см. биты на размерность в заметке об авторегрессионных моделях). Модель, распределяющая вероятность равномерно по 256 значениям, получает ровно 8. Для потока сообщают число −Eu[log⁡2pθ(x+u)]/d-\mathbb E_u\big[\log_2 p_\theta(x + u)\big]/d, которое по неравенству выше является верхней оценкой дискретного значения.

Масштабирование меняет плотность. Сетям редко подают на вход значения пикселей из [0,256)[0, 256). Распространённый выбор — x′=x~/127.5−1x' = \tilde x/127.5 - 1, что переводит данные примерно в [−1,1][-1, 1]. Тогда поток моделирует плотность x′x', а замена переменных связывает её с плотностью x~\tilde x: у отображения x~↦x′\tilde x\mapsto x' постоянная матрица Якоби 1127.5I\tfrac{1}{127.5}I, поэтому

px~(x~)=px′(x′)⋅127.5−d,−log⁡2px~(x~)d=−log⁡2px′(x′)d+log⁡2127.5.\begin{gathered} p_{\tilde x}(\tilde x) = p_{x'}(x')\cdot 127.5^{-d}, \\[4pt] -\frac{\log_2 p_{\tilde x}(\tilde x)}{d} = -\frac{\log_2 p_{x'}(x')}{d} + \log_2 127.5 . \end{gathered}

Число бит на размерность в единицах пикселей равно числу в единицах модели плюс log⁡2127.5≈6.99\log_2 127.5 \approx 6.99. В общем случае, если после предобработки один уровень квантования имеет ширину aa, сдвиг равен −log⁡2a-\log_2 a бит на размерность (Kingma and Dhariwal, 2018, §2, формула 2): log⁡2255≈7.99\log_2 255\approx 7.99 для x/255x/255, как у распространённых загрузчиков изображений, и ровно 8 для x/256x/256. Например (игрушечные числа), поток, который сообщает −3.50-3.50 бита на размерность для x′x', имеет в единицах пикселей −3.50+6.99=3.49-3.50 + 6.99 = 3.49 бита на размерность. Отрицательное значение в единицах модели нормально, потому что плотность на узком диапазоне может превышать 1; с опубликованными результатами, например с таблицей правдоподобий в заметке об авторегрессионных моделях, можно сравнивать только число в единицах пикселей.

Шум должен быть в тех же единицах. Шум деквантования должен покрывать ровно один уровень того, что видит сеть. При x′=x/127.5−1x' = x/127.5 - 1 это значит прибавлять u/127.5u/127.5 с u∼U[0,1)du\sim\mathcal U[0,1)^d, что равносильно прибавлению uu до масштабирования. Шум ширины 1 в единицах x′x' размазал бы каждое значение примерно на 127 уровней, а без шума правдоподобие снова становится неограниченным. NICE, например, деквантует CIFAR-10 равномерным шумом ширины 1128\tfrac{1}{128} на данных, приведённых к [−1,1][-1, 1], где ширина одного уровня равна 2256=1128\tfrac{2}{256} = \tfrac{1}{128} (Dinh, Krueger and Bengio, 2015, §5.1).

Логит-преобразование. Значения пикселей ограничены, а гауссовская базовая плотность задана на всём Rd\mathbb R^d. Чтобы ослабить краевые эффекты, RealNVP моделирует логит масштабированных пикселей (Dinh, Sohl-Dickstein and Bengio, 2017, §4.1):

y=logit⁡(p)=log⁡p1−p,p=α+(1−2α) x~256,α=0.05.\begin{gathered} y = \operatorname{logit}(p) = \log\frac{p}{1 - p}, \\[4pt] p = \alpha + (1 - 2\alpha)\,\frac{\tilde x}{256}, \qquad \alpha = 0.05 . \end{gathered}

Сдвиг α\alpha держит pp внутри [0.05,0.95)[0.05, 0.95), так что yy остаётся в пределах примерно ±2.94\pm2.94, а не уходит в ±∞\pm\infty на чёрных и белых пикселях. Это форма из эталонной реализации; в статье напечатано 1−α1 - \alpha вместо 1−2α1 - 2\alpha. Производная преобразования по каждой координате равна dy/dx~=(1−2α)/(256 p(1−p))dy/d\tilde x = (1 - 2\alpha)/\big(256\,p(1-p)\big), поэтому

−log⁡2px~(x~)=−log⁡2py(y)+∑i=1dlog⁡2256 pi(1−pi)1−2α.\begin{aligned} -\log_2 p_{\tilde x}(\tilde x) &= -\log_2 p_y(y) \\ &\quad + \sum_{i=1}^{d}\log_2\frac{256\,p_i(1 - p_i)}{1 - 2\alpha} . \end{aligned}

В отличие от линейного масштабирования, поправка зависит от пикселя: около 6.156.15 бита для среднего серого значения (x~=128.5\tilde x = 128.5) и 3.803.80 бита для самых тёмных и самых светлых значений (x~=0.5\tilde x = 0.5 или 255.5255.5). RealNVP включает это слагаемое в свои биты на размерность. В статье о Glow сказано, что она следует предобработке RealNVP (§5); её эталонный код вместо этого переводит данные в [−12,12)[-\tfrac12, \tfrac12), добавляет шум ширины 1256\tfrac{1}{256} и прибавляет к логарифму правдоподобия константу −dlog⁡256-d\log 256, то есть реализует линейный случай выше с a=1256a = \tfrac{1}{256}. Потокам, построенным для изображений, посвящена часть Е заметки «Архитектуры потоков».

Сводка: GAN, VAE и потоки#

Рисунок

Сводка: три способа связать данные x и латентную переменную z

Архитектуры GAN, VAE и потока рядомТри строки. Строка GAN: z поступает в расширяющийся генератор G(z), который выдаёт поддельный сэмпл x штрих; x штрих и настоящий сэмпл x поступают в сужающийся дискриминатор D, который выдаёт 0 или 1. Пометки: нет логарифма правдоподобия, нет вывода z. Строка VAE: x поступает в сужающийся энкодер q phi от z при условии x, который выдаёт маленький z; z поступает в расширяющийся декодер p theta от x при условии z, который выдаёт x штрих. Пометки: нижняя оценка ELBO, приближённое апостериорное распределение. Строка потока: x поступает в прямоугольный блок f обратное от x, из данных в латентное пространство, который выдаёт z того же размера, что и x; z поступает в блок f от z, из латентного пространства в данные, который точно возвращает x. Пометки: точный логарифм правдоподобия, точное z, равное f обратному от x.GANнет правдоподобиянет вывода zVAEнижняя оценка (ELBO)приближённое qφ(z|x)Потокточное правдоподобиеточное z = f⁻¹(x)zG(z)Генераторx′xD(x)Дискриминатор0/1настоящийили подделка?xqφ(z|x)Энкодерzpθ(x|z)Декодерx′xf−1(x)данные → zzf(z)z → данныеxdim z= dim xАрхитектуры GAN, VAE и потока друг под другомТе же три схемы друг под другом. GAN: z в генератор G, затем в поддельный x штрих; x штрих и настоящий x в дискриминатор D, выход 0 или 1; нет логарифма правдоподобия и нет вывода z. VAE: x в энкодер q phi от z при условии x, затем в z, затем в декодер p theta от x при условии z, затем в x штрих; нижняя оценка ELBO и приближённое апостериорное распределение. Поток: x в f обратное, из данных в латентное пространство, затем в z того же размера, затем в f, из латентного пространства в данные, которое точно возвращает x; точный логарифм правдоподобия и точное z, равное f обратному от x.GANнет правдоподобия, нет вывода zГенераторДискриминаторzG(z)x′xD(x)0/1VAEнижняя оценка (ELBO), приближённый вывод zxqφ(z|x)Энкодерzpθ(x|z)Декодерx′Потокточное правдоподобие, точное z = f⁻¹(x)xf−1(x)данные → zzf(z)z → данныеx
GAN: генератор отображает шум z в сэмпл x′, а дискриминатор лишь помечает входы как настоящие или подделку, поэтому нет ни правдоподобия, ни пути назад из x в z. VAE: стохастический энкодер q_φ(z|x) и декодер p_θ(x|z) дают приближённое апостериорное распределение и нижнюю оценку (ELBO) для log p(x). Поток: одно обратимое отображение; f⁻¹ точно переводит x в z, а f переводит z обратно в x, поэтому z имеет ту же размерность, что и x, а логарифм правдоподобия точен. Стрелки следуют соглашению заметки f: z → x.
  • GAN (Goodfellow et al., 2014; см. заметку о GAN). Логарифм правдоподобия не вычисляется: генератор задаёт своё распределение только через сэмплы. Вывода латентных переменных тоже нет: ничто не отображает xx обратно в zz, и ничто не гарантирует, что генератор покрывает весь носитель (support) распределения данных, так что у настоящего xx может вовсе не быть латентного кода.
  • VAE (Kingma and Welling, 2014; см. заметку о VAE). Он оптимизирует нижнюю оценку логарифма правдоподобия (evidence lower bound, ELBO) и выводит латентные переменные через приближённое апостериорное распределение qϕ(z∣x)q_\phi(z\mid x).
  • Генеративные модели на основе потоков, например NICE (Dinh, Krueger and Bengio, 2015) и RealNVP (Dinh, Sohl-Dickstein and Bengio, 2017). Они минимизируют точный отрицательный логарифм правдоподобия, а апостериорный вывод точен: z=f−1(x)z = f^{-1}(x), детерминированный ответ.
  • Диффузионные модели замыкают список; они появятся в курсе позже и, как VAE, выводят свою целевую функцию из нижней оценки правдоподобия.
Логарифм правдоподобияВывод латентных переменных
GANнетнет
VAEнижняя оценка (ELBO)приближённый, qϕ(z∣x)q_\phi(z\mid x)
Потокточныйточный, z=f−1(x)z = f^{-1}(x)

Ключевой приём: треугольная матрица Якоби#

Всё сказанное выше держится на ∣det⁡J∣|\det J|: если его можно вычислить, плотность точна; если его нельзя вычислить дёшево, правдоподобие на практике не удаётся ни вычислять, ни использовать для обучения в масштабе изображений. Для произвольной сети это дорого. Вычисление определителя произвольной матрицы d×dd\times d стоит O(d3)O(d^3) методом Гаусса или через LU-разложение (Golub and Van Loan, 2013); наивное разложение по алгебраическим дополнениям (cofactor expansion) ещё хуже, O(d!)O(d!). Возьмём d=1000d = 1000 (у полутонового изображения 32×3232\times 32 уже d=1024d = 1024): это порядка 10910^9 операций (около 23d3≈6.7×108\tfrac23 d^3 \approx 6.7\times 10^8 для LU) на каждый пример, каждый слой и каждый шаг обучения. Для произвольной сети даже построение JJ требует dd обратных проходов, по одному на строку.

Приём, благодаря которому потоки применимы на практике, — сделать матрицу Якоби треугольной. Для (нижне)треугольной матрицы разложение определителя по первой строке и повторение этого шага для оставшегося блока оставляет только диагональ:

A=[a110⋯0a21a22⋱⋮⋮⋮⋱0an1an2⋯ann]⟹det⁡A=a11 a22⋯ann.\begin{gathered} A = \begin{bmatrix} a_{11} & 0 & \cdots & 0 \\ a_{21} & a_{22} & \ddots & \vdots \\ \vdots & \vdots & \ddots & 0 \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{bmatrix} \\ \Longrightarrow\quad \det A = a_{11}\, a_{22} \cdots a_{nn}. \end{gathered}

Итак, если JJ треугольная,

det⁡J=∏i=1dJii,log⁡∣det⁡J∣=∑i=1dlog⁡∣Jii∣,\begin{gathered} \det J = \prod_{i=1}^{d} J_{ii}, \\ \log|\det J| = \sum_{i=1}^{d} \log|J_{ii}|, \end{gathered}

что стоит O(d)O(d): около 10310^3 операций вместо примерно 10910^9, и нужны только диагональные элементы.

Треугольная JJ к тому же обратима тогда и только тогда, когда все её диагональные элементы ненулевые, а это легко гарантировать по построению. Для самого отображения это условие даёт больше. Если JfJ_f всюду нижнетреугольная, выход ii зависит только от входов 1,…,i1,\dots,i. Если каждый диагональный элемент непрерывен и всюду ненулевой, он сохраняет знак, так что каждый выход строго монотонен по своему входу. Тогда отображение инъективно и обращается по одной координате за раз: z1z_1 из x1x_1, затем z2z_2 из x2x_2 и уже известного z1z_1, и так далее. Оно является биекцией Rd\mathbb R^d, когда каждое из этих одномерных отображений сюръективно, то есть принимает все значения из R\mathbb R, как аффинные отображения zi↦eszi+tz_i \mapsto e^{s}z_i + t в слоях связи.

Рисунок

Почему треугольная матрица Якоби — ключевой приём

Нижнетреугольная матрица и стоимость её определителяНижнетреугольная матрица A размера 5 на 5: диагональные элементы от a11 до a55 выделены янтарным, элементы ниже диагонали произвольны, а все элементы выше диагонали равны 0. Рядом: det A равен произведению диагональных элементов. Два столбца в логарифмической шкале сравнивают стоимость определителя при d, равном 1000: около 10 в степени 9 операций для произвольной матрицы против 10 в степени 3 для треугольной.A =a110000a21a22000a31a32a3300a41a42a43a440a51a52a53a54a55det A = a11 · a22 ⋯ a55произведение диагональных элементовстоимость det при d = 1000:произвольная d × d: O(d³)10⁹треугольная: O(d)10³Нижнетреугольная матрица и стоимость её определителяНижнетреугольная матрица A размера 5 на 5: диагональные элементы от a11 до a55 выделены янтарным, элементы ниже диагонали произвольны, а все элементы выше диагонали равны 0. Рядом: det A равен произведению диагональных элементов. Два столбца в логарифмической шкале сравнивают стоимость определителя при d, равном 1000: около 10 в степени 9 операций для произвольной матрицы против 10 в степени 3 для треугольной.A =a110000a21a22000a31a32a3300a41a42a43a440a51a52a53a54a55det A = a11 · a22 ⋯ a55произведение диагональных элементовстоимость det при d = 1000:произвольная d × d: O(d³)10⁹треугольная: O(d)10³
Если все элементы выше диагонали равны нулю, определитель равен произведению диагональных элементов, так что log|det A| = Σ log|aᵢᵢ|. При d = 1000 определитель произвольной матрицы (через LU-разложение) стоит порядка d³ = 10⁹ операций на каждый пример и каждый слой, тогда как для треугольной нужно d = 10³ умножений. Столбцы показаны в логарифмической шкале по основанию 10.

Ноутбук#

Ноутбук о нормализующих потоках из репозитория HSE-LAMBDA Deep Generative Models (ссылка закреплена на конкретном коммите; ячейки нумеруются с 1, считая все ячейки подряд, включая текстовые) опирается на библиотеку Андрея Карпаты pytorch-normalizing-flows (Karpathy, 2019), включённую в репозиторий как nflib. В ноутбуке нет сохранённых выходов ячеек, поэтому он документирует процедуры, а не результаты.

  • Ячейка 2 записывает замену переменных с порождающей стороны, log⁡p(zK)=log⁡p(z0)−∑ilog⁡∣det⁡∂fi/∂zi−1∣\log p(z_K) = \log p(z_0) - \sum_i \log\lvert\det \partial f_i/\partial z_{i-1}\rvert.
  • Ячейки 4–5 задают три двумерных игрушечных набора данных: две луны (two moons; используется именно он), смесь четырёх гауссиан со стандартным отклонением 0.50.5 и набор точек SIGGRAPH, которому нужен файл siggraph.pkl, отсутствующий в репозитории.
  • Ячейка 7 строит модель: логистическое априорное распределение — равномерное, пропущенное через обратную сигмоиду, с log⁡pZ(z)=∑i[−log⁡(1+ezi)−log⁡(1+e−zi)]\log p_Z(z) = \sum_i\big[-\log(1 + e^{z_i}) - \log(1 + e^{-z_i})\big] (гауссовское априорное распределение закомментировано). NICE использует то же априорное распределение и предпочитает его, потому что оно даёт градиенты с лучшим поведением (Dinh, Krueger and Bengio, 2015, §3.4). Формула замены переменных верна для любой базовой плотности, так что меняется только log⁡pZ\log p_Z. Поток состоит из трёх блоков, в каждом из которых идут ActNorm, обратимая «свёртка» 1×11\times1 и слой связи на нейросетевых сплайнах (neural spline coupling; 8 интервалов сплайна, граница сплайна (tail bound) 3, ширина скрытого слоя 16); все эти слои описаны в заметке Архитектуры потоков.
  • Ячейки 9–11 обучают модель с Adam (шаг обучения 10−410^{-4}, затухание весов (weight decay) 10−510^{-5}) на функции потерь выше: zs, prior_logprob, log_det = model(x_batch), logprob = prior_logprob + log_det, loss = -torch.sum(logprob), в течение 1000 итераций, каждая на свежем батче из 128 сэмплов. Функция потерь суммируется по батчу, а не усредняется, как в L(θ)\mathcal L(\theta), что лишь масштабирует градиент. nflib называет направления наоборот по сравнению с этой заметкой: её forward идёт от данных к латентному пространству (наше f−1f^{-1}) и накапливает наше ∑ilog⁡∣det⁡∂fi−1/∂zi∣\sum_i \log\lvert\det \partial f_i^{-1}/\partial z_i\rvert, а model.sample берёт сэмплы из априорного распределения и запускает inverse (наше ff).
  • Ячейки 13–17 отображают данные в латентное пространство, а сэмплы из априорного распределения — в данные и показывают, как сетка деформируется слой за слоем. Ячейка 13 берёт точки из априорного распределения вызовом model.prior.sample([128, 2]); у априорного распределения уже две координаты, поэтому получается тензор 128×2×2128\times2\times2, и на диаграмме рассеяния оказывается 256 точек вместо 128. Это безвредно (sample((128,)) даёт задуманную форму). Ячейка 17 выполняет ещё один шаг обучения и рисует деформацию сетки один раз: её цикл на 500 шагов прерывается при k=0k = 0.
  • Ячейка 19 раскрашивает сетку по prior_logprob.exp(), то есть по pZ(f−1(x))p_Z(f^{-1}(x)) без логарифма определителя. Это ровно наивная формула из начала заметки; плотность модели — (prior_logprob + log_det).exp().

Дальше#

Потокам нужны слои, которые достаточно выразительны и при этом по построению имеют дешёвый определитель Якоби. Такие слои строит заметка Архитектуры потоков: слои связи (NICE, RealNVP), маскированные авторегрессионные слои (MAF, IAF) и обратимые свёртки 1×11\times1 из Glow, затем сплайновые слои связи, ActNorm и многомасштабные потоки для изображений и, наконец, планарные и радиальные потоки Rezende и Mohamed.

Литература#