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

20 / 33 · Оценка качества

Точность и полнота для генеративных моделей

FID смешивает в одно число две разные ошибки: неправдоподобные сэмплы и пропущенные части данных. Точность и полнота их разделяют: кривая PRD по кластерам признаков, оценка двух носителей по k ближайшим соседям, её чувствительность к выбросам, а также плотность и покрытие, которые это исправляют.

Что нужно знать

Fréchet Inception Distance · LPIPS

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

Заметка о FID закончилась предупреждением: одно число оценивает два разных свойства. Генератор может ошибаться, порождая изображения, не похожие на данные, или порождая только часть того, что в данных есть, — например, лица одного возраста или в одной позе. Обе ошибки увеличивают FID, и две модели, ошибающиеся противоположным образом, могут получить одинаковый балл. Эта заметка делит балл на два, заимствуя слова из классификации: точность (precision) — доля сгенерированных сэмплов, похожих на настоящие данные, а полнота (recall) — доля настоящих данных, которую модель способна породить.

Обозначения. PP — настоящее распределение, QQ — модель, как и во всём курсе. Оба сравниваются в пространстве признаков: φ(x)\varphi(x) — эмбеддинг изображения предобученной сетью. X={x1,…,xN}X = \{x_1, \dots, x_N\} — настоящие сэмплы, Y={y1,…,yM}Y = \{y_1, \dots, y_M\} — сгенерированные, уже переведённые в признаки. B(c,r)B(c, r) — шар радиуса rr вокруг cc, а NNDk(x)\mathrm{NND}_k(x) — расстояние от xx до его kk-го ближайшего соседа в своём наборе.

Две ошибки, одно число#

Возьмём настоящие данные P=N(0,I)P = \mathcal N(0, I) на плоскости и модели Qs=N(0,s2I)Q_s = \mathcal N(0, s^2 I). FID между двумя гауссианами равен ∥μP−μQ∥2+Tr(ΣP+ΣQ−2(ΣPΣQ)1/2)\lVert\mu_P - \mu_Q\rVert^2 + \mathrm{Tr}\big(\Sigma_P + \Sigma_Q - 2(\Sigma_P\Sigma_Q)^{1/2}\big), а здесь

FID(P,Qs)=0+Tr((1+s2−2s) I)=2(1−s)2.\mathrm{FID}(P, Q_s) = 0 + \mathrm{Tr}\big((1 + s^2 - 2s)\, I\big) = 2(1 - s)^2 .

Значение зависит только от ∣1−s∣\lvert 1 - s\rvert, так что s=0.3s = 0.3 и s=1.7s = 1.7 получают одинаковый балл 2⋅0.72=0.982 \cdot 0.7^2 = 0.98. Однако первая модель сжата: её сэмплы — правдоподобные точки PP, но до внешних двух третей данных она почти не дотягивается. Круг радиуса 0.90 содержит внутреннюю треть PP, и вне его оказывается лишь e−0.81/0.18=e−4.5≈1.1%e^{-0.81/0.18} = e^{-4.5} \approx 1.1\% сэмплов модели. Вторая размыта: она дотягивается до всего, но многие её сэмплы попадают туда, где настоящих данных почти не бывает. Метрике, которая должна сказать, что именно произошло, нужны два числа.

Точность и полнота распределений#

Идеализированное определение сравнивает носители — области, где каждое распределение сосредоточивает массу:

precision=Q(supp P),recall=P(supp Q).\text{precision} = Q\big(\mathrm{supp}\,P\big), \qquad \text{recall} = P\big(\mathrm{supp}\,Q\big).

Точность — вероятность того, что сгенерированный сэмпл попадёт туда, где бывают настоящие данные; полнота — вероятность того, что настоящий сэмпл попадёт туда, где модель умеет генерировать. Если понимать носители буквально, две гауссианы выше они не различают. У невырожденной гауссианы плотность положительна на всём Rd\mathbb R^d, поэтому supp P=supp Qs=R2\mathrm{supp}\,P = \mathrm{supp}\,Q_s = \mathbb R^2, и точность и полнота равны ровно 1 при любом ss. Определение полезно как образ чего-то более слабого: области, где распределение сосредоточивает большую часть массы. В таком прочтении у сжатой модели точность близка к 1, а полнота мала; у модели, размазывающей массу повсюду, полнота близка к 1, а точность мала. Эту идею выражают три разных объекта, и их не следует путать: точные носители выше; разложение массы в кривой PRD, которое спрашивает, какая часть каждого распределения общая; и оценки по конечной выборке, которые покрывают только ту область, куда сэмплы действительно попали. Числа далее в этой заметке — значения оценок. Сжатая модель получает низкую оценку полноты потому, что почти все её 2000 сэмплов лежат внутри радиуса 0.9, и маленькие шары вокруг них не захватывают большинство настоящих точек дальше, хотя её точный носитель — вся плоскость. Носители, или области большой массы, приходится оценивать по сэмплам в пространстве признаков, где расстояния что-то значат. Два метода ниже делают это по-разному.

Кривая PRD#

Sajjadi et al. (2018) определяют точность и полноту через смеси. QQ имеет точность α\alpha при полноте β\beta относительно PP, если у них есть общая компонента μ\mu,

P=β μ+(1−β) νP,Q=α μ+(1−α) νQ,P = \beta\,\mu + (1 - \beta)\,\nu_P, \qquad Q = \alpha\,\mu + (1 - \alpha)\,\nu_Q ,

так что доля β\beta данных покрыта общей частью, а доля α\alpha массы модели лежит в ней. Для распределений на конечном множестве достижимые пары образуют кривую, которую пробегает λ>0\lambda > 0:

α(λ)=∑ωmin⁡(λP(ω), Q(ω)),β(λ)=∑ωmin⁡(P(ω), Q(ω)λ).\alpha(\lambda) = \sum_\omega \min\big(\lambda P(\omega),\, Q(\omega)\big), \qquad \beta(\lambda) = \sum_\omega \min\Big(P(\omega),\, \frac{Q(\omega)}{\lambda}\Big).

Чтобы применить это к изображениям, настоящие и сгенерированные эмбеддинги (в статье — признаки Inception) вместе кластеризуются k-means на 20 кластеров, и PP и QQ становятся двумя гистограммами по кластерам; кластеризация случайна, поэтому кривая усредняется по нескольким запускам. Каждая кривая сводится к двум числам — наибольшим вдоль неё значениям Fb=(1+b2) αβ/(b2α+β)F_b = (1 + b^2)\,\alpha\beta / (b^2 \alpha + \beta) при b=8b = 8 и b=1/8b = 1/8, где α\alpha — точность, а β\beta — полнота. F8F_8 подчёркивает полноту, F1/8F_{1/8} — точность; коэффициент в формуле равен b2=64b^2 = 64, так что «в восемь раз» описывает принятую относительную важность, а не буквальный вес.

Маленький пример. Два кластера, P=(0.5,0.5)P = (0.5, 0.5) и сжатая модель Q=(1,0)Q = (1, 0). Тогда α(λ)=min⁡(0.5λ,1)\alpha(\lambda) = \min(0.5\lambda, 1) и β(λ)=min⁡(0.5,1/λ)\beta(\lambda) = \min(0.5, 1/\lambda). При λ≤2\lambda \le 2 кривая идёт при полноте 0.5 до точности 1; дальше точность остаётся 1, а полнота падает. Модель достигает точности 1 — каждый её сэмпл лежит в кластере, которым пользуются данные, — но её полнота никогда не превышает 0.5: половина данных, второй кластер, ей недоступна.

Ближайшие соседи как оценка носителя#

Кластеры грубы: при 20 кластерах модель, покрывающая каждый кластер лишь частично, выглядит идеальной. Kynkäänniemi et al. (2019) оценивают каждый носитель напрямую как объединение шаров. Вокруг каждого настоящего сэмпла строится шар, доходящий до его kk-го ближайшего настоящего соседа; объединение этих шаров — оценка того, где живут настоящие данные. С

f(φ,Φ)={1,φ∈B(φ′,NNDk(φ′)) для некоторого φ′∈Φ,0,иначе,f(\varphi, \Phi) = \begin{cases} 1, & \varphi \in B\big(\varphi', \mathrm{NND}_k(\varphi')\big) \text{ для некоторого } \varphi' \in \Phi, \\ 0, & \text{иначе,} \end{cases}

точность — доля сгенерированных сэмплов внутри настоящей оценки, а полнота — доля настоящих сэмплов внутри сгенерированной:

precision=1M∑j=1Mf(yj,X),recall=1N∑i=1Nf(xi,Y).\text{precision} = \frac{1}{M}\sum_{j=1}^M f(y_j, X), \qquad \text{recall} = \frac{1}{N}\sum_{i=1}^N f(x_i, Y).

В статье k=3k = 3, по 50 000 сэмплов с каждой стороны и признаки второго полносвязного слоя классификатора VGG-16. Радиусы шаров подстраиваются под локальную плотность: в плотных областях шары маленькие, в разреженных — большие.

Разобранный пример: одно измерение, k = 1#

Настоящие сэмплы X={0,1,2,3}X = \{0, 1, 2, 3\}, сгенерированные Y={0.2,0.8,1.1,7}Y = \{0.2, 0.8, 1.1, 7\}, k=1k = 1. У каждого настоящего сэмпла есть сосед на расстоянии 1, так что каждый настоящий шар имеет радиус 1, а их объединение — [−1,4][-1, 4]. Три сгенерированных сэмпла лежат внутри, а 7 — нет: точность 3/4. Сгенерированные радиусы — расстояния до ближайшего сгенерированного соседа: 0.6 для 0.2, 0.3 для 0.8 и для 1.1 и 5.9 для 7. Настоящие 0 и 1 покрыты маленькими шарами вокруг 0.2 и 0.8. Настоящая 2 находится в 0.9 от 1.1, вне его шара радиуса 0.3, а настоящая 3 далека от всех трёх, но обе лежат в пределах 5.9 от выброса 7. Полнота 4/4. Уберём выброс — и полнота падает до 2/4: остальные сэмплы модели лежат между 0.2 и 1.1 и ничего не говорят о 2 и 3.

Рисунок

Шары k ближайших соседей и выброс

Точность и полнота по k ближайшим соседям в одном измеренииДве числовые прямые. Сверху отрезки радиуса 1 вокруг настоящих точек 0, 1, 2, 3; сгенерированные точки 0.2, 0.8 и 1.1 внутри, точка 7 снаружи: точность 3/4. Снизу отрезки вокруг сгенерированных точек с радиусами 0.6, 0.3, 0.3 и 5.9; отрезок выброса 7 накрывает настоящие точки 2 и 3: полнота 4/4.шары вокруг настоящих точек → точностьточность = 3/40123571013шары вокруг сгенерированных точек → полнотаполнота = 4/40123571013выброс 7: радиус 5.9Точность и полнота по k ближайшим соседям в одном измеренииДве числовые прямые. Сверху отрезки радиуса 1 вокруг настоящих точек 0, 1, 2, 3; сгенерированные точки 0.2, 0.8 и 1.1 внутри, точка 7 снаружи: точность 3/4. Снизу отрезки вокруг сгенерированных точек с радиусами 0.6, 0.3, 0.3 и 5.9; отрезок выброса 7 накрывает настоящие точки 2 и 3: полнота 4/4.шары вокруг настоящих точекточность = 3/40123571013шары вокруг сгенерированных точекполнота = 4/40123571013выброс 7: радиус 5.9
Разобранный пример из текста при k = 1: настоящие точки 0, 1, 2, 3 (серые) и сгенерированные 0.2, 0.8, 1.1, 7 (синие). Сверху вокруг каждой настоящей точки — отрезок радиуса до её ближайшей настоящей соседки, а над прямой — проверяемые сгенерированные точки: зелёная попадает хотя бы в один отрезок и засчитывается в точность, красная нет, так что точность 3/4. Снизу отрезки строятся вокруг сгенерированных точек, а проверяются настоящие: покрытые засчитываются в полноту. Изолированная точка 7 получает радиус 5.9 и одна покрывает 2 и 3: полнота 4/4, хотя модель не порождает ничего рядом с ними. Без выброса полнота была бы 2/4.

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

Плотность и покрытие#

Naeem et al. (2020) оставляют шары только вокруг настоящих сэмплов, где выбросы реже и данным можно доверять, и считают попадания вместо проверки:

density=1kM∑j=1M∑i=1N1[yj∈B(xi,NNDk(xi))],coverage=1N∑i=1N1[∃ j: yj∈B(xi,NNDk(xi))].\text{density} = \frac{1}{kM}\sum_{j=1}^M \sum_{i=1}^N \mathbb 1\big[y_j \in B(x_i, \mathrm{NND}_k(x_i))\big], \qquad \text{coverage} = \frac{1}{N}\sum_{i=1}^N \mathbb 1\big[\exists\, j:\ y_j \in B(x_i, \mathrm{NND}_k(x_i))\big].

Плотность (density) заменяет точность: вместо вопроса, лежит ли сгенерированный сэмпл в каком-нибудь настоящем шаре, она считает, во скольких, и делит на kk. Когда модель совпадает с данными, её математическое ожидание ровно 1 — при любом распределении и размерности; значения меньше 1 означают сэмплы в разреженных или пустых областях, больше 1 — сэмплы, столпившиеся в самых плотных областях. Покрытие (coverage) заменяет полноту: доля настоящих сэмплов, в чьём собственном шаре есть хотя бы один сгенерированный. Сгенерированный выброс не может его повысить, потому что попадает только в шары, принадлежащие настоящим сэмплам. Статья рекомендует k=5k = 5 и по 10 000 сэмплов с каждой стороны, что даёт ожидаемое покрытие около 0.97 для одинаковых распределений.

В одномерном примере при k=1k = 1 сгенерированные сэмплы 0.2, 0.8 и 1.1 попадают каждый в 2 настоящих шара, а 7 — ни в один, так что плотность 6/(1⋅4)=1.56/(1 \cdot 4) = 1.5: модель сваливает свои сэмплы в левую часть данных. Покрытие 3/4: шары 0, 1 и 2 содержат сгенерированный сэмпл, а шар 3 — нет. Удаление выброса оставляет покрытие равным 3/4, тогда как полнота прыгала между 4/4 и 2/4.

Снова две гауссианы#

Симуляция за рисунком берёт 2000 настоящих точек из N(0,I)\mathcal N(0, I) и по 2000 от каждой модели с фиксированным зерном генератора случайных чисел и считает баллы при k=3k = 3 для точности и полноты и k=5k = 5 для плотности и покрытия. Все они — оценки по конечной выборке; по точным носителям точность и полнота были бы равны 1 у всех трёх моделей:

МодельFIDТочностьПолнотаПлотностьПокрытие
сжатая, s=0.3s = 0.30.980.980.480.970.37
точная, s=1s = 100.970.981.000.98
размытая, s=1.7s = 1.70.980.880.990.810.90
Рисунок

Одинаковый FID, противоположные точность и полнота

Три модели против одних данныхсжатая модель, s = 0.3: FID 0.98, точность 0.98, полнота 0.48; точная модель, s = 1: FID 0.00, точность 0.97, полнота 0.98; размытая модель, s = 1.7: FID 0.98, точность 0.88, полнота 0.99.сжатая модель, s = 0.3FID 0.98точность 0.98 · полнота 0.48точная модель, s = 1FID 0.00точность 0.97 · полнота 0.98размытая модель, s = 1.7FID 0.98точность 0.88 · полнота 0.99Три модели против одних данныхсжатая модель, s = 0.3: FID 0.98, точность 0.98, полнота 0.48; точная модель, s = 1: FID 0.00, точность 0.97, полнота 0.98; размытая модель, s = 1.7: FID 0.98, точность 0.88, полнота 0.99.сжатая модель, s = 0.3FID 0.98точность 0.98 · полнота 0.48точная модель, s = 1FID 0.00точность 0.97 · полнота 0.98размытая модель, s = 1.7FID 0.98точность 0.88 · полнота 0.99
Настоящие данные — 2000 точек из N(0, I) на плоскости (серые), модели — по 2000 точек из N(0, s²I) с s = 0.3, 1 и 1.7 (цветные); на рисунке показаны первые 260 точек каждого набора. FID между гауссианами равен 2(1 − s)², то есть 0.98 и для s = 0.3, и для s = 1.7. Точность и полнота по k ближайшим соседям (k = 3) их различают: сжатая модель выдаёт только правдоподобные точки (точность 0.98), но покрывает меньше половины данных (полнота 0.48); размытая покрывает почти всё (полнота 0.99), но часть её точек лежит вне данных (точность 0.88).

Точность и полнота разделяют две модели, которые FID различить не смог: сжатая сохраняет точность и теряет половину полноты, размытая сохраняет полноту и теряет точность. Потеря точности меньше, чем подсказывает картинка, 0.88, потому что настоящие шары на краю данных велики и принимают многие далёкие сэмплы; плотность, 0.81, сообщает о той же ошибке яснее. Сжатие яснее всего показывает покрытие, 0.37: лишь у трети настоящих точек в собственной окрестности есть сгенерированный сэмпл.

Где возникает компромисс#

У многих генераторов есть ручка, меняющая одно свойство на другое. Трюк усечения (truncation trick) сэмплирует латентный код GAN из суженного распределения: BigGAN пересэмплирует латентные значения за порогом (Brock, Donahue and Simonyan, 2019), StyleGAN подтягивает промежуточный латентный вектор к его среднему. Суженные коды дают более типичные изображения, так что точность растёт, а полнота падает; Kynkäänniemi et al. (2019) прослеживают эту кривую для StyleGAN, где FID даёт по одному числу на каждое положение ручки. Поэтому точность и полноту сообщают парой или кривой по ручке, но никогда не усредняют в одно число.

Что изменилось#

FIDPRDточность / полнота по k-NNплотность / покрытие
Результатодно расстояниекривая, сводимая к F8F_8, F1/8F_{1/8}два числадва числа
Модель данныходна гауссиана в пространстве признаковгистограмма по 20 кластерамобъединение шаров k-NNобъединение шаров k-NN вокруг настоящих сэмплов
Разделяет реалистичность и покрытиенетдадада
Чувствительность к выбросамчерез средние и ковариациислабаяда, с обеих сторонгораздо меньше
Стоимостьлинейна по сэмпламk-meansвсе попарные расстояниярасстояния от настоящих до всех

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

  • Всё происходит в пространстве признаков. Признаки Inception или VGG, обученные на ImageNet, решают, что считать похожим; Kynkäänniemi et al. (2023) показывают, что FID реагирует на классы ImageNet на изображениях, и та же осторожность нужна здесь.
  • Оценки зависят от kk и размера выборки. Малое kk или мало сэмплов недооценивают носители и снижают и точность, и полноту даже у идеальной модели; опубликованные значения по умолчанию (k=3k = 3 с 50 000 сэмплов, k=5k = 5 с 10 000) на это откалиброваны.
  • Многомерные признаки. С ростом размерности расстояния до ближайших соседей концентрируются, так что шары описывают носитель менее чётко, чем на двумерной картинке.
  • Два числа — не рейтинг. Модель с большей точностью и меньшей полнотой не лучше и не хуже; что важнее, зависит от задачи.
  • Стоимость. Все попарные расстояния между 50 000 и 50 000 сэмплов — это 2.5⋅1092.5 \cdot 10^9 расстояний на одну оценку.

Итоги#

  • Одно число не отличает сжатую модель от размытой: две гауссианы с s=0.3s = 0.3 и s=1.7s = 1.7 имеют одинаковый FID 0.98.
  • Точность — доля сгенерированных сэмплов в области, где сосредоточены настоящие данные; полнота — доля настоящих сэмплов в области, где сосредоточена модель. По точным носителям обе равны 1 для любых двух невырожденных гауссиан, поэтому полезные числа — оценки по конечной выборке.
  • PRD оценивает обе по гистограммам кластеров; метод k-NN оценивает носители как объединения шаров до kk-го соседа и обманывается выбросами.
  • Плотность считает настоящие шары вокруг сгенерированных сэмплов и в среднем равна 1 у идеальной модели; покрытие — доля настоящих сэмплов, в чьём шаре есть сгенерированный. Обе используют шары только вокруг настоящих сэмплов, что делает их устойчивыми к сгенерированным выбросам.

Код#

Ни один ноутбук курса эти метрики не разбирает. Минимальная реализация на NumPy для эмбеддингов X (настоящие) и Y (сгенерированные) формы [n, d]:

import numpy as np

def kth_radius(A, k):
    d = np.linalg.norm(A[:, None] - A[None], axis=-1)
    return np.sort(d, axis=1)[:, k]          # column 0 is the point itself

def in_balls(B, A, r):                       # [len(B), len(A)]: is b in the ball around a?
    return np.linalg.norm(B[:, None] - A[None], axis=-1) <= r[None]

def precision_recall(X, Y, k=3):
    return in_balls(Y, X, kth_radius(X, k)).any(1).mean(), in_balls(X, Y, kth_radius(Y, k)).any(1).mean()

def density_coverage(X, Y, k=5):
    hits = in_balls(Y, X, kth_radius(X, k))
    return hits.sum() / (k * len(Y)), hits.any(0).mean()

С X = rng.standard_normal((2000, 2)) и Y = 0.3 * rng.standard_normal((2000, 2)) она воспроизводит первую строку таблицы с точностью до шума выборки около 0.02. Полная матрица попарных расстояний годится для нескольких тысяч сэмплов; для 50 000 расстояния считают блоками.

Дальше#

Точность, полнота, FID и IS заменяют человека, смотрящего на изображения, сетью, смотрящей на признаки. Следующая заметка возвращается к человеку: как спрашивать людей о сгенерированных изображениях, чтобы их ответы были надёжны, и как эту надёжность измерить.

Литература#