ann2 — нейросеть ветра на произвольном рельефе (архитектура заново)
Предшественник — модуль air-nn (docs/plan/air_nn.md, docs/archive/plan/air-nn-p3.md). Решения пользователя из
air_nn.md §«Решения пользователя» действуют и здесь (ONNX в Godot нативным расширением; вход — карты + числа
погоды, поворот к ветру; выход — u, v, w, θ′, w_mech на высотах над рельефом; офлайн-решатель — единственная
физика; критерий — заменимость ρ = ошибка сети / погрешность решателя, медиана ≤ 0,5, p90 ≤ 1).
0. Итог и отложено (решение пользователя 05.10.2026)
Направление отложено. Результаты и выводы — в этом плане, tools/research/ann2/out/ (таблицы, метрики, логи
обучения, замеры) и в реестре выводов; данные прогонов и расчётов ($AIR_NN_DATA/ann2/: снимки AN-1, прогоны,
контрольные точки, bg_theta.npz) удалены 05.10 — воспроизведение командами tools/research/ann2/README.md
(данные P2 в $AIR_NN_DATA/pilot не трогались).
- AN-1: шум цели решателя 0,003–0,009 м/с ≪ ошибки сети ~0,6 м/с — предел не в цели.
- AN-2/AN-3: 2,5D-оператор (3,0 М) лучше P2 на 7–9 % в механическом режиме (0,567 против 0,624 м/с, сошедшиеся отложенные системы), при слабом ветре и на несошедшихся — как P2; переобучение после ~26k шагов на 300 рельефах.
- AN-4: проверка данных — без расхождений; Fr/N случая — эффект в пределах разброса зёрен (в данных P2 стратификация почти одна, как в P3E6); исключение конвективных (w*/U > 0,5) из обучения хуже на ~4 % — их лучше оставлять; разложенная голова (DeepONet) — 34 мс CPU 6 потоков на 96² × 13 высот (AN-3 — 167, P2 — 22) без потери точности.
- Относительная ошибка ≈ 0,22 у всех сетей (P2, P3, AN-3, AN-4) при цели 0,10–0,15. Вывод: архитектура не узкое место (как в P3); следующее при возобновлении — §5: тест на заучивание (постановка или данные), кривая обучения, разнообразие стратификации; слабый ветер — отдельная модель (§5 п. 6); в игре остаётся P2.
Решения пользователя (не обсуждаются)
- 04.10: начать архитектуру сети ветра заново; план — этот файл; первым делом — пункт 0 (предел данных).
- 04.10: торможение ветра горным массивом (долины, подветренные склоны) — реальное физическое явление; решатель остаётся эталоном, массосогласованные эвристики (WindNinja) его не заменяют.
- 04.10: критерий — ошибка ветра сети ≤ 10–15 % скорости (15 % — допустимо, 10 % — цель), вместо ρ с допуском max(0,3; 0,15|V|). Сейчас P2 — 17–30 % (AN-1).
1. Что известно (уроки air-nn)
- P2 (U-Net + FiLM, 3,22 М параметров, 9 карт 96² + 18 чисел → 91 канал = 7 величин × 13 высот):
ветер на 60 м на отложенных горах — медиана 0,62, p90 1,84 м/с; в 4 раза точнее профиля притока
(
runs/2026-10-03_p2b, сводка —air_nn_p3.md§1). - Даже на обучающих местах ошибка ≈ 0,36 м/с («ок» ~61 %) — сеть не подгоняет и чистые случаи.
- Ошибка почти не связана с признаками рельефа (R² ≤ 1,5 %), растёт с U10 (0,32 → 1,00 м/с)
(
tools/research/air_nn_pilot/p3/err_by_feature_notes.md). - P3 (кодировки: линейная база, уклоны по масштабам, подсеточный рельеф, U-FNO, сеть ×2) — выигрыша нет, все варианты 0,665–0,864 против 0,683 у контроля, ρ ≈ 1,2.
- Несошедшиеся решения решателя колеблются: p90 |ΔV| ≈ 0,9 м/с; цель для них — среднее снимков 500…1000.
- Кривая по числу мест 25→300: 0,83→0,62 м/с, ≈ −7 % на удвоение, полки нет.
- Стратификация в данных почти одна (один месяц).
2. Пункт 0 — предел данных (первым)
Вопрос: ошибка сети P2 (≈ 0,36 м/с на обучающих, 0,62 на отложенных) — это неумение сети или шум самой цели?
- Для каждого случая — разброс решателя: расхождение поздних состояний между собой и с целью (среднее снимков), по тем же точкам и высотам, что метрика P2 (ветер на 60 м и другие высоты, подъём).
- Сопоставить по случаям: ошибка P2 против разброса; доля сошедшихся / несошедшихся; зависимость от U10, стратификации, места. ρ (медиана, p90) по группам.
- Если есть доступ к решателю: на малой выборке (5–10 случаев) — досчёт до сходимости или длинное усреднение, чтобы оценить, насколько цель «среднее 500…1000» отличается от сошедшегося/долго усреднённого поля.
- Итог: таблица «ошибка P2 / разброс цели» по группам + вывод: (а) ошибка ≈ разброс → сначала чинить цель (сходимость, усреднение), архитектуру не трогать; (б) ошибка ≫ разброса → дело в сети/данных, идти к §3.
- Шлюз: итог пункта 0 — пользователю, дальше по его решению.
Итог AN-1 (04.10, docs/research/ann2_data_limit.md): вариант (б) — дело в сети, не в цели.
Пересчёт 56 случаев со снимками каждые 10 итераций (45 отложенных, 11 обучающих; 23 несошедшихся), ветер 60 м,
медианы по случаям:
- сошедшиеся: дрейф цели 0,003 м/с, ошибка P2 0,59 — в 12 раз больше;
- несошедшиеся: мгновенный разброс ≈ 0,25, но цель (среднее 11 снимков) отличается от среднего 51 снимка на 0,009; ошибка P2 0,355 — в 24 раза больше;
- сдвиг условий (U10 × 1,02, направление +1°, 12 случаев): цель смещается на 0,02–0,28, ошибка P2 0,26–1,5;
- ошибка растёт с ветром: 0,295 → 0,470 → 0,737 → 1,035 при U10 0–2 / 2–4 / 4–6 / ≥ 6 м/с (≈ 17–30 % от |V|), одинаково и на сошедшихся;
- обучающие против отложенных (сошедшиеся): 0,563 против 0,711 — недообучение и на обучающих;
- P3E8 (обучение только на сошедшихся) не помог — согласуется. Вывод: чинить цель незачем; предел — архитектура, постановка или объём обучения. Вопрос исследователя (закрыт решением 04.10 — критерий 10–15 % скорости): допуск в ρ сейчас max(0,3; 0,15|V|), а измеренный шум решателя на порядки меньше — переопределять ли критерий заменимости через физическую погрешность решателя.
3. Архитектура «2,5D-оператор» (после пункта 0)
рельеф h−локальное среднее, вода, нагрев, z0 (в системе ветра) ─► 2D энкодер-декодер (ConvNeXt-свёртки), FiLM
столб атмосферы U(z), θ(z) ─► 1D энкодер профиля ─► вектор условий (FiLM)
узкое место — внимание по грубым токенам (6²…12²; давление, подветренные волны; любой размер карты)
карта признаков F(x,y), ~64 канала
колонка × высота η: MLP(F(x,y), Fourier(η), U(η), θ(η)) → Δu_вдоль, Δu_поперёк, w, θ′, log σПринципы:
- Местность, а не квадрат: полностью свёрточная сеть, учится на вырезках 64² с полями контекста, работает на карте любого размера; окна склеиваются без швов.
- Безразмерность: явно Fr = U/(N·h), h/z_i, уклон; выход — в долях U(η) на своей высоте (а не U10) — рост ошибки с U10 указывает на неполное масштабирование.
- Вертикаль — головой по непрерывной высоте, а не 91 каналом: одна колонка даёт много примеров с общей структурой; высоты для игры выбираются в рантайме.
- Профиль атмосферы целиком через 1D энкодер вместо 18 ручных чисел (устойчивость и z_i решают «перетекание или обтекание»).
- Глобальный блок — внимание, не FNO (U-FNO в P3 на 7 % хуже).
- Голова уверенности σ, потеря Гаусса (NLL): шумные цели сами получают меньший вес; карта σ в рантайме — страж области применимости (решение 03.10).
- Одна сеть на все шаги сетки: dx — условие; окно 100/50 м получает грубый контекст сети 400 м дополнительными каналами (вместо трёх отдельных сетей).
- Мягкий штраф дивергенции массового потока в координатах вдоль рельефа, малый вес.
- Симметрия: поворот к ветру, отражение поперёк ветра — аугментация (Кориолиса нет), как в P2.
- Размер ≈ 3–4 М параметров, инференс ≈ уровень P2 (17–45 мс CPU ONNX).
Итог AN-2/AN-3 (04.10, tools/research/ann2/, прогон $AIR_NN_DATA/ann2/runs/an3_pilot): сеть 3,0 М параметров,
40 000 шагов, батч 32, lr 2e-3 (лучший из 5e-4/1e-3/2e-3 по 3000 шагов), 1,6 ч GPU. Ветер 60 м, медиана (p90), м/с:
| группа | ann2 | P2 | ок10 ann2 / P2 |
|---|---|---|---|
| (г) все | 0,530 (1,660) | 0,573 (1,717) | 25 % / 23 % |
| (г) сошедшиеся | 0,567 (1,776) | 0,624 (1,842) | 29 % / 27 % |
| (г) несошедшиеся | 0,415 (1,082) | 0,423 (1,069) | 9 % / 9 % |
| (б′) процедурные | 0,439 | 0,432 | 49 % / 50 % |
| обучающие | 0,393 | 0,444 | 33 % / 30 % |
- Лучше P2 на 7–9 % по медиане на сошедшихся и при U10 ≥ 2 м/с; при U10 0–2, на несошедшихся и процедурных — как P2. Относительная ошибка (медиана) 0,22 против 0,24 у P2 — до критерия 10–15 % далеко.
- Переобучение: потеря проверки минимальна на шаге 26 000 (2,24), к 40 000 — 2,38; лучшая точка не сохранялась.
- Поправка входа: фон θ̄(z) — из
Day.gammaслучая (bg_theta.py), а не фиксированный 3/6 К/км; Fr⁻¹ пока по фону 3 К/км. - Не сделано (идеи исполнителя): ранняя остановка/лучшая точка, lr > 2e-3, N и Fr случая в условия, больше данных/аугментаций.
3a. Расширение новыми свойствами поверхности
Поглощение света, альбедо, покров, влажность почвы, z0 — растровые карты на той же сетке. В архитектуре это просто новые входные каналы 2D энкодера: меняется только первая свёртка, новые каналы инициализируются нулями, сеть дообучается без перестройки. Физика при этом — в офлайн-решателе: он должен считать нагрев с учётом поглощения (H = H0 · cos(склон, солнце) · поглощение), набор пересчитывается (решение air-nn: пересчёт за неделю приемлем). Удобно подавать и готовый физический признак — карту потока тепла с учётом поглощения, а сырой растр — дополнительно.
4. Порядок
- Пункт 0 (§2) — исследователь, данные P2 (
/home/greg/air_nn_data/pilot). - По итогу: (а) починка цели или (б) новая архитектура на тех же данных P2, сравнение с P2 на тех же отложенных горах (деление по горным системам).
- Затем — разнообразие стратификации (разные месяцы/часы) и больше мест (кривая без полки).
5. Вопросы после AN-3 (обсуждение с пользователем 04.10)
Снимок пилота на шаге 10k из 40k (~/air_nn_data/ann2/runs/an3_pilot_peek/eval.md): ann2 везде ≈ на 10 % хуже P2,
в том числе на обучающих (ок15 37 % против 42 %) — недоучена; обе сети не подгоняют обучающие случаи (ок15 ≈ 40 %).
Слабый ветер и несошедшиеся — худшие группы у обеих (ок15 10–20 % против 31–45 %).
Чтение итога AN-3. Об архитектуре судить по сошедшимся случаям с U10 ≥ 2 м/с; слабый ветер и несошедшиеся — отдельной строкой (известный пол, см. п. 6).
Тест на заучивание — обучить на 5–10 рельефах до упора. Заучит → дело в обучении/объёме (п. 3–4); не заучит → постановка (вход, нормировка цели, данные).
Функция потерь — NLL с σ может «сдаваться» на трудных точках (раздувать σ вместо подгонки): прогон с MSE или β-NLL. Затем ёмкость и контекст: вырезки 96² вместо 64² (P2 видела 96²), сеть ~10 М, дольше.
Разделение задач (по одному прогону): только горизонтальный ветер (есть ли конкуренция с w, θ′ — тогда общий энкодер и отдельные головы); только слабый/только сильный ветер (выигрывает ли специалист — тогда смесь экспертов).
Симметрии. Используются: сдвиг (свёртки), поворот на k·90°, отражение поперёк ветра, доли U(η), высота от земли. Не до конца: остаток угла r ∈ ±45° идёт условием (cos r, sin r) — сеть учит поворот сама. Дёшево: ошибка снимка в зависимости от |r| (отдельно — слабый ветер); усреднение с отражением при применении (×2 время). Если |r| важен — выравнивание сетки точно по ветру или аугментация произвольным поворотом; замер анизотропии самого решателя (1-й порядок на сетке: один рельеф при r = 0° и r = 30°).
Слабый ветер — отдельная физическая модель (решение пользователя 04.10). При U → 0 с нагревом стационарного решения нет — течение конвективное; решатель (RANS, замыкание K(Ri)) пытается разрешить вихри конвекции на 400 м и колеблется; цель несошедшихся случаев — кадр колебаний итераций, не среднее → пол ошибки у любой сети. Слабый ветер при этом — главный режим термических полётов, выкидывать его из игры нельзя; игроку в нём важны склоновые ветры и где срываются термики, а не точное среднее поле. Поэтому:
- Модель конвективного режима: склоновые ветры по Прандтлю (слой вдоль нагретого/остывшего склона по уклону,
потоку тепла и стратификации) + конвергенция встречных склоновых потоков на гребнях/вершинах → карта источников
термиков для масштаба 2 (
air_thermals.gd: Аллен, w* по Дирдорфу — уже есть; ему от масштаба 1 нужно «где»). Без решателя и сети, дёшево в рантайме. - Переключение по режиму, не по U10: w*/U (или z_i/L Обухова) — мало → механический режим (решатель/сеть), велико → конвективная модель, между — плавное смешивание. Промежуток (ветер и конвекция сравнимы) — самый трудный, смешивание там — приближение.
- Сеть учится только в механическом режиме: случаи с большим w*/U уходят из обучения и оценки ann2 (это в основном несошедшиеся) — набор чище, мерки AN-3 не портит неопределённая цель. Вопрос «исключить ли U10 < 2–3 м/с» закрыт: исключаем по режиму.
- Задача исследователю: порог w*/U — по литературе и по нашим данным (где решатель перестаёт сходиться); прототип модели склоновых ветров и источников термиков на нескольких местах, картинки. Проверка — измерения склоновых ветров из литературы и пилоты (где на знакомых местах срываются термики в слабый ветер). LES-эталонов не делаем (решение пользователя 04.10).
- Модель конвективного режима: склоновые ветры по Прандтлю (слой вдоль нагретого/остывшего склона по уклону,
потоку тепла и стратификации) + конвергенция встречных склоновых потоков на гребнях/вершинах → карта источников
термиков для масштаба 2 (
Сетка цели. 400 м выбраны ради скорости Пикара в рантайме; сеть от этого не зависит. 1-й порядок на 400 м занижает разгон у бровки на 15–20 % — больше критерия «ок». Эталоны 25–30 м (предел рельефа SRTM ~30 м; 12,5 м + 2-й порядок сходится к Askervein): 10–20 мест × 2–3 условия, окна 6–10 км; сходимость по сетке 400/200/100/50 м против эталона → выбор сетки большого набора; эталоны — также проверка сети и дообучение (многоуровневая точность; dx — вход ann2). Сначала замер цены одного случая.
Явные представления (если п. 2–4 укажут на постановку): сжимаемость поля — главные компоненты на имеющихся полях (сколько нужно для 5 %); поле = дешёвая физическая база (потенциальное/массосогласованное, линейная теория) + остаток от сети — сначала разобрать, почему не помогла линейная база P3; сохранение массы по построению (функция тока) вместо штрафа.
Объём данных — кривая обучения на 300 рельефах (38 → 300, ошибка ≈ c + a·N^(−b)), промежуточная точка 2–3 тыс. рельефов, затем 20–30 тыс. Независимый пример — рельеф; разнообразие по Fr, h/z_i, уклону, нагреву важнее числа; с ростом набора — растущая сеть.
Скорость инференса: голова ~12× P2 (CPU, 6 потоков, 96² × 13 высот: ~260 мс против 22 мс, голова — 85 % времени); лечение — разложенная голова, как DeepONet (AN-4). Порядок: 1 → 2 → 3 (фоновые прогоны на данных P2, без нового счёта) → по итогу 4–5; 6 — параллельно (своя модель); 7 — до большого набора; 8 — только если постановка; 9 — после выбора сетки.
Итог AN-4 (04.10, tools/research/ann2/out/an4/, прогон $AIR_NN_DATA/ann2/runs/an4, лучшая точка — шаг 22 000):
- Данные: проверка 140 случаев всех групп — расхождений нет (кеш = исходные решения, повороты/отражение, θ̄, деление без пересечений, ближайшее место обучения к (г) — 57 км). Перегенерация и новый счёт решателя не нужны.
- Режим: конвективный при w*/U > 0,5 (доля несошедшихся 2 % при < 0,25 → 31 % при 0,5–0,75 → 72 % при 3–5); исключено 26 % обучения, в (г) — 161 из 720. Порог выше литературного перехода (−z_i/L ≈ 220 против 10–100) — выбран по сходимости решателя.
- Fr случая: Fr⁻¹ ×1,39 в 12/15/20 ч, в 9 ч другой; на потере — в пределах разброса от зерна.
- Скорость CPU (6 потоков, 96² × 13 высот): разложенная голова — 34 мс (голова 3,8 мс) против 167 мс у AN-3 и 22 мс у P2 (×1,6–2,1 P2); точность голова не теряет (0,646 против 0,653 на 24k шагов).
- Механические (г), медиана ветра 60 м: an4 0,640, AN-3 0,617, P2 0,682 м/с; относительная 0,22 / 0,21 / 0,23. Конвективные (г): an4 0,576 (не видела), AN-3 0,343, P2 0,342. Критерий 10–15 % — не выполнен; лучше P2 — на 6 %.
- Обучение только на механических не помогло: потеря 26 % данных перевешивает (AN-3 на всех лучше на ~4 %). Рекомендация исполнителя — обучать на всех, режим — только для оценки и переключения в рантайме.
- Открыто для пользователя: (1) вернуть конвективные случаи в обучение (режим — только оценка); (2) критерий 10–15 % не достигают ни ann2, ни P2 (0,22 / 0,23). Довод исполнителя «упираются в шум цели» противоречит AN-1 (шум 0,003–0,009 м/с ≪ ошибки 0,6) — предел, по AN-1, в сети/постановке/объёме; следующий шаг — по §5 (п. 2 заучивание, п. 3 потери и ёмкость, п. 9 объём).
Задачи
| ID | Что | Исполнитель | Статус |
|---|---|---|---|
| AN-1 | Пункт 0: предел данных (§2) | dp-researcher, Sonnet | принято: (б) дело в сети |
| AN-2 | Сеть «2,5D-оператор» (§3): код, загрузчик вырезок, обучение и оценка против P2; проба на десятки шагов | dp-researcher, Sonnet | принято (b39b16a): 3,0 М парам., проба 60 шагов — потеря ×0,72, оценка против P2 работает |
| AN-3 | Пилотный прогон обучения AN-2 на P2 (фоном, dp job) и оценка против P2 | dp-researcher, Sonnet | принято (3929092): (г) 0,530 против 0,573 у P2 (−7 %), переобучение после 26k шагов |
| AN-4 | Проверка данных; один прогон: Fr случая, только механический режим, разложенная голова; лучшая точка; против P2 и AN-3 | dp-researcher, Sonnet | принято (0a4344d): данные чисты; голова ×5 быстрее; точность ≈ AN-3, критерий — нет |