Хабрахабр

Лопнул ли пузырь машинного обучения, или начало новой зари

Недавно вышла статья которая неплохо показывает тенденцию в машинном обучении последних лет. Если коротко: число стартапов в области машинного обучения в последние два года резко упало.
image
Ну что. Разберём “лопнул ли пузырь”, “как дальше жить” и поговорим откуда вообще такая загогулина.
Для начала поговорим что было бустером этой кривой. Откуда она взялась. Наверное всё вспомнят победу машинного обучения в 2012 году на конкурсе ImageNet. Ведь это первое глобальное событие! Но в реальности это не так. Да и рост кривой начинается несколько раньше. Я бы разбил его на несколько моментов.

  1. 2008 год это появление термина “большие данные”. Реальные продукты начали появляться с 2010 года. Большие данные прямо связаны с машинным обучением. Без больших данных невозможна стабильная работал алгоритмов, которые существовали на тот момент. И это не нейронные сети. До 2012 года нейронные сети — это удел маргинального меньшинства. Зато тогда начали работать совершенно другие алгоритмы, которые существовали уже годы, а то и десятилетия: SVM(1963,1993 годы), Random Forest (1995), AdaBoost (2003),… Стартапы тех годов в первую очередь связаны с автоматической обработкой структурированных данных: кассы, пользователи, реклама, многое другое.
    Производная этой первой волны — набор фреймворков, таких как XGBoost, CatBoost, LightGBM, и.т.д.
  2. В 2011-2012 году свёрточные нейронные сети выиграли ряд конкурсов по распознаванию изображений. Реальное их использование несколько затянулось. Я бы сказал что массово осмысленные стартапы и решения начали появляться с 2014 года. Два года понадобилось чтобы переварить что нейронки всё-таки работают, сделать удобные фреймворки которые можно было поставить и запустить за разумное время, разработать методы которые бы стабилизировали и ускорили время схождения.
    Свёрточные сети позволили решать задачи машинного зрения: классификация изображений и объектов на изображении, детектирование объектов, распознавание объектов и людей, улучшение изображений, и.т.д., и.т.п.
  3. 2015-2017 годы. Бум алгоритмов и проектов завязанных на рекуррентные сети или их аналоги (LSTM, GRU, TransformerNet и.т.д.). Появились хорошо работающие алгоритмы “речь-в-текст”, системы машинного перевода. Частично они основаны на свёрточных сетях для выделения базовых фич. Частично на том что научились собирать реально большие и хорошие датасеты.


“Пузырь лопнул? Хайп перегрет? Они умерли как блокчейн?”
А тож! Завтра в вашем телефоне перестанет работать Сири, а послезавтра Тесла не отличит поворот от кенгуру.
Нейронные сети уже работают. Они в десятках устройств. Они реально позволяют зарабатывать, изменяют рынок и окружающий мир. Хайп выглядит несколько иначе:

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

  • Производственные компании интегрируют алгоритмы для анализа брака на конвейере.
  • Животноводческие хозяйства покупают системы для контроля коров.
  • Автоматические комбайны.
  • Автоматизированные Call-центры.
  • Фильтры в SnapChat. (ну хоть что-то дельное!)

Но главное, и не самое очевидное: “Новых идей больше нет, или они не принесут мгновенного капитала”. Нейронные сети решили десятки проблем. И решат ещё больше. Все очевидные идеи которые были — породили множество стартапов. Но всё что было на поверхности — уже собрали. За последние два года я не встречал ни одной новой идеи для применения нейронных сетей. Ни одного нового подхода (ну, ок, там немного с GAN-ами есть заморочек).
А каждый следующий стартап всё сложнее и сложнее. Он требует уже не двух парней которые обучают нейронку на открытых данных. Он требует программистов, сервера, команду разметчиков, сложную поддержку, и.т.д.
Как результат — стартапов становится меньше. А вот продакшна больше. Нужно приделать распознавание автомобильных номеров? На рынке сотни специалистов с релевантным опытом. Можно нанять и за пару месяцев ваш сотрудник сделает систему. Или купить готовую. Но делать новый стартап?.. Безумие!
Нужно сделать систему трекинга посетителей — зачем платить за кучу лицензий, когда можно за 3-4 месяца сделать свою, заточить её для своего бизнеса.
Сейчас нейронные сети проходят тот же путь который прошли десятки других технологий.

Пока рынок не насыщен специалистами. Помните как менялось с 1995 года понятие «разработчик сайтов»? Но я могу поспорить, что через 5-10 лет не будет особой разницы между программистом Java и разработчиком нейронных сетей. Профессионалов очень мало. Возникла задача — нанимаете специалиста. И тех и тех специалистов будет достаточно на рынке.
Просто будет класс задач под который решается нейронками.

Где обещанный искусственный интеллект?”
А вот тут есть небольшая, но интересная непонятчка:)
Тот стек технологий который есть сегодня судя по всему нас к искусственному интеллекту всё же не приведёт. “А что дальше? Давайте поговорим о том что держит текущий уровень развития. Идеи, их новизна — во многом исчерпали себя.

Ограничения

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

Есть много других специалистов, которые оценивают это как 5-10 лет.
Скорее всего, на мой взгляд, лет через 15 инфраструктура городов уже сама изменится так, что появление автономных автомобилей станет неизбежно, станет её продолжением. Но ведь это нельзя считать интеллектом. Современная Тесла — это очень сложный конвейер по фильтрации данных, их поиску и переобучению. Это правила-правила-правила, сбор данных и фильтры над ними (вот тут я чуть подробнее про это написал, либо смотреть с этой отметки).

Первая проблема

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

Вторая проблема

Вторая проблема — визуализация того что наша нейронная сеть поняла. Это очень нетривиальная задача. До сих пор мало кто понимает как это визуализировать. Вот эти статьи весьма свежие, это всего лишь несколько примеров, пусть даже отдалённых:
Визуализация зацикленности на текстурах. Хорошо показывает на чём нейронка склонна зацикливаться + что она воспринимает как отправную информацию.
image
Визуализация аттеншна при переводах. Реально аттеншн часто можно использовать именно для того чтобы показать что вызвало такую реакцию сети. Я встречал такие штуки и для дебага и для продуктовых решений. На эту тему очень много статей. Но чем сложнее данные, тем сложнее понять как добиться устойчивой визуализации.
image
Ну и да, старый добрый набор из «посмотри что у сетки внутри в фильтрах». Эти картинки были популярны года 3-4 назад, но все быстро поняли, что картинки то красивые, да смысла в них не много.
image
Я не назвал десятки других примочек, способов, хаков, исследований о том как отобразить внутренности сети. Работают ли эти инструменты? Помогают ли они быстро понять в чём проблема и отладить сеть?.. Вытащить последние проценты? Ну, примерно вот так же:

Можете посмотреть любой конкурс на Kaggle. И описание того как народ финальные решения делает. Мы настакали 100-500-800 мульёнов моделек и оно заработало!
Я, конечно, утрирую. Но быстрых и прямых ответов эти подходы не дают.
Обладая достаточным опытом, потыкая разные варианты можно выдать вердикт о том почему ваша система приняла такое решение. Но поправить поведение системы будет сложно. Поставить костыль, передвинуть порог, добавить датасет, взять другую backend-сеть.

Третья проблема

Третья фундаментальная проблема — сетки учат не логику, а статистику. Статистически это лицо:
image
Логически — не очень похоже. Нейронные сети не учат что-то сложное, если их не заставляют. Они всегда учат максимально простые признаки. Есть глаза, нос, голова? Значит это лицо! Либо приводи пример где глаза не будут означать лицо. И опять — миллионы примеров.

There's Plenty of Room at the Bottom

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

Нейронные сети встали?
Неизвестно. Это конец? Но пока ни один из этих подходов не позволил сделать что-то фундаментально новое, решить что-то, что до сих пор не решалось. Но, конечно, все надеются что нет.
Есть много подходов и направлений к решению тех фундаментальных проблем которые я осветил выше. Пока что все фундаментальные проекты делаются на основе стабильных подходов (Tesla), или остаются тестовыми проектами институтов или корпораций (Google Brain, OpenAI).

В каком-то смысле “памяти”. Если говорить грубо, то основное направление — создание некоторого высокоуровневого представления входных данных. Ну, например, все системы распознавания лиц. Самый простой пример памяти — это различные “Embedding” — представления изображений. По сути сеть минимизирует метрику “разные лица — далеко” и “одинаковые — близко”.

Для такого обучения нужны десятки и сотни тысяч примеров. Сеть учится получить из лица некоторое стабильное представление которое не зависит от поворота, освещения, разрешения. Теперь нам не нужно сотни лиц чтобы запомнить человека. Зато результат несёт некоторые зачатки “One-shot Learning”. При попытке различать не лица, а, например, “людей по одежде” (задача Re-indentification) — качество проваливается на много порядков. Всего лишь одно лицо, и всё — мы узнаём!
Только вот проблемка… Сетка может выучить только достаточно простые объекты. Например, сходу можно вспомнить одну из первых работ по OneShot Learning от гугла:

Таких работ много, например 1 или 2 или 3.
Минус один — обычно обучение неплохо работает на каких-то простых, “MNIST’овских примерах”. И сеть уже не может выучить достаточно очевидные смены ракурсов.
Да и учиться на миллионах примеров — тоже как-то так себе развлечение.
Есть работы по значительному уменьшению выборов. Много идей находишь. А при переходе к сложным задачам — нужна большая база, модель объектов, или какая-то магия.
Вообще работы по One-Shot обучению — это очень интересная тема. Но большей частью те две проблемы что я перечислил (предобучение на огромном датасете / нестабильность на сложных данных) — очень мешают обучению.

Вы наверняка читали на Хабре кучу статей на эту тему. С другой стороны к теме Embedding подходят GAN — генеративно состязательные сети. Это могут быть лица, могут быть действия.
image
Проблема GAN — чем сложнее генерируемый объект, тем сложнее описывать его в логике “генератор-дискриминатор”. (1, 2,3)
Особенностью GAN является формирование некоторого внутреннего пространства состояний (по сути того же Embedding), которое позволяет нарисовать изображение. Обычно какие-то свистелки-перделки с дорисовыванием картинок.
И опять же. В результате из реальных применений GAN, которые на слуху -только DeepFake, который опять же, манипулирует с представлениями лиц (для которых существует огромная база).
Других полезных применений я встречал очень мало. Представление логики/пространства в нейронной сети — это хорошо. Ни у кого нет понимания как это позволит нам двинуться в светлое будущее. Но нужно огромное число примеров, нам непонятно как нейронка в себе это представляет, нам непонятно как заставить нейронку запомнить какое-то реально сложное представление.

Наверняка вы помните как Google обыграл всех в Go. Reinforcement learning — это заход совсем с другой стороны. Но тут всё далеко не так радужно и перспективно. Недавние победы в Starcraft и в Dota. Лучше всего про RL и его сложности рассказывает эта статья
Если кратко просуммировать что писал автор:

  • Модели из коробки не подходят/работают в большинстве случаев плохо
  • Практические задачи проще решить другими способами. Boston Dynamics не использует RL из-за его сложности/непредсказуемости/сложности вычислений
  • Чтобы RL заработал — нужна сложная функция. Зачастую её сложно создать/написать.
  • Сложно обучать модели. Приходится тратить кучу времени чтобы раскачать и вывести из локальных оптимумов
  • Как следствие — сложно повторить модель, неустойчивость модели при малейших изменениях
  • Часто оверфититься на какие-нибудь левые закономерности, вплоть до генератора случайных чисел

У гугла есть какие-то эксперименты ( 1, 2 ). Ключевой момент — RL пока что не работает в продакшне. Но я не видел ни одной продуктовой системы.

Минус всего того что описано выше — неструктурированность. Memory. Чтобы она могла записывать и перезаписывать там результаты своих шагов. Один из подходов как всё это пытаются прибрать — предоставить нейронной сети доступ к отдельной памяти. Это очень похоже на классические процессоры и компьютеры.
Самая известная и популярная статья — от DeepMind:
image
Кажется что вот он, ключ к пониманию интеллекта? Тогда нейронная сеть может определяться текущим состоянием памяти. Системе всё равно требуется огромный массив данных для тренировки. Но скорее нет. При этом когда FaceBook решал аналогичную проблему, то они пошли по пути “нафиг память, просто сделаем нейронку посложнее, да примеров побольше — и она сама обучится”. А работает она в основном со структурированными табличными данными.

Другой способ создать значимую память — это взять те же самые эмбединги, но при обучении ввести дополнительные критерии, которые бы позволили выделять в них “смыслы”. Disentanglement. Если бы мы шли по стандартному пути — мы должны были бы сделать десяток сетей. Например мы хотим обучить нейронную сеть различать поведение человека в магазине. Отдельная логика смотрит часть магазина где он делает/обучается на это. Одна ищет человека, вторая определяет что он делает, третья его возраст, четвертая — пол. Чтобы она по видео сформировала эмбединг, где одна область определяла бы действие, одна — позицию на полу во времени, одна — рост человека, а ещё одна — его пол. Третья определяет его траекторию, и.т.д.
Или, если бы было бесконечно много данных, то можно было бы обучить одну сеть на всевозможные исходы (очевидно, что такой массив данных набрать нельзя).
Дизэнтелгмент подход говорит нам — а давайте обучать сеть так чтобы она сама смогла различать понятия. Таких статей достаточно мало (некоторые из них 1, 2,
3) и в целом они достаточно теоретические. При этом при обучении хотелось бы почти не подсказывать сети такие ключевые понятия, а чтобы она сама выделяла и группировала области. Но данное направление, по крайней мере теоретически, должно закрывать перечисленные в начале проблемы.
image
Разложение изображения по параметрам “цвет стен/цвет пола/форма объекта/цвет объекта/и.т.д.”

Разложение лица по параметрам “размер, брови, ориентация, цвет кожи, и.т.д.”

Прочее.

Есть много других не столько глобальных направлений, которые позволяют как-то уменьшать базы, работать с более разнородными данными, и.т.д.
Attention. Наверное, не имеет смысла выделять это как отдельный метод. Просто подход, усиливающий другие. Ему посвящено много статей (1,2,3). Смысл Attention в том, чтобы усилить у сети реакцию именно на значимые объекты при обучении. Зачастую каким-нибудь внешним целеуказанием, или небольшой внешней сетью.
3Д-симуляция. Если сделать хороший 3д движок, то им зачастую можно закрыть 90% обучающих данных (я даже видел пример когда почти 99% данных закрывалось хорошим движком). Есть много идей и хаков как заставить сеть обученную на 3д движке работать по реальным данным (Fine tuning, style transfer, и.т.д.). Но зачастую сделать хороший движок — на несколько порядков сложнее чем набрать данные. Примеры когда делали движки:
Обучение роботов (google, braingarden)
Обучение распознавания товаров в магазине (но в двух проектах которые делали мы — мы спокойно обходились без этого)
Обучение в Tesla (опять же то видео что было выше)

Выводы

Вся статья это в каком-то смысле выводы. Наверное, основной посыл который я хотел сделать — «халява кончилась, нейронки не дают больше простых решений». Теперь надо вкалывать стоя сложные решения. Или вкалывать делая сложные научные ресёрчи.
А вообще тема дискутабельная. Может у читателей есть более интересные примеры?

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть