После победы AlphaGo в марте 2016 года над одним из сильнейших игроков Go в мире Ли Седолем о методах глубокого обучения заговорили практически везде. И даже Google не упустил случая назвать себя компанией машинного обучения и искусственного интеллекта.
Что стоит за термином «глубокое обучение»? Какими бывают модели машинного обучения и на чём они пишутся? Ответить на эти и многие другие вопросы, связанные с МО и, в частности, с глубоким обучением (deep learning), мы попросили Алексея Потапова, профессора кафедры компьютерной фотоники и видеоинформатики ИТМО.
Алексей Потапов
Профессор кафедры компьютерной фотоники и видеоинформатики ИТМО. Победитель конкурса грантов для молодых научно-педагогических работников вузов Санкт-Петербурга. Победитель конкурса грантов Президента Российской Федерации для государственной поддержки молодых российских ученых — докторов наук в области «Информационно-телекоммуникационных систем и технологий».
— Сегодня мы практически отовсюду слышим о буме машинного обучения и особенно глубокого обучения. Как и в какой ситуации это может понадобиться простому IT-шнику?
Алексей Потапов: Честно говоря, у меня в голове нет образа «простого IT-шника», так что мне непросто ответить на этот вопрос. Можно ли считать «простым IT-шником» того, кто сможет применить методы глубокого обучения для автоматизации своей деятельности? Не уверен. Наверное, это всё же будет «сложный IT-шник». Тогда простому особо вникать, наверное, и не надо — за исключением того, чтобы поддерживать актуальную картину мира и в качестве демотиватора: рано или поздно «роботы отберут работу» не только у сотрудников Макдональдса, но и у IT-шников.
— А если у человека есть техническое образование, и он решил погрузиться в тему — с чего ему лучше начать и куда пойти?
Алексей Потапов: Здесь очень сильно зависит от того, насколько глубоко и с какой целью человек решил погрузиться в тему, а также от уровня его подготовки. Одно дело — использовать имеющиеся предобученные сети или обучать известные модели с реализацией на высокоуровневых библиотеках, таких как Keras. Это может делать и не самый продвинутый школьник, не особо вникая в математику. Достаточно изучить документацию соответствующей библиотеки и на примерах научиться комбинировать разные слои, активационные функции и т.д. — работать как с «чёрными ящиками».
Вообще, в принципе, многим лучше начинать с этого — пощупать глубокое обучение на практике, сформировать свою интуицию относительно него. К счастью, сейчас это вполне доступно без специальных знаний.
Если человеку не подходит такой путь или он хочет копнуть глубже, он может начать с поверхностной теории — с описания базовых моделей (автоэнкодеров, машин Больцмана, свёрточных сетей, рекуррентных блоков — tanh-RNN, LSTM, GRU и т.д.) AS-IS. Кому-то, может, придётся начать с логистической регрессии и перцептронов. Несложно обо всём этом почитать в интернете. На этом уровне погружения можно пользоваться более низкоуровневыми библиотеками (такими как Tensorflow и Theano) и реализовывать модели не из готовых блоков, а на уровне операций с тензорами.
Вообще, сейчас появились учебники, которые дают более систематическое введение в область на более продвинутом уровне, чем просто описание стандартных моделей. Скажем, часто упоминается deeplearningbook.org, но я его, к сожалению, не читал. Судя по оглавлению, этот учебник не столь поверхностный и вполне подходит для несколько углубленного изучения вопроса, хотя при этом предпочтение отдаётся явно тем вопросам, которыми занимались авторы. А это далеко не вся область. Я также слышал про неплохие онлайн-курсы. Кто-то начинает с них. К сожалению, не могу дать конкретных рекомендаций, поскольку сам начинал изучать эти вопросы до того, как появились эти учебники и курсы.
Вот, например, несколько неплохих курсов:
Introduction into Deep Learning
Neural Networks and Deep Learning
Convolutional Neural Networks for Visual Recognition
— В докладе Вы рассматриваете дискриминантные и генеративные модели, можно ли на простом примере объяснить, в чём между ними разница и для чего они нужны?
Алексей Потапов: Если говорить широко, то дискриминантные и генеративные модели используются людьми повсеместно. Скажем, когда древние люди заметили разницу в движении планет и звёзд по небу, они построили дискриминантную модель: если у светила есть попятное движение, то это планета, а если оно движется по небесной сфере равномерно, то это звезда. А вот модель Кеплера — это генеративная модель: она не просто выделяет некоторый различительный признак из наблюдений, а позволяет воспроизводить траекторию.
Очень много дискриминантных моделей в гуманитарных науках, тогда как точные тяготеют к генеративным. Дискриминантная модель преобразует наблюдаемый образ в некоторое описание, зачастую неполное, выделяет признаки, имеющие прагматическое значение.
Возьмём грибы. Вы хотите отделить ядовитые грибы от съедобных. Дискриминантная модель будет использовать различные визуальные признаки, которые сами по себе не вызывают ядовитость, но по ним её можно распознать, например: окраску шляпки, цвет среза или наличие бахромы. Это весьма эффективно и практично.
Генеративная модель в этом случае будет, ну, скажем, брать ДНК гриба и моделировать его образование путем деления клеток или экспрессии генов. Она будет предсказывать внешний вид гриба и присутствующие в них вещества, по которым можно предсказать ядовитость.
Если вы рассматриваете гриб, то, чтобы воспользоваться генеративной моделью, вам придётся угадать его генотип, например, по нескольким выборкам разных генотипов, моделируя на их основе грибы и сравнивая с наблюдением. Это чудовищно неэффективно, если не добавлять сюда дискриминантных моделей. Зато, определяя съедобность неизвестного вам гриба на основе дискриминантной модели, построенной по другим грибам, вы очень сильно рискуете, тогда как с генеративной моделью шансов ошибиться гораздо меньше. Кроме того, с генеративной моделью вы можете решать не только задачу распознавания, но и, скажем, вывода нового сорта гриба с уникальными вкусовыми или визуальными свойствами. Дискриминантные модели на это принципиально не способны — в них вывод осуществляется в одну сторону. То же самое, в целом, характерно и для дискриминантных и генеративных моделей в машинном обучении.
— Почему глубокое обучение и вероятностный подход выстрелили именно сейчас, а не 20-30 лет назад?
Алексей Потапов: Если отвечать максимально упрощённо, то дело, очевидно, в вычислительных ресурсах, особенно в развитии GPGPU, а также в доступности данных для обучения. Всё, конечно, чуть сложнее, и это не единственная причина, но всё же основная. Конечно, дело и в развитии представлений исследователей.
Скажем, 20 лет назад ещё было общепринятым мнение, что обучение многослойной сети — это крайне сложная оптимизационная задача, что упрощённые ещё решения будут приводить к крайне далёким от оптимальных результатам, а полноценная оптимизация будет безнадёжно медленной. Это представление оказалось ошибочным, но тогда этого никто точно не знал. А мало кто берётся заниматься бесперспективными вещами.
Тогда были популярными машины опорных векторов. Многие успешно занимались ими. Сейчас, кстати, то же самое с глубоким обучением. Все занимаются им, а не другими безнадежно тяжелыми подходами, которые, однако, также могут выстрелить через какой-то десяток лет. Но всё же дело во многом связано с вычислительными ресурсами. Тот же LSTM был известен и 20 лет назад. Но если перенести его современное использование на компьютеры тех времен, то это сразу станет никому не нужно…
Перейдём к техническим вопросам. Нейровероятностное программирование на Edward — каким образом две парадигмы объединены и что это позволяет моделировать?
Алексей Потапов: В Tensorflow всё строится на тензорах и операциях с ними и, главное, добавляется автоматическое дифференцирование, которое используется для оптимизации заданной функции потерь градиентным спуском. В Edward все операции с тензорами остаются, но поверх или внутрь тензоров добавляются распределения вероятностей, а также специальные функции потерь для распределений, скажем, дивергенция Кульбака-Лейблера, и методы их оптимизации. Это даёт возможность просто и компактно задавать и обучать генеративные глубокие сети, такие как Generative Adversarial Networks (вариант перевода: генеративные состязающиеся сети), вариационные автоэнкодеры, а также писать свои аналогичные модели и делать байесовский вывод над любыми сетями.
В последнем случае мы не просто находим точечную оценку для весов связей сети, а получаем на выходе распределение вероятностей для этих весов. Это может нам дать информацию о неопределённости, с которой сеть выполняет свои функции на конкретных входных данных. Кроме того, мы можем вводить любую априорную информацию, что может ускорить обучение и помочь выполнить трансферное обучение.
— При каких практических условиях Вы бы точно не рекомендовали использовать глубокое обучения?
Алексей Потапов: На самом деле, таких задач, где глубокое обучение является не лучшим подходом, всё ещё очень много. Их можно разделить на две категории — недостаточно вычислительных ресурсов и недостаточно данных, хотя нередко эти случаи сопутствуют друг другу. Такое нередко встречается даже в обработке изображений, где, казалось бы, свёрточные сети давно превзошли ручную инженерию признаков.
Возьмём робот-пылесос, который ездит по дому, убирает и заодно составляет карту помещения. Потом приходят хозяева и включают свет. Роботу надо продолжить успешно распознавать локации с изменившимися условиями освещения. Бортовой процессор у него максимально хилый, чтобы тратил меньше энергии и был дешевле. В себестоимости каждая копейка на счету. Помещение заранее неизвестное. Аннотированных данных для разных условий освещения, чтобы можно было натренировать инвариантные признаки, конечно же, нет. Собирать такие данные дорого. И сделать репрезентативную выборку сложно.
Конечно, вручную разработанные признаки будут не самыми лучшим. Но можно разработать неплохие признаки в условиях недостатка данных. И их можно сделать очень быстрыми — на порядок быстрее сверточной сети с сопоставимым качеством. Но, конечно, если у вас достаточно данных и нет очень жёсткого ограничения по вычислительным ресурсам, то проще за день обучить сеть, которая вполне может побить признаки, которые вы разрабатывали неделю, а то и месяц.
Бывают, конечно, и другие случаи, когда глубокое обучение применить сложно. Например, это сложноструктурированные данные; при принятии решений — задачи, имеющие комбинаторный характер. Но, как я понимаю, вопрос был про условия, когда глубокое обучение вроде как должно быть применимо, но от него приходится отказаться.
— Одна из возможных классификаций моделей обучения делит их на интерпретируемые и неинтерпретируемые. Как правило, глубокое обучение относят к последним — есть ли всё же какой-нибудь способ заглянуть под капот и рассмотреть, что же она выучила?
Алексей Потапов: Можно построить более сложную метасеть, которая будет «понимать» более простую сеть, но это вычислительно слишком дорого. Вопрос, скорее, в том, что вы хотите узнать о сети. Скажем, «байесовизация» сети даст вам информацию о неопределённости. Есть техники для генерации «плохих» примеров. В случае генеративных сетей вы можете визуализировать выученное многообразие, меняя одну скрытую переменную. То есть отдельные техники для анализа есть. Но, конечно, всей картины они вам не покажут — если вы используете типичные сети глубокого обучения, а не какие-то специальные компактные модели, то просто описать работу сети вы не сможете, так как такая сеть в принципе сложная.
Классические алгоритмы машинного обучения с учителем (supervised), как, например SVM, пытаются определить класс объекта, а без учителя (unsupervised) — разбить набор объектов по классам без меток. С этой точки зрения автоэнкодеры (autoencoder) делают что-то очень странное: они пытаются воссоздать сами данные — зачем и почему это вообще может быть нужно?
Алексей Потапов: Обучение без учителя не обязательно сводится к кластеризации. Это лишь один возможный класс моделей. Да и вообще, разделение на обучение с учителем и без учителя несколько условно. Метку класса вы можете считать просто как дополнительный категориальный признак и тогда получите обычную постановку обучения без учителя. Вопрос, скорее, в целевой функции, в том, что вы хотите сделать в результате обучения. При обучении с учителем, как правило, вас интересует предсказание той самой метки и больше ничего. При обучении без учителя у вас такой конкретной цели нет, она гораздо более общая — вы хотите найти в данных закономерности. Возможно, это кластеры, в которые группируются образы. Возможно, гладкое малоразмерное многообразие, на котором эти образы расположены. Таким образом, при обучении без учителя вы пытаетесь построить модель того, как данные распределены. Обычно это генеративная модель, хотя не обязательно. Но как проверить правильность такой модели? Надо сравнить задаваемое ею распределение с реальным, то есть надо воссоздать данные из обучающей выборки. Таким образом, ничего странного автоэнкодеры не делают — они решают совершенно типичную задачу обучения без учителя. Именно это делают и все другие методы обучения без учителя, правда, не всегда явно.
Ту же кластеризацию можно трактовать как проекцию образа на центр кластера. То есть каждый образ воссоздаётся как центр ближайшего к нему кластера, и критерием также служит ошибка реконструкции — расстояние от реального образа до этого центра. В точности как в автоэнкодерах — просто другой тип закономерности. Особенность автоэнкодеров лишь в том, как конкретно они решают эту задачу. А именно, они включают как генеративную, так и дискриминантную компоненты модели.
Многие исследователи (например, Демис Хассабис и Андрэ Ын) отмечают, что машинное обучение началось с определения параметров (классическое машинное обучение SVM, C4.5), перешло к построению признаков (e.g., CNN) и сейчас переходит в стадию нахождения и построения архитектуры. Как технически такое метообучение вообще может быть реализовано и насколько результаты сравнимы с традиционными методами?
Алексей Потапов: Если же говорить про метаобучение в целом, то лично меня это направление очень интересует. Когда вы смотрите на многообразие имеющихся моделей, то становится очевидным, что ни одна из них не является фундаментальной, во всех есть какие-то эвристики, которые могут быть не очень применимы и т.д. Все эти модели придумываются людьми, а значит, можно автоматизировать и процесс разработки этих моделей и алгоритмов их обучения. И как вручную сконструированные признаки сейчас легко побеждаются обученными признаками, так и вручную сконструированные модели и алгоритмы обучения гипотетически будут проигрывать метаобучению. Сейчас есть разные отдельные эксперименты, показывающие, что это действительно возможно — в узких экспериментах метаобучение (и, говоря шире, AutoML) превосходит разработки человека, хотя для широкого использования пока технология недостаточно развита.
Если темы Big Data и машинного обучения вам близки так же, как и нам, хотим обратить ваше внимание на ряд ключевых докладов на грядущей конференции SmartData 2017, которая пройдёт 21 октября в Санкт-Петербурге:
- Глубокие свёрточные сети для сегментации изображений (Сергей Николенко, ПОМИ РАН)
- От клика к прогнозу и обратно: Data Science пайплайны в ОК (Дмитрий Бугайченко, Одноклассники)
- Автоматический поиск контактной информации в интернете (Александр Сибиряков, Scrapinghub)
- Прикладное машинное обучение в электронной коммерции: сценарии и архитектуры пилотов и боевых проектов (Александр Сербул, 1С-Битрикс)
- Deep Learning: Распознавание сцен и достопримечательностей на изображениях (Андрей Бояров, Mail.ru)
Автор: ARG89