Русский
Русский
English
Статистика
Реклама

Machine learning

Как системы ИИ преображают digital-маркетинг мнение эксперта и обсуждение проектов

03.04.2021 10:09:09 | Автор: admin

Сотрудники лаборатории машинного обучения Университета ИТМО занимаются не только теорией, но и прикладными проектами. Некоторым из них удается вдохновлять участников научного и профессионального сообщества по всему миру, преображать бизнес и цифровое пространство. Такую работу ведет Media Research Group под руководством профессора Александра Фарсеева. Сегодня он рассказывает об исследованиях и проектах его команды.

Профилирование пользователей в соцсетях

В Media Research Group, которая является частью лаборатории машинного обучения Университета ИТМО, мы работаем в нескольких исследовательских направлениях. Они связаны с использованием систем искусственного интеллекта в анализе данных соцсетей и генерации синтетического мультимедийного контента. Причем все наши проекты так или иначе находят практическое применение взять хотя бы профилирование в социальных сетях.

Здесь речь идет об анализе данных о пользователях. Его цель понять, кто они, что им интересно, какой у них тип личности. Профилирование используют в социальных, маркетинговых, политических и других исследованиях.

Громкое обсуждение наших алгоритмов профилирования произошло ещё в 2017 году в связи с новостью о Дональде Трампе. На основе данных из Twitter алгоритмы сделали вывод, что Трамп холост, хотя было понятно, что он женат. Тогда эту новость обсуждали везде, даже в The Independent написали о нашей работе. Вывод о семейном статусе Трампа показался для многих спорным, но всё же, как я считаю, он помог приоткрыть истинное лицо экс-президента.

Стоит отметить, что точность алгоритма превысила 80%, то есть модель построена верно. Просто Трамп по демографии не подходил к своему психографическому поведению. Если бы вы почитали твиты Трампа, не зная, что это он, то вряд ли бы догадались, что их автор женатый мужчина в преклонном возрасте, который занимает важный политический пост.

Скорее всего, как и наш алгоритм, вы бы подумали, что это кто-то намного моложе.

Фотография: History in HD. Источник: Unsplash.comФотография: History in HD. Источник: Unsplash.com

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

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

В ряде наших исследований мы прогнозировали характеристики пользователей соцсетей по шкале MBTI (Типология Майерс Бриггс), а в одном из них решили сосредоточиться на предсказании семейного статуса пользователей, так как эта характеристика во многом определяет интересы и поведение людей. Для исследования мы использовали собранную нами ещё в 2014 году базу данных NUS-MSS, которая содержит мультимодальные данные из трёх социальных сетей (Twitter, Foursquare и Instagram) и достоверные записи о семейном статусе пользователей из трёх регионов Сингапура, Нью-Йорка и Лондона. Чтобы получить предсказательную модель с количественными значениями, мы разделили пользователей NUS-MSS на состоящих и не состоящих в браке, а затем с помощью алгоритмов выбора признаков выявили коррелирующие с семейным статусом характеристики. Экстраполируя выводы, мы применили алгоритмы выбора признаков к двум получившимся группам. Средняя точность предсказательных способностей модели по трем локациям представлена в таблице.

Наш опыт показывает, что объединение данных из двух источников в некоторых случаях может повысить точность предсказания на17%. Она учитывает не только информацию о поведении отдельного пользователя, но и похожих на него людей. Схожесть определяется по попаданию в кластеры, выявленные на основе данных из нескольких соцсетей. О спектральной кластеризации, которая является ключевым концептом в данном исследовании, можно почитать в нашей статье. Если интересно копнуть поглубже, посмотрите реализацию такой кластеризации для Java.

Это лишь верхушка айсберга возможностей систем ИИ в анализе данных из соцсетей. Некоторые облачные ИИ-платформы (например, Social Bakers или SoMin.ai, основателем которой я являюсь) способны выходить далеко за пределы персонального профилирования и использовать так называемый психографический анализ. Он заключается в выявлении скрытых личностных черт, определяющих наши повседневные решения буквально в каждом жизненном аспекте.

Генерация контента

Специалисты по маркетингу тратят десятки часов на то, чтобы подготовить несколько вариаций того или иного контента. Ведь им важно попасть в нужную аудиторию, отразить фирменный стиль, и, в конце концов, сделать сам контент привлекательным для потребителей. Ещё его необходимо адаптировать для разных каналов (материал для Хабра != пост в Facebook), что также влечет дополнительную трату времени. Как раз с решением этой проблемы связано наше второе исследовательское направление с помощью поддержки со стороны технологий машинного обучения маркетологи могут сфокусироваться на творчестве и стратегических решениях. А генерацией контента займутся автоматизированные системы.

На фотографии: Maya. Источник: Instagram.comНа фотографии: Maya. Источник: Instagram.com

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

GANs технология будущего для индустрии digital-маркетинга, других профессий и сфер деятельности. Мы используем GANs и в наших коммерческих разработках например, задействовали одну из вариаций архитектуры при проектировании первого в мире инфлюенсера, работающего на базе системы ИИ, для PUMA Asia Pacific. Мы назвали этого персонажа Maya. Она делает селфи и живёт своей обычной виртуальной жизнью. Чтобы создать её, были сопоставлены миллионы лиц из различных источников, включая Instagram. Это позволило визуализировать несколько версий лица, ставших первым шагом для создания виртуального блогера.

Однако исключительно порождающими состязательными сетями здесь не обойтись. Не могу делиться всеми техническими подробностями, так как проект коммерческий. Но я бы хотел упомянуть об инструменте, который оказался весьма полезен как в этом проекте, так и в других, связанных с профилированием. Это поиск восхождением к вершине (Hill Climbing) техника поиска оптимального решения путем пошагового изменения одного из элементов решения. Ее используют в качестве стратегии оптимизации невыпуклых моделей-ансамблей. Мы часто применяем Hill Climbing в случаях, когда у нас стоит задача подбора параметров алгоритмов машинного обучения и нет возможности перебирать все комбинации например, из-за сложности каждого прохода тренировки. В случае с Hill Climbing такая проблема решается за гораздо меньшее количество проходов, тем самым ускоряя процесс тренировки.

Также важно уметь пользоваться небольшой модификацией алгоритма Hill Climbing with Random Restart. Суть в том, что мы перезапускаем Hill Climbing много раз с различными случайными значениями точек отправления параметров, тем самым увеличивая наш шанс найти не локальный, а глобальный минимум даже для задач невыпуклой оптимизации. Очень полезная эвристика, позволяющая подбирать значения параметров быстро и с высокой вероятностью близкие к оптимальным. Реализацию техники в коде можно посмотреть здесь.

В частности, техника Hill Climbing использовалась в одном из наших первых проектов по профилированию пользователей социальных сетей. Этому проекту посвящена статья Harvesting multiple sources for user profile learning: a big data study. Здесь мы осуществляем слияние данных, моделируя источники как линейную комбинацию предсказаний моделей машинного обучения, натренированных на каждом источнике по отдельности так называемый Late Fusion Ensemble. Понятно, что соединив источники с весами 1, мы не сможем добиться наилучших результатов. Ведь текстовые данные, например, из Twitter могут быть более полезными, чем те же самые текстовые данные, только из Foursquare (предназначена для обмена точками геоданных). Вот тут-то и нужны подходы вроде Hill Climbing для того, чтобы эффективно и быстро (не перебирая все комбинации источников) найти правильные веса каждой соцсети и модальности данных для достижения хороших результатов скомбинированной модели.

Профилирование и генерация

Синтетическим контентом можно пользоваться в тандеме с профилированием. В зависимости от интересов человека, ему будет предложено наиболее привлекательное автоматически сгенерированное рекламное объявление. Допустим, фастфуд выпустил баннер с рекламой нового бургера. Мы можем сгенерировать на его основе ещё сто версий баннера и найти среди них те, которые больше нравятся аудитории. Таким образом, профилирование пользователей и генерация контента органично дополняют друг друга. И SoMin.ai на практике объединяет два этих исследовательских направления в хороший маркетинговый инструмент. Руководствуясь типом личности MBTI, который автоматически определяется с помощью анализа контента из профилей соцсетей, SoMin.ai генерирует новый контент на основе предпочтений других пользователей с аналогичным типом личности. Вот так выглядит структура платформы SoMin.ai:

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

  1. Сбор контента от брендов.

  2. Сбор контента от пользователей и сбор фидбека.

  3. Тренировка моделей профилирования и генерации контента.

  4. Генерация контента на основе типа личности.

  5. Сбор фидбека от пользователей платформы.

Более полное описание работы платформы можно найти в статье, которую мы с коллегами из лаборатории опубликовали на WSDM 2020.


Бизнес понимает потенциал данных исследовательских направлений, а Media Research Group успешно раскрывает его. Я думаю, поэтому SoMin.ai стала партнером OpenAI, а моя команда получила доступ к GPT-3 для развития рекламных алгоритмов в соцсетях. Вероятно, по той же причине SoMin.ai удостоена престижной премии от Gartner Cool Vendors Award 2020. Но это еще не все. Совсем недавно мы представили новый проект SoPop.ai. Эта платформа анализирует публикации блогеров и определяет реакцию пользователей на них. Как и SoMin.ai, она помогает компаниям искать блоги, которые могут быть использованы в рекламных целях. Кроме того, SoPop.ai сотрудничает с банком Arival, чтобы сделать следующий шаг в развитии платформы создание цифрового банка для инфлюенсеров. Такая экосистема для блогеров и компаний будет не только искать возможности для рекламы, но и улучшать контент. О технологиях, на основе которых разработана платформа в этой научной статье.

Что дальше? Виртуальные друзья, роботы на улицах? Что ж... посмотрим! Ясно одно захватывающих задач для лаборатории машинного обучения меньше точно не будет.


Наши англоязычные хабрапосты по другим темам:


Подробнее..

Перевод Оптимизация платежей в Dropbox при помощи машинного обучения

19.06.2021 16:06:42 | Автор: admin

Представьте ситуацию: вам нужно воспользоваться оплаченным (как вы думаете) сервисом и вдруг оказывается, что он отключен за неуплату. Такая неприятность портит впечатление от бренда, снижая поток прибыли, а внезапно отключенный клиент может не вернуться к сервису. К старту курса о глубоком и машинном обучении делимся переводом о том, как эту проблему решили в Dropbox, где обнаружили, что внедрение ML в обработку клиентских платежей помогает пользователям оставаться довольными и работает лучше внедрённых за 14 лет политик биллинга.


Платежи в Dropbox

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

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

Продление подписки и сбои

Обычно подписчики Dropbox платят за подписку ежемесячно или ежегодно. Если клиент дал нам полномочия снимать оплату, повторный платёж списывается с банковской карты клиента автоматически. Когда оплата проходит успешно, подписка продлевается без каких-либо действий со стороны пользователя.

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

Рисунок 1. Недобровольный отток происходит, когда истекает срок действия кредитной карты, или же она аннулирована, или на ней нет средств и т. д.Рисунок 1. Недобровольный отток происходит, когда истекает срок действия кредитной карты, или же она аннулирована, или на ней нет средств и т. д.

Чтобы определить время платежа от клиента, чья подписка не продлевается, наша платёжная платформа использовала статический набор из примерно 10 различных методов. Так сложилось исторически. Например, мы можем взимать плату с клиента каждые четыре дня, пока платёж не завершится успешно, в течение максимум 28 дней. Если платеж клиента к концу этого срока по-прежнему не выполнен, уровень его учётной записи в Dropbox понижается до бесплатной базовой учётной записи. Конечно, для активных пользователей и команд понижение уровня учётной записи создаёт неприятные впечатления, а для Dropbox недобровольный отток может обернуться упущенной выгодой.

Рисунок 2. Попытки обновленияРисунок 2. Попытки обновления

Сбои в оплате могут произойти по ряду причин. Среди них:

  • нехватка средств;

  • карта с истекшим сроком действия;

  • заблокированная карта возможно, сообщается о потере или краже;

  • непредсказуемые сбои обработки.

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

Зачем машинное обучение в работе с платежами?

Последние два года, чтобы выяснить, повлияет ли изменение времени оплаты на её успешность, Dropbox проводил A/B-тестирование. Чтобы разработать набор правил о том, когда взимать плату, эти тесты в значительной мере опирались на интуицию и знания людей в предметной области.

Команда платежей должна была вручную разделить пользователей на группы в зависимости от их признаков типа подписки, географического местоположения и т. д., а затем выполнить A/B-тест наших десяти или около того различных жёстко закодированных наборов правил, чтобы определить, какие из них лучше всего подходят для этих признаков. Затем команда платежей сохраняла оптимальный вариант политики для этой группы выставления счетов по умолчанию. Периодически команда проводила повторное тестирование, чтобы узнать, изменились ли для разных пользователей лучшие решения.

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

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

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

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

  • устранение ручного вмешательства и сложной логики на основе правил;

  • например, Повторяйте каждые X дней или Избегайте попыток оплаты в выходные;

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

  • устойчивость к изменениям клиентов и рынка;

  • увеличение общего числа успешных платежей и сокращение времени сбора платежей.

Говоря коротко, применение ML к платежам сделало счастливее и клиентов, и нас.

Как мы сделали это

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

Эксперименты проводились с различными сегментами клиентов, а конкретно начиная с отдельных клиентов и команд в Северной Америке. Мы построили модель ранжирования с градиентным бустингом, обученную на таких признаках, как типы сбоев платежей, шаблоны использования учётной записи Dropbox и характеристики типа оплаты. Модель ранжирует попытки оплаты по прогнозируемой вероятности успеха для каждого окна оплаты.

Например, мы взяли окно в 8 дней, разделив его на часовые промежутки, так, в общей сложности получилось 192 отрезка времени. Чтобы найти самый протяжённый отрезок времени для попытки обновления, мы использовали наши модели. А также экспериментировали с дневными окнами по 6 и 4 часа.

Сначала эксперименты проводились с оптимизацией каждой попытки независимо. У нас была модель, оптимизирующая решение о том, когда взимать плату с клиента после неудачной первой оплаты. Если рекомендуемая попытка модели также проваливалась, в оставшейся части окна обновления мы по умолчанию возвращались к логике правил. A/B-тесты этой комбинации проводились на отдельных сегментах пользователей в США. Для таргетинга применялся внутренний сервис развёртывания функциональности Stormcrow. Модель стала работать лучше, и мы развернули её.

Нашей целью всегда была сквозная оптимизация неудачных попыток обновления. Процесс начинался с единственной моделью, и этот факт помог подтвердить, что ML применимо к решению задач такого типа. Тем не менее мы быстро поняли, что шаблон проектирования с отдельной моделью для каждой попытки оплаты только создал более сложную систему. Например, если бы мы повторили попытку оплаты 5 раз, прежде чем платёж удался, то так получили бы 5 моделей. И это противоречило цели применения ML снижению сложности биллинговой системы.

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

Именно эта модель сегодня проходит A/B-тестирование в производстве при помощи Stormcrow со случайным набором команд участников тестирования Dropbox. Результаты пока положительные.

Predict Service

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

Когда эксперименты только начинались, мы работали с платформой платежей, чтобы загрузить и запустить модели. Из-за добавленных зависимостей архитектура сильно раздулась. Задержки прогноза в среднем составляли около двух минут.

Чтобы упростить процесс, мы воспользовались созданным и управляемым командой платформы ML сервисом Predict Service, этот сервис управляет инфраструктурой для быстрого создания, развёртывания и масштабирования процессов машинного обучения в Dropbox. Применение Predict Service помогло сократить время ожидания при генерации прогнозов модели с нескольких минут до менее 300 мс для 99 % моделей. Переход на Predict Service также обеспечил возможность легкого масштабирования и чистое разделение двух систем.

С помощью этой системы машинного обучения платёжная платформа собирает все относящиеся к клиенту сигналы, запрашивает обслуживаемую через сервис Predict модель, чтобы получить лучшее время выставления счета, таким образом устраняя все наши разработанные и закодированные за 14 лет A/B-тестирования неоптимальные политики биллинга. Рабочий процесс этой системы построен следующим образом:

Белый цвет представляет компоненты платёжной платформы. Фиолетовым цветом обозначены компоненты системы машинного обученияБелый цвет представляет компоненты платёжной платформы. Фиолетовым цветом обозначены компоненты системы машинного обучения
  1. Получение прогноза о следующем лучшем времени списания средств. Когда попытка не удалась, платформа платежей, чтобы получить следующее лучшее время, запрашивает модуль Predict. Запрос выполняется с использованием идентификатора клиента и его типа.

  2. Получение сигналов клиентов. Модуль Predict собирает последние сигналы об использовании и о платежах клиентов, а также информацию о предыдущем сбое. Эти данные сохраняются в Edgestore (основной системе хранения метаданных в Dropbox) ежедневным заданием Airflow Job.

  3. Запрос прогноза. Собранные сигналы отправляются в Predict Service через вызов GRPC, который кодирует сигналы во фрейм данных о признаках, а затем отправляет их в модель.

  4. Генерация прогноза. Модель возвращает ранжированное наилучшее время оплаты. Этот прогноз отправляется обратно в модуль Predict, в свою очередь, результаты в биллинговую политику.

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

  6. Расписание следующего платежа. Как только сервис платежей получает наилучшее время списания средств, он учитывает это время при планировании следующей попытки оплаты и сохраняет в Edgestore.

ML-операции

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

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

Бизнес-метрики

  • Коэффициент одобрения счетов. Основная метрика, которую нужно улучшить. При каждом продлении подписки в Dropbox все платежи за продление отслеживаются как часть единого счёта. Эта метрика сообщает нам, было ли обновление подписки успешным.

  • Коэффициент успешности попыток. Эта метрика помогает отслеживать успешность каждой предпринятой от имени пользователя отдельной попытки оплаты. Может быть предпринята одна, две, четыре или более попыток. Этот показатель наряду с показателем утверждения счетов помогает отслеживать, как можно быстро продлить срок действия договора с клиентом.

Внутренний мониторинг модели

Это внутренний в отношении процесса обучения и используемого инструментария комплекс мер. На основе входных данных он помогает нам определить, насколько хорошо настроена модель, а также во время её работы в производственной среде помогает выявить любые проблемы модели. Как вспомогательные для диагностики измеряются следующие показатели онлайн-модели:

  • Охват: процент клиентов, получивших рекомендации от модели, в сравнении с подходом фиксированного интервала в 4 дня.

  • Количество сделанных моделью прогнозов: количество рекомендаций, которые модель успешно выполнила без каких-либо ошибок.

  • Задержка прогнозирования: сколько времени потребовалось модели для составления каждой рекомендации.

Мониторинг инфраструктуры

Наряду с мониторингом и оповещением для платёжной платформы и сервиса Predict мы также отслеживаем следующее, чтобы определить, насколько хорошо работает инфраструктура:

  • свежесть и задержки в конвейерах данных признаков;

  • доступность и задержка сервиса Predict;

  • доступность EdgeStore.

Для мониторинга нашей модели и метрик инфраструктуры мы используем дашборды Grafana и Vortex. Для бизнес-метрик мы используем Superset. Все эти живые метрики и дашборды помогают нам проактивно отслеживать ожидаемое поведение модели, позволяя принимать соответствующие меры, когда оно отклоняется.

Ответственность за мониторинг этих показателей разделена между командой инженеров по платежам и командой прикладного машинного обучения. У нас есть руководства по устранению неисправностей с чёткими путями эскалации, помогающие дежурным инженерам отладить любые проблемы. Поскольку ML был новым для команды инженеров по платежам, мы потратили время на объяснение принципов работы систем и интерпретацию результатов модели. Это помогло двум командам успешно сотрудничать в работе над проектом и обеспечить бесперебойную работу.

Дальнейшие шаги

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

Наша модель, ориентированная на индивидуальных клиентов, в настоящее время внедрена в производство. Модель оптимизации всего цикла обновления сейчас проходит A/B-тестирование. Компания стремится распространить оптимизацию через ML на всех наших клиентов.

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

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

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Комментарий переводчика, или никто никого не обучает

24.04.2021 20:04:45 | Автор: admin

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

В таком виде мы книгу не продадим.

Ниже приведено несколько показательных примеров. Возможно, они кому-то помогут лучше разобраться в терминологии информатики и ИТ в целом.

Идиоматика ИИ

  • Термин machine learning

Усвоение (learning) - это процесс приобретения новых знаний, смыслов и поведения. Способностью усваивать знания обладают люди, животные и некоторые машины. Достижения в области machine learning не в малой степени опираются на многолетние исследования в области теорий усвоения знаний (learning theories), предметом изучения которых является процесс формирования и усвоения знаний животными (animal learning) и человеком (human learning).

Искусственные нейронные сети и целое направление под названием reinforcement learning - яркие тому примеры. Уоррен МакКаллок и Уолтер Питтс создавали свой персептрон по принципу сети нервных клеток организма, а Ричард Саттон строил свой алгоритм reinforcement learning, моделируя усвоение знаний путем проб и ошибок, заимствовав идею подкрепления из бихейвиористской психологии, где оно означает стимул, побуждающий ученика приспосабливать свое поведение в окружающей среде.

Таким образом, практическая подобласть ИИ под названием machine learning, в отличие от теорий усвоения знаний, нацелена на отыскание методов, с помощью которых машины могли бы усваивать знания автоматически без вмешательства человека, что и следует из классического определения данного термина:

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

Из всего вышесказанного непосредственно вытекает один важный терминологический вывод. Говоря machine learning, мы имеем в виду именно усвоение знаний машиной. И поэтому, судя по всему, указанный термин должен переводиться как машинное усвоение.

Интересно, что в некоторых европейских языках термин machine learning так и переводится. В испанском языке он звучит как aprendizaje automtico или aprendizaje automatizado, то есть автоматическое или автоматизированное усвоение. И такой подход отражает суть, так как в основе модели лежит алгоритм усвоения (learning algorithm), aka искатель минимумов (или максимумов) для надлежащим образом сформулированной математической функции. Добавив прилагательное machine, получим алгоритм автоматического усвоения, или, в более общем контексте (поменяв algorithm на model) модель автоматического усвоения, а не как в общепринятом ныне варианте. И эту тонкость очень важно понимать, так как она меняет знак смысла на противоположный и правильный, то есть на автоматическое усвоение машиной закономерностей.

Например, нередко можно услышать, что специалисты, дескать, обучают модели. Однако, профессионалы так не говорят, по крайней мере, за рубежом. Они говорят, что они их тренируют (train), так как для них причина очевидна - все тот же алгоритм машинного усвоения, лежащий в их основе. Очень жаль, но у исследователя данных нет никакого ореола демиурга. Никто никого не обучает :-(. Как раз наоборот. Учитывая заложенный в модель математический каркас, совершенно очевидно, что она в силу своей особенности учится сама, обновляя свои параметры, а роль исследователя данных (data scientist) в целом сводится к тому, чтобы подавать в модель предобработанные исторические данные и тренировать ее делать предсказания на новых данных. Математический каркас (framework) модели перелопачивает тонны данных и статистически (и не только) учится на них отыскивать неразличимые для человека закономерности, регулярности и шаблоны, то есть то, что в английском называется patterns, и, разумеется, делать предсказания (predictions) в отношении ранее не встречавшихся (unseen) данных.

Поразительно, но целая передовая практическая дисциплина до сих пор не имеет правильного названия!

Вот еще несколько кратких примеров в подтверждение такому пониманию. Одним из направлений МУ является representation learning, которое и по форме и по смыслу есть автоматическое усвоение представлений данных. Крайне важный для МУ гиперпараметр learning rate должен переводится, как скорость усвоения, так как обозначает темп, с которой модель усваивает задачу. А методика transfer learning, которая основывается на идее преодоления парадигмы изолированности знаний и улучшает усвоение моделью решаемой задачи за счет переноса знаний из родственной задачи, должна переводится как трансферное усвоение.

Возвращаясь к reinforcement learning, здесь речь идет о гедонистической самообучающейся системе усвоения путем проб и ошибок, которая адаптирует свое поведение с целью максимизировать подкрепление со стороны окружающей среды. Говоря проще, тут будет уместна аналогия с ослом и морковкой, где учеником является осел, а стимулом со стороны среды - морковка :). И тогда по идее данный термин должен переводиться как усвоение стимула или усвоение подкрепления.

Усвоение стимулаУсвоение стимула

А теперь бинго! Поскольку никто никого не обучает, то нет и учителя, а есть один лишь ученик, который учится самостоятельно, а все три направления в машинном усвоении должны звучать так: контролируемое усвоение (supervised learning) , то есть он учится, сверяясь с предопределенными метками, неконтролируемое усвоение (unsupervised learning), то есть, когда меток нет, и стимулируемое усвоение (reinforcement learning), то есть путем проб и ошибок под воздействием среды.

  • Термин precision

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

  • Термин scaling

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

  • Термин overfitting

Не следует выдавать этот термин за пресловутое переобучение. В машинном усвоении такого понятия как переобучение нет вообще от слова совсем. К тому же, вы уже надеюсь поняли, что никто никого не обучает. Переподгонка, а именно так этот термин должен переводиться, возникает, когда модель машинного усвоения слишком плотно прилегает к тренировочным данным и поэтому не способна давать точные предсказания на ранее невстречавшихся данных. Здесь неплохой аналогией является визит к портному: переподгонка - это когда костюм подогнан слишком плотно, и попытка почесать затылок приводит к расхождению швов на спине, а недоподгонка - когда наоборот, и рукава свисают до пола ;-)

Ярко выраженная переподгонкаЯрко выраженная переподгонка
  • Термин bias

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

  • Термин performance

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

Далее следуют несколько терминов информатики и программирования, важных для понимания их идиоматики.

Общая идиоматика

  • Термин building

В зарубежной информатике принят ряд метафор и противопоставлений, которые встречаются из текста в текст еще с конца 50-х годов прошлого века. И прежде всего, это метафора строительства программно-информационного обеспечения. Вот выдержка из культовой книги Фредерика Брукса Мифический человеко-месяц:

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

В переводе следует использовать этот термин во всех словоформах.

  • Термин implementation

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

  • Термин exploration

В зарубежной информатике глагол explore выполняет очень важную познавательную роль и часто используется в противопоставлении с глаголом exploit. Разведывание, разведка (exploration) - это поиск новых идей или новых стратегий. Эксплуатация (exploitation) - это использование существующих идей и стратегий, которые оказались успешными в прошлом. Вот что об этом пишет Дэн Саймон в своей культовой книге по эволюционным алгоритмам Evolutionary Optimization Algorithms:

Разведывание сопряжено с высоким риском; многие новые идеи приводят к пустой трате времени и тупикам. Тем не менее, разведывание также может приносить высокую отдачу; много новых идей окупаются способами, которые мы не могли себе представить. Разумный человек использует то, что он знает и что имеет, вместо того, чтобы постоянно изобретать колесо. Но разумный человек также открыт для новых идей и готов пойти на просчитанный риск. Интеллект включает в себя надлежащий баланс разведывания и эксплуатации. Правильный баланс разведывания и эксплуатации зависит от того, насколько регулярна наша окружающая среда. Если наша окружающая среда быстро меняется, то наши знания быстро устаревают, и мы не можем во многом полагаться на эксплуатацию. Однако, если наша окружающая среда весьма последовательна, то наше знание является надежным, и, возможно, не будет иметь смысла в том, чтобы испытывать слишком много новых идей.

В переводе не следует подменять этот термин и его словоформы другими словами.

  • Термин workflow

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

  • Термин image

Применительно к машинному усвоению и к информатике в целом, говоря об изображениях, речь почти всегда идет о цифровом снимке, представляемым матрицей пиксельных значений, и технических приемах его обработки на компьютере (ср. satellite image, X-ray image, images of cats and dogs). Выбор этого более конкретного варианта перевода еще обусловлен и тем, что слово снимок не является отглагольным существительным как слово изображение и поэтому не вносит двусмысленность, а также тем, что оно может использоваться атрибутивно как определение (ср. снимковые данные). В переводе следует использовать указанный вариант.

  • Термин thread

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

Нити исполненияНити исполнения

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

  • Термин concurrent

Указанный термин не следует путать с термином параллельный. Последний означает равноудаленность в любой точке пространства, тогда как конкурентный означает схождение в одном месте или в одно время. Слово concurrent складывается из приставки con (вместе) и основы occurrence (появление). К примеру в лингвистике существует термин co-occurence (коокуррентность, co-возникновение) и его разновидность concurrence, которыми обозначается частота появления двух или более слов вместе в словарном корпусе. Конкурентная программа допускает синхронизованную обработку ветвей кода, сходящихся в одной временной точке при обращении к совместным данным, тогда как параллельная программа исполняется одновременно на разных процессорах, в разных ядрах или нитях эквидистантно, не пересекаясь.

  • Термин lock

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

  • Термин service

Указанный термин в переводе как служба появился еще со времен ОС Windows 3.0 примерно в 1990 году, когда она стала многозадачной (и живет в Windows по сей день - нажмите CTRL+ALT+DEL, чтобы попасть в Диспетчер задач и взгляните на последнюю вкладку). В те годы Интернет только зарождался, а о веб-службах не было еще и речи. Сегодня термин служба (не пресловутый сервис) широко принят в русскоязычной документации среди таких гигантов ИТ как Microsoft и Google, а также IBM, HP и многих других, поэтому нет причин вводить термин-однодневку. В книгах, посвященных новейшей технологии, именуемой MLaaS (Машинное усвоение как служба), в которой модели машинного усвоения выставляются в качестве служб для обслуживания запросов, поступающих со стороны конечных пользователей, на получение модельных предсказаний, термин serving нередко встречается свернуто как обслуживание, но следует помнить, что под ним подразумевается именно модельное обслуживание запросов, aka доставка предсказаний конечным пользователям.

  • Термин software

Указанный термин за рубежом понимается, как программы и операционная информация, необходимые компьютеру (ср. https://en.wikipedia.org/wiki/Software), поэтому, по-видимому, его следует переводить точнее, как программно-информационное обеспечение, так как программа состоит из логики и данных.

Выводы

К сожалению, приходится констатировать, что вынесенное в заголовок поста утверждение близко к реальности - у нас до сих пор нет четких и выверенных терминологических стандартов. Переводы бывают переполнены англицизмами типа паттернов, разные термины источника переводятся одним термином или один термин источника в разных местах переводится по-разному, и оттого они похожи на наукообразный и полу-понятный хайп. Издательствам же приходится приспосабливаться, выбирая хайп вместо точности. Поразительно, но целая передовая практическая дисциплина до сих пор не имеет правильного названия!

Подытоживая, приведенный выше перечень ни в коем случае не является исчерпывающим и служит для того, чтобы привлечь внимание к данной проблематике специалистов в области ИТ и информатики в целом, а также инженеров ИИ, которые строят системы машинного усвоения, то есть то, что в английском языке носит название machine learning systems.

Подробнее..

Перевод Что такое machine learning?

29.04.2021 12:05:53 | Автор: admin

Данный пост содержит выдержки из одноименной статьи Дэниела Фагеллы, руководителя отдела исследований в компании Emerj от 26.02.2020. Дэниел является всемирно востребованным экспертом по последствиям ИИ по направлению конкурентных стратегий для лидеров бизнеса и государств; его услугами пользуются ООН, Всемирный банк, Интерпол и ведущие компании.

Слегка укороченный перевод данной статьи служит доказательством концепции, изложенной мной в предыдущем посте от 24.04.2021 Комментарий переводчика, или никто никого не обучает.

Главный тезис указанного поста звучал так:

Мы имеем феномен, который называется усвоением знаний человеком и животными. Этот феномен объясняется теориями усвоения знаний (в частности павловской теорией условных-безусловных рефлексов). В 60-х годах XX-го века компьютерные ученые задались вопросом о том, как создать самообучающуюся машину, и дали классическое определение такой машины (определение дано выше в посте), как способной автоматически усваивать знания из данных, не будучи для этого программируемой. То есть признавалось, что вычислительную машину, в отличие от людей и животных, которые наделены такой способностью по природе, надо еще наделить способностью усваивать знания. Это делается путем строительства специальных моделей машинного усвоения знаний, в основе которых лежит алгоритм машинного усвоения. Строительство таких моделей и алгоритмов и является предметом подобласти ИИ под названием машинное усвоение (МУ).

Приведенный ниже перевод сделан с учетом именно такого понимания термина machine learning. Если вы настроены к такому пониманию , как говорится по-аглицки, upfront враждебно то прошу не тратить своего времени на мои призывы подумать о присоединении к принятому во всем мире пониманию machine learning как машинному (автоматическому) усвоению знаний.

Итак, вот перевод. Прошу отнестись с пониманием (с) ;-). Все очепятки мои

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

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

Эта статья будет разбита на следующие ниже разделы:

  • Что такое машинное усвоение?

  • Как мы пришли к нашему определению (посредством разных точек зрения экспертов-исследователей)

  • Базовые концепции машинного усвоения

  • Визуальные представления моделей машинного усвоения

  • Как мы обеспечиваем машины способностью усваивать знания

  • Обзор трудностей и пределов машинного усвоения

  • Краткое введение в глубокое усвоение знаний

  • Цитируемые работы

  • Интервью по данной теме

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

Что такое машинное усвоение?

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

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

Как мы пришли к нашему определению

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

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

2. Машинное усвоение - это наука о том, как обеспечивать компьютеры способностью действовать без явного на то программирования Стэнфорд

3. Машинное усвоение основывается на алгоритмах, которые могут усваивать знания из данных, не опираясь в этом на программирование на основе правил -McKinsey & Co.

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

5. Область машинного усвоения стремится ответить на вопрос о том, как строить компьютерные системы, которые совершенствуются автоматически вместе с опытом, и каковы фундаментальные законы, которые управляют всеми процессами усвоения знаний? Университет Карнеги Мелона

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

Д-р Иошуа Бенжио, Монреальский университет:

Термин не должен определяться использованием отрицаний (отсюда, пункты 2 и 3 исключаются). Вот мое определение:

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

Д-р Данко Николич, CSC и Институт Макса Планка:

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

Д-р Роман Ямпольский, Университет Луисвилла:

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

Доктор Эмили Фокс, Вашингтонский университет:

Мое любимое определение - пункт 5.

Базовые концепции машинного усвоения

Существует много разных типов алгоритмов машинного усвоения знаний, сотни из которых публикуются каждый день, и они, как правило, группируются либо по стилю усвоения (т. е. контролируемое усвоение, неконтролируемое усвоение, полуконтролируемое усвоение), либо по сходству формы или функции (т. е. классификация, регрессия, дерево решений, кластеризация, глубокое усвоение и т. д.). Независимо от стиля усвоения или функции, все комбинации алгоритмов машинного усвоения знаний состоят из следующих ниже компонентов:

  • Представление (набор классификаторов или понятный компьютеру язык)

  • Оценивание (aka целевая функция/функция оценивания)

  • Оптимизация (метод поиска; нередко, например, классификатор с наивысшей оценкой; используются как готовые, так и конкретно-прикладные методы оптимизации)

Автор таблицы: д-р Педро Доминго, Вашингтонский университетАвтор таблицы: д-р Педро Доминго, Вашингтонский университет

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

Визуализации моделей машинного усвоения знаний

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

Модель на основе дерева решений:

Дерево решенийДерево решений

Модель на основе гауссовой смеси:

Гауссова смесьГауссова смесь

Нейронная сеть с отсевом

Как мы обеспечиваем машины способностью усваивать знания

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

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

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

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

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

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

Обзор трудностей и пределов машинного усвоения

Машинное усвоение знаний не может получать что-то из ничего но оно умеет получать больше из меньшего Доктор Педро Доминго, Вашингтонский университет

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

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

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

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

Глубокое усвоение и новейшие разработки в нейронных сетях

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

Международная конференция по машинному усвоению (International Conference on Machine Learning, аббр. ICML) широко считается одной из самых важных в мире. В 2019 году она проводилась в Нью-Йорке и собрала исследователей со всего мира, которые работают над решением текущих проблем в области глубокого усвоения знаний:

  1. Неконтролируемое усвоение в малых наборах данных

  2. Усвоение на основе симуляций и переносимость в реальный мир

За последнее десятилетие системы глубокого усвоения добились больших успехов в таких областях, как обнаружение и распознавание объектов, преобразование текста в речь, информационный поиск и другие. В настоящее время исследования сосредоточены на разработке эффективного машинного усвоения знаний, т. е. систем глубокого усвоения, которые могут усваивать знания еще эффективнее, с той же результативностью за меньшее время и с меньшим объемом данных, в таких передовых областях, как персонализированное здравоохранение, стимулированное усвоение знаний роботом (robot reinforcement learning), анализ настроений и другие.

Ключевые тезисы по применению машинного усвоения знаний

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

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

  • Причина большинства случаев плохой работы алгоритмов связана с наличием проблем в тренировочных данных (например, недостаточность/искаженность данных; зашумленность данных; или недостаточное число признаков, которые описывают данные, для принятия решений

  • Из простоты не следует точность (согласно Доминго) между числом модельных параметров и склонностью к переподгонке нет заданной связи

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

  • Независимо от того, как мы называем данные - причинно-следственными или коррелятивными, - более важным моментом является предсказание последствий наших действий

  • Следует всегда откладывать порцию тренировочных данных в сторону для целей перекрестной валидации, если хотите, чтобы выбранный вами классификатор или алгоритм усвоения хорошо работал на свежих данных

Цитируемые работы

1 http://homes.cs.washington.edu/~pedrod/papers/cacm12.pd

2 http://videolectures.net/deeplearning2016_precup_machine_learning/

3 http://www.aaai.org/ojs/index.php/aimagazine/article/view/2367/2272

4 https://research.facebook.com/blog/facebook-researchers-focus-on-the-most-challenging-machine-learning-questions-at-icml-2016/

5 https://sites.google.com/site/dataefficientml/

6 http://www.cl.uni-heidelberg.de/courses/ws14/deepl/BengioETAL12.pdf

Интервью в Emerj по темам, связанным с машинным усвоением знаний

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

Выводы

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

Подробнее..

KotlinDL 0.2 Functional API, зоопарк моделей c ResNet и MobileNet, DSL для обработки изображений

25.05.2021 12:05:50 | Автор: admin

Представляем вам версию 0.2 библиотеки глубокого обучения KotlinDL.

KotlinDL 0.2 теперь доступен на Maven Central (до этого он лежал на bintray, но закатилось солнышко земли опенсорсной). Появилось столько всего нового: новые слои, специальный DSL для препроцессинга изображений, новые типы датасетов, зоопарк моделей с несколькими моделями из семейства ResNet, MobileNet и старой доброй моделью VGG (рабочая лошадка, впрочем).

В этой статье мы коснемся самых главных изменений релиза 0.2. Полный список изменений доступен по ссылке.

Functional API

Прошлая версия библиотеки позволяла описывать нейронные сети лишь при помощи Sequential API. Например, используя метод Sequential.of(..), вы могли легко описать модель как последовательность слоев и построить VGG-подобную модель.

Однако с 2014 года (эпохи взлета и расцвета подобных архитектур) много воды утекло, и было создано множество новых нейросетей. В частности, стандартным подходом стало использование так называемых остаточных нейросетей (Residual Neural Networks или ResNet), которые решают проблемы исчезающих градиентов (vanishing gradients) и, напротив, взрывающихся градиентов (exploding gradients) а значит, и проблемы деградации обучения нейросети. Подобные архитектуры невозможно описать в виде Sequential API их корректнее представлять в виде направленного ациклического графа (Directed Acyclic Graph). Для задания таких графов мы добавили в версии 0.2 новый Functional API, который позволяет нам описывать модели, подобные ResNet или MobileNet.

Ну что же, давайте построим некое подобие ResNet. Нейросеть будет обучаться на датасете FashionMnist (небольшие изображения модных вещей). Черно-белые изображения размером 28х28 отлично подойдут на старте работы с нейросетями.

val (train, test) = fashionMnist()val inputs = Input(28, 28, 1)val conv1 = Conv2D(32)(inputs)val conv2 = Conv2D(64)(conv1)val maxPool = MaxPool2D(poolSize = intArrayOf(1, 3, 3, 1),strides = intArrayOf(1, 3, 3, 1))(conv2)val conv3 = Conv2D(64)(maxPool)val conv4 = Conv2D(64)(conv3)val add1 = Add()(conv4, maxPool)val conv5 = Conv2D(64)(add1)val conv6 = Conv2D(64)(conv5)val add2 = Add()(conv6, add1)val conv7 = Conv2D(64)(add2)val globalAvgPool2D = GlobalAvgPool2D()(conv7)val dense1 = Dense(256)(globalAvgPool2D)val outputs = Dense(10, activation = Activations.Linear)(dense1)val model = Functional.fromOutput(outputs)model.use {it.compile(optimizer = Adam(),loss = Losses.SOFT_MAX_CROSS_ENTROPY_WITH_LOGITS,metric = Metrics.ACCURACY)it.summary()it.fit(dataset = train, epochs = 3, batchSize = 1000)val accuracy = it.evaluate(dataset = test, batchSize = 1000).metrics[Metrics.ACCURACY]println("Accuracy after: $accuracy")}

Перед вами вывод метода summary(), описывающий архитектуру только что созданной нами модели.

Некоторые не любят сухие отчеты и предпочитают диаграммы. В нашем случае диаграмма типична для всех представителей славного семейства ResNet.

Если вы знакомы с фреймворком Keras, то без особого труда сможете перенести модели, описанные при помощи Functional API, в Keras, используя KotlinDL.

Коллекция предварительно тренированных моделей ResNet и MobileNet

Начиная с релиза 0.2, в Kotlin DL появляется зоопарк моделей (или Model Zoo). По сути, это коллекция моделей с весами, полученными в ходе обучения на большом датасете изображений (ImageNet).

Зачем нужна такая коллекция моделей? Дело в том, что современные сверхточные нейросети могут иметь сотни слоев и миллионы параметров, обновляемых многократно в течении каждой итерации обучения. Тренировка моделей до приемлемого уровня точности (7080%) на таком большом датасете, как ImageNet, может занимать сотни и тысячи часов вычислительного времени большого кластера из видеокарт.

Зоопарк моделей позволяет вам пользоваться уже готовыми и натренированными моделями (вам не придется тренировать их с нуля каждый раз, когда они вам нужны). Вы можете использовать такую модель непосредственно для предсказаний. Также вы можете применить ее для дотренировки части модели на небольшой порции входных данных это весьма распространненная техника при использовании переноса обучения (Transfer Learning). Это может занять десятки минут на одной видеокарте (или даже центральном процессоре) вместо сотен часов на большом кластере.

Доступны следующие модели:

  • VGG16

  • VGG19

  • ResNet50

  • ResNet101

  • ResNet152

  • ResNet50v2

  • ResNet101v2

  • ResNet152v2

  • MobileNet

  • MobileNetv2

Для каждой модели из этого списка доступны функции загрузки конфигурации модели в JSON-формате и весов в формате .h5. Также для каждой модели можно использовать специальный препроцессинг, применявшийся для ее обучения на датасете ImageNet.

Ниже вы видите пример загрузки одной из таких моделей (ResNet50):

// specify the model type to be loaded, ResNet50, for exampleval loader =ModelZoo(commonModelDirectory = File("cache/pretrainedModels"), modelType = ModelType.ResNet_50)// obtain the model configurationval model = loader.loadModel() as Functional// load class labels (from ImageNet dataset in ResNet50 case)val imageNetClassLabels = loader.loadClassLabels()// load weights if required (for Transfer Learning purposes)val hdfFile = loader.loadWeights()

Ну что же, теперь у вас есть сама модель и веса вы можете использовать их по вашему усмотрению.

Внимание! К изображениям, которые вы подаете на вход модели для предсказаний, необходимо применять специальный препроцессинг, о котором мы говорили ранее. Иначе вы получите неверные результаты. Для вызова препроцессинга используйте функцию preprocessInput.

Если вам не нужны предобученные веса, но вы не хотите описывать многослойные модели а-ля VGG или ResNet с нуля, у вас есть два пути: а) просто загрузить конфигурацию модели либо б) взять за основу полный код конструирования модели, написанный на Kotlin, он доступен для каждой из моделей через вызов функции высшего порядка, лежащей в пакете org.jetbrains.kotlinx.dl.api.core.model.

Ниже мы приводим пример использования функции, строящей облегченную версию ResNet50:

val model = resnet50Light(imageSize = 28,numberOfClasses = 10,numberOfChannels = 1,lastLayerActivation = Activations.Linear)

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

DSL для предобработки изображений

Python-разработчикам предлагается огромное количество библиотек визуализации и предобработки изображений, музыки и видео. Разработчикам экосистемы языков программирования JVM повезло меньше.

Большинство библиотек для предобработки изображений, найденные на просторах Github и имеющие разную степень заброшенности, так или иначе используют класс BufferedImage, оборачивая его более понятным и согласованным API. Мы решили упростить жизнь Kotlin-разработчиков, предложив им простой DSL, построенный на лямбда-выражениях и объектах-приемниках.

На данный момент доступны следующие функции преобразования изображений:

  • Load

  • Crop

  • Resize

  • Rotate

  • Rescale

  • Sharpen

  • Save

val preprocessing: Preprocessing = preprocess {   transformImage {       load {           pathToData = imageDirectory           imageShape = ImageShape(224, 224, 3)           colorMode = ColorOrder.BGR       }       rotate {           degrees = 30f       }       crop {           left = 12           right = 12           top = 12           bottom = 12       }       resize {           outputWidth = 400           outputHeight = 400           interpolation = InterpolationType.NEAREST       }   }   transformTensor {       rescale {           scalingCoefficient = 255f       }   }}

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

Если, экспериментируя с DSL, вы поймете, что некоторых функций вам не хватает, не стесняйтесь написать об этом в наш баг-трекер.

Новые слои

В релизе 0.2 появилось много новых слоев. В основном, это обусловлено тем, что они используются в архитектурах ResNet и MobileNet:

  • BatchNorm

  • ActivationLayer

  • DepthwiseConv2D

  • SeparableConv2D

  • Merge (Add, Subtract, Multiply, Average, Concatenate, Maximum, Minimum)

  • GlobalAvgPool2D

  • Cropping2D

  • Reshape

  • ZeroPadding2D*

* Спасибо Anton Kosyakov за имплементацию нетривиального ZeroPadding2D!

Кстати, если вы хотите добавить новый слой, вы можете самостоятельно реализовать его и создать пул-реквест. Список слоев, которые мы хотели бы включить в релиз 0.3, представлен набором тикетов в баг-трекере с пометкой good first issue и может быть использован вами как точка входа в проект.

Dataset API и парочка наследников: OnHeapDataset & OnFlyDataset

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

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

Этот метод хорош, когда оперативной памяти мало, а данных много. Но что, если оперативной памяти более чем достаточно? Это не такой уж редкий случай для задач переноса обучения: датасеты для дообучения могут быть не такими большими, как при тренировке моделей. Также можно получить некоторый прирост в скорости за счет того, что препроцессинг будет применен лишь один раз на этапе формирования датасета, а не при каждой загрузке батча. Если у вас достаточно оперативной памяти, используйте OnHeapDataset. Он будет держать все данные в оперативной памяти не нужно будет повторно считывать их с диска на каждой эпохе.

Набор встроенных датасетов

Если вы только начинаете путешествие в удивительный мир глубокого обучения, мы настоятельно рекомендуем вам строить и запускать ваши первые нейросети на широко известных датасетах, таких как MNIST (набор рукописных цифр), FashionMNIST(набор изображений модных вещей от компании Zalando), Cifar10 (подмножество ImageNet, насчитывающее 50 000 изображений) или коллекцию изображений кошек и собак со знаменитого соревнования Kaggle (по 25 000 изображений каждого класса различных размеров).

Все эти датасеты, как и модели из зоопарка моделей, вы можете загрузить в папку на вашем диске при помощи функций высшего порядка, таких как mnist() и fashionMnist(). Если датасет уже был загружен, заново по сети он грузиться не будет, а будет взят с диска.

Как добавить KotlinDL в проект

Чтобы начать использовать KotlinDL в вашем проекте, просто добавьте дополнительную зависимость в файл build.gradle:

repositories {    mavenCentral()}dependencies {    implementation 'org.jetbrains.kotlinx:kotlin-deeplearning-api:0.2.0'}

KotlinDL можно использовать в Java-проектах, даже если у вас нет ни капли Kotlin-кода. Здесь вы найдете пример построения и тренировки сверточной сети, полностью написанный на Java.

Если вы думаете, что в вашем проекте будет полезен Java API, напишите нам об этом или создайте PR.

Полезные ссылки

Мы надеемся, что вам понравилась наша статья и новые возможности KotlinDL.

Хотите узнать больше о проекте? Предлагаем ознакомиться с Readme или со страничкой проекта на GitHub. А этот туториал поможет вам создать вашу первую нейросеть на Kotlin.

Если вам интересно, как устроен KotlinDL, как он появился и в каком направлении развивается, почему он так похож на Keras, и планируется ли поддержка PyTorch, посмотрите свежее видео от Алексея Зиновьева.

Также мы ждем вас в Slack-канале #kotlindl (инвайт можно получить тут). В нем вы можете задавать вопросы, участвовать в дискуссиях и первыми получать информацию о превью-релизах и новых моделях в зоопарке моделей.

Ваша обратная связь, ваши описания багов и краш-репорты, идеи и комментарии все это очень важно для нас. Мы ждем новых пользователей и контрибьюторов, как начинающих, так и опытных исследователей всех, кому интересны Deep Learning и Data Science на Kotlin, Java и Scala!

Подробнее..

Quantization Aware Training. Или как правильно использовать fp16 inference в TensorRT

21.05.2021 12:08:14 | Автор: admin

Low-precision inference в TensorRT сегодня - мастхэв, бест практис и прочие иностранные. Сконвертить из TensorFlow легко, запустить легко, использовать fp16 легко. Да и КПД выше, чем у pruning или distillation. На первый взгляд всё работает идеально. Но на самом деле всё ли так гладко? Рассказываем, как мы в TrafficData споткнулись об fp16, встали и написали статью.

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

Что за зверь ваш low-precision?

float16

И так, low-precision inference - запуск нейронных сетей в типе пониженной точности. Но зачем это нужно? По умолчанию все фреймворки учат и сохраняют модели в типе float32. Оказывается, что количество знаков во fp32 - часто избыточно. Ну а зачем нам эти сотни знаков после запятой? Можно просто скастовать fp32 веса во fp16, чтобы получить ускорение прямого прогона и уменьшение используемой памяти в 2 раза. При этом сохранив исходную точность модели. Единственное условие - наличие тензорных ядер в вашем GPU.

int8 и прочее

Кроме fp16 с простым кастованием есть много идей по более оптимальному использованию бит в 16-битном значении. Просто чтобы напомнить:

Но этого мало. Использование нейронных сетей в высоконагруженных системах и мобильных платформах заставляет еще сильнее ужимать сети и ускорять инференс. Добро пожаловать в мир int8 и int4. Да, в них квантуют. Да, в int8 всего 256 значений. Да, это работает. Со своими сложностями, конечно - здесь уже просто так не кастанёшь, как в случае с fp16. Нужно внимательно изучать распределения значений в слоях, чтобы эффективно использовать предоставленный небольшой диапазон значений.

Объясню, почему мы не смотрим на 8/4 битные квантизации. Дело в том, что здесь не обойтись без потери точности. Например, тут говорят как оптимально юзать int4 и радуются, что потеряли не 15%, а 8% точности. Или вот красноречивая табличка от Nvidia о западении точности при использовании int8:

Я слышал на конференциях, что на такую потерю точности нормально смотрят в мобильных решениях. Особенно, если это какой-то развлекательный контент типа переноса стилей на GANax и тд. Ну изменился стиль немного - ничего страшного.
В нашем решении каждый процент точности - наше золотце. И пока мы не научились не терять их в int8.

TensorRT

Если у вас мобильные решения или просто инференс на CPU, то попробуйте TensorFlow Lite. Но в основном, говоря про low-precision inference в проде, сегодня имеют ввиду TensorRT - кроссплатформенный SDK для супер-быстрой работы на GPU от Nvidia. TensorRT легко превращает ваши модели в оптимизированные Engines. Сконвертить можно из любого нейросетевого фреймворка через ONNX. Engine - очень важная сущность в TensorRT. При билде происходит оптимизация под текущий GPU - на других GPU engine либо не запустится, либо будет работать неоптимально. Короче говоря, есть ряд параметров, которые нужно знать или задать заранее:

  • GPU. На чём собрали Engine, на том пусть он и работает. Но допустим общий билд для карточек одного семейства - Turing или Ampere. Например, мы билдили Engine для RTX 2060 и он замечательно работает на RTX 2080 Super. Создание отдельного Engine для RTX 2080 Super существенного ускорения не создает.

  • BatchSize. Нужно задать максимальный - для него и будет соптимизирован Engine. В рантайме можно подавать батчи размером меньше максимального, но это будет неоптимально.

  • InputSize. Мы работаем с изображениями. И размер входного изображения иногда может меняться во время рантайма. Но TRT требует его задавать жестко, что логично. Да, есть возможность задать минимальный и максимальный размеры, а TRT создаст несколько профилей оптимизации. Но всё же это не так гибко, как в TensorFlow, а иногда нужно.

  • Precision. Собственно мы можем задать fp32/fp16/int8. Первые два различаются лишь выбором флага. С int8 я мало экспериментировал. Но судя по документации, отличие лишь в необходимости калибровочного датасета - набора картинок, на основании которого TRT определит распределения значений на разных слоях.

Ну и под конец еще добавлю, что в рантайме эти движки отжирают лишь необходимый минимум GPU RAM и замечательно работают параллельно (если правильно работать с TensorRT Context в вашем коде рантайма).

Контекст задачи

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

И не хуже.

На opentalks.ai2020 мы рассказывали, как, используя Pruning и физичность данных, ускорили обработку в 4 раза и не потеряли в точности. Статью про Pruning я уже выкладывал. Но сегодня давайте поговорим конкретно про low-precision inference.

Как мы запустились и потеряли нежные фичи

Скачивая либы TensorRT, бонусом вы получаете набор примеров с кодом для самых разных архитектур и ситуаций. Для билда движков мы использовали пример SampleUffSSD (UFF - универсальный формат описания сети, через который мы конвертили наши .pb), cлегка его закастомив под входной тензор от YOLO. И хотя TensorRT очень много обновляется и всё больше новых интересных слоев поддерживает, тогда мы запускались на версии, где не было реализации ResizeBilinear операции для Upsample слоя. И мы накостылили Conv2DTranspose вместо него, чтобы не писать кастомный слой. Первая сконверченная модель была радостью, как и её скорость работы.

Даже если перейти с fp32 из TF в fp32 TRT, то уже получается неслабое ускорение - на 15-20%. В конце концов TRT использует и много других оптимизаций, например горизонтальные, вертикальные и любые другие LayerFusion.

Для инференса мы закастомили пример trtExec, обернув его для использования в .NET коде. На вход - байты изображения, на выходе - нераспарсенные байты выхода YOLO. Здесь аккуратно работайте с CudaStream и ExecutionContext. Тогда ни память не утечет, ни потоки обработки не закорраптятся.

И так, мы реализовали TensorRT fp16 inference. Сбилдили движки для разных карточек. Прогнали основные тесты - колебания точности в пределах погрешности. И всё замечательно работало несколько месяцев. А дальше - история.
10:00. Звонок клиента:
- У нас тут на одном ролике TrafficData плохо работает - машинки двоятся.
- Окей, скиньте ролик разберемся.
Смотрим ролик - да, проблема есть. Ролик с тенями и на нём тени отмечаются, как второе авто.

13:00. Добрали изображения в основной датасет. Поставили доучиться с низким LR.

16:00. Тестим на версии с инференсом в TensorFlow - всё замечательно. Билдим новый Engine. Тестим на версии с инференсом в TensorRT - опять машины двоятся:

17:00. Идём домой.

Следующее утро началось с мема:

Стало очевидно, что проблема в TensorRT, а конкретно - в преобразовании весов во fp16. Мы проверили еще несколько других роликов со сложными условиями и увидели, что после преобразования во fp16 проблемы появились и в других местах. Стали появляться пропуски детекции на ночных видео, некоторые билборды стали определяться как авто. Короче вот так мы потеряли нежные, но важные фичи, про которые оригинальная сеть во fp32 знала, а вот во fp16 успешно забыла. Что делать?

Quntization Aware Training. Учи на том, на чем будет работать

Подсознательно мы сразу понимали, что если мы обучаем на fp32, а потом инференсим на fp16, то выйдет неприятная вещь. Вот эти жалкие циферки далеко после запятой потеряны и так влияют. Тогда зачем мы их учили на каждом батче? Идея Quntization Aware Training крайне проста - учи и помни о том типе, в котором будешь инференсить. Т.е. в типе fp16 должны быть все веса сверток, активаций и градиентов. Не удивляйтесь, если первые запуски в TensorFlow окажутся с NaN-лоссом. Просто внимательно инспектируйте происходящее. Мы потратили пару недель, переписали всё обучение на fp16 и проблема была решена.

Как в Tensorflow 2.0?

Тут небольшое отступление о том, как мы были рады обновлению TF2.0. Работая под TF1.15 мы кусали локти, заставляя запуститься обучение во fp16, переписывая слои. Но это заработало. А потом пришел TF2.0 - используешь tf.train.experimental.enable_mixed_precision_graph_rewrite над оптимизатором и всё заводится, как моя Lada Granta. Но всё же стоит обратить внимание на whitelist - не все ноды по умолчанию будут работать во fp16. Часть стоит поправить руками. Ну и дополнительный бонус - огромная экономия памяти, которой не получалось в TF1.15. Батч-сайз для нашей кастомной YOLOv4.5 увеличился в 2 раза - с 4 до 8. Больше батч - лучше градиенты.

Выводы

Fp16 inference - это здорово. Только не стоит забывать про Quntization Aware Training, если вы хотите сохранить точность оригинальной модели. Это позволило нам сделать еще шаг в сторону оптимизации наших и клиентских мощностей:

Что особенно важно в годы дефицита чипов и дорогих GPU. Я всё же за использование GPU в тех местах, где они приносят пользу людям, автоматизируя что-то. А не там, где они приносят прибыль, делая деньги из подогретого воздуха.

А вообще вся тематика ускорения инференса сетей сегодня - очень интересное поле для экспериментов. Хочется попробовать десятки новых способов Pruning, Distillation или квантования в int4, но всех Баксов Банни не догонишь. Пробуйте новое, но не забывайте отдыхать.

Подробнее..

Геопространственное моделирование с применением методов машинного обучения

18.06.2021 18:20:53 | Автор: admin


Всем привет! Меня зовут Константин Измайлов, я руководитель направления Data Science в Delivery Club. Мы работаем над многочисленными интересными и сложными задачами: от формирования классических аналитических отчетов до построения рекомендательных моделей в ленте приложения.

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

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

Статья написана по мотивам выступления с Евгением Макиным на конференции Highload++ Весна 2021. Для тех, кто любит видео, ищите его в конце статьи.

Бизнес-модель работы Delivery Club


Бизнес-модель Delivery Club состоит из двух частей:

  • ДДК (доставка Деливери Клаб): мы передаем заказ в ресторан и доставляем его клиенту, то есть ресторану остается только приготовить заказ к определенному времени, когда придет курьер.
  • МП (маркетплейс): мы передаем заказ в ресторан, а он своими силами доставляет заказ в пределах своей согласованной зоны.

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

При этом построить зону доставки это полбеды. Ведь география ДДК огромна и охватывает более 170 городов России с тысячами ресторанов в каждом из них, и у каждого ресторана свои индивидуальные особенности, которые необходимо учитывать при построении эффективного сервиса доставки.

Рисуем зону доставки ресторана


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



Как процесс выглядел раньше


Исторически сложилось, что за построение зон доставки отвечали координаторы операционной команды, которые вручную перерисовывали зоны для каждого из наших партнеров. Это было трудоемко, требовало должной сноровки и, самое главное, терпения. Несмотря на набор правил, в процессе присутствовала субъективная оценка. Даже можно было заметить индивидуальный стиль отрисовки зон, который прослеживался у каждого из менеджеров.

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



Стоит упомянуть и про SLA (Service Level Agreement соглашение о максимальной длительности отрисовки зоны доставки для одного партнера): онбординг партнера или подготовка его зоны для внедрения в нашу платформу составляли порядка 40 минут для одного заведения. Представьте, что к вам подключилась городская сеть с сотней ресторанов, а если это ещё и жаркий сезон, например, после проведения рекламной акции Вот наглядное доказательство неэффективности ручной отрисовки:

$T = R * SLA = 100 * 40\ минут =\ \sim 67\ часов\ ручной\ работы$


где $T$ время, которое будет затрачено на отрисовку всех зон доставки партнера,
$R$ количество ресторанов,
$SLA$ время на отрисовку одной зоны.

Проблемы ручной отрисовки зон:


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

Baseline


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

При этом оставались недостатки:

  • артефакты в зонах доставки (стандартный случай с переходом через реку);
  • единообразный подход к партнерам (не учитываются индивидуальные KPI партнеров).

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



Пробовали алгоритмы на основе Convex Hull и Alpha Shape, с их помощью можно было бы устранить артефакты. Например, используя границы водных массивов как опорные точки для построения форм удавалось обходить реки. Однако всё равно отсутствовал индивидуальный подход к партнерам.

Преимущества технологии H3


Мы стремились прийти к универсальному решению. Каких-то простых и популярных подходов найти не удалось, поэтому мы сосредоточились на разработке собственного алгоритма. А за основу взяли технологию H3 компании Uber.


Источник: eng.uber.com/h3

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

Также стоит отметить, что:

  1. Существует хорошая библиотека для работы с H3, которую и выбрала наша команда в качестве основного инструмента. Библиотека поддерживает многие языки программирования (Python, Go и другие), в которых уже реализованы основные функции для работы с гексагонами.
  2. Наша реляционная аналитическая база Postgres поддерживает работу с нативными функциями H3.
  3. При использовании гексагональной сетки благодаря ряду алгоритмов, работающих с индексами, можно очень быстро получить точную информацию о признаках в соседних ячейках, например, определить вхождение точки в гексагон.
  4. Преимуществом гексагонов является возможность хранить информацию о признаках не только в конкретных точках, но и в целых областях.

Алгоритм построения зон доставки


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


  2. Убираем точки-выбросы. Анализируем все постройки и сразу отбрасываем те, которые нас не интересуют. Например, какие-то мелкие нежилые объекты. Далее с помощью DBSCAN формируем кластеры точек и отбрасываем те, которые для нас не являются важными: например, если кластер находится далеко от ресторана или нам экономически невыгодно доставлять туда.


  3. Далее на основе очищенного набора точек применяем триангуляцию Делоне.


  4. Создаем сетку гексагонов H3.


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


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



    В текущей версии алгоритма мы используем следующие функции ошибок:

    • минимизацию времени доставки при фиксированном покрытии;
    • максимизацию охвата пользователей при фиксированном времени доставки.

    Пример функции ошибки для минимизации времени доставки:

    ${L_{min}}_{time}\;=\;min(\sum_{i=1}^n\;({t_{rest}}_i)/n),$


    где $L_{min_ {time}}$ функция ошибки минимизации времени доставки с фиксированным покрытием,
    $t_{rest_ {i}}$ время от ресторана i до клиента,
    $n$ количество клиентов в зоне доставки.

  7. Далее строим временной градиент в получившихся зонах (с очищенными выбросами) и с заранее определенными интервалами (например, по 10-минутным отрезкам пешего пути).



Зона построена, теперь очередь оптимизации бизнес-метрики. В алгоритме используются оптимизации покрытия клиентов с фиксированием времени доставки и оптимизация времени доставки с фиксированным покрытием.

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

Внедрение


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

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

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

Но тут пришел COVID-19

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

Всё это отчасти помогло нам убедить партнёров активнее тестировать и переходить на алгоритм автоматического построения зон доставки. В итоге, за первую неделю после начала пандемии и введения ограничения для ресторанов порядка 50% наших партнеров перешло на новые зоны доставки, которые уже были построены автоматически, а в течение следующих 3 недель уже почти не осталось партнеров с зонами, построенными вручную.

Оценка


После решения всех горящих проблем нам нужно было немного отдышаться и понять, что мы вообще наделали. Для этого воспользовались A/B-тестом, а точнее его вариацией switch-back. Мы сравнивали зоны ресторанов с одинаковыми входными параметрами, оценивали GMV и время доставки, где в качестве контроля у нас были простые автоматически отрисованные зоны в виде окружностей и прямоугольников, либо зоны, отрисованные операторами вручную.



В итоге для разных алгоритмов мы получили прирост GMV в тестовых алгоритмических зонах при одинаковом времени доставки, либо уменьшение времени доставки в случае с алгоритмом с фиксированным клиентским покрытием.

А время, затрачиваемое на построение зон для партнера из примера выше, теперь выглядит более оптимистично:

$T = 100 * 3,6\ секунды =\ \sim 6\ минут$


Ускорение в 670 раз!

Текущая ситуация и планы


Сервис работает в production. Зоны автоматически строятся по кнопке. Появился более гибкий инструмент для работы со стоимостью доставки для клиентов в зависимости от их удаленности от ресторана. 99,9% ресторанов (изредка ещё нужно ручное вмешательство) перешли на алгоритмические зоны, а наш алгоритм поспособствовал переходу бэкенда на H3.

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

Работа с географией и зонами открыла нам дорогу к новым проектам: рекомендации для размещения, гранулярная работа с зонами доставки, более точный прогноз длительности доставки для клиента, ценообразование.

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

Всем спасибо!

Подробнее..

Перевод 6 причин, по которым вам следовало бы отказаться от гистограмм

12.05.2021 14:11:23 | Автор: admin

Гистограммам не чужды систематические ошибки. Дело в том, что они достаточно условны и могут привести к неправильным выводам о данных. Если вы хотите визуализировать переменную, лучше выбрать другой график.

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

И нетрудно догадаться почему. Гистограммы весьма интуитивно наглядны: любой поймет их с первого взгляда. Более того, они объективно представляют реальность, не так ли? А вот и нет.

Гистограмма может ввести в заблуждение и привести к ошибочным выводам даже на простейшем наборе данных!

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

  1. Они слишком сильно зависят от количества интервалов.

  2. Они слишком сильно зависят от максимума и минимума переменной.

  3. Они не дают возможности заметить значимые значения переменной.

  4. Они не позволяют отличить непрерывные переменные от дискретных.

  5. Они делают сравнение распределений сложным.

  6. Их построение затруднено, если в памяти находятся не все данные.

Ладно, я понял: гистограммы не идеальны. Но есть ли у меня выбор? Конечно есть!

В конце статьи я порекомендую другой график, называемый CDP, который минует эти недостатки.

Итак, что же не так с гистограммой?

1. Она слишком сильно зависит от количества интервалов.

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

Переменная представляет собой максимальную частоту сердечных сокращений (ударов в минуту), полученную у 303 людей во время некоторой физической активности (данные взяты из набора данных UCI по сердечным заболеваниям: источник).

Как изменяется гистограмма при изменении количества интервалов. [Рисунок автора]Как изменяется гистограмма при изменении количества интервалов. [Рисунок автора]

Глядя на верхний левый график (который мы получим по умолчанию в Python и R), у нас сложится впечатление хорошего распределения с одним пиком (модой). Однако если бы мы рассмотрели бы другие варианты гистограммы, мы получили бы совершенно другую картину. Разные гистограммы одних и тех же данных могут привести к противоречивым выводам.

2. Она слишком сильно зависит от максимума и минимума переменной.

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

Например, давайте попробуем изменить максимум переменной, не меняя количество интервалов.

Как меняется гистограмма при изменении максимального значения. [Рисунок автора]Как меняется гистограмма при изменении максимального значения. [Рисунок автора]

Отличается только одно значение, а весь график получается другим. Это нежелательное свойство, потому что нас интересует общее распределение: одно значение не должно так влиять на график!

3. Не дает возможности заметить значимые значения переменной.

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

Классическим примером является случай, когда отсутствующим значениям массово присваивается 0. В качестве примера давайте рассмотрим набор данных переменной, состоящий из 10 тысяч значений, 26% из которых нули.

Те же данные, разная ширина интервала. На левом графике невозможно обнаружить высокую концентрацию нулей. [Рисунок автора]Те же данные, разная ширина интервала. На левом графике невозможно обнаружить высокую концентрацию нулей. [Рисунок автора]

График слева это то, что вы получаете по умолчанию в Python. Глядя на него, вы не заметите скопление нулей, и вы даже можете подумать, что эта переменная имеет плавную динамику.

График справа получен путем сужения интервалов и дает более четкое представление о реальности. Но дело в том, что как бы вы ни сужали интервалы, вы никогда не будете уверены, содержит ли первый интервал только 0 или какие-то другие значения.

4. Не позволяет отличить непрерывные переменные от дискретных.

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

Возьмем переменную Возраст (Age). Вы можете получить Возраст = 49 лет (когда возраст округлен) или Возраст = 49,828884325804246 лет (когда возраст рассчитывается как количество дней с момента рождения, деленное на 365,25). Первая дискретная переменная, вторая непрерывная.

Слева непрерывная переменная. Справа дискретная переменная. Однако на верхних графиках они выглядят одинаково. [Рисунок автора]Слева непрерывная переменная. Справа дискретная переменная. Однако на верхних графиках они выглядят одинаково. [Рисунок автора]

Тот, что слева, непрерывен, а тот, что справа, дискретен. Однако на верхних графиках (по умолчанию в Python) вы не увидите никакой разницы между ними: они выглядят совершенно одинаково.

5. Сложно сравнивать распределения.

Часто бывает необходимо сравнить одну и ту же переменную в разных кластерах. Например, в отношении данных UCI о сердечных заболеваниях, приведенных выше, мы можем сравнить:

  • все население (для справки)

  • люди моложе 50 страдающие сердечными заболеваниями

  • люди моложе 50 НЕ страдающие сердечными заболеваниями

  • люди старше 60 лет страдающие сердечными заболеваниями

  • люди старше 60 и НЕ страдающие сердечными заболеваниями.

Вот что мы получили бы в итоге:

Сравнение гистограмм. [Рисунок автора]Сравнение гистограмм. [Рисунок автора]

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

6. Сложно построить, если в памяти находятся не все данные.

Если все ваши данные находятся в Excel, R или Python, построить гистограмму легко: в Excel вам просто нужно кликнуть по иконке гистограммы, в R выполнить команду hist(x), а в Python plt.hist(х).

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

| INTERVAL_LEFT | INTERVAL_RIGHT | COUNT |

|---------------|----------------|---------------|

| 75.0 | 87.0 | 31 |

| 87.0 | 99.0 | 52 |

| 99.0 | 111.0 | 76 |

| ... | ... | ... |

Но получить ее с помощью SQL-запроса не так просто, как кажется. Например, в Google Big Query код будет выглядеть так:

WITHSTATS AS (  SELECT     COUNT(*) AS N,    APPROX_QUANTILES(VARIABLE_NAME, 4) AS QUARTILES  FROM    TABLE_NAME),BIN_WIDTH AS (  SELECT    -- freedman-diaconis formula for calculating the bin width    (QUARTILES[OFFSET(4)]  QUARTILES[OFFSET(0)]) / ROUND((QUARTILES[OFFSET(4)]  QUARTILES[OFFSET(0)]) / (2 * (QUARTILES[OFFSET(3)]  QUARTILES[OFFSET(1)]) / POW(N, 1/3)) + .5) AS FD  FROM     STATS),HIST AS (  SELECT     FLOOR((TABLE_NAME.VARIABLE_NAME  STATS.QUARTILES[OFFSET(0)]) / BIN_WIDTH.FD) AS INTERVAL_ID,    COUNT(*) AS COUNT  FROM     TABLE_NAME,    STATS,    BIN_WIDTH  GROUP BY     1)SELECT   STATS.QUARTILES[OFFSET(0)] + BIN_WIDTH.FD * HIST.INTERVAL_ID AS INTERVAL_LEFT,  STATS.QUARTILES[OFFSET(0)] + BIN_WIDTH.FD * (HIST.INTERVAL_ID + 1) AS INTERVAL_RIGHT,  HIST.COUNTFROM   HIST,   STATS,   BIN_WIDTH

Немного громоздко, не правда ли?

Альтернатива: график кумулятивного распределения.

Узнав 6 причин, по которым гистограмма не является идеальным выбором, возникает естественный вопрос: Есть ли у меня альтернатива? Хорошие новости: существует лучшая альтернатива, которая называется График кумулятивного распределения (Cumulative Distribution Plot - CDP). Я знаю, что это название не такое запоминающееся, но гарантирую, оно того стоит.

График кумулятивного распределения это график квантилей переменной. Другими словами, каждая точка CDP показывает:

  • по оси x: исходное значение переменной (как в гистограмме);

  • по оси y: сколько наблюдений имеют такое же или меньшее значение.

Давайте посмотрим на пример с переменной максимальной частотой пульса.

График кумулятивного распределения максимальной частоты сердечных сокращений. [Рисунок автора]График кумулятивного распределения максимальной частоты сердечных сокращений. [Рисунок автора]

Возьмем точку с координатами x = 140 и y = 90 (30%). По горизонтальной оси вы видите значение переменной: 140 ударов сердца в минуту. По вертикальной оси вы видите количество наблюдений, у которых частота сердцебиение равна или ниже 140 (в данном случае 90 человек, что означает 30% выборки). Следовательно, у 30% нашей выборки максимальная частота сердцебиения составляет 140 или менее ударов в минуту.

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

Вдобавок CDP намного полезнее. Если задуматься, вам часто приходится отвечать на такие вопросы, как у скольких из них от 140 до 160? Или у скольких из них больше 180?. Имея перед глазами CDP, вы можете дать немедленный ответ. С гистограммой это было бы невозможно.

CDP решает все проблемы, которые мы видели выше. Фактически, по сравнению с гистограммой:

1. Не требует пользовательского выбора. Для одного набора данных, существует только один возможный CDP.

2. Не страдает от выпадающих значений. Экстремальные значения не влияют на CDP, поскольку квантили не меняются.

3. Позволяет определять значимые значения. Если существует концентрация точек данных на каком-то конкретном значении, это сразу видно, поскольку будет вертикальный сегмент, соответствующий значению.

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

5. Упрощает сравнение распределений. На одном графике легко сравнить два или более распределения, поскольку это просто кривые, а не области. Кроме того, ось y всегда находится в диапазоне от 0 до 100%, что делает сравнение еще более простым. Для сравнения, это пример, который мы видели выше:

Сравнение распределений в CDP. [Рисунок автора]Сравнение распределений в CDP. [Рисунок автора]

6. Его легко построить, даже если у вас нет всех данных в памяти. Все, что вам нужно, это квантили, которые можно легко получить с помощью SQL:

SELECT   COUNT(*) AS N,  APPROX_QUANTILES(VARIABLE_NAME, 100) AS PERCENTILESFROM  TABLE_NAME

Как построить график кумулятивного распределения в Excel, R, Python

В Excel вам нужно построить два столбца. Первый с 101 числом, равномерно распределенными от 0 до 1. Второй столбец должен содержать процентили, которые могут быть получены по формуле: =PERCENTILE(DATA, FRAC), где DATA - это вектор, содержащий данные, а FRAC - это первый столбец: 0,00, 0,01, 0,02, 0,03,, 0,98, 0,99, 1. Затем вам просто нужно построить график по этим двум столбцам, разместив значения переменной на оси x.

В R это делается в одну строчку:

plot(ecdf(data))

В Python:

from statsmodels.distributions.empirical_distribution import ECDFimport matplotlib.pyplot as pltecdf = ECDF(data)plt.plot(ecdf.x, ecdf.y)

Спасибо за внимание! Надеюсь, эта статья оказалась для вас полезной.

Я ценю отзывы и конструктивную критику. Если вы хотите поговорить об этой статье или других связанных темах, вы можете написать мне в Linkedin.


Перевод материала подготовлен в рамках онлайн-курса "Machine Learning. Basic". Всех заинтересованных приглашаем на день открытых дверей курса, где можно будет узнать все подробности об обучении и пообщаться с преподавателем.

- Узнать подробнее о курсе "Machine Learning. Basic"

- Смотреть онлайн-встречу "День открытых дверей"

Подробнее..

Music2Dance как мы пытались научиться танцевать

19.05.2021 08:16:04 | Автор: admin

Всем привет! Меня зовут Владислав Мосин, я учусь на 4-м курсе бакалаврской программы Прикладная математика и информатика в Питерской Вышке. Прошлым летом вместе с Алиной Плешковой, магистранткой нашего факультета, я проходил стажировку в JetBrains Research. Мы работали над проектом Music2Dance, цель которого научиться генерировать танцевальные движения, подходящие под заданную музыку. Это может быть использовано, например, при самостоятельном обучении танцам: услышал музыку, запустил приложение, и оно показало движения, которые гармонично с этой музыкой сочетаются.

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

Из к/ф Криминальное чтивоИз к/ф Криминальное чтиво

Существующие подходы

Идея генерации танца по музыке довольно стара. Наверное, самый яркий пример это танцевальные симуляторы типа Dance Dance Revolution, где игрок должен наступать на светящиеся в такт музыке панели на полу, и таким образом создается некоторое подобие танца. Также красивый результат в этой области это создание танцующих геометрических фигур или 2D-человечков.

Cуществуют и более серьезные работы генерация 3D-движений для людей. Большинство таких подходов основываются исключительно на глубоком обучении. Лучшие результаты на лето 2020 года показывала архитектура DanceNet, и мы решили взять именно её в качестве бейзлайна. Дальше мы обсудим их подход подробнее.

Предобработка данных

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

Музыка: onset, beats, chroma

Наверное, самый распространенный способ извлечение фичей из аудио это подсчет спектрограммы или мелграммы преобразование звука из амплитудного домена в частотный при помощи преобразования Фурье. Однако, в нашей задаче мы работаем с музыкой, а не произвольным аудиосигналом, и низкоуровневый анализ в данном случае не подходит. Нас интересуют ритм и мелодия, поэтому мы будем извлекать onset, beats и chroma (начало ноты, ритм и настроение мелодии).

Видео: извлечение позы человека

Тут все намного интереснее. Примитивный подход по видео с танцующими людьми попытаться предсказать следующий кадр обречен на провал. Например, один и тот же танец, снятый с разных дистанций, будет интерпретироваться по-разному. К тому же, размерность кадра даже маленького разрешения (например, 240x240) превышает несколько десятков тысяч пикселей.

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

Синим отмечены ключевые точкиСиним отмечены ключевые точки

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

Важной особенностью этого метода является способ хранения положений ключевых точек. Например, если хранить просто абсолютные положения в 3D-пространстве, то возникает проблема нефиксированной длины костей: расстояние между голенью и коленом или плечом и локтем может изменяться от кадра к кадру, что не является ожидаемым поведением. Для избежания таких проблем фиксируется положение одной точки человека, а именно середины таза, а положение всех остальных задается через длину кости и угол поворота относительно предыдущей точки. Поясню на примере: положение кисти задается через длину лучевой кости, а также поворот относительно локтя.

Архитектура DanceNet

Архитектура DanceNet. Источник: https://arxiv.org/abs/2002.03761Архитектура DanceNet. Источник: https://arxiv.org/abs/2002.03761

Архитектура DanceNet cocтоит из нескольких основных частей:

  • Кодирование музыки;

  • Классификация музыки по стилю;

  • Кодирование кадров видео;

  • Предсказание следующего кадра по предыдущим и музыке;

  • Декодирование полученного кадра.

Рассмотрим немного подробнее каждую из частей:

  1. Кодирование музыки. Предобратанный аудиосигнал кодируется при помощи сверточной нейросети с Bi-LSTM слоем.

  2. Классификация музыки по стилю. Аналогично предыдущему пункту, сверточная нейросеть с Bi-LSTM слоем.

  3. Кодирование-декодирование кадра. Маленькая двухслойная сверточная сеть.

  4. Предсказание следующего кадра. Самая содержательная часть архитектуры, которая собственно и предсказывает следующую позу по предыдущим и музыке. Состоит из блоков из dilated (расширенных) сверток со скип-соединениями.

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

Наше решение

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

Архитектура решения. Эпоха тренировкиАрхитектура решения. Эпоха тренировки

Наше решение состоит из четырех основных частей:

  • Датасет

  • Модель для предсказания следующего положения (DanceNet)

  • Модель для исправления следующего положения положения (RL модель)

  • Функция потерь

Датасет

Одним из главных вопросов при решении задач машинного обучения является выбор датасета. Для задачи генерации танца на лето 2020 года не было открытых датасетов хорошего качества, и авторы существующих решений собирали их самостоятельно. В статье, взятой нами за бейзлайн, серьезно подошли к вопросу данных и отсняли несколько часов танцев профессионалов. К сожалению, на просьбы поделиться датасетом исключительно на благо науки они ответили отказом. Так как без датасета жить совсем грустно, пришлось что-то придумывать. В итоге мы решили создать датасет из того, что нашлось под рукой: видео с YouTube и библиотеки для детектирования положения человека VIBE.

DanceNet

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

RL модель

Задача RL модели исправить положение тела так, чтобы оно выглядело более реалистичным. На вход модель принимает движение (для каждой точки разность между новым и старым положениями) и старое положение тела, на выход выдает исправленное новое положение.

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

Структура алгоритмов обучения с подкреплениемСтруктура алгоритмов обучения с подкреплением

В качестве алгоритмов обучения с подкреплением мы решили выбрать один алгоритм, использующий Q-Learning (наш выбор пал на TD3, как на наиболее стабильный и выразительный) и один не использующий (мы остановились на PPO).

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

Функция потерь

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

L(S, S_{real},R)=-\parallel S-S{real} \parallel_2-R ,

где S положение, Sreal правильное положение, R награда среды.

Модель на фазе тестирования

Архитектура решения. Эпоха тестированияАрхитектура решения. Эпоха тестирования

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

Результаты

К сожалению, у нас не получилось впечатляющих результатов, таких как у авторов DanceNet. Наш агент научился генерировать некоторые танцевальные движения, например, вращение вокруг своей оси и плавные движения руками, однако, в полноценный танец они не складываются. Мы связываем это в первую очередь с разницей в качествах датасетов. К сожалению, нам не удалось собрать действительно качественные данные автоматическое извлечение положения из видео с YouTube существенно отличается по качеству в худшую сторону от ручной съемки профессиональных танцоров, и компенсировать это RL алгоритм не сумел.

Наш грустный танец. Спасибо за ваш интерес!


Другие материалы из нашего блога о стажировках:


Подробнее..

Временные ряды. Простые решения

22.04.2021 00:12:56 | Автор: admin


Привет, Хабр!

В этой статье мы рассмотрим несколько простых подходов прогнозирования временных рядов.

Материал, изложенный в статье, на мой взгляд, хорошо дополняет первую неделю курса Прикладные задачи анализа данных от МФТИ и Яндекс. На обозначенном курсе можно получить теоретические знания, достаточные для решения задач прогнозирования рядов динамики, а в качестве практического закрепления материала предлагается с помощью модели ARIMA библиотеки scipy сформировать прогноз заработной платы в Российской Федерации на год вперед. В статье, мы также будем формировать прогноз заработной платы, но при этом будем использовать не библиотеку scipy, а библиотеку sklearn. Фишка в том, что в scipy уже предусмотрена модель ARIMA, а sklearn не располагает готовой моделью, поэтому нам придется потрудиться ручками. Таким образом, нам для решения задачи, в каком то смысле, необходимо будет разобраться как устроена модель изнутри. Также, в качестве дополнительного материала, в статье, задача прогнозирования решается с помощью однослойной нейронной сети библиотеки pytorch.

Весь код написан на python 3 в jupyter notebook. Более того, notebook устроен таким образом, что вместо данных о заработной плате можно подставить многие другие ряды динамики, например данные о ценах на сахар, поменять период прогнозирования, валидации и обучения, добавить иные внешние факторы и сформировать соответствующий прогноз. Другими словами, в работе используется простенький самописный тренажерчик, с помощью которого можно прогнозировать различные ряды динамики. Код можно посмотреть здесь

План статьи


  1. Краткое описание тренажера.
  2. Решение в лоб прогнозирование временных рядов с использованием только сырых данных прошлых значений рядов динамики.
  3. Добавление экзогенных переменных.
  4. Коррекция гетероскедастичности через логарифмирование исходных данных.
  5. Приведение ряда к стационарному.
  6. Прогнозирование с помощью однослойной нейронной сети.
  7. Сравнение подходов.
  8. Полезные ссылки

Краткое описание тренажера



Import the data
Здесь все просто импортируем данные. Иногда бывает так, что сырых данных достаточно для формирования более-менее внятного прогноза. Именно первый и второй прогнозы в статье моделируются на основании сырых данных, то есть для прогноза заработной платы используются необработанные данные о заработной плате в прошлые периоды.

Aggregate the data
В статье не используется агрегация данных ввиду отсутствия необходимости. Однако зачастую, данные могут быть представлены неравными временными интервалами. В таком случае, просто необходимо их агрегировать. Например, данные с торгов ценными бумагами, валютой и другими финансовыми инструментами необходимо агрегировать. Обычно берут среднее значение в интервале, но можно и максимальное, минимальное, стандартное отклонение и другие статистики.

Preprocessing the data
В нашем случае, речь идет в первую очередь о предобработке данных, благодаря которой, временной ряд приобретает свойство гомоскедастичности (через логарифмирование данных) и становится стационарным (через дифференцирование ряда).

Split to train, test & forecast
В этом блоке кода временные ряды разбиваются на периоды обучения, тестирования и прогнозирования путем добавления нового столбца с соответствующими значениями train, test, forecast. То есть, мы не создаем три отдельных таблицы для каждого периода, а просто добавляем столбец, на основании, которого в дальнейшем будем разделять данные.

Extraction exogenous time-series features
Бывает полезным выделить дополнительные внешние (экзогенные) признаки из временного ряда. Например, указать выходной это день или нет, указать количество дней в месяце (или количество рабочих дней в месяце) и др. Как правило эти признаки вытаскиваются из самого временного ряда без какого либо ручного вмешательства.

Create/import exogenous data
Не всю информацию можно вытащить из временного ряда. Иногда могут потребоваться дополнительные внешние данные. Например, какие-то эпизодические события, которые оказывают сильное влияние на значения временного ряда. Такими событиями могут быть даты начала военных действий, введения санкций, природные катаклизмы и др. В работе такие факторы не рассматриваются, однако возможность их использования стоит иметь в виду.

Exogenous values
В этом блоке кода мы объединяем все экзогенные данные в одну таблицу.

Union the data (create dataset)
В этом блоке кода мы объединяем значения временного ряда и экзогенных признаков в одну таблицу. Другими словами готовим датасет, на основании, которого будем обучать модель, тестировать качество и формировать прогноз.

Learning the model
Здесь все понятно мы просто обучаем модель.

Preprocessing data: predict & forecast
В случае, если мы для обучения модели использовали предобаботанные данные (логарифмированные, обработанные функцией бокса-кокса, стационарный ряд и др.), то качество модели для начала оценивается на предобработанных данных и только потом уже на сырых данных. Если, мы данные не предобрабатывали, то данный этап пропускается.

Row data: predict & forecast
Данный этап является заключительным. Если, модель обучалась на предобработанных данных, например, мы их прологарифмировали, то для получения прогноза заработной платы в рублях, а не логарифма рублей, нам следует перевести прогноз обратно в рубли.

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

Решение в лоб


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

Давайте возьмем значения заработной платы в 12-ть прошлых месяцев для предсказания заработной платы в 13-й месяц. Другими словами для каждого целевого значения у нас будет 12 признаков.

Признаки будем подавать на вход Ridge Regression библиотеки sklearn. Параметры модели берем по умолчанию за исключением параметра alpha, его установили на 0, то есть по сути мы используем обычную регрессию.

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

Давайте посмотрим, что у нас получилось.





На первый взгляд результат выглядит хоть и неидеально, но близко к действительности.

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



Попробуем добавить в модель экзогенные переменные.

Добавление экзогенных переменных


Мы будем использовать 2 внешних признака: количество дней в месяце и номер месяца (от 1 до 12). Признак Номер месяца мы бинаризируем, в итоге у нас получится 12 столбцов для каждого месяца со значениями 0 или 1.

Сформируем новый датасет и посмотрим на качество модели.

Смотрим графики





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

Давайте теперь проведем первую предобработку данных.

Коррекция гетероскедастичности.


Если мы посмотрим на график заработной платы за период с 2010 по 2020 гг, то мы увидим, что ежегодно разброс заработной платы внутри года между месяцами растет.



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

Для этого воспользуемся обычным логарифмированием и посмотрим как выглядит прологарифмированный ряд.



Обучим модель на прологарифмированном ряду

Смотрим графики




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

Приведение ряда к стационарному


Приводить ряд к стационарному будем следующим образом:

  • Определяем разницу между целевым значением заработной платы и значением год назад: t (t-12) = dif_1
  • Определяем разницу между полученным и смещенным на 1 месяц значением: dif_1 (dif_1-1) = dif_2

В итоге получаем следующий временной ряд.



Ряд действительно выглядит стационарным, об этом также говорит значение критерия Дики-Фуллера.

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

Давайте посмотрим, что получилось.



Вот так выглядит предсказание стационарного ряда. Как и ожидали не очень-то и хорошо :)

А вот предсказание и прогноз заработной платы.

Смотрим графики




Качество заметно улучшилось и прогноз визуально стал выглядеть правдоподобным.

Теперь сформируем прогноз без использования экзогенных переменных

Смотрим графики




Качество еще улучшилось и правдоподобность прогноза сохранилась :)

Прогнозирование с помощью однослойной нейронной сети


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

Для начала посмотрим на саму сеть

Смотрим код
class Model_1(nn.Module):    def __init__(self, input_size, output_size):        super(Model_1, self).__init__()        self.input_size = input_size        self.output_size = output_size        self.linear = nn.Linear(self.input_size, self.output_size)            def forward(self, x):        output = self.linear(x)        return output



Теперь пару слов о том, как будем ее обучать.

  1. Фиксируем random seed для целей воспроизводимости результата
  2. Инициализируем модель
  3. Задаем функцию потерь MSELoss
  4. Выбираем в качестве оптимизатора Adam optimizer
  5. Указываем начальный шаг обучения и определяем условие, при котором шаг понижается. Отмечу, что правильный выбор шага и его дальнейшее изменение (обычно уменьшение) приносит хорошие плоды
  6. Указываем количество эпох обучения
  7. Запускаем обучение
  8. На вход сети подаем целиком датасет, так как он очень маленький и разбивать его на батчи не имеет смысла
  9. При обучении, каждую тысячу эпох формируем графики значения функции потерь на обучающей и тестовой выборках. Это позволяет нам контролировать переобучение или не дообучение модели.

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

Смотрим код
# fix the random seedSEED = 42random_init(SEED)# initialization model, loss function, optimizatormodel = Model_1(len(features),1)loss_func = nn.MSELoss()opt = torch.optim.Adam(model.parameters(), lr=5e-2)# set the epoch numbers, initialization list for every loss after learning on epochepochs = 15000losses_train = []losses_test = []# initialization counter for calculation epoch numberscounter = 0# start the learning modelfor epoch in range(epochs):    model.train()#     make prediction targets on train data    y_pred_train = model(torch.tensor(X_train.to_numpy(), dtype=torch.float))#     calculate loss    loss = loss_func(y_pred_train,                      torch.reshape(torch.tensor(y_train.to_numpy(), dtype=torch.float),(-1,1)))#     bacward loss to model and calculate new parameters (coefficients) with fixed learning rate    loss.backward()    opt.step()    opt.zero_grad()# add loss to list losses     losses_train.append(loss)        model.eval()    y_pred_test = model(torch.tensor(X_test.to_numpy(), dtype=torch.float))    loss_test = loss_func(y_pred_test,                      torch.reshape(torch.tensor(y_test.to_numpy(), dtype=torch.float),(-1,1)))    losses_test.append(loss_test)        # make the mini report for every 1000 epoch        if epoch % 1000 == 0 and epoch > 0:        print ('Epoch:', epoch // 1000)        print ('Learning rate:', opt.param_groups[0]['lr'])        print ('Last loss on TRAIN data:', losses_train[-1].cpu().detach().numpy(),              '              Last loss on TEST data:', losses_test[-1].cpu().detach().numpy())#         print ('Last loss on TEST data:', losses_test[-1].cpu().detach().numpy())        fig, (ax1, ax2) = plt.subplots(1, 2)#         fig.suptitle('MSE on TRAIN & TEST DATA')        fig.set_figheight(3)        fig.set_figwidth(12)        ax1.plot(np.arange(counter,epoch,1), np.array([float(i) for i in losses_train][-1000:]), color = 'darkred')        plt.xlabel("Epoch")        plt.ylabel("Loss on TRAIN data")        ax2.plot(np.arange(counter,epoch,1), np.array([float(i) for i in losses_test][-1000:]), color = 'darkred')        plt.xlabel("Epoch")        plt.ylabel("Loss on TEST data")        plt.show()                counter += 1000        #   reduce learning rate    if epoch == 1000:        opt = torch.optim.Adam(model.parameters(), lr=7e-3)


Не будем рассматривать качество предсказаний для каждого датасета отдельно (желающие могут посмотреть подробности на гите). Давайте сравним итоговые результаты.

Качество на тестовой выборке с использованием Ridge Regression



Качество на тестовой выборке с использованием Single layer NN



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

На этом моменте статья подошла к завершению. Надеюсь, материал будет полезен как некий обзор baseline-подходов, применяемых при прогнозировании временных рядов и послужит хорошим практическим дополнением к курсу Прикладные задачи анализа данных от МФТИ и Яндекс.

Полезные ссылки


  1. Исходники на гитхабе
  2. Курс Прикладные задачи анализа данных от МФТИ и Яндекс
  3. Государственная статистика ЕМИСС (данные по заработной плате)
  4. LSTM for time series prediction
  5. Лекция 9. Прогнозирование на основе регрессионной модели. Computer Science Center
  6. Картинка под заголовком взята отсюда :)
Подробнее..

Как мы запустили агрегатор удаленных вакансий и зачем в нем ML

26.05.2021 18:20:11 | Автор: admin

В один прекрасный день в конце 2020 года мы решили сделать еще один агрегатор удаленных вакансий, начав с исключительно IT-позиций. Логично спросить: зачем? Мол, на рынке их уже достаточно. Ответ на этот вопрос звучит очень просто: мы понимали, как улучшить текущие решения как минимум по пяти параметрам.

  • Количество (агрегировать больше всех в мире);

  • Реальная удаленка (а не позиции в стиле "remote until COVID-19");

  • Актуальность (часто на схожих сайтах можно найти большое количество неактуальных вакансий);

  • Хороший поиск (по нашему мнению поиск на текущих сайтах с удаленными вакансиями находится на уровне 2005 года);

  • Фильтр по гражданству.

О последнем параметре я и хочу сегодня рассказать.

Прежде, чем вы начнете читать. Сегодня мы запустились с Bergamot на ProductHunt. И, если у вас вдруг возникло желание поддержать наш продукт, будет круто. Ищите нас тут.

Проблема

Иногда компании устанавливают ограничения для граждан некоторых стран (например, компания готова нанимать только ребят с гражданством США / или конкретным типом визы ЕС). Как правило, на страницах с описанием вакансий нет отдельного поля где выводились бы подобные ограничения. И поиска/фильтра, соответственно, тоже нет. Поэтому соискателю приходится внимательно читать текст каждой вакансии, чтобы понять, есть ли вообще смысл откликаться на эту позицию.

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

Анализ

Сначала мы думали решить эту задачу простыми алгоритмическими методами. Базовая идея заключалась в следующем:

Шаг 1

Ищем определенные ключевые слова в тексте, например: only, remote in, authorized to work in и так далее.

Шаг 2

Ищем рядом с ключевыми словами локацию. Как правило, это слово, которое начинается с заглавной буквы. Если такое слово-локация находится, то оно и является ограничением.

Окей, если в вакансии написано USA only, то такая логика работает идеально. Но если капнуть глубже, становится понятно, что ограничения могут быть обозначены самыми разными, например:

  • This role is remote and you can be based anywhere across the UK

  • Living in Europe is a must

  • This opportunity is only open to candidates within Canada at this time

  • Location: Argentina (any part of the country its great for us!)

  • и еще сотни других описаний.

Очевидно, алгоритмами задачу не решить и мы попробовали использовать силу ML-a.

Задача

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

restriction: 0 (no) / 1 (yes)

если restriction = 1, то тогда необходимо выделять еще и страну, по которой есть ограничение

Решение

Структура решения

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

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

Нахождение локаций

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

Во-первых, ограничения касались не только стран и столиц мира, а также небольших городов и штатов. Например Can work full time in Eugene, OR / Hammond, IN. А сделать список локаций всех уровней уже сложнее.

Во-вторых, написания локаций в вакансиях часто отличались от стандартного (например 100% Remote in LATAM).

Поэтому для выделения локаций мы приняли решение использовать NER. Пробовали разные готовые варианты:

В итоге выбор пал на spaCy, потому что из готовых и бесплатных вариантов spaCy EntityRecognizer показал наилучший результат.

Итого: нам удалось выделить в тексте локации.

Разделение на предложения

Для разделения на предложения, где есть локации, мы тоже использовали spaCy.

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

  • The position is remote so the only thing is they have to be in the US and be able to work Eastern or Central time.

  • This job is located out of our Chicago office, but remote, US-based applicants are still encouraged to apply.

  • This is a remote role, but we're looking for candidates based in Montreal, Canada.

Классификатор

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

Решили попробовать несколько моделей, среди которых как более простые CNN и LSTM, так и более современные transformers. Последние предсказуемо оказались лучше, обучение которых сводилось по сути к fine-tunning это нам точно подходило, ведь датасет, как я уже сказал выше, был невелик.

Среди transformers наилучший результат показала архитектура RoBERTa (roberta-base) с показателем точности 94% для нашего датасета.

Нормализация локаций

На основе классификатора и NER-a для каждой вакансии мы получили вот такие дополнительные поля:

restriction: 1 (yes); location: London

Restriction отдавал классификатор. А вот Location выдавал NER. Из-за того что в поле Location могли быть разные написания городов и стран, мы еще сделали дополнительную нормализацию через Google API. Остановились на том, чтобы сделать ограничения по странам.

То есть на выходе получалось:

restriction: 1 (yes); location: United Kingdom

Итог

В итоге мы теперь умеем это делать и кандидаты могут фильтровать неподходящие для них вакансии. Mission accomplished (вроде бы! вы можете сами потестить Bergamot и написать, что думаете).

Подробнее..

Log-Sum-Exp Trick как свойства функций делают работу классификаторов реальной

19.06.2021 00:09:06 | Автор: admin


В этой статье мы рассмотрим, что такое классификатор, поговорим о мультиклассовой классификации с помощью нейронных сетей. Затем, ознакомившись с контекстом перейдем к основному топику поста к Log-Sum-Exp Trick. Напишем формулы и разберемся, как этот трюк помогает избежать переполнения чисел с плавающей точкой.

Логистическая регрессия


В классическом машинном обучение существует метод классификации под названием логистическая регрессия. Классификатор на основе логистической регрессии, в обычном случае, призван разделять данные на два класса. Например, классификатор электронной почты может выдавать значение 0.9, что может означать: 90% вероятность, письмо спам, и 10% не спам. При этом сумма вероятностей всегда даёт единицу. Логистическая регрессия выдаёт такие вероятности на основе выхода сигмоидной функции.

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

Мультиклассовые нейронные сети


В качестве классификатора, выдающего сразу несколько вероятностей, давайте рассмотрим нейронную сеть. Такие нейронные сети делают предсказания с помощью функции софтмакс.

\frac{e^{x_i}}{\sum_{j=0}^N{e^{x_j}}} = p_i, \, i \in [0, N].

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



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

Например, если мы обучили классификатор на изображениях, определять что изображено на картинке, то мы можем увидеть что-то похожее на следующее:

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

Проблема переполнения при вычислении Softmax


Логиты, приходящие из нейронной сети, могут принимать произвольные значения на вещественной прямой. Рассмотрим, что будет если в Python мы попытаемся вычислить софтмакс для третьей компоненты заданного вектора:

import numpy as npx = np.array([-100, 1000, -100, 5, 10, 0.001])exp_x = np.exp(x)print("Возведение в степень X: ", "\n", exp_x)print("Сумма экспонент: ", "\n", np.sum(exp_x))print("Третья вероятность: ", np.exp(x[3]) / np.sum(exp_x))

Вывод:

Возведение в степень X:   [3.72007598e-44            inf 3.72007598e-44 1.48413159e+02 2.20264658e+04 1.00100050e+00]Сумма экспонент:  infТретья вероятность:  0.0

Видим, что значения 1000 приводит к переполнению и это губит всю дальнейшую нормализацию.

Log-Sum-Exp


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

LSE(X) = \log\left(\sum_{j=0}^N e^{x_j}\right) Log-Sum-Exp функция.


Её определение вытекает из названия это последовательное применение к входному аргументу: экспоненты, суммирования и логарифмирования. Часто можно увидеть, что эту функцию называют дифференцируемым аналогом функции максимума от нескольких переменных. Дифференцируемость крайне полезное для поиска экстремумов свойство.

image (источник)
Как видно на картинке выше, lse(x) всюду гладкая, в отличии от max(x) функция.

Вариант Log-Sum-Exp без переполнения


Если попытаться вычислить функцию LSE от вектора x, то мы так же столкнемся с проблемой переполнения, поскольку в сумме участвуют экспоненты произвольной, возможно большой, степени. Путём преобразований, основанных на свойствах функции можно избавиться от проблемы переполнения.

Пусть результат выполнения LSE(x) имеет значение y, тогда мы можем записать следующее уравнение:


y = LSE(x) = \log{\sum_{j=0}^N{e^{x_j}}}.

Применим экспоненту к обоим частя уравнения:


e^y = \sum_{j=0}^N{e^{x_j}}.

Время трюка. Пусть c = \max_{j}(x_j), тогда вынесем из каждого слагаемого e^c:


e^y = e^c \sum_{j=0}^N{e^{x_j- c}}, \, \, | \,\, \log(\cdot)

y = c + \log\left(\sum_{j=0}^N{e^{x_j- c}} \right) = LSE(x).


Теперь проверим на практике новую формулу:

import numpy as npx = np.array([11, 12, -1000, 5, 10, 0.001])y = np.array([-1000, 1000, -1000, 5, 10, 0.001])def LSE_initial(x):  return np.log(np.sum(np.exp(x)))def LSE_modified(x):  c = np.max(x)  return c + np.log(np.sum(np.exp(x - c)))# с экспонентами, не приводящими к переполнениюprint('Исходная LSE(x): ', LSE_initial(x)) print('Преобразованная LSE(x): ', LSE_modified(x))# с экспонентой в 1000й степениprint('Исходная LSE(y): ', LSE_initial(y))print('Преобразованная LSE(y): ', LSE_modified(y))

Вывод:

Исходная LSE(x):  12.408216490736713Преобразованная LSE(x):  12.408216490736713Исходная LSE(y):  infПреобразованная LSE(y):  1000.0

Видно, что даже в случае, когда одно из слагаемых обращается в float inf, модифицированный вариант lse(x) даёт верный результат.

Log-Sum-Exp Trick


Теперь перейдём непосредственно к трюку. Наша исходная задача состоит в том, чтобы вычислить софтмакс для набора вещественных значений, не получая при этом неправильные результаты из-за переполнения.

Чтобы этого добиться, давайте приведем функцию софтмакс к виду, зависящему от LSE.


Пусть p_i в формуле софтмакс равно 1, тогда наше равенство примет следующий вид:


\frac{e^{x_i}}{\sum_{j=0}^N{e^{x_j}}} = 1.

Применим ряд преобразований:


\frac{e^{x_i}}{\sum_{j=0}^N{e^{x_j}}} = 1, \,\, | \,\, * \sum_{j=0}^N{e^{x_j}}

e^{x_i} = \sum_{j=0}^N{e^{x_j}}, \,\, | \,\, \log(\cdot)

0 = x_i - \log{\sum_{j=0}^N{e^{x_j}}}, \,\, | \,\, \exp(\cdot)

1 = \exp\left( x_i - \log{\sum_{j=0}^N{e^{x_j}}} \right).

Получается, что вместо вычисления исходного примера можно вычислить следующее:


\frac{e^{x_i}}{\sum_{j=0}^N{e^{x_j}}} = \exp\left( x_i - LSE(x) \right).


Применим новую формулу для вычисления софтмакса:

import numpy as npx = np.array([11, 12, -1000, 5, 10, 0.001])y = np.array([-1000, 1000, -1000, 5, 10, 0.001])def softmax_initial(x):  return np.exp(x) / np.sum(np.exp(x))def LSE(x):  c = np.max(x)  return c + np.log(np.sum(np.exp(x - c)))def softmax_modified(x):  return np.exp(x - LSE(x))# с экспонентами, не приводящими к переполнениюprint('Исходный Softmax(x): ', softmax_initial(x)) print('Преобразованный Softmax(x): ', softmax_modified(x))print('Суммы вероятностей: {} {}\n'.format(np.sum(softmax_initial(x)), np.sum(softmax_modified(x))))# с экспонентой в 1000й степениprint('Исходный Softmax(y): ', softmax_initial(y))print('Преобразованный Softmax(y): ', softmax_modified(y))print('Суммы вероятностей: {} {}'.format(np.sum(softmax_initial(y)), np.sum(softmax_modified(y))))

Вывод:

Исходный Softmax(x):  [2.44579103e-01 6.64834933e-01 0.00000000e+00 6.06250985e-04 8.99756239e-02 4.08897394e-06]Преобразованный Softmax(x):  [2.44579103e-01 6.64834933e-01 0.00000000e+00 6.06250985e-04 8.99756239e-02 4.08897394e-06]Суммы вероятностей: 0.9999999999999999 1.0000000000000004Исходный Softmax(y):  [ 0. nan  0.  0.  0.  0.]Преобразованный Softmax(y):  [0. 1. 0. 0. 0. 0.]Суммы вероятностей: nan 1.0

Здесь, аналогично результатам с преобразованным lse(x), видно, что модифицированная версия софтмакса стабильнее, и не страдает от переполнения при вычислении. Сумма вероятностей, полученных из софтмакс, даёт единицу, на всех примерах векторов. Такое поведение и ожидается от этой функции.

Заключение


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

Статья была подготовлена в рамках курса Математика для Data Science. Также предлагаю всем желающим посмотреть запись бесплатного демоурока про линейные пространства и отображения.

СМОТРЕТЬ ДЕМОУРОК
Подробнее..

Как победить букмекеров с помощью ИИ опыт студентов магистратуры Наука о данных

06.05.2021 14:05:14 | Автор: admin

Привет, Хабр! Сегодня хотим представить вам проект студентов магистратуры Наука о данных НИТУ МИСиС и Zavtra.Online (подразделении SkillFactory по работе с университетами) созданный на внутреннем хакатоне, который прошел в марте. Команда поделится решением выбранной задачи предсказание победителя-бойца турнира UFC. Задача отличалась от прочих тем, что после написания модели из неё можно сделать целый продукт, оформив модель в приложение, готовое к использованию конечными пользователями, например теми, кто захочет обыграть букмекеров.


Гипотеза и её проверка

Для нашего проекта мы сформулировали гипотезу, что на победу бойца влияют:

  • физические параметры бойца (его рост, вес, размах рук и ног);

  • возраст бойца (всё-таки со временем физически мы слабеем);

  • разница в опыте соперников (вряд ли какой-то новичок без опыта одолеет Хабиба);

  • характер поведения бойца на ринге (чаще обороняется или чаще нападает);

  • географические параметры (вдруг наш боец не успел адаптироваться к другому часовому поясу).

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

Принцип разделения прост: мы случайным образом разбиваем свои данные примерно на 70 %, используемых для обучения модели, и 30 % для тестирования модели. Однако есть нюанс... Для предсказания результата боя UFC важно, чтобы тренировочная выборка была раньше тестовой во временном периоде.

Иначе модель будет смотреть в будущее, и на реальных данных модель будет работать некорректно. Этот нюанс мы учли и разбили выборку не случайным образом, а в зависимости от временных периодов.

Разработка проекта

В ходе работы над проектом мы просидели в зуме, а затем в дискорде более 10 часов. Углубились во все тонкости предобработки данных, сделали немного занимательной визуализации и обучили нашу модель.

Примерно 90 % времени мы потратили на обработку данных и остальные 10 % на обучение модели. Пайплайн подготовки данных верхнеуровнево выглядел следующим образом: мы очистили датасет от пропусков и выбросов и обогатили его новыми признаками.

Например, на основе физических характеристик рассчитали другие, а также посчитали кумулятивную статистику для каждого боя и каждого бойца. А ещё для увеличения качества модели вычислили разницу между физическими характеристиками бойцов.

Сбор данных и статистика

Ментор предоставил нам спарсенные данные по истории Боёв UFC и статистику по бойцам. Данные и Jupyter Notebook с бейзлайном модели можно найти по этой ссылке на Kaggle. В связи с тем что сроки у нас были ограничены, мы решили не заниматься дополнительным парсингом фичей, а уделить большое внимание обработке имеющихся данных и генерации новых признаков.

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

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

Предобработка данных

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

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

Вторым шагом был сбор фичей с кумулятивной статистикой по всем предыдущим боям для каждого из соперников и генерации из получившейся накопленной суммы новых важных признаков, таких как серия побед, сумма побед нокаутами, сумма чистых побед, точность ударов, среднее время боя, KO/TKO и т. д. Это перечень важных показателей по уже проведённым боям, которые обычно публикуются на сайте UFC до начала боя. Затем мы посчитали разницу по физическим характеристикам бойцов, удалили коррелированные между собой величины и законсервировали данные в pkl-файл.

Случайный лес, стекинг, бэггинг и итоговая модель

В качестве первой модели мы решили взять случайный лес, так как эта модель неплохо справляется с ненормализованными данными. Результат ошеломил по сравнению с букмекерскими конторами, процент точности был очень высок, однако не всё так просто

Изначально мы не учли наличие временного ряда, и наша модель тренировалась на данных из будущего перемешанного с прошлым, то есть мы взяли временной ряд и случайным образом поделили данные на тренировочные и тестовые (80/20). Тренировочные для тренировки модели, тестовые для проверки правильности уже тренированной модели.

Процент точности прогноза победы варьировался от 75 до 82%! Но какая разница, если обучение было неправильным?.. Модель не должна смотреть в будущее, как это было у нас. Решить эту проблему удалось достаточно просто: мы вернули даты для нашего датасета и поделили на тренировочные и тестовые по датам: данные до 2018 года взяли за тренировочные, данные после 2018 года за тестовые, и вуаля, точность упала в среднем на 5 %, однако теперь мы в ней хотя бы уверены.

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

Посмотреть на модель можно на GitHub.

Для того чтобы модель предсказала победителя на новых данных, нужно эти данные обработать таким же образом, как мы это делали в нашем ноутбуке (Jupyter Notebook) DeepOverfitting-DataPreparing, после этого просто подать эти строчки данных для двух бойцов в predict функцию нашей модели и получить предсказание, либо 0, либо 1, 0 победил 2 боец, 1 победил первый боец.

Итоги

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

Поэтому мы наметили следующий план:

  1. Улучшим точность предсказаний путем более кропотливой настройки модели.

  2. Проверим нашу текущую модель на предстоящих боях.

  3. Попробуем применить нейронные сети и глубокое обучение.

  4. Разработаем приложение, которое будет в удобном виде показывать, сколько и куда ставить.

  5. Станем кем-то кроме букмекера, кто заработает на ставках. И, конечно, будем писать на Хабре про дальнейшее развитие проекта. Букмекеры, берегитесь, мы идём за вами.

Состав команды работавшей над проектов:

  • Евгения Шикина (г. Видное)

  • Оксана Евсеева (г. Барселона)

  • Максим Щиколодков (г. Москва)

  • Михаил Стриженов (г. Москва)

  • Лев Неганов (г. Москва)

  • Кирилл Плотников (г. Екатеринбург)

Узнать больше про магистратуру можно на сайтеdata.misis.ruи вTelegram канале.

Ну и конечно не магистратурой единой! Если вы хотите узнать больше про data science, машинное и глубокое обучение заглядывайте к нам на соответствующий курсы, будет непросто, но увлекательно.

Узнайте, как прокачаться и в других специальностях и навыках или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Монетизация машинного обучения как превратить данные в деньги

12.05.2021 20:07:31 | Автор: admin

Машинное обучение одна из самых быстрорастущих отраслей в IT. Каждый год эта сфера растёт на 44 %. И, по аналитике экспертов-прогнозистов, до 2024 года размер рынка будет составлять уже свыше 30 млрд. долларов это в 25 раз больше, чем было в 2017 году. Многие компании уже понимают ценность машинного обучения для собственного бизнеса. И цель здесь прагматичная деньги. ML-специалисты помогают компаниям увеличивать свой доход.

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


Персонализация маркетинга

Любая крупная компания, которая занимается онлайн-торговлей, собирает огромное количество информации о своих клиентах (увы). Предпочтения, характер и история заказов каждого собираются с CMS и часто лежат мёртвым грузом, занимая место на сервере.

Инженер по машинному обучению способен настроить систему персонификации маркетинга, чтобы каждый посетитель сразу видел в интернет-магазине товары и рубрики, которые его заинтересуют.

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

Вместе с тем в Фейсбуке свыше 60 млн. бизнес-страниц, которые запускают рекламные кампании. Нейросеть соцсети каждый день обрабатывает свыше 60 млрд. интеракций пользователей с друг с другом и больше миллиарда с рекламой и товарами, чтобы подбирать более актуальные предложения.

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

Но для грамотного анализа совсем не обязательно обрабатывать такое огромное количество информации. К примеру, в интернет-магазине Amazon персонализация работает так. В рекомендуемом покупателю будут попадаться товары из рубрик, которые он просматривает и покупает чаще всего. Если человек покупает книги, то в рекомендуемом будут книги:

Довольно простая придумка, но она позволила увеличить продажи в целевых категориях, которыми интересуются посетители, на 15 %.

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

Вот, к примеру, как сделал интернет-магазин Very. Для персонализации маркетинга он использует только имя пользователя. Но при этом учитывает погоду за окном и геолокацию пользователя. В результате при попадании на сайт человек получает максимально личностное предложение.

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

Для создания системы анализа, как у Facebook, нужны огромный отдел ML и колоссальные производственные мощности. Реализовать идею, как у Amazon, тоже сложно, но систему, как у Very, может запустить даже middle-спец в одиночку. Все зависит от творческого подхода и грамотной реализации.

Анализ рынка и поиск новых направлений

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

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

К примеру, небольшой кейс компании, которая занимается продажей кухонных блендеров в США. Путём машинного анализа специалисты нашли 34 категории товаров, которые клиенты охотно приобретали вместе с блендерами, тем самым увеличивая средний чек покупки в среднем на 1525 %. Такой кейс можно повторить на фрилансе для разных интернет-магазинов, число которых в пандемию только выросло.

Улучшение опыта покупателя

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

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

Сервис анализировал музыку, которую сохраняют пользователи в собственные подборки, и предлагал рекомендации, основанные на этих предпочтениях. 30 песен каждую неделю. И оказалось, что сервис выдаёт рекомендации, которые лайкают абсолютное большинство слушателей.

Дата-инженеры создали довольно сложную модель анализа контекста и стилей песен и сопоставления их с предпочтениями каждого слушателя.

Она выглядит следующим образом:

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

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

Но есть и более простые примеры обычные чат-боты или голосовые помощники на основе машинного обучения. Bank of America это одна из первых крупных финансовых организаций, которая запустила бота, чтобы разгрузить собственный колл-центр.

В результате уже в первые 3 месяца бот Эрика успешно обработал миллион заявок от пользователей. Сегодня бот стал полноценным финансовым помощником и на данный момент обработал уже 100 миллионов запросов, тем самым сэкономив компании более 8 миллионов человеко-часов. А это десятки миллионов долларов в денежном эквиваленте.

Открытые платформы аналитики и статистики

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

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

Самым крупным открытым порталом структурированных данных в мире можно считать сайт Statista. На нём есть свыше 60 000 пулов данных, уже готовых для применения в статистике и аналитике.

Переплюнуть Статисту вряд ли удастся, но никто не мешает создавать обработанные пулы информации в более узконаправленных сферах. Особенно активно такие данные используют маркетологи.

Защита от мошенничества

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

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

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

Модели машинного обучения, которые выискивают мошеннические схемы, очень сложны, но они экономят просто кучу денег крупным компаниям. Поэтому спрос на них стабильно повышается. Если в 2019 году машинное обучение против мошенников использовали только 13 % крупных компаний в мире, то в 2021 году уже 40 %.

Компания Feedzai отчитывается, что в 2020 году в разы выросли попытки фрода в сферах финтех и е-коммерс. Попытки похищения данных платежных карт увеличились на 650 %, а взлома онлайн-банкинга на 250 %. Но при этом грамотная антифрод-система на базе машинного обучения способна в точности определять до 95 % случаев мошенничества и ложных отклонений оплаты и при этом сократить общие затраты на противодействие подобным схемам на 75 %.

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

По ML у нас есть две программы для тех кто только постигает Machine Learning и расширенная Machine Learning и Deep Learning, для тех кто хочет уйти в это направление всерьез и надолго. По ссылкам можно ознакомиться с программами, сравнить их с другими и сделать оптимальный для себя выбор.

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Как построить свою систему поиска похожих изображений

04.04.2021 14:14:58 | Автор: admin

Представлюсь

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

Эта публикация предназначена для Machine Learning инженеров и написана по мотивам моего выступления Поиск похожих изображений - справочник от А до Я, который был опубликован сообществом Open Data Science на Data Fest Online 2020.

Данная статья содержит справочную информацию по зарекомендованным методам, применяемым в задаче Image Retireval. Прочитав статью, вы сможете построить систему поиска похожих изображений под вашу задачу с нуля (не включая процесс разработки production решения).

О задаче

Поиск похожих изображений (по-другому, Content-Based Image Retrieval или CBIR) - это любой поиск, в котором участвуют изображения.

Проще всего о задаче расскажет картинка сверху из статьи Recent Advance in Content-based Image Retrieval: A Literature Survey (2017).

Сейчас все активнее применяется подход "Поиск по фото", в частности, в e-commerce сервисах (AliExpress, Wildberries и др.). "Поиск по ключевому слову" (с пониманием контента изображений) уже давно осел в поисковых движках Google, Яндекс и пр., но вот до маркетплейсов и прочих частных поисковых систем еще не дошел. Думаю, с момента появления нашумевшего в кругах компьютерного зрения CLIP: Connecting Text and Images ускорится глобализация и этого подхода.

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

Базовые компоненты сервиса

Шаг 1. Обучение модели. Модель может быть сделана на классике CV или на базе нейронной сети. На вход модели - изображение, на выход - D-мерный дескриптор/эмбеддинг. В случае с классикой это может быть комбинация SIFT-дескриптора + Bag of Visual Words. В случае с нейронной сетью - стандартный бэкбон по типу ResNet, EfficientNet и пр. + замысловатые пулинг слои + хитрые техники обучения, о которых мы далее поговорим. Могу сказать, что при наличии достаточного объема данных или хорошего претрена нейронные сети сильно выиграют почти всегда (мы проверяли), поэтому сосредоточимся на них.

Шаг 2. Индексирование базы изображений. Индексирование представляет из себя прогон обученной модели на всех изображениях и запись эмбеддингов в специальный индекс для быстрого поиска.

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

Нейросети и Metric Learning

Нейронная сеть в задаче поиска похожих используется как feature extractor (бэкбон). Выбор бэкбона зависит от объема и сложности данных - рассмотреть можно все от ResNet18 до Visual Transformer.

Первая особенность моделей в Image Retrieval - это магия в голове нейросети. На лидерборде по Image Retrieval борются за построение лучших дескрипторов - тут есть и Combined Global Descriptors с параллельными пулингами и Batch Drop Block для более равномерного распределения активации по выходной карте признаков.

Второй главной фишкой являются функции ошибок. Их очень много. Только в Deep Image Retrieval: A Survey представлено больше десятка зарекомендованных парных лоссов. Еще столько же есть классификационных. Главная суть всех этих лоссов - обучить нейросеть трансформировать изображение в вектор линейно разделимого пространства, так чтобы далее можно было сравнивать эти вектора по косинусному или евклидову расстоянию: похожие изображения будут иметь близкие эмбеддинги, непохожие - далекие. Рассмотрим подробнее.

Функции ошибок

Contrastive Loss

Самая простая для понимания функция ошибки - Contrastive Loss. Это парный лосс, т.е. объекты сравниваются по расстоянию между друг другом.

Нейросеть штрафуется за отдаленность друг от друга эмбеддингов изображений p и q, если эти изображения на самом деле похожи. Аналогично, возникает штраф за близость эмбеддингов, изображения которых на самом деле непохожи друг на друга. При этом в последнем случае мы ставим границу m (например, 0.5), преодолев которую, мы считаем, что нейросеть справилась с задачей "разъединения" непохожих изображений.

Triplet Loss

Triplet Loss берет во внимание три объекта - якорь, позитив (похожий на якорь) и негатив (отличный от якоря). Это также парный лосс.

Здесь мы нацелены на минимизацию расстояния от якоря до позитива и максимизацию расстояния от якоря до негатива. Впервые Triplet Loss был представлен в статье FaceNet от Google по распознаванию лиц и долгое время был state-of-the-art решением.

N-tupled Loss

N-tupled Loss - развитие Triplet Loss, в котором также берется якорь и позитив, но вместо одного негатива используется несколько негативов.

Angular Additive Margin (ArcFace)

Проблема парных лоссов заключается в выборе комбинаций позитивов, негативов и якорей - если их просто брать равномерно случайными из датасета, то возникнет проблема "легких пар". Это такие простые пары изображений, для которых лосс будет 0. Оказывается, сеть достаточно быстро сходится к состоянию, в котором большинство элементов в батче будут для нее "легкими", и лосс для них окажется нулевым - сеть перестанет учиться. Чтобы избежать этой проблемы, стали придумывать изощренные техники майнинга пар - hard negative и hard positive mining. Подробнее о проблеме можно почитать в этой статье. Существует также библиотека PML, в которой реализовано множество методов майнинга, да и вообще в библиотеке представлено много полезного по задаче Metric Learning на PyTorch.

Еще одним решением проблемы являются классификационные лоссы. Рассмотрим одну популярную функцию ошибки, которая привела к state-of-the-art в распознавании лиц три года назад - ArcFace.

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

Кажется, что это идеальная функция ошибки, особенно, когда посмотришь на бэнчмарк MegaFace. Но нужно иметь в виду, что она будет работать только при наличии классификационной разметки. Если у вас такой нет, придется работать с парными лоссами.

Здесь я визуально показываю, какие функции ошибок лучше всего применять при наличии одноклассовой и многоклассовой разметки (из последней можно вывести парную разметку путем подсчета доли пересечения между multilabel векторами примеров).

Пулинги

Вернемся к архитектуре нейросети и рассмотрим парочку pooling слоев, применяемых в задачах Image Retrieval

R-MAC

Regional Maximum Activation of Convolutions (R-MAC) - пулинг слой, принимающий выходную карту нейронной сети (до глобального пулинга или слоев классификации) и возвращающий вектор-дескриптор, посчитанный как сумма активаций в различных окнах выходной карты. Здесь активацией окна является взятие максимума по этому окну для каждого канала независимо.

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

GeM

Generalized Mean (GeM) - простой пулинг, который может улучшить качество выходного дескриптора. Суть в том, что классический average pooling можно обобщить на lambda-норму. При увеличении lambda мы заставляем сеть фокусироваться на значимых частях изображения, что в определенных задачах может быть важно.

Ранжирование

Индексы

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

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

Датасет glove, размер эмбеддинга 100, расстояние - angularДатасет glove, размер эмбеддинга 100, расстояние - angular

Указанные проблемы можно решить в ущерб качеству - хранить эмбеддинги не в исходном виде, а сжатом (квантизованном). А также изменить стратегию поиска - искать не brute-force, а стараться за минимальное число сравнений найти нужное число ближайших к данному запросу. Существует большое число эффективных фреймворков приближенного поиска ближайших. Для них создан специальный бэнчмарк, где можно посмотреть, как ведет себя каждая библиотека на различных датасетах.

Самые популярные: отечественная NMSLIB, Spotify Annoy, Facebook Faiss, Google Scann. Также, если хочется взять индексирование с REST API "из коробки", можно рассмотреть приложение Jina.

Переранжирование

Исследователи в области Information Retrieval давно поняли, что упорядоченная поисковая выдача может быть улучшена неким способом переупорядочивания элементов после получения исходной выдачи.

Одним из таких методов является Query Expansion. Идея состоит в том, чтобы использовать top-k ближайших элементов для генерации нового эмбеддинга. В самом простом случае можно взять усредненный вектор, как показано на картинке выше. Также можно взвесить эмбеддинги, например, по отдаленности в выдаче или косинусному расстоянию от запроса. Подобные улучшения описаны в едином фреймворке в статье Attention-Based Query Expansion Learning. По желанию можно применить Query Expansion рекурсивно.

k-reciprocal

k-reciprocal - множество элементов из top-k, в числе k ближайших которых присутствует сам запрос. На базе этого множества строят процесс переранжирования выдачи, один из которых описан в статье Re-ranking Person Re-identification with k-reciprocal Encoding. По определению, k-reciprocal ближе к запросу, чем k-nearest neighbors. Соответственно, можно грубо считать элементы, попавшие в множество k-reciprocal заведомо позитивными и изменять правило взвешивания, например, для Query Expansion. В данной статье разработан механизм пересчета дистанций с использований k-reciprocal множеств самих элементов в top-k. В статье много выкладок, это выходит за рамки данного поста, поэтому предлагаю читателю ознакомиться самостоятельно.

Валидация

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

Метрики

В первую очередь - метрики. Рассмотрим такие популярные метрики в задаче Image Retrieval: precision@k, recall@k, R-precision, mAP и nDCG.

precision@k

Показывает долю релевантных среди top-k ответов.

Плюсы:

  • показывает, насколько система избирательна в построении top-k

Минусы:

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

  • достичь значение 1 возможно только, если число релевантных >= k для всех запросов

R-precision

То же самое, что precision@k, где k устанавливается равным числу релевантных к данному запросу

Плюсы:

  • исчезает чувствительность к числу k в precision@k, метрика становится стабильной

Минусы:

  • приходится знать общее число релевантных к запросу (может быть проблемой, если не все релевантные размечены)

recall@k

Показывает, какая доля релевантных была найдена в top-k

Плюсы:

  • отвечает на вопрос, найдены ли релевантные в принципе среди top-k

  • стабильна и хорошо усредняется по запросам

mAP (mean Average Precision)

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

Плюсы:

  • объективная стабильная оценка качества поиска

  • является одно-численным представлением precision-recall кривой, которая сама по себе богата информацией для анализа

Минусы

  • приходится знать общее число релевантных к запросу (может быть проблемой, если не все релевантные размечены)

Подробнее про метрики в Information Retrieval, в том числе посмотреть вывод mAP, можно почитать здесь.

nDCG (Normalized Discounted Gain)

Данная метрика показывает, насколько корректно упорядочены элементы в top-k между собой. Плюсы и минусы этой метрики не будем рассматривать, поскольку в нашем списке это единственная метрика, учитывающая порядок элементов. Тем не менее, есть исследования, показывающие, что при необходимости учитывать порядок данная метрика является достаточно стабильной и может подойти в большинстве случаев.

Усреднение

Также важно отметить варианты усреднения метрик по запросам. Рассмотрим два варианта:

macro: для каждого запроса считается метрика, усредняем по всем запросам

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

micro: число размеченных релевантных и отдельно успешно найденных релевантных суммируется по всем запросам, затем участвует в дроби соответствующей метрики

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

Схемы валидации

Предлагаю рассмотреть два варианта валидации.

Валидация на множестве запросов и выбранных к ним релевантных

На вход: изображения-запросы и изображения, релевантные к ним. Имеется разметка в виде списка релевантных для данного запроса.

Для подсчета метрик можно посчитать матрицу релевантности каждый с каждым и, на основе бинарной информации о релевантности элементов посчитать метрики.

Валидация на полной базе

На вход: изображения-запросы, и изображения, релевантные к ним. Также должна быть валидационная база изображений, в которой в идеале отмечены все релевантные к данным запросам. А также в ней не должно присутствовать изображений-запросов, иначе придется их чистить на этапе поиска, чтобы они не засоряли top-1. Валидационная база участвует как база негативов - наша задача вытянуть релевантные по отношению к ней.

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

Пример реализованного проекта

Некоторые компании спорят с другими компаниями, чтобы вторые не использовали изобразительные элементы бренда первых. В таких случаях более слабый производитель пытается паразитировать на успехе крупного бренда, выдавая свои продукты и услуги под похожей символикой. От этого страдают и пользователи - вы можете по ошибке купить сыр не того производителя, которому вы уже доверяете, а взять подделанный товар, не прочитав внимательно этикетку. Пример из недавнего: Apple Is Attempting to Block a Pear Logo Trademark.

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

Устройство нашей системы

Для обучения, валидации и разработки поискового приложения мы разработали такую систему. Здесь Training pipeline, Benchmark, Indexer и Demo Web app - независимые репозитории, Logo Search app - поисковое приложение одного из клиентов. Объем индексируемой базы изображений: 1.5 млн товарных знаков.

Примеры работы

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

Заключение

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

Подробнее..

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

21.04.2021 18:22:57 | Автор: admin

Перевод статьи подготовлен в преддверии старта курса "Deep Learning. Basic".

Предлагаем также всем желающим посмотреть запись вебинара
Knowledge distillation: нейросети обучают нейросети.


В конце 2018 года исследователи из FAIR опубликовали статью Переосмысление предобучения в ImageNet, которая впоследствии была представлена на ICCV2019. В статье представлены некоторые очень интересные выводы относительно предобучения. Я тогда не стал посвящать этому событию отдельный пост, но мы долго обсуждали его в нашем слаке (KaggleNoobs). Исследователи из Google Research and Brain team предложили расширенную версию той же концепции. Их новая публикация затрагивает не только тему предобучения (pre-training), она также исследует самообучение (self-training), сравнивая его с предобучением и обучением без учителя (self-supervised learning) на тех же наборах задач.

Введение

Прежде чем мы углубимся в детали, представленные в публикации, давайте сделаем один шаг назад и обсудим сначала несколько понятий. Предобучение очень распространенная практика в различных областях, таких как компьютерное зрение, NLP и генерация речи. Когда речь заходит о компьютерном зрении, мы ожидаем, что модель, предварительно обученная на одном наборе данных, поможет другой модели. Например, предобучение ImageNet с учителем является широко используемым методом инициализации для моделей обнаружения и сегментации объектов. Трансферное обучение (transfer learning) и точная настройка (fine-tuning) два распространенных метода для реализации этой затеи.

С другой стороны, самообучение пытается улучшить эффективность модели за счет включения прогнозов для модели на неразмеченных данных для получения дополнительной информации, которая может быть использована во время обучения. Например, использование ImageNet для улучшения модели обнаружения объектов COCO. Сначала модель обучается на наборе данных COCO. Затем она используется для создания псевдо-меток для ImageNet (мы отбрасываем исходные метки ImageNet). Затем псевдо-размеченные данные ImageNet и размеченные данные COCO объединяются для обучения новой модели.

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

Что ж, хватит болтовни! Мудреные определения в сторону, ведь вы до сих пор не понимаете, о чем конкретно эта статья? Или мы собрались здесь, чтобы определения почитать?

Мотивация

Мы используем эти методы уже достаточно давно. Авторы заинтересованы в том, чтобы найти ответы на следующие вопросы:

  1. Насколько может помочь предобучение? Когда предобучение не приносит пользы?

  2. Можем ли мы использовать самообучение вместо предобучения и получить аналогичные или лучшие результаты по сравнению с предобучением и обучением без учителя?

  3. Если самообучение превосходит предобучение (если предположить, что это так), то насколько оно лучше, чем предобучение?

  4. В каких случаях самообучение лучше предобучения?

  5. Насколько самообучение гибкое и масштабируемое?

Сетап

Наборы данных и модели

  1. Обнаружение объектов: авторы использовали набор данных COCO (118K изображений) для обнаружения объектов с применением обучения с учителем. ImageNet (1,2М изображений) и OpenImages (1,7М изображений) использовались в качестве немаркированных наборов данных. Были использован детектор RetinaNet с EfficientNet-B7 в качестве базовой сети (backbone). Разрешение изображений было до 640 x 640, слои пирамиды от P3-P7 и использовались 9 якорей на пиксель.

  2. Семантическая сегментация: для обучения с учителем использовался набор для обучения сегментации PASCAL VOC 2012 (1,5K изображений). Для самообучения авторы использовали аугментированный набор данных PASCAL (9K изображений), COCO (240K размеченных, а также неразмеченных изображений) и ImageNet (1,2M изображений). Использовалась модель NAS-FPN с EfficientNet-B7 и EfficientNet-L2 в качестве базовых сетей.

Дополнительные сведения, такие как размер пакета, скорость обучения и т. д., смотрите в разделе 3.2 в публикации.

Аугментация данных

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

  1. Augment-S1: это стандартная Flip and Crop (переворот и кадрирование) аугментация. Стандартный метод flip and crop состоит из горизонтальных переворотов изображения и флуктуаций масштаба (scale jittering). Операция флуктации также может быть случайной, так же как то как мы изменяем размер изображения до (0.8, 1.2) от размера исходного изображения, а затем обрезаем его.

  2. Augment-S2: состоит из AutoAugment и переворотов и кадрирований.

  3. Augment-S3: включает сильную флуктуацию масштаба, AutoAugment, перевороты и кадрирование. Флуктуация масштаба увеличен до (0.5, 2.0).

  4. Augment-S4: комбинация RandAugment, переворотов и кадрирования и сильной флуктуацией масштаба. Флуктуация масштаба такая же, как и в Augment-S2/S3.

Предварительное обучение

Для изучения эффективности предобучения использовались предварительно обученные контрольные точки (checkpoints) ImageNet. EfficientNet-B7 архитектура, используемая для оценки. Для этой модели использовались две разные контрольные точки. Они обозначаются как:

  1. ImageNet: контрольная точка EfficientNet-B7, обученная с помощью AutoAugment, которая достигает 84,5% top-1 точности в ImageNet.

  2. ImageNet++: контрольная точка EfficientNet-B7, обученная с помощью метода Noisy Student, который использует дополнительные 300 млн неразмеченных изображений и обеспечивает 86,9% top-1 точности.

Обучение из случайной инициализации обозначается как Rand Init.

Самообучение

Реализация самообучения основана на алгоритме Noisy Student и состоит из трех этапов:

  1. Модель-учитель обучается на размеченных данных, например, на наборе данных COCO.

  2. Затем модель-учитель используется для создания псевдометок для неразмеченных данных, например ImageNet.

  3. Модель-ученик обучается оптимизировать потери на человеческой разметке и псевдо-метках одновременно.

Ради бога, можем ли мы уже взглянуть на хоть какие-нибудь эксперименты?

Эксперименты

Влияние увеличения и размера размеченного набора данных на предобучение

Авторы использовали ImageNet для предварительного обучения с учителем и варьировали размер размеченного набора данных COCO для изучения эффекта предобучения. Разнился не только размер размеченных данных, но и аугментации разной силы для обучения RetinaNet с EfficientNet-B7 в качестве базовой сети. Авторы наблюдали следующие факты:

  1. Предобучение ухудшает эффективность, когда используется более сильная аугментация данных: авторы заметили, что, когда они используют стандартную аугментацию, Augment-S1, как она описана выше, предобучение помогает. Но по мере увеличения силы аугментации, предобучение помогает все меньше и меньше. Даже больше, они заметили, что при использовании сильнейшей аугментации (Augment-S3) предварительная тренировка на самом деле сильно ухудшает эффективность.

  2. Чем больше размеченных данных, тем меньше польза предварительного обучения: это не открытие. Все мы знаем, что предварительное обучение помогает, когда у нас мало данных. Но если у нас достаточно размеченных данных, то обучение с нуля не будет результировать в плохой эффективности. Авторы пришли к такому же выводу, и этот вывод согласуется с публикацией FAIR.

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

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

Влияние увеличения и размера размеченного набора данных на самообучение

Теперь, когда мы увидели влияние предварительного обучения, пришло время проверить результаты с той же задачей (в данном случае обнаружение объекта COCO) с той же моделью (RetinaNet детектор с базой EfficientNet-B7), но на этот раз с самообучением. Авторы использовали для самообучения набор данных ImageNet (метки для ImageNet в этом случае отбрасываются). Авторы отметили следующее:

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

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

Погодите-ка секундочку! Когда используется ImageNet++ init, выигрыш невелик по сравнению с выигрышем в Rand init и ImageNet init. Есть какая-то конкретная причина?

Да, ImageNet++ init получается из контрольной точки, для которой использовались дополнительные 300M неразмеченных изображений.

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

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

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

Не хочется вас разочаровывать, но ответ НЕТ. Чтобы исследовать эффекты обучения без учителя, авторы использовали полный набор данных COCO и сильнейшие аугментации. Цель состояла в том, чтобы сравнить случайную инициализацию с моделью, предварительно обученной с помощью современного алгоритма с обучения без учителя. Контрольная точка для SimCLR в этом эксперименте использовалась до того, как она была тонко настроена (fine-tuned) в ImageNet. Поскольку SimCLR использует только ResNet50, основа детектора RetinaNet была заменена на ResNet50. Вот результаты:

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

Что мы узнали?

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

Мы увидели, что предварительное обучение (как контролируемое, так и самостоятельное) не всегда приводит к повышению эффективности. Более того, оно всегда уступает самообучению. Почему так происходит? Почему предобучение ImageNet не так хорошо для обнаружения объектов COCO? Почему представления, полученные с помощью предобучения без учителя, не помогли повысить эффективность?

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

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

Совместное обучение

Как указали авторы, одна из сильных сторон парадигмы самообучения состоит в том, что оно совместно обучает цели с учителем и цели самообучения, тем самым устраняя несоответствие между ними. Мы всегда можем утверждать, что вместо того, чтобы искать какой-либо другой метод устранения несоответствия различий между задачами, почему мы не можем обучаться вместе, например, совместно обучая ImageNet и COCO?

Авторы использовали тот же сетап, что и при самообучении для этого эксперимента, и обнаружили, что предобучение ImageNet дает улучшение +2,6AP, но использование случайной инициализации и совместного обучения дает больший выигрыш +2,9AP. Более того, предобучение, совместная тренировка и самообучение все могут работать вместе. Используя тот же источник данных ImageNet, предобучение ImageNet получает улучшение +2,6AP, предобучение + совместное обучение дает +0,7AP, а комбинация предобучения + совместного обучение + самообучение дает улучшение +3,3AP.

Важность согласования задач

Как мы видели выше, согласование задач важно для повышения производительности. В этой статье сообщалось о схожих выводах о том, что предобучение на Open Images снижает эффективность COCO, несмотря на то, что оба они помечены ограничивающими рамками. Это означает, что мы не только хотим, чтобы задача была такой же, но и чтобы аннотации были одинаковыми, чтобы предварительное обучение было действительно полезным. Авторы отметили еще две интересные вещи:

  1. Предварительное обучение ImageNet, даже с дополнительными человеческими метками, работает хуже, чем самообучение.

  2. При сильной аугментации данных (Augment-S4) обучение с помощью PASCAL (наборы данных для обучения + аугментация) на самом деле снижает точность. Между тем, псевдометки, созданные путем самообучения на одном и том же наборе данных, повышают точность.

Масштабируемость, универсальность и гибкость самообучения

Из всех экспериментов, проведенных авторами, мы можем сделать вывод, что:

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

  2. Самообучение не зависит от архитектуры или набора данных. Он хорошо работает с различными архитектурами, такими как ResNets, EfficientNets, SpineNet и т. д., а также с различными наборами данных, такими как ImageNet, COCO, PASCAL и т. д.

  3. В общем, самообучение хорошо работает, когда предобучение терпит неудачу, но также и когда предобучение обучение тоже работает хорошо.

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

Это хорошо. Некоторые из перечисленных здесь пунктов вызывают множество вопросов о том, как все мы использовали предварительное обучение. Но все, что имеет плюсы, имеет и минусы. Вы, должно быть, скрываете какой-то важный момент?

Ограничения самообучения

Хотя у самообучение есть свои преимущества, у него также есть несколько ограничений.

  1. Самостоятельное обучение требует больше вычислительных ресурсов, чем точная настройка на предварительно обученной модели.

  2. Ускорение от предобучения варьируется от 1,3x до 8x, в зависимости от качества предобученной модели, силы аугментации данных и размера набора данных.

  3. Самообучение не является полной заменой трансферного обучения и тонкой настройки. Оба эти метода также будут активно использоваться в будущем.

Заключение

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


Узнать подробнее о курсе "Deep Learning. Basic".

Смотреть запись вебинара Knowledge distillation: нейросети обучают нейросети.

Подробнее..

Перевод Контролируемое и неконтролируемое обучение в чем разница?

23.04.2021 20:10:29 | Автор: admin

В общих чертах рассмотрим два подхода к анализу и обработке данных обучение контролируемое (с учителем) и неконтролируемое (без учителя). Основная разница в том, что в первом случае используются размеченные данные для помощи в прогнозировании, а во втором нет. Но у обоих подходов есть более тонкие различия и ключевые области, в которых они превосходят друг друга.



Что такое контролируемое обучение?


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


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


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

Что такое неконтролируемое обучение?


При неконтролируемом обученииалгоритмы машинного обучения используются для анализа и группирования наборов неразмеченных данных. Эти алгоритмы выявляют шаблоны в данных без вмешательства человека (поэтому они неконтролируемые).


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


  • Кластеризация это метод интеллектуального анализа данных, применяемый для группирования неразмеченных данных исходя из их сходств и различий. Например, в рамках алгоритмов кластеризации по K-средним похожие точки данных объединяются в группы, где значение K представляет размер группы и степень структурированности. Этот метод подходит для сегментации рынка, сжатия изображений и т.д.
  • Ассоциация метод неконтролируемого обучения, в котором для выявления взаимосвязей между переменными и заданным набором данных используются определенные правила. Эти методы часто применяются для анализа покупательского поведения и создания рекомендательных сервисов и отбора товаров в категориях Вместе с этим товаром покупают.
  • Снижение размерности это метод обучения, который используется в том случае, когда в определенном наборе данных слишком много признаков(или размерностей). Он сокращает количество входных данных до управляемого, сохраняя при этом их целостность. Этот метод часто используется на этапе обработки данных, например когда автокодировщики удаляют помехи из визуальных данных для повышения качества изображения.

Основная разница между контролируемым и неконтролируемым обучением: размеченные данные


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


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


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


Другие ключевые различия между контролируемым и неконтролируемым обучением


  • Цели.Цель контролируемого обучения прогнозировать результаты по новым данным. Вы заранее знаете, какого рода результат ожидать. Цель неконтролируемого обучения получить полезную информацию из огромного объема новых данных. В ходе обучения машина сама определяет, какая информация из набора необычна или представляет интерес.
  • Области применения. Модели контролируемого обучения идеально подходят для обнаружения спама, анализа тональности высказываний, прогнозирования погоды, изменения цен и т.д. Модели неконтролируемого обучения созданы для выявления отклонений, повышения эффективности рекомендательных сервисов, прогнозирования поведения клиентов и медицинской визуализации.
  • Сложность.Контролируемое обучение это простой метод машинного обучения, который обычно рассчитывается с использованием таких программ как R или Python.Неконтролируемое обучение требует мощных инструментов для работы с большим количеством неклассифицированных данных. Модели неконтролируемого обучения отличаются высокой вычислительной сложностью, поскольку для получения необходимых результатов нужна большая обучающая выборка.
  • Недостатки. Модели неконтролируемого обучения могут быть затратными по времени, а разметка входных и выходных данных требует опыта и знаний. Методы неконтролируемого обучения могут давать очень неточные результаты, если выходные переменные не будут валидироваться человеком.

Контролируемое и неконтролируемое обучение: что лучше?


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


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


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



Подробную информацию о разработке моделей машинного обучения см. в бесплатных обучающих материалах на порталедля разработчиков IBM Developer Hub.





Джулианна Делуа (Julianna Delua)


Эксперт в области анализа и обработки данных/машинного обучения IBM Analytics






Исходный текст: https://www.ibm.com/cloud/blog/supervised-vs-unsupervised-learning

Подробнее..

Разработка Computer Vision в онкологии почему всегда нужно еще больше сил, времени и денег

25.05.2021 16:13:10 | Автор: admin
image

Привет!

Я Жека Никитин, Head of AI в компании Celsus. Больше трех лет мы занимаемся разработкой системы для выявления патологий на медицинских снимках.

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

Ориентировался я в первую очередь на ML-разработчиков и DS-менеджеров, но пост может быть интересен и всем любопытствующим, кто хочет разобраться со спецификой CV в медицине.

Собираем данные для обучения


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

image

Вы собрали команду талантливых программистов, ML-инженеров и аналитиков, купили дорогое оборудование, арендовали офис и продумали маркетинговую стратегию. Кажется, все готово для того, чтобы начать менять мир к лучшему! Увы, все не так просто, ведь вы забыли о самом главном о данных. Без них нельзя натренировать нейронную сеть или другую модель машинного обучения.

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

Рассмотрим ситуацию на все том же примере детекции рака молочной железы. Более или менее качественные публичные датасеты можно пересчитать по пальцам одной руки: DDSM (порядка 2600 кейсов), InBreast (115), MIAS (161). Есть еще OPTIMAM и BCDR с достаточно сложной и запутанной процедурой получения доступа.

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

Итак, вы разослали запросы в медицинские учреждения, подняли все свои связи и контакты и получили в руки разношерстную коллекцию различных снимков. Не радуйтесь раньше времени, вы в самом начале пути! Ведь несмотря на наличие единого стандарта хранения медицинских изображений DICOM (Digital Imaging and Communications in Medicine), в реальной жизни все не так радужно. К примеру, информация о стороне (Left/Right) и проекции (CC/MLO) снимка молочной железы могут в разных источниках данных храниться в абсолютно разных полях. Решение тут единственное собирать данные из максимального числа источников и пытаться учесть в логике работы сервиса все возможные варианты.

Что разметишь, то и пожнешь


image

Мы наконец-то подобрались к самому интересному процессу разметки данных. Что же делает его таким особенным и незабываемым в сфере медицины? Во-первых, сам процесс разметки намного сложнее и дольше, чем в большинстве индустрий. Рентгеновские снимки невозможно загрузить в Яндекс.Толоку и за копейки получить размеченный датасет. Здесь требуется кропотливая работа медицинских специалистов, причем каждый снимок желательно отдавать для разметки нескольким врачам а это дорого и долго.

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

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

image

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

image

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

Конечно, если подходить к процессу с умом, то затраты можно и нужно сокращать например, с помощью активного обучения. В этом случае ML-система сама подсказывает врачам, какие снимки нужно доразметить для того, чтобы максимально улучшить качество распознавания патологий. Существуют разные способы оценки уверенности модели в своих предсказаниях Learning Loss, Discriminative Active Learning, MC Dropout, энтропия предсказанных вероятностей, confidence branch и многие другие. Какой из них лучше использовать, покажут только эксперименты на ваших моделях и датасетах.

Наконец, можно вовсе отказаться от разметки врачей и полагаться только на конечные, подтвержденные исходы например, смерть или выздоровление пациента. Возможно, это лучший подход (хотя и здесь есть куча нюансов), вот только начать работать он может в лучшем случае лет через десять-пятнадцать, когда повсеместно будут внедрены полноценные PACS (picture archiving and communication systems) и медицинские информационные системы (МИС) и когда будет накоплено достаточное количество данных. Но даже в этом случае чистоту и качество этих данных вам никто не гарантирует.

Хорошей модели хороший препроцессинг


image

Ура! Модель обучена, показывает отличные результаты и готова к запуску в пилотном режиме. Заключены договоры о сотрудничестве с несколькими медицинскими организациями, система установлена и настроена, врачам проведена демонстрация и показаны возможности системы.

И вот первый день работы системы закончен, вы с замиранием сердца открываете дашборд с метриками И видите такую картину: куча запросов в систему, при этом ноль обнаруженных системой объектов и, конечно, негативная реакция от врачей. Как же так? Ведь система отлично показала себя на внутренних тестах!

При дальнейшем анализе выясняется, что в этом медицинском учреждении стоит какой-то незнакомый для вас рентгеновский аппарат со своими настройками, и снимки в результате внешне выглядят абсолютно по-другому. Нейронная сеть не обучалась на таких снимках, поэтому неудивительно, что на них она проваливается и ничего не детектирует. В мире машинного обучения такие случаи обычно называют Out-of-Distribution Data (данные не из исходного распределения). Модели обычно показывают значительно худшие результаты на таких данных, и это является одной из главных проблем машинного обучения.

Наглядный пример: наша команда протестировала публичную модель от исследователей из Нью-Йоркского университета, обученную на миллионе снимков. Авторы статьи утверждают, что модель продемонстрировала высокое качество детектирования онкологии на маммограммах, а конкретно они говорят о показателе точности ROC-AUC в районе 0.88-0.89. На наших данных эта же модель демонстрирует значительно худшие результаты от 0.65 до 0.70 в зависимости от датасета.

Самое простое решение этой проблемы на поверхности нужно собирать все возможные виды снимков, со всех аппаратов, со всеми настройками, размечать их и обучать на них систему. Минусы? Опять же, долго и дорого. В некоторых случаях можно обойтись и без разметки на помощь вам придет обучение без учителя (unsupervised learning). В нейронку определенным подаются неразмеченные снимки, и модель привыкает к их признакам, что позволяет ей успешно детектировать объекты на подобных изображениях в будущем. Это можно делать, например, с помощью псевдоразметки неразмеченных снимков или различных вспомогательных задач.

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

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


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

image
image

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

image

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

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

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

Как я Лигу Легенд парсил

19.04.2021 00:19:54 | Автор: admin

Привет, Хабр!

Осмелюсь сегодня рассказать, как мне довелось извлекать данные прямо из видеозаписей турнирных игр по игре League of Legends с помощью глубоких нейронных сетей: зачем это нужно, какие архитектуры и приёмы использовались, и с какими сложностями я столкнулся.

Шаг 0: Разбираемся, что к чему

Лига Легенд (League of Legends, LoL) - популярная MOBA игра, с ежемесячной аудиторией более чем в 100 млн игроков всему миру. LoL была разработана компанией Riot Games и выпущена в далёком 2009-м году.

Именно благодаря политике компании Riot Games мне и довелось познакомиться с данной задачей извлечения статистик прямо из турнирных видео. Дело в том, что Риоты с очень большой неохотой отдают турнирные данные, из-за чего проведение анализа сильно осложняется. К примеру китайский чемпионат вообще имеет закрытое апи и получить ну хоть какие-то игровые статистики становится невозможным. Почти...

Скриншот стрима матча континентальной лиги. LCL Летний Сплит 2020.Скриншот стрима матча континентальной лиги. LCL Летний Сплит 2020.

Для начала разберёмся с игровым HUD-ом (Heads-Up Display - визуальный интерфейс игры). На картинке выше цветами выделены основные его части:

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

  2. Боковые панели (фиолетовый цвет) - две панели, содержащие в себе информацию о чемпионах - игровых персонажах обеих команд. Панели показывают количество жизненной силы и маны чемпиона, а также набор его способностей с индикацией использования.

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

  4. Нижняя панель (красный цвет) - наиболее нагруженная панель, показывающая более детальные статистики по каждому чемпиону, такие как: K/D/A (Kills/Deaths/Assists), кол-во убитых миньонов, а также набор предметов в инвентаре чемпиона.

Шаг 1: Парсинг верхней панели

  1. Первично была произведена аннотация данных. С использованием утилиты CVAT были выделены обрамляющими прямоугольниками необходимые поля, а также в ручном режиме выписаны их числовые значения. Хоть и задача распознавания чисел на картинке и не кажется сложной для современных нейронных сетей, в ручном режиме необходимость всё же была, т.к. эти самые современные нейронные сети (Google OCR, Yandex OCR) показали откровенно плохие результаты на некоторых типах полей при тестировании, не говоря уже об открытых движках для распознавания (Tesseract OCR, EasyOCR).

  2. Далее нам необходимо научиться выделять (детектировать) нужные нам поля. Для решения данной задачи было принято использовать segmentation-based подход. Я взял сеть Unet c предобученным efficientnet энкодером и обучил решать задачу instance сегментации для трех классов: башни (жёлтый цвет), золото (зелёный цвет) и кол-во убийств (фиолетовый цвет). Имплементация модели была взята из репозитория segmentation_models.pytorch. Хороший код для обучения таких моделей на Pytorch Lightning вы можете найти в репозитории Владимира Игловикова по сегментированию одежды.

  3. Теперь мы умеем получать маски с классами, а после применения watershed алгоритма даже целые отдельные области нахождения наших полей. Пора научиться их распознавать. Вдохновением для решения данной задачи послужили статьи по распознаванию номеров домов SVHN , а конкретно multihead архитектуры. Идея такова, что если мы имеем последовательности чисел фиксированной небольшой длины (а мы имеем), то мы можем не возиться с RNN или же детектировать отдельные символы. Мы можем взять энкодер и поставить за ним несколько отдельных голов по количеству цифр в числе, с 11-ю (11-ый для случаев, когда цифры нет) выходами в каждой. Каждая голова будет отвечать за предсказание отдельной цифры в числе, но учится все они будут вместе. Схожий подход можно найти имплементированным на Pytorch здесь.

  4. Но не будем забывать, что мы имеем дело с видео. Т.е. нам нужно научить модель работать с последовательностями кадров. Для этого был выбран простейший подход: а давайте просто заменим все 2D свёртки на трёхмерные. Как итог, практически без изменения архитектуры сети, мы добиваемся нужного результата, ведь размерности выходов у этих слоёв одинаковы. Добавление 3D свёрток сильно уменьшает количество выбросов распознавания, ведь сеть учится, что после числа N может идти либо само это чисто, либо же N+1.

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

Multihead OCR архитектураMultihead OCR архитектураНо зачем таймер-то парсить?

Если вы подумали, что в этом нет необходимости и зная одно лишь начало игры таймер восстанавливается однозначно, то я поспешу вас расстроить. Таймер на видео (внимание) не является линейным. Скажу даже больше, если вам интересно - можете посмотреть данный пятисекундный ролик и объяснить, почему семнадцатая секунда длится по времени как две :/

Шаг 2: Парсинг боковых панелей

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

  2. Начнём с самого простого: определение кол-ва здоровья и маны чемпиона. Для начала стоит предобработать вырезанные прямоугольные области . Переведём их в цветовую модель HSV (данный переход нужен для более простых манипуляций с цветами) и оставим лишь цвета из нужного диапазона: зелёного для здоровья и синего для маны. Теперь всё просто: итерируемся по матричному представлению одного из каналов изображения (или всех вместе) и ищем наиболее резкий переход между цветом и его подложкой. Разделив x-координату на размер всей области, из относительного перехода получаем значение кол-ва здоровья/маны чемпиона. Данный элементарный метод, как ни странно, показывает отличные результаты, являясь в достаточной мере робастным и точным.

  3. Далее нам нужно распознать классы заклинаний чемпиона и их статус(готовы заклинания к использованию или нет). О статусе заклинания можно узнать по наличию постепенно уходящего затемнения по часовой стрелке , чуть позже мы научимся определять прогресс этого отката. А пока вспомним, что такое multihead архитектура нейронной сети и применим ёё и здесь. Вместо предобученного энкодера возьмём простой набор из нескольких свёрточных и пуллинг слоёв в качестве кодировщика и пару голов с полносвязными слоями, одна из которых будет отвечать за предсказание класса заклинания, а другая за его состояние (активен/нет активен).

  4. К сожалению, свёрточные нейронные сети хуже приспособлены к тому, чтобы решать регрессионные задачи, а задача определения прогресса, когда заклинание будет готово является таковой. В процессе рисёрча я наткнулся на статью, в которой исследователи (да, кто-то публикует статьи про LoL) решили её за меня. Основная идея заключалась в том, чтобы взять неглубокую свёрточную нейросеть и решать ей задачу классификации, разделив набор вариантов отката заклинания на 20-ть интервалов воспринимая их как 20-ть отдельных классов и считая финальное число как взвешенную среднюю активаций выходных нейронов. Я слегка изменил данный подход, сделав не 20-ть, а 100 интервалов, вычисляя финальное число как argmax по выходам сети (в целом, так делать теоретически правильнее).

  5. На сладкое остаётся задача классификации чемпиона по его иконке. Её также можно решать обучив простую нейросеть классификации. На первое время так и сделаем, для того, чтобы набрать данных для обучения другой сети, более архитектурно подходящей для наших баранов. Подход с простой сетью-классификатором ограничен проблемой, которая называется OOD (Out-of-Domain), ведь разработчики достаточно часто добавляют новых чемпионов в игру, и чтобы не переобучать сеть каждый раз я решил обучить другую, основанную на подходе metric learning. Данный подход позволяет обучать сеть находить схожие изображения. Для этого я взял простую сеть-классификатор и вместо оптимизации кросс-энтропии и случайного сэмплирования оптимизировал hinge-loss с hard-negative triplet сэмплированием, чтобы сеть научалась выучивать эмбеддинги чемпионов.

Мяу?

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

Но зачем hinge-loss-то обучать?

В целом вопрос хороший. На самом деле саму задачу можно научиться решать вообще без использования нейросетей, т.к. сама по себе она является задачей pattern recogntion. Но при тестировании методы pattern recogntion оказались очень медленными и не робастными, поэтому от них я отказался.

Шаг 3: Парсинг мини-карты

  1. Ещё одна задача, которую кто-то уже решал до меня. Человек под ником Farza собрал датасет из ста тысяч изображений (огромное спасибо ему за это) и обучил на нём модель детекции Yolo, получив неплохие метрики детекции, но не особо хорошие классификации чемпионов. Давайте применим немного другой подход, используя его датасет.

  2. Yolo - anchor-based архитектура детекции, которая не очень хорошо справляется с коллизиями объектов. Мне же нравится идея применить segmentation-based подход. Для начала сгенерируем маски. Используя имеющуюся разметку будем генерировать два вида масок: маска чемпиона (синий цвет), граница изображения чемпиона (желтый цвет). Это довольно известный приём для instance сегментации, идея которого состоит в предсказании всего двух видов масок, а потом в вычитании границ.

  3. Вновь обучаем Unet.

  4. Далее в ход идёт уже упомянутый watershed алгоритм. Теперь нужно научиться понимать, что за чемпиона вы отсегментировали. Вспоминаем, что у нас уже обучена нейросеть, которая выдаёт нам векторные представления чемпионов. Просто итерируемся по уже найденным героям на боковых панелях и сравниваем используя косинусное расстояние, их изображения с нашим отсегментированным.

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

Шаг N: Итоги

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

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

Спасибо за внимание!

Подробнее..

Перевод Facebook Prophet Deep Learning NeuralProphet

04.05.2021 18:23:50 | Автор: admin

Улучшение интерпретируемой модели Prophet с помощью глубокого обучения

Привет, хабровчане. В рамках набора учащихся на онлайн-курс "Machine Learning. Advanced" подготовили перевод материала.

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


Изучая прогнозирование временных рядов, рано или поздно вы наткнетесь на чрезвычайно популярную модель Prophet, разработанную Facebook. Она приобрела свою большую популярность благодаря тому, что обеспечивает хорошие показатели с точки зрения точности, интерпретируемых результатов и, в то же время, автоматизирует многие элементы (например, подбор гиперпараметров или конструирование признаков) за пользователя. Вот почему ее относительно просто использовать как и опытным датасайентистам, так и энтузиастам с меньшим техническим багажом.

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

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

NeuralProphet

Чтобы понять, что такое NeuralProphet, я кратко рассмотрю ее составные части и объясню, как все они складываются воедино.

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

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

Источник

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

  • Prophet может использовать дополнительные внешние регрессоры т.е. не только лаговые значения цели

  • модель может учитывать эффект праздников

  • она может автоматически обнаруживать поворотные точки в тенденции например, когда возрастающая тенденция становится убывающей

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

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

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

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

Как упоминалось во введении, основными преимуществами использования Prophet являются хорошая производительность, интерпретируемость, а также простота установки и использования. Именно на это авторы NeuralProphet ориентировались в разработке своей библиотеки сохранить все преимущества Prophet, улучшив при этом его точность и масштабируемость за счет внедрения улучшенного бэкенда (PyTorch вместо Stan) и использования авторегрессионной сети (AR-Net), чтобы объединить масштабируемость нейронных сетей с интерпретируемостью авторегрессионных моделей. Если охарактеризовать AR-Net одним предложением, то это однослойная сеть, которая обучена имитировать авторегрессионный процесс в сигнале временного ряда, но в гораздо большем масштабе, чем традиционные модели.

NeuralProphet против Prophet

Кратко описав, что такое NeuralProphet, я хотел бы сосредоточиться на различиях между двумя библиотеками. Если опираться на документацию, то основные отличия заключаются в следующем:

  • NeuralProphet в целях оптимизации использует градиентный спуск PyTorch, что значительно ускоряет моделирование

  • Автокорреляция временных рядов моделируется с использованием авторегрессионной сети.

  • Лаговые регрессоры моделируются с использованием отдельной нейронной сети прямого распространения.

  • Кроме того, модель имеет настраиваемые нелинейные глубокие слои сетевых сетей прямого распространения

  • Модель настраивается на определенные горизонты прогноза (больше 1).

  • Она предлагает настраиваемые потери и метрики.

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

Установка

На момент написания, лучший способ установить NeuralProphet это клонировать репозиторий и установить ее прямо оттуда, запустив pip install. в каталоге. Самую актуальную информацию о процедуре установки см. в этой части инструкции.

Установив библиотеки, импортируем их в Python.

import pandas as pdfrom fbprophet import Prophetfrom neuralprophet import NeuralProphetfrom sklearn.metrics import mean_squared_error# plottingimport matplotlib.pyplot as plt# settingsplt.style.use('seaborn')plt.rcParams["figure.figsize"] = (16, 8)

neural_prophet_1.py hosted with by GitHub

Подготовка данных

В этом примере мы будем работать с набором данных Peyton Manning (звезда НФЛ). Если вы не американец, вам, вероятно, придется заглянуть в статью в Википедии, чтобы понять шутку в документации к Prophet. Но вернемся к нашей теме набор данных содержит лог ежедневных просмотров его странички в Википедии.

Набор данных был собран командой Facebook, чтобы показать, как работает Prophet, и доступен для использования как в Prophet, так и в NeuralProphet.

Мы загружаем данные, выполнив следующую строку:

# loading the datasetdf = pd.read_csv('../neural_prophet/example_data/wp_log_peyton_manning.csv')print(f'The dataset contains {len(df)} observations.')df.head()

neural_prophet_2.py hosted with by GitHub

Для тех, кто раньше не работал с Prophet, для запуска модели нам нужны два столбца с соответствующими именами: ds столбец даты/таймстемпа, а y переменная, которую мы хотим прогнозировать. Учитывая, что это учебный набор данных, он уже подготовлен.

Затем мы выводим данные на график, чтобы иметь возможность сделать некоторый базовые предположения. Учитывая взлеты и падения, я могу предположить, что рост популярности коррелирует с сезонами НФЛ. Пожалуйста, поправьте меня, если я ошибаюсь.

df.plot(x='ds', y='y', title='Log daily page views');
# getting the train/test splittest_length = 365df_train = df.iloc[:-test_length]df_test = df.iloc[-test_length:]

neural_prophet_3.py hosted with by GitHub

Prophet

Как уже упоминалось, Prophet упрощает конечным пользователям получение прогнозов. Мы уложились в 4 строчки кода. Мы можем кратко их рассмотреть. Сначала мы создаем экземпляр модели, используя настройки по умолчанию. Затем мы обучаем модель, используя обучающие данные. Чтобы получить прогнозы, нам нужно создать так называемый future dataframe. Мы указываем количество дней, на которое мы хотим сделать прогноз. По умолчанию метод также включает исторические данные. Таким образом, мы получим подобранные величины (прогнозы с использованием данных из обучающей выборки). Наконец, мы получаем прогнозы и сохраняем их в preds_df_1.

prophet_model = Prophet()prophet_model.fit(df_train)future_df = prophet_model.make_future_dataframe(periods=test_length)preds_df_1 = prophet_model.predict(future_df)

neural_prophet_4.py hosted with by GitHub

Обучив модель, мы сопоставляем прогнозы и фактические наблюдения (только из обучающего набора).

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

В качестве последнего шага мы отражаем на графике извлеченные компоненты. Этот процесс аналогичен стандартной декомпозиции временных рядов.

prophet_model.plot_components(preds_df_1);

Мы можем наблюдать на графике тенденцию на протяжении многих лет вместе с недельной и годовой составляющими.

NeuralProphet

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

nprophet_model = NeuralProphet()metrics = nprophet_model.fit(df_train, freq="D")future_df = nprophet_model.make_future_dataframe(df_train,                                                  periods = test_length,                                                  n_historic_predictions=len(df_train))preds_df_2 = nprophet_model.predict(future_df)

neural_prophet_5.py hosted with by GitHub

Естественно, мы используем другой класс для инстанцирования экземпляра модели. Другие отличия заключаются в явном указании частоты данных при обучении модели (исходный Prophet был в первую очередь предназначен для ежедневных данных) и упоминании длины исторической выборки, которую мы хотим включить в future dataframe. Чтобы примеры были как можно более похожими, мы включаем все исторические данные.

Как и раньше, мы строим прогнозы, используя следующую строку.

nprophet_model.plot(preds_df_2);

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

nprophet_model.plot_components(preds_df_2, residuals=True);

Мы также можем отразить на графике параметры модели, запустив.

nprophet_model.plot_parameters();

Мы включили сюда только два графика, так как оставшиеся два перекрываются с графиками, полученными с помощью plot_components (еженедельная и годовая сезонность).

Сравнение показателей

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

# prepping the DataFramedf_test['prophet'] = preds_df_1.iloc[-test_length:].loc[:, 'yhat']df_test['neural_prophet'] = preds_df_2.iloc[-test_length:].loc[:, 'yhat1']df_test.set_index('ds', inplace=True)print('MSE comparison ----')print(f"Prophet:\t{mean_squared_error(df_test['y'], preds_df_1.iloc[-test_length:]['yhat']):.4f}")print(f"NeuralProphet:\t{mean_squared_error(df_test['y'], preds_df_2.iloc[-test_length:]['yhat1']):.4f}")df_test.plot(title='Forecast evaluation');

neural_prophet_6.py hosted with by GitHub

Запуск этого кода создаст следующий график.

Хотя может быть трудно однозначно сказать, какие прогнозы ближе к фактическим, расчет MSE ясно показывает победителя NeuralProphet.

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

Выводы

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

Лично я бы не советовал всем отказываться пока от Prophet в пользу NeuralProphet, в основном потому, что библиотека все еще молода и постоянно развивается, что может быть не лучшим фактором для использования в производственной среде. Тем не менее, я однозначно рекомендую следить за ее развитием!

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

Ссылки:


Узнать подробнее о курсе "Machine Learning. Advanced"

Смотреть вебинар Кластеризация временных рядов

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru