20 / 33 · Оценка качества
Точность и полнота для генеративных моделей
FID смешивает в одно число две разные ошибки: неправдоподобные сэмплы и пропущенные части данных. Точность и полнота их разделяют: кривая PRD по кластерам признаков, оценка двух носителей по k ближайшим соседям, её чувствительность к выбросам, а также плотность и покрытие, которые это исправляют.
На этой странице 13
Заметка о FID закончилась предупреждением: одно число оценивает два разных свойства. Генератор может ошибаться, порождая изображения, не похожие на данные, или порождая только часть того, что в данных есть, — например, лица одного возраста или в одной позе. Обе ошибки увеличивают FID, и две модели, ошибающиеся противоположным образом, могут получить одинаковый балл. Эта заметка делит балл на два, заимствуя слова из классификации: точность (precision) — доля сгенерированных сэмплов, похожих на настоящие данные, а полнота (recall) — доля настоящих данных, которую модель способна породить.
Обозначения. — настоящее распределение, — модель, как и во всём курсе. Оба сравниваются в пространстве признаков: — эмбеддинг изображения предобученной сетью. — настоящие сэмплы, — сгенерированные, уже переведённые в признаки. — шар радиуса вокруг , а — расстояние от до его -го ближайшего соседа в своём наборе.
Две ошибки, одно число#
Возьмём настоящие данные на плоскости и модели . FID между двумя гауссианами равен , а здесь
Значение зависит только от , так что и получают одинаковый балл . Однако первая модель сжата: её сэмплы — правдоподобные точки , но до внешних двух третей данных она почти не дотягивается. Круг радиуса 0.90 содержит внутреннюю треть , и вне его оказывается лишь сэмплов модели. Вторая размыта: она дотягивается до всего, но многие её сэмплы попадают туда, где настоящих данных почти не бывает. Метрике, которая должна сказать, что именно произошло, нужны два числа.
Точность и полнота распределений#
Идеализированное определение сравнивает носители — области, где каждое распределение сосредоточивает массу:
Точность — вероятность того, что сгенерированный сэмпл попадёт туда, где бывают настоящие данные; полнота — вероятность того, что настоящий сэмпл попадёт туда, где модель умеет генерировать. Если понимать носители буквально, две гауссианы выше они не различают. У невырожденной гауссианы плотность положительна на всём , поэтому , и точность и полнота равны ровно 1 при любом . Определение полезно как образ чего-то более слабого: области, где распределение сосредоточивает большую часть массы. В таком прочтении у сжатой модели точность близка к 1, а полнота мала; у модели, размазывающей массу повсюду, полнота близка к 1, а точность мала. Эту идею выражают три разных объекта, и их не следует путать: точные носители выше; разложение массы в кривой PRD, которое спрашивает, какая часть каждого распределения общая; и оценки по конечной выборке, которые покрывают только ту область, куда сэмплы действительно попали. Числа далее в этой заметке — значения оценок. Сжатая модель получает низкую оценку полноты потому, что почти все её 2000 сэмплов лежат внутри радиуса 0.9, и маленькие шары вокруг них не захватывают большинство настоящих точек дальше, хотя её точный носитель — вся плоскость. Носители, или области большой массы, приходится оценивать по сэмплам в пространстве признаков, где расстояния что-то значат. Два метода ниже делают это по-разному.
Кривая PRD#
Sajjadi et al. (2018) определяют точность и полноту через смеси. имеет точность при полноте относительно , если у них есть общая компонента ,
так что доля данных покрыта общей частью, а доля массы модели лежит в ней. Для распределений на конечном множестве достижимые пары образуют кривую, которую пробегает :
Чтобы применить это к изображениям, настоящие и сгенерированные эмбеддинги (в статье — признаки Inception) вместе кластеризуются k-means на 20 кластеров, и и становятся двумя гистограммами по кластерам; кластеризация случайна, поэтому кривая усредняется по нескольким запускам. Каждая кривая сводится к двум числам — наибольшим вдоль неё значениям при и , где — точность, а — полнота. подчёркивает полноту, — точность; коэффициент в формуле равен , так что «в восемь раз» описывает принятую относительную важность, а не буквальный вес.
Маленький пример. Два кластера, и сжатая модель . Тогда и . При кривая идёт при полноте 0.5 до точности 1; дальше точность остаётся 1, а полнота падает. Модель достигает точности 1 — каждый её сэмпл лежит в кластере, которым пользуются данные, — но её полнота никогда не превышает 0.5: половина данных, второй кластер, ей недоступна.
Ближайшие соседи как оценка носителя#
Кластеры грубы: при 20 кластерах модель, покрывающая каждый кластер лишь частично, выглядит идеальной. Kynkäänniemi et al. (2019) оценивают каждый носитель напрямую как объединение шаров. Вокруг каждого настоящего сэмпла строится шар, доходящий до его -го ближайшего настоящего соседа; объединение этих шаров — оценка того, где живут настоящие данные. С
точность — доля сгенерированных сэмплов внутри настоящей оценки, а полнота — доля настоящих сэмплов внутри сгенерированной:
В статье , по 50 000 сэмплов с каждой стороны и признаки второго полносвязного слоя классификатора VGG-16. Радиусы шаров подстраиваются под локальную плотность: в плотных областях шары маленькие, в разреженных — большие.
Разобранный пример: одно измерение, k = 1#
Настоящие сэмплы , сгенерированные , . У каждого настоящего сэмпла есть сосед на расстоянии 1, так что каждый настоящий шар имеет радиус 1, а их объединение — . Три сгенерированных сэмпла лежат внутри, а 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 ближайших соседей и выброс
Пример показывает слабость оценки. У изолированного сэмпла большое расстояние до соседей, а значит, большой шар, и этот шар закрепляет за своим распределением целую область пространства. Один настоящий выброс раздувает настоящий носитель и повышает точность; один сгенерированный выброс повышает полноту. Для изображений выбросы не редкость: это как раз необычные сэмплы, которые генератор выдаёт, когда ошибается.
Плотность и покрытие#
Naeem et al. (2020) оставляют шары только вокруг настоящих сэмплов, где выбросы реже и данным можно доверять, и считают попадания вместо проверки:
Плотность (density) заменяет точность: вместо вопроса, лежит ли сгенерированный сэмпл в каком-нибудь настоящем шаре, она считает, во скольких, и делит на . Когда модель совпадает с данными, её математическое ожидание ровно 1 — при любом распределении и размерности; значения меньше 1 означают сэмплы в разреженных или пустых областях, больше 1 — сэмплы, столпившиеся в самых плотных областях. Покрытие (coverage) заменяет полноту: доля настоящих сэмплов, в чьём собственном шаре есть хотя бы один сгенерированный. Сгенерированный выброс не может его повысить, потому что попадает только в шары, принадлежащие настоящим сэмплам. Статья рекомендует и по 10 000 сэмплов с каждой стороны, что даёт ожидаемое покрытие около 0.97 для одинаковых распределений.
В одномерном примере при сгенерированные сэмплы 0.2, 0.8 и 1.1 попадают каждый в 2 настоящих шара, а 7 — ни в один, так что плотность : модель сваливает свои сэмплы в левую часть данных. Покрытие 3/4: шары 0, 1 и 2 содержат сгенерированный сэмпл, а шар 3 — нет. Удаление выброса оставляет покрытие равным 3/4, тогда как полнота прыгала между 4/4 и 2/4.
Снова две гауссианы#
Симуляция за рисунком берёт 2000 настоящих точек из и по 2000 от каждой модели с фиксированным зерном генератора случайных чисел и считает баллы при для точности и полноты и для плотности и покрытия. Все они — оценки по конечной выборке; по точным носителям точность и полнота были бы равны 1 у всех трёх моделей:
| Модель | FID | Точность | Полнота | Плотность | Покрытие |
|---|---|---|---|---|---|
| сжатая, | 0.98 | 0.98 | 0.48 | 0.97 | 0.37 |
| точная, | 0 | 0.97 | 0.98 | 1.00 | 0.98 |
| размытая, | 0.98 | 0.88 | 0.99 | 0.81 | 0.90 |
Одинаковый FID, противоположные точность и полнота
Точность и полнота разделяют две модели, которые FID различить не смог: сжатая сохраняет точность и теряет половину полноты, размытая сохраняет полноту и теряет точность. Потеря точности меньше, чем подсказывает картинка, 0.88, потому что настоящие шары на краю данных велики и принимают многие далёкие сэмплы; плотность, 0.81, сообщает о той же ошибке яснее. Сжатие яснее всего показывает покрытие, 0.37: лишь у трети настоящих точек в собственной окрестности есть сгенерированный сэмпл.
Где возникает компромисс#
У многих генераторов есть ручка, меняющая одно свойство на другое. Трюк усечения (truncation trick) сэмплирует латентный код GAN из суженного распределения: BigGAN пересэмплирует латентные значения за порогом (Brock, Donahue and Simonyan, 2019), StyleGAN подтягивает промежуточный латентный вектор к его среднему. Суженные коды дают более типичные изображения, так что точность растёт, а полнота падает; Kynkäänniemi et al. (2019) прослеживают эту кривую для StyleGAN, где FID даёт по одному числу на каждое положение ручки. Поэтому точность и полноту сообщают парой или кривой по ручке, но никогда не усредняют в одно число.
Что изменилось#
| FID | PRD | точность / полнота по k-NN | плотность / покрытие | |
|---|---|---|---|---|
| Результат | одно расстояние | кривая, сводимая к , | два числа | два числа |
| Модель данных | одна гауссиана в пространстве признаков | гистограмма по 20 кластерам | объединение шаров k-NN | объединение шаров k-NN вокруг настоящих сэмплов |
| Разделяет реалистичность и покрытие | нет | да | да | да |
| Чувствительность к выбросам | через средние и ковариации | слабая | да, с обеих сторон | гораздо меньше |
| Стоимость | линейна по сэмплам | k-means | все попарные расстояния | расстояния от настоящих до всех |
Ограничения#
- Всё происходит в пространстве признаков. Признаки Inception или VGG, обученные на ImageNet, решают, что считать похожим; Kynkäänniemi et al. (2023) показывают, что FID реагирует на классы ImageNet на изображениях, и та же осторожность нужна здесь.
- Оценки зависят от и размера выборки. Малое или мало сэмплов недооценивают носители и снижают и точность, и полноту даже у идеальной модели; опубликованные значения по умолчанию ( с 50 000 сэмплов, с 10 000) на это откалиброваны.
- Многомерные признаки. С ростом размерности расстояния до ближайших соседей концентрируются, так что шары описывают носитель менее чётко, чем на двумерной картинке.
- Два числа — не рейтинг. Модель с большей точностью и меньшей полнотой не лучше и не хуже; что важнее, зависит от задачи.
- Стоимость. Все попарные расстояния между 50 000 и 50 000 сэмплов — это расстояний на одну оценку.
Итоги#
- Одно число не отличает сжатую модель от размытой: две гауссианы с и имеют одинаковый FID 0.98.
- Точность — доля сгенерированных сэмплов в области, где сосредоточены настоящие данные; полнота — доля настоящих сэмплов в области, где сосредоточена модель. По точным носителям обе равны 1 для любых двух невырожденных гауссиан, поэтому полезные числа — оценки по конечной выборке.
- PRD оценивает обе по гистограммам кластеров; метод k-NN оценивает носители как объединения шаров до -го соседа и обманывается выбросами.
- Плотность считает настоящие шары вокруг сгенерированных сэмплов и в среднем равна 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 заменяют человека, смотрящего на изображения, сетью, смотрящей на признаки. Следующая заметка возвращается к человеку: как спрашивать людей о сгенерированных изображениях, чтобы их ответы были надёжны, и как эту надёжность измерить.
Литература#
- M. S. M. Sajjadi, O. Bachem, M. Lucic, O. Bousquet, S. Gelly. Assessing Generative Models via Precision and Recall. NeurIPS, 2018.
- T. Kynkäänniemi, T. Karras, S. Laine, J. Lehtinen, T. Aila. Improved Precision and Recall Metric for Assessing Generative Models. NeurIPS, 2019.
- M. F. Naeem, S. J. Oh, Y. Uh, Y. Choi, J. Yoo. Reliable Fidelity and Diversity Metrics for Generative Models. ICML, 2020. Плотность и покрытие.
- M. Heusel, H. Ramsauer, T. Unterthiner, B. Nessler, S. Hochreiter. GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium. NeurIPS, 2017. FID.
- A. Brock, J. Donahue, K. Simonyan. Large Scale GAN Training for High Fidelity Natural Image Synthesis. ICLR, 2019. Трюк усечения.
- T. Kynkäänniemi, T. Karras, M. Aittala, T. Aila, J. Lehtinen. The Role of ImageNet Classes in Fréchet Inception Distance. ICLR, 2023.