Эфир 18.11 · Поток 318 ноября в 19:00 МСК — бесплатный практический эфир по ИИ-агентам · Живой Поток 3 стартует 23.11Эфир 18 ноября →Поток 3 (23.11)
РелизРазбор · На радарHabr AI→ оригинал

Шаги сэмплера по равному углу поворота снизили ошибку flow-модели на 30–43%

Идея простая: многошаговый сэмплер и так помнит прошлую скорость, а косинус между старой и новой скоростью показывает, насколько круто поворачивает траектория. Автор попробовал сделать из этого адаптивный шаг на модели Anima. Контроллер проиграл стандартному расписанию из-за слепого первого шага. Зато заранее построенная сетка шагов по равному углу поворота дала заметный выигрыш.

AI-обработка оригинала Habr AI; редакция Hamidun News
Шаги сэмплера по равному углу поворота снизили ошибку flow-модели на 30–43%
Источник: Habr AI. Коллаж: Hamidun News.
Слушать статью
Паспорт материала и цифры
ПараметрДанные
ПервоисточникHabr AI ↗
Главный редактор
Ключевой факт #1Ошибка на 30–43% ниже расписания ComfyUI при 8–24 вызовах сети
Контроллер «шаг по косинусу» проигрываетпервый шаг идёт вслепую
Ключевой факт #3Только Anima, 12 образцов, текстуры по LPIPS выходят хуже

Каждый шаг flow-модели при генерации картинки стоит полного прохода через большую сеть. Поэтому все хотят меньше шагов при том же качестве, и главный вопрос в том, где именно эти шаги ставить. Автор исследования на Habr проверил красивую идею: брать подсказку из того, что сэмплер и так считает бесплатно. Идея выжила только наполовину, и вторая половина оказалась практичнее первой.

Бесплатный сигнал и что он видит

Многошаговый сэмплер вроде Адамса-Башфорта хранит предыдущую скорость. Косинус между старой и новой скоростью не требует лишних вызовов сети. Если он близок к 1, траектория почти прямая, и шаг можно увеличить. Если направление резко меняется, шаг лучше раздробить.

У сигнала есть слепая зона: косинус видит поворот скорости, но не видит изменение её длины. На Anima это почти не мешает в середине траектории, где длина даёт 0,3–0,4% энергии ускорения. На концах вклад длины растёт до 8–9%, местами до 23%.

Оценка ошибки шага Эйлера E = (h/2)·|v|·θ, где θ — угол между соседними скоростями, работает хорошо. Её медианное отношение к реальной ошибке составляет 80–84%, а корреляция между юнитами (комбинациями промпта и сида) достигает 91–92%. Нужна лишь калибровочная константа.

Есть и шумовой пол. В bf16 с classifier-free guidance угол между соседними вычислениями скорости шумит примерно на 1,7°. Это округление, а не шероховатость потока. Контроллер, который целится в угол ниже этого пола, схлопывается к минимальному шагу.

Контроллер проиграл, сетка выиграла

Адаптивный контроллер h_next = h · (целевой_угол / измеренный_угол) при равном числе вызовов оказался хуже стандартного расписания. Ошибка зависела не от целевого угла, а от начального шага: 0,80 при шаге 0,06, 0,51 при 0,02 и 0,26 при 0,01. Причина в том, что на первом шаге истории нет, и контроллер слеп там, где кривизна максимальна.

Тогда автор построил статическую сетку заранее. Он усреднил темп поворота скорости по остальным 11 юнитам и расставил шаги так, чтобы на каждом шаге угол поворота был одинаковым. Затем он прогнал обычный Эйлер.

Результат: ошибка до сошедшегося решения ниже на 30–43% при 8, 12, 16 и 24 вызовах относительно стандартного расписания ComfyUI. Если добавить профиль распространения ошибки (ранняя ошибка весит в конце примерно в четыре раза больше), выигрыш доходит до 41–50%. 8 вызовов тогда дают меньшую ошибку, чем стандартное расписание при 24. На промпте с лицом сетка добирается до композиции эталона уже за 8 шагов, а стандартное расписание рисует другую.

Адаптация под конкретную картинку ничего не добавила. Сетка от одной картинки, применённая к другой, дала ту же ошибку. Значит, выигрыш приносит форма сетки, а не подстройка под траекторию.

Где это ломается

Метрика меняет картину. По LPIPS сетка выигрывает на 30–35% и побеждает в 9–11 юнитах из 12. На плоской заливке, лицах и геометрических сетках LPIPS ниже на 39–48%. Но на текстурном промпте (мех) LPIPS примерно на 16% хуже, хотя расстояние по латенту улучшилось. Сетка ставит шаги рано, где решается композиция, и мало в конце, где проступает мелкая текстура, поэтому картинка выходит более гладкой.

Ограничения автор перечисляет честно:

  • одна модель (Anima), одно разрешение, один масштаб guidance;
  • 12 юнитов, эффекты меньше 5–8% не видны;
  • гипотезы не были зафиксированы до измерений, находка про первый шаг получена post hoc;
  • проверены только Эйлер и Адамс-Башфорт 2, причём на таких сетках второй хуже Эйлера;
  • идея не новая: похожий подход предложен в CAT-Flow, с которым автор не сравнивался.

Что с этим делать

Если вы гоняете flow-модель в ComfyUI и считаете вызовы сети, не стоит верить, что стандартное расписание оптимально для малого числа шагов. Для Anima в репозитории лежат готовые списки сигм на 8, 12, 16 и 24 вызова. Их можно подать в ноду ручных сигм со стандартным сэмплером euler (576×768, CFG 5).

Для другой модели нужно снять эталонные траектории и посчитать профиль темпа поворота. На одну картинку уходит около двух минут. Сколько картинок хватит, автор не проверял. Для текстурных сцен сетку лучше сравнивать глазами, а не только по латентной метрике. Код, 30 тестов и препринт доступны в репозитории YakovSava/zero-cost-proxy-research.

Сюжет

Вопросы и ответы по материалу

Что известно по теме: бесплатный сигнал и что он видит?

Многошаговый сэмплер вроде Адамса-Башфорта хранит предыдущую скорость. Косинус между старой и новой скоростью не требует лишних вызовов сети. Если он близок к 1, траектория почти прямая, и шаг можно увеличить. Если направление резко меняется, шаг лучше раздробить. У сигнала есть слепая зона: косинус видит поворот скорости, но не видит изменение её длины. На Anima это почти не мешает в середине траектории, где длина даёт 0,3–0,4% энергии ускорения. На концах вклад длины растёт до 8–9%, местами до 23%.

Что известно по теме: контроллер проиграл, сетка выиграла?

Адаптивный контроллер h_next = h · (целевой_угол / измеренный_угол) при равном числе вызовов оказался хуже стандартного расписания. Ошибка зависела не от целевого угла, а от начального шага: 0,80 при шаге 0,06, 0,51 при 0,02 и 0,26 при 0,01. Причина в том, что на первом шаге истории нет, и контроллер слеп там, где кривизна максимальна. Тогда автор построил статическую сетку заранее. Он усреднил темп поворота скорости по остальным 11 юнитам и расставил шаги так, чтобы на каждом шаге угол поворота был одинаковым.

Что известно по теме: где это ломается?

Метрика меняет картину. По LPIPS сетка выигрывает на 30–35% и побеждает в 9–11 юнитах из 12. На плоской заливке, лицах и геометрических сетках LPIPS ниже на 39–48%. Но на текстурном промпте (мех) LPIPS примерно на 16% хуже, хотя расстояние по латенту улучшилось. Сетка ставит шаги рано, где решается композиция, и мало в конце, где проступает мелкая текстура, поэтому картинка выходит более гладкой.

ЖХ
Жемал Хамидун — CPO Alpina Digital, продакт-менеджер AlpinaGPT. Делает AI-продукты с 2019 года. Hamidun News — pet project, который вырос в production-агрегатор с 6000+ читателей.
✦ Единое AI-пространство · Nomad

Протестируйте новые LLM и мультимодальные модели в одном окне

Платформа Nomad AI (nomadnet.ai) даёт прямой доступ к Claude Opus 5.5, GPT-6, Gemini 3.1, DeepSeek и автономным агентам без VPN, зарубежных карт и зоопарка подписок.

Открыть Nomad AI →Автономный Nomad Agent
Что вы думаете?
Загружаем комментарии…