Диффузия и потоки
Численные решатели ОДУ
Эйлер, Хойн, Рунге–Кутта — и что означает слово «порядок», если его измерить
Зачем это в ветке про диффузию
Забегая вперёд: сэмплирование диффузионной модели — это решение дифференциального уравнения численно. Урок 060 покажет, откуда оно берётся; здесь нужен аппарат.
Задача Коши: известна производная и начальное условие, нужно значение в конце.
Три метода
Эйлер — двигаться по производной в текущей точке:
Хойн (он же метод трапеций, он же RK2) — сделать пробный шаг, посмотреть производную там и усреднить:
Рунге–Кутта 4 — четыре пробных вычисления с известными весами:
Ключевая цифра, которую стоит держать в голове: число вызовов на шаг — один, два и четыре соответственно. В диффузии это буквально число прогонов сети.
Что такое порядок и как его измерить
Метод имеет порядок , если ошибка на конце ведёт себя как . Проверяется это без всякой теории: удвоить число шагов и посмотреть, во сколько раз упала ошибка. Отношение , значит
Виджет считает именно это. Возьмите , где точный ответ , и пройдитесь по методам.
время x
- x в конце
- 2.56578
- ошибка
- 1.52e-1
- измеренный порядок
- 0.92
- разброс траекторий
- —
- разница методов
- 0.1525
Классический тест: точный ответ равен e = 2.718281828…, поэтому ошибку видно до последнего знака.
Шум выключен: столбец «измеренный порядок» осмыслен, и его стоит сравнить с 1, 2 и 4.
Измерено на , :
| метод | вызовов | ошибка при | ошибка при | измеренный порядок |
|---|---|---|---|---|
| Эйлер | ||||
| Хойн | ||||
| RK4 |
Обратите внимание, что порядок измеряется как , а не ровно : он асимптотический, и на крупном шаге проявляется не полностью. Это сам по себе полезный факт — «второй порядок» не означает, что при четырёх шагах ошибка будет квадратично мала.
Как правильно сравнивать методы
Здесь стоит поправить типичное сравнение «RK4 точнее Эйлера». Точнее при равном числе шагов, но каждый шаг стоит вчетверо больше. Честное сравнение — при равном числе вызовов :
| бюджет: 32 вызова | шагов | ошибка |
|---|---|---|
| Эйлер | ||
| Хойн | ||
| RK4 |
RK4 всё равно выигрывает, и с большим запасом. Но вывод не универсален: выигрыш высокого порядка пропадает, когда либо поле негладко, либо в задаче есть шум (урок 030), либо бюджет вызовов настолько мал, что асимптотика не наступила. Все три случая встречаются в диффузии, и поэтому DDIM с Эйлером остаётся конкурентоспособным.
Устойчивость — не то же самое, что точность
Возьмите в виджете жёсткое уравнение с четырьмя шагами. Точный ответ убывает до ; Эйлер даёт — на семь порядков не туда, да ещё с чередованием знака.
Причина не в порядке метода. Эйлер устойчив только при , то есть при для отрицательного вещественного . Это в точности то же условие , которое ограничивало шаг градиентного спуска в блоке 5, урок 040 — и не случайно: градиентный спуск и есть метод Эйлера для .
| точность | устойчивость | |
|---|---|---|
| про что | как быстро ошибка падает с | расходится ли метод вовсе |
| лечится | методом выше порядка | только уменьшением шага (или неявной схемой) |
| проявляется | лишними знаками | взрывом или колебаниями |
Различать их обязательно: увидев расходимость, повышать порядок метода бессмысленно.
Что из этого понадобится дальше
- Сэмплирование диффузии — численное интегрирование, и число вызовов сети равно числу вычислений . Отсюда все разговоры про «сколько шагов нужно».
- Порядок метода — измеримая величина, и на крупных шагах он проявляется частично.
- Сравнивать методы нужно по бюджету вызовов, а не по числу шагов.
- Устойчивость ограничивает шаг независимо от точности, и её ограничение — то же, что у градиентного спуска.
Источники
- Süli, Mayers — An Introduction to Numerical Analysis — Главы про одношаговые методы и порядок точности
- Karras и др. — Elucidating the Design Space of Diffusion-Based Generative Models — Диффузия как задача численного интегрирования, и что из этого следует
Проверки
0 из 2Порядок, бюджет и устойчивость
Отметьте все верные утверждения о численных решателях ОДУ.
Измерить порядок и множитель за шаг
Реализуйте
solve_linear(method, lam, t_end, steps)для задачи с . Метод — строка"euler","heun"или"rk4"; формулы даны в уроке. Верните[final, error, observed_order, amplification]:final— численное решение в точкеt_endприstepsшагах;error= ;observed_order= — придётся решить задачу второй раз, с удвоенным числом шагов;amplification= — во сколько раз решение умножается за один шаг.
Последняя величина устроена так специально: для линейной задачи любой из трёх методов умножает на одно и то же число каждый шаг, поэтому корень степени
stepsиз результата и есть этот множитель. Для Эйлера он обязан равняться — проверьте.Загрузка редактора…
Ctrl/⌘ + Enter