ESPNVAR review: Should Brentford's Yarmoliuk have been sent off vs. Liverpool?ESPN DeportesArsenal no puede atravesar el muro del Nottingham ForestThe Jerusalem PostTrump endorses Netanyahu days before Israeli election, warns US could face Iran alone if PM losesRTP DesportoAlverca afastado pelo Tondela com golos no prolongamentoPunchKogi LG poll: APC wins all 21 chairmanships, 239 council seatsZDF heuteEntdecken Sie das ZDF-NachrichtenstudioVanguardADC Campaign to Kwankwaso: Declare for APC if you share its agendaPopular ScienceWash your hands. There’s probably poop on them.n-tvBoss-Knall in der Bundesliga: Sportvorstand Krösche schmeißt bei Eintracht Frankfurt hinThe GuardianNottingham Forest v Arsenal: Premier League – liveThe Sydney Morning HeraldGreens insiders break cover to demand public findings in Steele-John inquiryGuardian SportTexans beat Jaguars at the last; Bears v Falcons, Ravens v Browns and more: NFL week six – live
The Daily Newsstand · Free, Always
Sunday, October 18, 2026

Нейросеть-синоптик на 110 тысяч параметров: проверка реальными метеостанциями

Translate

Всем привет! Это продолжение истории про мою модель МАЯК: маленькую нейросеть, которая по истории одной метеостанции прогнозирует температуру на неделю вперёд и при этом помещается на Raspberry Pi. В прошлых статьях я рассказывал, как появилась идея и как выглядела первая версия. С тех пор проект пережил почти полную переделку, и об этом сегодня.

Если коротко: в первой версии у меня были отличные результаты. Слишком отличные. Во второй версии я выстроил нормальный стенд проверки, добавил реальные станции вместо одного реанализа, и часть красивых чисел ушла. Зато оставшимся теперь можно верить.

Код открыт: github.com/feyra-labs/tempcast

Что такое МАЯК, если вы не читали прошлые части

Представьте, что у вас на даче или на крыше стоит самодельная метеостанция: термометр, барометр, датчик влажности, раз в час пишут показания. Хочется, чтобы она сама говорила, какая будет температура в ближайшие дни, без интернета и без внешних прогнозов.

МАЯК берёт:

  • почасовую историю этой одной точки (температура, давление, влажность, до 28 суток назад);

  • координаты и высоту.

И выдаёт прогноз на 168 часов вперёд. Не одно число на час, а 7 квантилей: 5, 10, 25, 50, 75, 90 и 95 %. То есть не «завтра в 15:00 будет +12», а «скорее всего +12, с вероятностью 90 % от +8 до +16». Для бытовых задач вроде «укрывать ли рассаду» интервал полезнее точки.

Ограничение принципиальное: модель видит только одну станцию. Она не знает, что к вам с запада идёт циклон. Поэтому чудес на неделю вперёд ждать не стоит, и ниже я покажу, где именно заканчивается её полезность.

Почему понадобилась вторая версия

Когда я перечитывал результаты первой версии, меня смутила одна строчка: на станциях, которых модель не видела при обучении, качество было лучше, чем на знакомых. Скилл на 24 часа +54 % против +48 %. Так бывает, но обычно это повод насторожиться, а не радоваться.

Дальше начались раскопки, и всплыло несколько проблем.

Временные утечки. Окна для обучения и проверки нарезались из одного ряда, и история одного окна могла заглядывать в цели соседнего. Для погоды, где сегодня сильно похоже на вчера, это заметно завышает метрики.

Климат-поле запоминало точки. В модели есть часть, которая по координатам выдаёт «нормальную» температуру для места и часа. Обучается она примерно на 270 точках, и с прежними настройками она их просто выучила. Без истории ошибка медианы на новых станциях была 8,1 °C, тогда как у обычного GRU около 3 °C. Ограничил частоты координатных признаков так, чтобы поле не могло рисовать волны короче ~5000 км, и включил сильное затухание весов.

Сравнение было нечестным. У бейзлайнов был свой протокол обучения, свои скорости обучения, разное число параметров. Выигрыш у такой GRU мало что значит.

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

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

Данные и защита от утечек

  • 350 точек на суше по решётке Фибоначчи, минимум по 3 в каждой климатической зоне Кёппена. Данные ERA5 за 10 лет через архивный API Open-Meteo.

  • Станции разбиты на роли: обучение, валидация, тест. Тестовых около 50, и модель их не видит никогда.

  • Ряд каждой станции режется на блоки с зазором 840 часов (горизонт + полная история), так что окна разных блоков физически не могут видеть цели друг друга.

  • Перед каждым этапом обучения и перед оценкой запускается автоматический чек-лист утечек. Если что-то не так, обучение не стартует.

Внешний тест на реальных станциях

Самое важное изменение. Я добавил проверку на наблюдениях GHCNh от NOAA, это реальные почасовые данные с реальных метеостанций. Модель на них не обучается вообще, только проверяется. Пока это около 70 станций в Европе.

Один контроль качества на всё

Раньше очистка данных для обучения и для устройства жила отдельно. Теперь один модуль QC: диапазоны, выбросы, скачки, залипания датчика, давление «на уровне моря» вместо станционного и так далее. Он работает в причинном режиме, то есть смотрит только в прошлое и не меняет своих решений задним числом.

Честные соперники

Все нейросети теперь:

  • примерно одного размера, 100–140 тысяч параметров;

  • обучаются по одному протоколу с одной функцией потерь;

  • проходят одинаковый подбор скорости обучения.

К GRU и DLinear добавились LRU (линейная рекуррентная сеть от DeepMind) и PatchTST (трансформер для временных рядов). LRU здесь важнее всех: у неё такая же «затухающая память», как у МАЯКа, но нет моей главной идеи с разложением на климат и аномалию. Так что сравнение с LRU проверяет, работает ли идея вообще.

Абляции, робастность, калибровка

  • Каждый модуль МАЯКа выключается по очереди, и модель переобучается с нуля.

  • Появился стенд проверки на устойчивость: он намеренно искажает входные данные (шум, пропуски, залипания, сдвиг и дрейф показаний прибора, неверные координаты) и смотрит, насколько при этом проседает прогноз.

  • Интервалы калибруются конформным методом, а на устройстве ширина интервала подстраивается на лету по фактическим промахам (адаптивная конформная калибровка, Gibbs & Candès).

Запуск на устройстве

Рантайм переписан: на устройстве нужны только numpy и onnxruntime, никакого PyTorch. Состояние станции хранится в бинарном файле на 3236 байт, пишется атомарно после каждого наблюдения и переживает перезагрузку. Общение - простые текстовые команды через stdin, ответ в JSON. Есть пример службы systemd.

Как это устроено внутри (в двух словах)

Главная идея не поменялась. Прогноз раскладывается на три слагаемых:

температура = климат места + смещение станции + аномалия погоды
  • Климат места - небольшая сеть по координатам и высоте выдаёт «нормальную» температуру на любой час года.

  • Смещение станции - у каждого термометра свой характер: стоит у стены, на солнце, в низине. Модель вычитывает это из истории и переносит на весь горизонт как константу плюс суточную составляющую.

  • Аномалия погоды - «сейчас на 4 градуса теплее нормы». Она раскладывается на 24 затухающие колебательные моды с разными временами жизни от 3 до 240 часов. Чем дальше прогноз, тем сильнее аномалия затухает, и прогноз плавно сходится к климату.

Без истории все аномалии нулевые, и модель честно выдаёт климат с широким интервалом. Она не «уверенно ошибается», а говорит «не знаю».

Подробное описание всех компонентов, формулы и ссылки на статьи — в MODELS.md и METHODS.md.

Результаты

Метрика - это скилл относительно климатологии самой станции: 0 значит «не лучше климата», 1 - идеальный прогноз, меньше нуля — хуже климата.

Станции, которых модель не видела (ERA5 с сильными аугментациями):

модель

1 ч

6 ч

24 ч

72 ч

168 ч

МАЯК

0,93

0,81

0,48

0,12

−0,05

GRU

0,90

0,80

0,46

0,07

−0,10

LRU

0,82

0,72

0,41

0,06

−0,10

PatchTST

0,93

0,75

0,40

−0,05

−0,41

DLinear

0,92

0,66

0,32

−0,15

−0,54

Затухающая персистентность

0,70

0,60

0,32

0,08

0,00

Реальные станции GHCNh:

модель

1 ч

6 ч

24 ч

72 ч

168 ч

МАЯК

0,90

0,67

0,48

0,09

−0,06

GRU

0,88

0,66

0,46

0,07

−0,10

LRU

0,67

0,48

0,20

−0,18

−0,36

PatchTST

0,90

0,61

0,41

−0,06

−0,34

Что из этого я для себя вынес:

  1. Перенос с реанализа на реальные приборы работает. На 24 часа скилл 0,48 и там и там. Средняя ошибка на сутки вперёд около 2 °C. Для меня это главный результат версии: модель, ни разу не видевшая настоящего термометра, держит качество на реальных станциях.

  2. Калибровка честная. 90-процентный интервал накрывает факт в 89–90 % случаев на всём горизонте и при этом уже, чем у соперников.

  3. Полезный горизонт - 2–3 суток, а не неделя. На 72 часа преимущество над климатом уже небольшое, на 168 часов скилл слегка отрицательный. В первой версии я писал, что модель «никогда не хуже климатологии». Это было неправдой: тогда эталоном была менее точная климатология. С эталоном, который знает многолетнюю историю конкретной станции, одна неделя наблюдений проигрывает.

  4. МАЯК против LRU - та же затухающая память, но без разложения. На реальных станциях разрыв большой: 0,48 против 0,20 на сутки. Мне кажется, это главный аргумент за саму идею.

Неудобные результаты

Об этом хочется сказать отдельно, потому что такие вещи в статьях обычно прячут.

Абляции почти ничего не показали. Я выключал по очереди сжатие состояния, паспорт станции, солнечные признаки, группы мод, нелинейную поправку, отдельные моды смещения. Скилл на сутки почти везде остался 0,48, изменения в пределах сотых. Либо эти модули дублируют друг друга, либо они просто не нужны. Пока не прогоню несколько сидов, не узнаю. Те, что не подтвердятся, выкину.

Преимущество над GRU небольшое. 0,48 против 0,46 на сутки, и доверительные интервалы перекрываются. Утверждать, что МАЯК лучше GRU, пока нельзя. Утверждать, что он лучше на дальних лидах и с калибровкой, можно с осторожностью.

Дрейф датчика — слабое место. Если термометр медленно уплывает (0,2 °C в сутки), на дальних лидах модель проседает сильно. В обучении дрейфа нет, и это осознанное решение, но проблему надо решать.

Замеров на реальной Raspberry Pi ещё нет. Память и задержка пока посчитаны на бумаге: около 96 КБ рабочей памяти с адаптивной калибровкой. Таблица с реальными замерами в README пока пустая, и я не хочу писать цифры, которых не мерил.

Что дальше

  • Замерить всё на настоящей Raspberry Pi.

  • Обучить на нескольких сидах и посчитать значимость разницы с GRU.

  • Упростить архитектуру: убрать то, что не подтвердится.

  • Либо научить модель аккуратнее сходиться к климату после трёх суток, либо честно сократить заявленный горизонт до 72 часов.

  • Добавить дрейф прибора в аугментации.

  • Расширить внешний тест за пределы Европы.

Заключение

Главный урок второй версии для меня: красивые цифры первой версии были не столько заслугой модели, сколько следствием слабой проверки. Половину времени я потратил не на архитектуру, а на то, чтобы самому себе не врать: зазоры между блоками, чек-лист утечек, одинаковый протокол для всех, реальные станции. Модель после этого стала выглядеть скромнее, но теперь я хотя бы понимаю, что она умеет.

Буду рад обсуждению в комментариях. Особенно интересно услышать:

  • метеорологов - насколько адекватен эталон «климатология станции» и как бы вы оценивали такой прогноз;

  • тех, у кого есть своя домашняя метеостанция - было бы здорово прогнать модель на реальных данных с ваших приборов;

  • ML-специалистов - что бы вы сделали с абляциями, которые ничего не показывают: резать модули сразу или сначала гонять сиды;

  • и вообще всех, кто видит, где я ещё мог себя обмануть. Критика именно такого рода помогла сделать эту версию.

Репозиторий: github.com/feyra-labs/tempcast. Звёздочки, issue и пулл-реквесты приветствуются.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.