Введение

В MindsDB мы создаем платформу с открытым исходным кодом, чтобы каждый мог использовать возможности автоматизированного машинного обучения (ML) из своих баз данных. MindsDB использует обобщенную философию для решения новых и разнообразных вариантов использования в сообществе; Поскольку существует множество типов данных, с которыми вы можете работать, наша команда машинного обучения фокусируется на способах расширения нашей философии для создания надежных и надежных предикторов во многих различных областях. PyTorch - ключевой компонент нашей способности быстро выполнять итерацию и развертывать гибкий код машинного обучения.

Поскольку в реляционных базах данных все больше хранится временной информации, мы заметили, что одной из тенденций использования является потребность в точных прогнозах ([1], [2]). Недавно мы исследовали, как создать предикторы, которые могли бы совместно эффективно учитывать временные и вневременные детали, что может иметь решающее значение для получения хороших результатов.

Прогнозирование временных рядов - сложная задача, на решение которой уходят десятилетия исследований и разработок ([3], [5]). В этом сообщении блога мы рассмотрим некоторые проблемы, возникшие при расширении нашего решения AutoML для обработки широкого спектра сценариев прогнозирования в базах данных, и то, как мы их преодолеваем с помощью мощных функций и абстракций, которые PyTorch предложения.

Придумайте пример

Чтобы проиллюстрировать некоторые общие проблемы, давайте рассмотрим розничного продавца с несколькими магазинами по всему городу. В их базе данных есть подробные записи о продажах по всем магазинам в течение года. Помимо прочего, каждая транзакция содержит информацию о том, когда был приобретен каждый тип продукта, сколько единиц было продано по какой цене, а также некоторые дополнительные сведения, которые клиенты добровольно предоставили (например, адрес или возраст). Цель состоит в том, чтобы получить представление о том, как пойдут дела в следующем месяце, путем прогнозирования продаж. Это представляет собой интересную проблему с количеством элементов, когда каждая пара продукт-магазин представляет собой независимый временной ряд. С тысячами таких пар, как лучше всего управлять прогнозированием для нескольких временных рядов параллельно? Как мы можем использовать контекстную информацию? И как нам максимально использовать ресурсы? Давайте рассмотрим эти вопросы более подробно.

Несколько серий с помощью одной команды

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

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

Как мы продолжим? Нормальным подходом здесь было бы обучение разных прогнозистов для каждой из этих серий. Более амбициозный подход рассматривает сразу все серии и обучает одну модель. Последний подход желателен из-за улучшенной масштабируемости, когда количество комбинаций в подмножествах растет, и создание независимого предсказателя для каждого случая становится трудноразрешимым.

Учитывая, что эти ряды могут иметь совершенно разные диапазоны значений, как мы можем использовать все данные в нашей модели, не сталкиваясь с проблемами при обучении наших нейронных сетей? Давайте рассмотрим, как MindsDB решает эту проблему, чтобы создать унифицированный предиктор, способный выполнять обобщение для различных задач прогнозирования временных рядов.

Философия MindsDB заключается в том, чтобы преобразовывать данные в особые характеристики с помощью специализированных кодировщиков и использовать их для использования прогнозной модели, «микшера». Этот подход позволяет нам гибко комбинировать различные типы данных, такие как текст или временные ряды, вместе с категориальными или числовыми данными.

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

Этот ограниченный набор числовых последовательностей является входом для нашей архитектуры автоэнкодера, построенной с использованием слоев GRU и Linear в PyTorch. Парадигма представляет собой классическую пару кодер-декодер, где интересующий бит - это промежуточное представление, которое модель генерирует после обучения, описывающее состояние каждой серии с учетом ее последних N значений (причем N определяется пользователем). Каждому нормализатору серии доступно соответствующее обратное преобразование, чтобы мы могли декодировать обратно в исходный масштаб каждой серии.

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

Добавление контекста в микс…

К этому моменту у нас есть полезные промежуточные представления (IR) для наших временных данных. Что теперь? Напомним, что продажи - не единственная информация, имеющаяся в нашем распоряжении. Возможно, что другие данные, такие как запасы каждого продукта, могут быть учтены моделью машинного обучения для дальнейшего улучшения ее прогнозов.

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

Смеситель - это прогностическая модель, которая включает в себя каждый дескриптор, полученный из уже имеющихся данных. Смесители могут представлять собой алгоритмы повышения градиента или другие классические подходы к машинному обучению, но при работе с большим объемом данных мы обнаружили, что нейронные сети имеют преимущество. Для построения моделей глубокого обучения мы используем класс PyTorch nn.Module, так как он позволяет нам с легкостью определять настраиваемые элементы архитектуры. Остаточные связи, которые сокращают передачу информации между слоями, открывают поток, который можно рассматривать как авторегрессивный компонент (который обрабатывает нестационарную динамику). Более подробные формулировки можно найти в статье AR-Net от Facebook AI [4].

Мы постоянно исследуем новые «вкусы» миксеров, отчасти благодаря тому, что дизайн nn.Module способствует быстрому экспериментированию. Исходя из нашего опыта, один из наших следующих шагов - включить дифференцированный поиск нейронной архитектуры, чтобы еще на шаг автоматизировать создание микшера.

Расширенные функции для более эффективного использования ресурсов

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

Автоматическая смешанная точность (AMP) используется во внутренних циклах обучения кодировщиков и микшеров MindsDB. Это позволяет любому пользователю графического процессора CUDA с тензорными ядрами обучать свою модель машинного обучения с помощью чисел с плавающей запятой половинной точности, получая ускорение обучения без потери точности.

Чтобы улучшить сходимость моделей с поддержкой AMP, рекомендуется в качестве дополнения использовать градиентное масштабирование. В обоих случаях пара дополнительных строк кода torch.cuda.amp - это все, что нам действительно нужно для успешного развертывания этой техники.

Пользователи могут обучать модели на своих собственных локальных серверах, которые затем развертываются на различном оборудовании, включая машины без ускорения графического процессора. Абстракции PyTorch упрощают обработку тензоров и весов моделей в ЦП и из него. С другой стороны, мы используем DataParallel, чтобы использовать дополнительную вычислительную мощность, когда у пользователя есть несколько графических процессоров.

Эти методы, в дополнение к инструментам машинного обучения, таким как оптимизатор RAdam + Lookahead (также известный как «Ranger») и ранняя остановка, позволяют нам быстро и масштабируемо прогнозировать динамику обучения.

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

Что дальше?

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

Я надеюсь, что эта статья передала одну из прелестей открытого исходного кода: благодаря PyTorch мы находимся в гораздо лучшем положении для быстрой итерации и легкого доступа к последним достижениям в исследованиях нейронных сетей. Поскольку мы сами являемся решением с открытым исходным кодом, мы рады, что сообщество опробует нашу работу, поэтому дайте нам знать, что вы думаете! Присоединяйтесь к нам на GitHub или Slack.

- Патрисио Серда-Мардини, инженер-исследователь по машинному обучению @ команда MindsDB

Ссылки

[1] Цзе, К., Цзэн, Г., Чжоу, В., Ду, В., и Канди, Л. (2018). Прогнозирование скорости ветра с использованием ансамбля нелинейного обучения для прогнозирования временных рядов с глубоким обучением и экстремальной оптимизации. Преобразование энергии и управление, 165, 681–695.

[2] Гаспарин, А., Лукович, С., и Алиппи, К. (2019). Глубокое обучение для прогнозирования временных рядов: случай электрической нагрузки. ArXiv, abs / 1907.09207.

[3] Дики, Д., Фуллер, В. (1979). Распределение оценок для авторегрессионных временных рядов с единичным корнем. Журнал Американской статистической ассоциации, 74, 427–431.

[4] Трибе, О., Лаптев, Н., и Раджагопал, Р. (2019). AR-Net: простая нейронная сеть с авторегрессией для временных рядов. ArXiv, abs / 1911.12436.

[5] Бокс, Г.П., и Дженкинс, Г. (1970). Анализ, прогнозирование и контроль временных рядов. Вайли.