Как мы делали краткосрочный прогноз осадков. Лекция в Яндексе +43


В начале зимы Яндекс.Погода научилась показывать, будут ли осадки в ближайшие два часа. Спустя пару месяцев тема метеопрогнозирования стала центральной на одном из мероприятий Data & Science. Среди докладчиков в тот день был Алексей Преображенский — разработчик из команды Яндекс.Погоды. Алексей рассказал о нашем алгоритме наукастинга и сверточной нейросети, лежащей в основе этого алгоритма.


Под катом — расшифровка лекции и слайды.



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

Сколько людей здесь занимаются анализом данных — участвуют в соревнованиях на Kaggle, например? Много. А кто участвует в тренировках Яндекса по машинному обучению? Столько же, отлично. Мой доклад организован примерно как тренировка. Вас ждет рассказ о том, как мы в команде Яндекс.Погоды построили наукастинг, какие алгоритмы применяли, какие данные использовали, как проводили измерения и что у нас получилось.

Что такое наукастинг, наверное, знают все, кто смотрел фильм «Назад в будущее 2». Когда док Браун выходит из машины и говорит, что дождь закончится через 5 секунд, это наукастинг. Но это наукастинг в фильмах. Наукастинг в реальной жизни — по крайней мере, в головах менеджеров — выглядит либо как уведомление человеку в виде текста или пуш-нотификации, либо как карта осадков, которая движется со временем. Задача была именно в том, чтобы разработать продукт, который бы совмещал в себе и уведомления, и карту осадков. Требовался прогноз осадков на будущей карте, плывущие облачка.

Полтора года назад, когда мы начинали, у нас не было ничего, кроме данных. В отличие от участников на Kaggle, у нас не было никакой фиксированной метрики, никаких baseline-решений. Единственное, что было, — постоянная гонка технологий, в которой мы хотели обогнать сами себя.

Первое решение — просто День сурка. Обогнать прогноз, решить, что завтра будет то же самое, что и вчера. А следующая модель должна улучшать показания предыдущей.

Что нужно для прогноза осадков? Нужны данные, радарные снимки. Нужно понимать, как в атмосфере движутся частицы, какие ветра дуют и как применять это движение к частицам. Расскажу про все три составляющих прогноза.

Первое — радарные снимки. Они бывают очень разных форматов и поступают от очень разных поставщиков. Это и просто отдельные картинки в PNG, с договоренностью, что цветом с таким-то кодом обозначается такая-то интенсивность отраженного сигнала. Это бывает GeoTIFF — картинка в формате TIFF с геоинформацией внутри самой себя, где указано, к каким координатам она относится. Либо — научный формат NetCDF.

Радары сильно отличаются по частоте обновления. Бывают радары, которые обновляются раз в 10 минут, раз в 15 минут. Самое ужасное, что данные с радаров — в отличие от относительно чистых данных для соревнований — содержат артефакты. Радары работают на физических принципах, на отражении волны, так что у них бывают слепые зоны. Причем когда маленькие фрагменты зоны видимости радиально закрыты зданиями — это еще далеко не самый тяжелый случай.

Некоторые радары закрыты примерно на 50% круга. Бывают и сделанные людьми артефакты. Например, в период бета-тестирования мы столкнулись с человеком, который купил себе Wi-Fi-точку, неправильно настроил на ней частоту и номер канала, после чего выставил ее в окно. В результате у нас над Иваново висел огромный лазерный меч в виде облака. Мы видели его на карте и ничего не могли с ним поделать, пока не вызвали Частотнадзор. Пожалуйста, если покупаете Wi-Fi-точки где-то в Китае, настраивайте их на российские частоты.

Кроме радарных данных, надо еще откуда-то взять векторное поле. Принципиально его можно взять всего из двух мест: либо проанализировав предыдущие радарные снимки и применив, скажем, алгоритмы оптического потока, либо из каких-то других источников. Например, можно воспользоваться метеомоделированием и результатом работы того же ОРФ или Метеума. Берем поле ветров и с его помощью переносим картинки, которые возвращает радар.

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

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

Третий компонент наукастинга — алгоритм применения векторного поля. Здесь наука умеет довольно многое. Мы взяли за основу thin plate spline transform — преобразование картинки, которое представляет ее в виде тонкой резиновой пластины и растягивает некоторые места. Мы параметризуем это преобразование всего несколькими опорными векторами, а все остальные вектора движения внутри картинки восстанавливаем сплайновой интерполяцией. Такая технология используется, например, в восстановлении движения по последнему кадру из видео. Известная научная работа.

Вооружившись полученными знаниями, мы начали пытаться строить прогноз. Первое решение, которое пришло в голову, — просто обучить несколько нейросетей так, чтобы первая нейросеть предсказывала ситуацию на радаре через 10 минут, вторая — через 20 минут, третья — через 30. Требование было следующим: предсказывать радарные данные где-то на два часа вперед.

Предсказания получались вот такие. Примерно тогда же, когда мы обучили 12 нейросетей, у нас появилась возможность визуализировать данные на карте. Посмотрев на скачущие облака, менеджеры сказали: это мы выпускать точно не будем. Один из них сказал: конечно, я понимаю, что это максимизирует вероятность чего-то там, но пользователю такое не объяснить — в жизни облака так не скачут.

Во время следующей итерации мы решили считать только векторное поле и умножать опорные вектора на 2 и 3, чтобы получить перенос не на 10, а на 20 минут и 30 минут соответственно.

На ближних горизонтах результаты выглядели довольно прилично, но чем дальше, тем чаще с краю появлялись артефакты. Оказалось, что в векторном поле слишком большие вектора разрывают thin plate spline, и у нас появляется второе зеркальное отражение нашей картинки. Потом отражения сливаются. На ближних горизонтах артефакт не был заметен, но на дальних проявлялся очень сильно. Из ниоткуда возникало облако.

Третьим решением стало последовательное применение одного и того же преобразования thin plate spline к одной картинке. С одной стороны, оно способствовало накоплению ошибок. Это было первое реально работающее решение, которое мы показывали при внутреннем бета-тесте. Нейросеть получала на вход шесть радарных снимков за последний час, несколькими свертками приводила их к тензору из 16 векторов 4 x 4. Cплайновое преобразование восстанавливалось по векторам и последовательно применялось к картинке для получения каждого следующего горизонта прогноза.

Решение довольно хорошо себя показало, но оставался единственный вопрос: зачем нужна нейросеть? Если красные свертки — единственная часть, которую мы обучаем, почему бы нам не вычислить векторное поле самостоятельно, алгоритмически? Так что четвертое решение, которое заметно улучшило результат, использовало явную минимизацию loss-функции.

Мы искали векторное поле, которое бы одинаково хорошо приближало переход на 10 минут в последний час. От –60 минут до –50, потом до –40 и т. д. Мы применяли это векторное поле к t0, чтобы получить прогноз на 10 минут дальше.

Алгоритмически гораздо лучше находить векторное поле с помощью минимизации. Оно быстрее работает, не требует обучения. Самое интересное — оно не требует всех данных. Можно пропустить какие-то данные — а радары довольно часто запаздывают. Мы долго думали, что же оставить — нейронные сети или алгоритмические вычисления векторного поля. Но всё победил тот самый лазерный меч в Иваново. Когда он висит над вами как дамоклов меч и зануляет вокруг себя все вектора, то облака не могут ни пересечь его, ни двигаться в одном районе с ним. Даже какого-то физического движения на картинке не происходит.

Поэтому в конечном итоге мы пришли к нейронной сети. Сейчас нейронная сеть работает и выдает предсказания, схематически ее архитектура изображена здесь. Она составлена из 12 примерно одинаковых блоков. Каждый блок последовательно строит прогноз по своему горизонту, получая на вход некоторый тензор состояния и последний радарный снимок, последнее предсказание с предыдущего горизонта.

Тензор состояния имеет довольно маленькую размерность, всего 32 x 32 на 30 каналов, но сверткой к инволюции мы получаем из него векторное поле, опорные вектора для преобразования thin plate spline. И, наоборот, сверткой к деконволюции мы получаем места, где выпадают осадки. Такая архитектура нейросети учитывает, что в каких-то местах осадки выпадают традиционно. Например, туча, налетевшая на город, прольется с большей вероятностью, чем над лесом, потому что над городом другая атмосфера, микроклимат. Там, например, попросту теплее.

От горизонта к горизонту, от блока к блоку мы передаем состояние, о котором идет речь, и попутно немного меняем его с помощью residual network. Residual — это когда мы сам тензор меняем совсем немного, прибавляя к нему измерения. Обученная часть — дельта от обучаемой части, изменение тензора.

Мы берем запомненное состояние, с помощью деконволюции делаем из него какую-то карту выпадения осадков, складываем их с облаками и двигаем их. Такова нынешняя архитектура сети. Она работает, предсказывает, и результаты получаются довольно хорошими — вы их можете увидеть на сайте.

Но они довольно хорошие с точки зрения метрик data science, ROC AUC и F1-меры, а бизнесу интересны не абстрактные циферки и кривые, которые мы рисуем. Бизнесу интересна точность этих предсказаний, точность текста о том, что дождь закончится через 10 минут 20 секунд. Перед нами сейчас стоит другая задача. Сейчас нейросеть обучается с какой-то функцией потерь. Она максимизирует вероятность правильной классификации с помощью бинарной энтропии. А на самом деле надо улучшать другие, бизнесовые метрики — не правильность классификации, а правильность определения времени начала и прекращения осадков. Исследования о том, как из бизнесовых метрик получить loss-функции для обучения нейросетей, — очень важны и интересны. Мы продолжаем развиваться в нужном направлении.

Помимо бизнесовых требований, у нас еще есть довольно много планов по развитию текущего решения. Например, в данный момент мы используем только снимки, но у нас есть огромное количество информации. Самое интересное — радиальная скорость. Радар по доплеровскому эффекту определяет не только наличие частиц в воздухе, но и их скорость. По длине отраженной волны он понимает, с какой скоростью движутся, к радару или от него. Результаты тоже можно использовать для прогнозирования векторного поля. Но к несчастью, у нас есть только радиальная скорость и только в местах, где реально находятся какие-то частицы, осадки.

Можно подмешивать векторные поля из метеомоделирования. Там есть ветра, а можно добавлять и еще что-то — например, температуру.

У нас есть рельеф, высо?ты, география land use, тип подстилающей поверхности. В городах осадки ведут себя по-другому, чем над огромным Балтийским морем. Они над ним пролетают и выпадают уже в Питере.

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

Это всё. Обо всех отличиях и сходствах между решениями соревнований на Kaggle и задач бизнеса я рассказал. Наша текущая архитектура — сверточная нейросеть. Она предсказывает не только движение, но и выпадение осадков. Спасибо.
-->


К сожалению, не доступен сервер mySQL