Как правило, data scientist имеет смутное представление о мобильной разработке, а разработчики мобильных приложений не занимаются машинным обучением. Андрей Володин — инженер Prisma AI живет на стыке этих двух миров и рассказал ведущим подкаста Podlodka, каково это.
Воспользовавшись моментом, Стас Цыганов (Туту.ру) и Глеб Новик (Тинькофф Банк), во-первых, раз и навсегда прояснили, что никто не обучает нейронные сети на мобильных устройствах. А также разобрались, что в машинном обучении, к сожалению, нет маги; обсудили современные техники вроде глубокого обучения, обучения с подкреплением и капсульных сетей.
В итоге, поскольку Podlodka — аудиошоу про мобильную разработку, к ней и пришли и узнали, как это все работает для мобильных устройств.
![](https://habrastorage.org/r/w780q1/webt/fw/ph/db/fwphdbn4sxovfbminez_irgn6pm.jpeg)
Далее текстовая версия этой беседы, а запись подкаста здесь.
Про Андрея Володина, cocos2d и Fiber2d
ГЛЕБ: Расскажи, пожалуйста, нам немножко о себе. Чем ты занимаешься?
АНДРЕЙ: Я мобильный разработчик, но очень мало занимаюсь классической iOS разработкой. В мои обязанности практически не входит работа с UIKit. Я — главный разработчик довольно популярного на GitHub игрового движка Cocos2d. На данный момент я занимаю позицию GPU инженера в компании Prisma. В мои обязанности входит интеграция нейронных сетей на видеокарты и работа с дополненной реальностью, в частности, с VR-kit.
ГЛЕБ: Круто! Особенно интересно насчет cocos2d. Насколько я знаю, этот фреймворк появился достаточно давно.
АНДРЕЙ: Да, где-то в 2009 году.
ГЛЕБ: Ты его с самого начала применял?
АНДРЕЙ: Нет. Я стал главным разработчиком только в 2015 году. До этого я был Core контрибьютором. Компания Apportable, которая финансировала разработку, обанкротилась, люди, получавшие деньги за разработку, ушли, и лидом стал я. Сейчас я администратор на форуме, помогаю новичкам с какими-то проблемами, последние несколько версий выпущены мной. То есть я — главный майнтейнер на данный момент.
ГЛЕБ: Но cocos2d еще жив?
АНДРЕЙ: Уже скорее нет, в первую очередь в силу того, что написан на Objective-C, и там очень много legacy. Я, например, поддерживаю свои какие-то старые игрушки, написанные с его использованием, другие разработчики — свои legacy-проекты. Из актуальных движков вы могли слышать о Fiber2d. Это тоже мой проект.
Fiber2d — первый игровой движок на Swift, который был портирован на Android. Мы запустили игру, полностью написанную на Swift, и на iOS, и на Android. Про это тоже можно найти на Гитхабе. Это следующая веха в развитии cocos2d сообщества.
Про машинное обучение на пальцах
ГЛЕБ: Давайте начнем постепенно двигаться к нашей сегодняшней теме. Сегодня мы будем говорить про машинное обучение и обо всем вокруг этого — связанном и несвязанном с мобилками. Для начала давай разберемся, что такое вообще машинное обучение. Мы будем стараться объяснять максимально на пальцах, потому что не все мобильные разработчики с ним хорошо знакомы. Можешь нам рассказать, что это такое?
АНДРЕЙ: Если руководствоваться классическим определением, то машинное обучение — это поиск закономерностей в наборе данных. Классический пример — это нейронные сети, которые сейчас очень популярны. Среди них есть сети, связанные с классификацией. Простой пример задачи классификации это определение того, что нарисовано на картинке: есть какое-то изображение, и мы хотим понять, что это: собака, кошка или прочее.
Написать это с помощью стандартного кода очень сложно, потому что непонятно, как это делать. Поэтому используются математические модели, которые принято называть машинным обучением. Они строятся на том, что из большого количества примеров извлекаются определенные закономерности, и потом, используя эти закономерности, можно делать предсказания с некоторой точностью на новых примерах, которых не было в изначальном наборе данных. Это, если в двух словах.
ГЛЕБ: Соответственно, обучение — это история про изменение модели при помощи обучающего датасета?
АНДРЕЙ: Во время обучения модель, как правило, остается постоянной. То есть вы выбираете какую-то архитектуру и учите ее. Если взять для примера нейронные сети, которыми не ограничивается все машинное обучение, там изначально, грубо говоря, все веса нули или другие одинаковые значения. По ходу того, как мы скармливаем learning фреймворку наши данные, веса по чуть-чуть изменяются с каждым новым примером, и в конце выливаются в обученную машину.
СТАС: Конечное предназначение этой модели в том, чтобы, быстро подавая какие-то данные не из обучающей выборки, быстро получать результат?
АНДРЕЙ: Да, но дело не только в скорости. Например, некоторые задачи по-другому нельзя было решить — скажем, пример с классификацией очень нетривиальный. До того, как выстрелили классификационные сети, решения для того, чтобы понимать, что изображено на картинке, особенно и не было. То есть в некоторых сферах это прямо революционная технология.
Про ручной труд и машинное обучение
СТАС: Я недавно рассказывал своей бабушке, что такое машинное обучение. Она вначале думала, что машинное обучение — это когда машина учит кого-то. Я ей стал объяснять, что на самом деле, наоборот, это мы пытаемся научить машину, чтобы она потом выполняла какую-то задачу.
Я представил задачи, которые решает машинное обучение. Большинство из них, до того как машинное обучение выстрелило, выполняли люди. Причем это считалось не то чтобы низкоквалифицированной работой, но не слишком наукоемкой, скажем так. Это простейшие операции, которые во многом может выполнить человек. Можно так представить?
АНДРЕЙ: Так тоже можно сказать. На самом деле сейчас такая работа все равно нужна, но только для того, чтобы подготавливать датасеты для машинного обучения. Действительно, в некоторых сферах, например, в медицине, машинное обучение позволяет немного сгладить рутинные задачи и несколько облегчить процесс. Но не всегда. Я бы не сказал, что машинное обучение замыкается на том, чтобы облегчить тупую работу. Иногда оно делает довольно интеллектуальную работу.
СТАС: Можешь привести пример такой интеллектуальной работы?
АНДРЕЙ: Например, наше приложение Prisma — наверняка многие им пользовались (это не реклама!) Нельзя сказать, что это именно интеллектуальная работа и люди часто перерисовывали изображение в картины, а нейронная сеть это делает — вы даете ей обычную картинку и получаете нечто новое. Дальше можно спорить о том, красиво это или нет, но неоспорим сам факт, что это нечто, что человек сам не может сделать, или это занимает колоссальное количество времени.
Про историю
ГЛЕБ: Да, мне кажется, это отличный пример. Наверное, стоит немного обратиться к истории. Насколько давно эта тема развивается? Мне кажется, что чуть ли не от самых истоков программирования, во всяком случае очень-очень давно.
АНДРЕЙ: Да, в целом большинство концепций, которые сейчас применяются, уже были разработаны в 90-х годах. Естественно, сейчас появились новые алгоритмы, а качество тогдашних алгоритмов повысилось. И хотя есть ощущение, что внезапный интерес к машинному обучению возник из ниоткуда, на самом деле люди интересовались им давно.
Прогресс на первых этапах был обусловлен тем, что это по большей части математические модели, а математика уже достаточно давно стабилизировалась в плане открытий.
Текущий взрыв связан исключительно с тем, что мощности железа вокруг нас сильно выросли, в первую очередь, за счет использования видеокарт. Благодаря тому, что сегодня мы умеем делать огромные параллельные вычисления, появились новые технологии — машинное обучение, криптовалюта и пр.
По большей части текущий интерес и вообще текущая волна связаны с тем, что это просто стало возможным. Эти вычисления можно было делать и раньше, но катастрофически долго. Сейчас на них уходит вполне разумное время, и поэтому все начали это использовать.
Про железо
СТАС: Я сейчас прохожу курс, и там, в том числе, нужно обучать всевозможные модели. Часть из них я обучаю на своем рабочем Макбуке. Да, в каких-то случаях приходится подождать, может быть, минут 5, и модели получаются не самыми лучшими, средняя точность в районе 85%, но главное — они работают. Понятно, что в бою хочется иметь этот процент получше и возможно для продакшена она не совсем подходят.
АНДРЕЙ: Да, такие модели, наверное, не очень интересны. Скорее всего, это связано с простейшими предсказаниями и прочим. В реальности у нас, например, обучающая выборка может весить 90Гб, и обучаться это все может неделю. Такие компании, как Nvidia, хвастаются, что теперь они выпустили новую специальную видеокарту Tesla и на ней можно обучить Inception V3 за 24 часа! Это считается прямо прорывом, потому что раньше это занимало несколько недель.
Чем больше датасет и чем сложнее структура модели, тем больше времени занимает обучение. Но проблема с производительностью не только в этом. В принципе, если очень нужно, можно и месяц подождать. Проблема связана с inference — как потом применять потом эту нейронную сеть. Нужно, чтобы во время ее использования она тоже показывала хороший результат с точки зрения performance.
СТАС: Потому что, в том числе, хочется, чтобы на мобильных устройствах все работало, и работало быстро.
АНДРЕЙ: Я не думаю, что изначально это начало развиваться с прицелом работы на мобильные приложения. Такой бум начался где-то в 2011 году, и тогда все-таки это были десктопные решения. Но сейчас истинный интерес сообщества подкрепляется тем, что на айфонах, в том числе, стало возможным запускать сети, которые работают в реал-тайме.
ГЛЕБ: Стас, ты сказал, что от того, какая мощная у тебя видеокарта и вообще система, зависит окончательный результат. То есть иначе не работает?
АНДРЕЙ: Это не так, но я не уверен, что на маломощной машине модель будет обучаться.
ГЛЕБ: Кстати, помню, 5 лет назад, когда как раз был бум нейросетей, наши преподаватели говорили о том, что все новое — просто хорошо забытье старое. Это все уже было в 70-80-х годах и это не сработает, раз тогда не получилось. Наверное, они все-таки были не правы.
АНДРЕЙ: Да. Для каких-то задач машинное обучение сейчас очень сильно выстрелило. Объективно можно сказать, что они работают.
Про deep learning
ГЛЕБ: Есть такая модная штука — deep learning (глубокое обучение). В чем его отличие от того, о чем мы говорили для этого?
АНДРЕЙ: Я бы не сказал, что есть отличия. Существуют просто какие-то подмножества машинного обучения, и их громадное количество. Нужно понимать, что то, что называется deep learning — это та часть машинного обучения, которую принято относить к нейронным сетям. Глубоким оно называется потому, что в нейронных сетях есть много слоёв, и чем больше слоев, тем глубже получается нейронная сеть. От этого появилось название.
Но существуют и другие виды машинного обучения. Например, машинное обучение, построенное на деревьях, успешно применяется для face tracking до сих пор, потому что это гораздо быстрее, чем нейронки. Оно также используется для ранжирования, показа рекламы и прочего.
То есть глубокое обучение — это не что-то другое. На самом деле это подмножество машинного обучения, которое включает в себя кучу всего. Просто deep learning стал сегодня самым популярным.
Про теорию нейронных сетей
СТАС: Я хотел поговорить немножко про теорию нейронных сетей, постараюсь попроще. Ты сказал, что в них много слоев. По идее, если у нас есть один слой, и есть какие-то объекты, расположенные на плоскости, при помощи одного слоя мы фактически можем разделить эту плоскость на две части, правильно?
АНДРЕЙ: Нет, не совсем.
СТАС: Что нам дает большое количество слоев, если на пальцах?
АНДРЕЙ: Что такое нейронная сеть? Давай прямо разложим. Это просто математическая функция, которая на вход принимает набор чисел, а на выход тоже дает набор чисел — все.
Что внутри? Сейчас популярнее всего сверточные сети, внутри которых происходит convolution — просто очень много умножений матриц друг на друга, результаты складываются, эти операции выполняются в каждом слое. Плюс между слоями существует так называемая активация, которая как раз позволяет нейронным сетям быть глубокими.
Поскольку комбинация из линейных преобразований — это линейное преобразование, то сделав 10 линейных слоев, их можно все равно представить, как один линейный слой. Для того, чтобы слои не схлопывались, между ними существуют определенные математические действия, которые делают функцию нелинейной. Это нужно для того, чтобы увеличивать количество параметров.
Грубо говоря, нейронная сеть — это просто огромный массив чисел, которые потом как-то применяются к нашим данным, например, к картинке. Но картинка — тоже набор чисел на самом деле — это просто череда пикселей. Когда мы обучаем сеть, мы рассматриваем, например, 15 млн параметров (каждое число — это отдельный параметр), которые можно немножко с помощью некоторых эвристик сдвигать чуть влево, чуть вправо. Благодаря такому огромному количеству параметров получаются такие крутые результаты.
Глубокое обучение нужно именно для того, чтобы этих параметров было много, и все не схлопывалось до одного слоя.
ГЛЕБ: Кажется, что более-менее понятно.
АНДРЕЙ: Глубокое обучение — это подмножество машинного обучения. Но почему-то на эту тему поднялся хайп — особенно какое-то время назад из всех щелей, мне кажется, можно было услышать про deep learning. Не знаю, обосновано это или нет.
ГЛЕБ: Я думаю, что такая популярность вызвана тем, что оно дает впечатляющие результаты.
Про задачи
СТАС: При помощи нейронных сетей можно решать большинство задач машинного обучения, правильно?
АНДРЕЙ: Да.
СТАС: Давай тогда проговорим, какие задачи могут быть решены при помощи методов машинного обучения?
АНДРЕЙ: На самом деле, это щепетильная тема, потому что в реальности нужно перестать идеализировать и романтизировать то, что происходит. Как я уже сказал, там нет никакого искусственного интеллекта. Это чисто математическая модель и математическая функция, которая что-то перемножает и т.д.
Со стороны кажется, что сейчас машинное обучение немножко забуксовало на определенных категориях задач. Это, например, классификация (пример, о котором мы говорили в самом начале), трекинг объектов и их сегментация. Последнее есть в нашем приложении Sticky AI — оно выделяет человека, а фон убирает. Также есть биологическая медицинская сегментация, когда, например, определяются раковые клетки. Есть генеративные сети, которые учатся на наборе случайных чисел, и потом могут создавать что-то новое. Есть задачи Style Transfer и прочие.
Но на данный момент нет удобной площадки и инфраструктуры для использования машинного обучения. Например, у вас есть какая-то задача, которую вы, как человек, решаете легко, а как программист, вы не можете ее решить в силу комплексности и потому, что нельзя просто написать императивный алгоритм. Но при этом обучить нейронную сеть тоже не представляется возможным в первую очередь потому, что есть проблема с нехваткой данных. Для того, чтобы обучить нейронку, нужны большие датасеты с множеством примеров, к тому же очень сильно формализованных, описанных в определенном регламенте и т.д. Плюс нужна архитектура этой нейронной сети.
То есть сначала нужно формализовать входные данные в виде чисел, сделать саму архитектуру модели, потом формализовать выходные данные в виде чисел, как-то их интерпретировать. Для этого нужен довольно мощный математический аппарат и вообще понимание того, как все работает. Поэтому сейчас применение нейронок, как мне кажется, вне специализированных компаний типа нашей немножко проседает.
Какие-то задачи, которые раньше не решались, нейронки научились решать очень круто. Но нет такого, что нейронки пришли и решили весь спектр нерешенных задач.
ГЛЕБ: В каких областях ты видишь глобальные задачи, для решения которых нейронные сети вообще не подходят?
АНДРЕЙ: С ходу сложно ответить. Нам встречаются задачи, над которыми мы работаем и на которых не получается обучить нейронную сеть. Например, сейчас игровая индустрия очень интересуется обучением, и даже есть какие-то нейронки, которые имеют искусственный интеллект. Но, например, в AAA играх это пока не используется, потому что все равно на данный момент нельзя обучить искусственный интеллект абстрактного солдата вести себя как человек, чтобы это выглядело естественно. Сложно.
Про Доту
СТАС: Ты слышал, что искусственный интеллект уже побеждает в Доте?
АНДРЕЙ: Да, но это все равно несколько иное. Дота — это довольно математическая игра, ее можно описать. Никого не хочу обидеть, но это фактически, как шашки — игра в одно и то же. Там есть определенные правила, и вы просто по ним играете.
Но при этом пока есть сложности, чтобы создать какое-то естественное поведение, связанные прежде всего с малым количеством данных и малым количеством инженеров, которые умеют это делать.
Например, в Google инженеры пытаются при помощи нейронных сетей обучить ходить 3D модель человека — просто чтобы она передвигалась. Это выглядит всегда ужасно, люди так не ходят.
Про TensorFlow
СТАС: Ты сказал, что сейчас по сути нет, легкого и дешевого способа, не разбираясь вообще в машинном обучении, решать задачи машинного обучения. В любом случае получается, что в этом надо шарить. Хотел бы узнать по поводу TensorFlow. Кажется, что Google пытается сделать так, чтобы даже люди, которые не очень в этом всем разбираются и у которых не очень большой бэкграунд, могли решать какие-то простейшие задачи. Расскажи, что такое TensorFlow и как ты думаешь, возможно ли такое?
АНДРЕЙ: Давай по порядку. TensorFlow — это на самом деле не самая простая вещь из всех. Это один из самых популярных так называемых learning фреймворков — фреймворк для обучения общего назначения, не обязательно нейронок. Это не самый высокоуровневый фреймворк из существующих. Есть, например, Keras, который является более высокоуровневой абстракцией на TensorFlow. Там можно гораздо меньшим количеством кода сделать то же самое.
Типовые задачи решаются довольно просто, потому что, в частности, Github уже полон примерами и репозиториями. Скажем, если ваша компания делает поиск по картинкам для книжного магазина, то у вас, в принципе, все хорошо. Вы заходите на Github, там есть примеры, как можно взять фичи картинки, вы пишите поиск по фичам — все готово!
На самом деле так обстоит дело с большим количеством задач. Если вы можете переложить свои проблемы на уже решенные или около того задачи в машинном обучении типовыми способами, тогда у вас все круто. Но если у вас что-то прямо уникальное, такое, что нельзя закодить, и при этом нужно нечто, что принято называть искусственным интеллектом, то я бы не сказал, что TensorFlow — это самый простой путь. Чтобы в нем разобраться, нужно потратить приличное количество времени.
СТАС: Я так понимаю, на стороне Google играет то, что они предлагают вместе с фреймворком и мощности?
АНДРЕЙ: Да, они очень сильно сейчас активно развивают, и вообще стремятся, чтобы в сообществе все друг с другом шарили нейронки. У них есть платформа, на которой, если вы готовы делиться своими результатами, они будут давать вам сервера и прочее. Единственное условие, что вы должны поделиться этим со всеми, то есть платформа не предназначена для коммерческого использования.
Про проблемы
ГЛЕБ: Давайте еще раз пробежимся по проблемам, которые сейчас есть в области машинного обучения. Что наиболее актуально? Во-первых, это данные.
АНДРЕЙ: Да. Недавно даже видел мем — грустная картинка и подпись «Когда нашел крутую архитектуру, но нет датасета, чтобы ее обучить». Действительно, такая проблема существует.
ГЛЕБ: Хорошо, но, допустим, у нас есть большой датасет, на котором модель обучается неделю. Как решаются проблемы со временем? Грубо говоря, для нас это как компиляция, только компиляция идет в худшем случае 15 минут на каком-нибудь жестком iOS проекте, обычно все-таки быстрее. Тут такая же ситуация, только уже две недели. Если налажать, это время пропадет.
АНДРЕЙ: Две недели — это, наверное, все-таки уже ушедшие реалии. Сейчас это сутки — двое — трое. Но твои опасения имеют место быть. Действительно, бывает такое, что работа R&D заключается в том, что они думают: «О, попробуем вот это!» — что-то изменяют, запускают обучение, а через два дня узнают, что метрики упали на 0,5%: «ОК, это не сработало, попробуем вот это!» И снова ждут. Такая проблема действительно существует, и от нее никуда не деться.
СТАС: Хотел бы вернуться к истории про мой бедненький ноут, про то, что все-таки крутость модели и успешность ее предсказаний, наверное, связана со временем обучения. Есть такая корреляция? Приведу пример. Ты можешь вначале убедиться, что твоя модель более или менее решает твою задачу — допустим, на 70%. После этого ты понимаешь, что точно у тебя все будет лучше работать, если добавить количество признаков. Чем больше признаков, тем дольше все будет обсчитываться. Пусть ты запустишь на день, но практически будешь уверен, что модель будет работать лучше.
АНДРЕЙ: Да, такая оптимизация работает, скорее, на первых этапах. Когда ты совершенствуешь уже существующую модель, так не получается делать. Просто для того, чтобы осознать какое-то преимущество, приходится иногда переучивать модель с нуля. Это действительно времязатратный процесс.
СТАС: Я почувствовал, что все мои примеры на уровне второго класса.
Про работу разработчиков
ГЛЕБ: Я вспомнил еще известную картинку, про компиляцию. А тут сеть обучается.
![](https://habrastorage.org/r/w1560/webt/wl/fb/eo/wlfbeojhnc13z4_wcooqk5bhu4e.png)
СТАС: Если обучение занимает целый день, то что в это время делают разработчики? С утра пришел, заварил себе кофе, отправил обучаться, пошел домой — встретимся завтра?
АНДРЕЙ: Вообще сама по себе работа, связанная с машинным обучением, не очень похожа на классическую разработку. Я сам ей практически не занимаюсь, но могу рассказать из опыта своих коллег.
Во-первых, это люди, у которых очень сильный математический бэкграунд. В основном они закончили факультеты прикладной математики, а не computer science. Их профессиональная черта заключается в том, что они постоянно читают научные статьи и находятся в постоянном поиске новых гипотез.
В реальности это работа больше в сторону науки. Чтобы запрограммировать даже довольно сложную нейронную сеть, нужно написать примерно 500 строчек на Python, причем довольно однотипного. Эти люди обычно не ощущают себя классическими кодерами. У них нет репозиториев с ветками и всего такого. Они несколько оперируют другими категориями, и их работа заключается в другом. Зачастую они занимаются очень хардкорными вещами, им всегда есть чем заняться, пока нейронка обучается.
Это из того, что я вижу со стороны. Я все-таки больше разработчик, больше пишу код и интегрирую результаты их работы в мобильные приложения. Но могу с уверенностью сказать, что это довольно существенно отличается от классической работы программиста.
СТАС: Получается ли, что в конечном счете модель обучения с Python переписывается на что-то более быстрое, например, на C++? Чтобы оптимизировать код как раз для того, чтобы обучение происходило быстрее.
АНДРЕЙ: Нет, не совсем так. Обычно обучается модель на каком-то learning фреймворке, скажем, на TensorFlow, и по итогу получается модель в формате TensorFlow. Дальше есть несколько вариантов, как ее запускать
Первый вариант — это запускать ее там, где может запускаться сам TensorFlow. Для этого нужно скомпилировать ядро TensorFlow — это статическая библиотека примерно на 1 Гб — поставить его, куда мы хотим, и запускать.
Естественно у такого варианта есть ограничения. Например, на iOS это сложно и долго. Поэтому чаще всего существуют так называемые конвертеры, которые умеют из моделей разных learning фреймворков, не важно, будь то Caffe, Torch, TensorFlow и пр., доставать веса которые потом можно применить и использовать у себя в продакшене.
Хотя это тоже уже ушедшие реалии, но буквально полтора года назад работа таких разработчиков, как я, состояла в следующем. R&D обучили какую-то нейронку, получилась модель. Они из нее вынули веса и записали их просто в буферы из действительных чисел. Дальше отдают их разработчику (мне) и говорят: «Закодь эту нейронку!» — и ты пишешь все эти слои, потом подгружаешь к ним веса из буферов и запускаешь это все. Но саму нейронную сеть никто не переписывает на C++.
То есть это два отдельных этапа:
Про получение датасетов
ГЛЕБ: Давайте вернемся опять к актуальным проблемам. Мы поговорили о том, что есть проблемы с данными, и начали говорить про инженеров.
СТАС: Да, расскажи как же решить проблему получения датасетов? Не будешь же ты сам сидеть и размечать миллион примеров, правильно?
АНДРЕЙ: К сожалению, это ровно так и работает. Единственное решение, и другого не существует и не будет существовать очень долго — это ручной труд. Обычно это выглядит так: есть армия фрилансеров, которым дают миллион фотографий, они визуально определяют: «Так, на этой фотографии кошка, на этой — собака», в каком-то формате это фиксируют и отдают компаниям. Существуют специальные биржи, например, Яндекс-Толока, где можно оставить задание разметить данные за какую-то плату. У Амазона тоже есть своя биржа, на которой работают в основном индусы. Это довольно большая индустрия.
Сейчас это решается только ручным трудом и вложением средств. Для того, чтобы собрать датасет, нужна приличная сумма денег, чтобы оплатить ручной труд и потом использовать размеченные данные.
СТАС: Мне вспомнилась история про Google и их капчу, где они за счет пользователей распознавали фотографии для Google Street Maps. Получается, это тоже оттуда же.
АНДРЕЙ: Да, иногда компании хитрят и как-то используют вас в качестве фрилансеров.
Про профессию Data Scientist
ГЛЕБ: А как обстоят дела с инженерами. Я хочу понять, как вообще обстоят дела с рынком — их не хватает, их слишком много, где их брать?
СТАС: Ставлю на то, что не хватает.
АНДРЕЙ: Да, есть определенная нехватка, но даже не инженеров, а, скорее data scientist’ов. Не хватает именно людей, которые могут что-то крутое делать. Сейчас это оверхайп тема. В той же ВШЭ переполнены все кафедры с машинным обучением, все им хотят заниматься, у каждого второго диплом с машинным обучением. Оно везде — даже на экономфаках уже есть!
Но не хватает именно хардкорных людей, их тут же расхватывают. Если вы показываете даже минимальные скилы, то просто сразу отъезжаете в Маунтин-Вью, потому что вас там очень ждут. Это действительно правда.
СТАС: Ты сейчас закинул еще угля в топку hype train.
АНДРЕЙ: Наверное, это рано или поздно сойдет на нет, но сейчас специальность data scientist стабильно популярна. Если вы делаете крутые штуки, то компании готовы платить крутые деньги.
ГЛЕБ: Есть некоторые стереотипы, как выглядят программисты. Есть ли какое-то отличие для data scientist’ов?
АНДРЕЙ: Я бы не сказал. Но они не такие, как мы. Программисты в основном очень дотошные, им нравится, чтобы все было по полочкам, чтобы Git-репозиторий был идеальный и все такое. Data scientist все-таки больше математик, ему главное найти решение проблемы. У них нет таких странных вещей, как code review, unit-тесты — всей этой чепухой они не занимаются. Они используют программирование только лишь как инструмент, а их основная деятельность более интеллектуальная.
СТАС: Как раз хотел сказать, что у них нет культа инструмента, как есть у многих разработчиков.
АНДРЕЙ: Да, и они меняют фреймворки чуть ли не каждую неделю, потому что как только появляется что-то новое, например, Kaffe 2, PyTorch — они это пробуют! У них нет такого: «Я Data scientist на TensorFlow».
Про GPU-инженеров
Основная проблема есть на самом деле с разработчиками типа меня. Мне кажется, что сложно найти компанию, которая была была заинтересована в разработчике, который пишет на Swift, но при этом занимается не UI-kit, а хардкорными штуками. Честно говоря, даже с ходу не знаю, кто такие вакансии может в принципе иметь.
Понятное дело, что это какие-то технологические стартапы, но стартапы не могут взять всех. В этом смысле я очень дорожу своей работой, пусть она иногда и не такая выгодная. Есть мало инженеров, которые это умеют, но и востребованность очень маленькая. Поэтому есть компромисс между интересными проектами и работой на enterprise.
Если вам интересно работать над чем-то уникальным, более сложным, чем верстка экранов и прочее, то стоит однозначно искать такие вакансии. Думаю, с годами их будет появляться больше, потому что рынок растет. Но я пока слабо представляю, куда можно устроиться.
АНДРЕЙ: Я в этом смысле прямо очень ей дорожу, потому что такую работу довольно сложно найти. Просто обычно GPU разработка нужна все-таки в основном игровым компаниям. Чтобы ты был относительно классическим разработчиком, но занимался хардкорными вещами — в этом смысле рынок труда очень маленький и узкий. Я не думаю, что можно сходу устроиться на Junior GPU инженером или стажером. Нужно сначала самому разобраться, набраться опыта, и приходить уже в компанию готовым решать задачи самостоятельно.
Про железки
СТАС: К железкам пора — к нехватке железок.
ГЛЕБ: Потому что все разобрали на биткоины, ты хочешь сказать?
АНДРЕЙ: Да, Сбертех недавно заявили, что весь дефицит на рынке видеокарт был из-за них.
ГЛЕБ: А зачем им — для машинного обучения или для майнинга?
АНДРЕЙ: Не возьмусь точно сказать, но, по-моему, все-таки для обучения.
ГЛЕБ: А вообще есть проблема, что не все могут себе позволить необходимое оборудование?
АНДРЕЙ: Обычно это никто не делает дома. Чаще всего это арендованный сервер, скажем, на Амазоне, у которого есть эластичная оплата в зависимости от того, как много ресурсов вы используете. В реальности вы можете заниматься машинным обучением хоть с Macbook Air. То есть вы просто через терминал запускаете расчет на сервере — где-то далеко на горячих видеокартах он считается, а потом вы скачиваете результат, и все.
В реальности никто на ноутбуках ничего не учит, и ни у кого дома Nvidia Titan тоже не стоит, потому что это невыгодно. Каждый год выходят новые видеокарты, в основном все на серверах.
Про тестирование
ГЛЕБ: Как обстоят дела с тестированием? У меня есть друг, который работает в Nvidia и занимается тестированием производительности программ, которые обучают сети. Это все, что я слышал про тестирование, связанное с машинным обучением. Какие процессы в этом смысле есть?
АНДРЕЙ: На самом деле сейчас это по большей части выглядит как аналог дебага с помощью многих print из нашего мира, то есть когда ты несколько вручную это делаешь. Но недавно была конференция NIPS, на которой рассказали, что в Стэнфорде ребята разработали хранилище нейронок и моделей, которые считывают метрики из нескольких разных итераций и вариаций. Их можно сравнивать, смотреть, как и что меняется. То есть сейчас что-то есть, но инфраструктура пока несколько сырая — очень много разнородных инструментов, которые плохо друг с другом работают.
Но есть подвижки. Сейчас запускается стандарт ONNX для описания нейронных сетей в унифицированном стиле, который принимается уже многими компаниями. Но все равно инфраструктура сырая. Насколько могу судить, очень многое пока делается вручную. То есть чтобы протестировать, нужно запустить и посмотреть, работает или нет. Понятное дело, что можно считать какие-то метрики, но иногда есть и субъективное тестирование на глаз. Оно до сих пор имеет место быть.
Про бенчмарки
СТАС: Я подумал о том, какие можно применять бенчмарки. Я правильно понимаю, что когда обучаешь модель на конкретном датасете и на конкретном железе, можно судить о том, сколько времени она будет гоняться?
АНДРЕЙ: Нет, датасет вообще ни на что не влияет. И не обученная, и обученная модель будет работать одно количество времени. Обученная модель отличается от необученной только циферками внутри, но количество циферок одинаковое. Если конкретно оперировать в терминах нейронных сетей, то скорость напрямую зависит от толщины модели — как много слоев, насколько толстые эти слои и т.д.
Есть легковесные нейронки, которые запоминают не так много параметров. Есть тяжеловесные, которые запоминают их больше. Это всегда компромисс — нет такого, что ты берешь в два раза больше слоев, и у тебя результат в два раза лучше. Это нелинейная корреляция. Всегда нужно находить компромисс, чтобы для одного набора данных сеть получилась не слишком тонкой, выучила довольно много критериев и обучилась правильно. Но при этом она не должна быть излишне толстой, потому что количество данных все равно недостаточно для того, чтобы все задействовать.
Про reinforcement training и игру в го
ГЛЕБ: Мы сейчас говорили о самых общих аспектах машинного обучения. Но есть, особенно последние пару лет, прорывные штуки, например, AlphaGo. Я думал, что это глубокое обучение, но как выясняется, правильно называть это reinforcement training.
АНДРЕЙ: Reinforcement training — обучение с подкреплением. Это такой вид обучения, который работает несколько иначе. Допустим, вы обучаете модель, например, искать выход из лабиринта или играть в шашки. Вы берете свой алгоритм, свою структуру и кладете в эту среду и предопределяете набор действий, которые в этой среде можно совершить. Модель перебирает варианты, условно пытаясь пойти влево или вправо. Reinforcement training заключается в том, что каждый раз, когда машина выполняет действие, вы ее либо бьете по рукам, либо говорите: «Все норм!»
Действительно, был алгоритм AlphaGo — кто не знает, есть такая игра го. Долгое время го была единственной игрой, в которой машина не могла обыграть человека. Там настолько много комбинаций, что чтобы все их просчитать, требуется очень много времени. Человек в прямом смысле этого слова не занимается перебором вариантов, поэтому может справиться с поиском ходов быстрее. Алгоритм AlphaGo на основе нейронной сети, обученной с помощью reinforcement training, стал первым алгоритмом, который смог обыграть профессионального игрока в го.
Конечно, обучение с подкреплением развивается не чтобы машина могла выиграть в го, есть более важные кейсы, и это трендовая тема в машинном обучении, которая сейчас активно развивается.
ГЛЕБ: Если я ничего не путаю, в го порядка 10170 комбинаций — это астрономические цифры. Я следил, когда был самый первый матч AlphaGo против Ли Седоля. Это был не самый крутой игрок в мире, но один из сильнейших. Когда его обыграли, все сообщество, конечно, поникло. Было ощущение — черт побери, все-таки добрались они до нас!
Когда играли во второй раз через год, программа стала совсем ненормальная, она обучалась сама с собой без исходных данных уже, совсем без начального обучения. К тому же она стала во много раз мощнее первой, и сейчас может выполняться на одном компьютере, а раньше требовалась распределенная сеть из машин. Короче, нас окончательно победили!
Про генетические алгоритмы
СТАС: Хочу спросить про генетические алгоритмы. По описанию кажется, что генетические алгоритмы тоже можно отнести к обучению с подкреплением. Как я себе их представляю — есть какое-то поколение, мы берем каждый отдельный субъект в поколении, он выполняет какую-то задачу, мы даем оценку его действиям, и потом, исходя из этих оценок, отбираем лучших. Потом мы скрещиваем их определенные свойства, создаем новое поколение, добавляем немножко мутации, и вот у нас появилось новое поколение. И повторяем эти операции, пытаясь увеличить финальную полезность у каждого конкретного члена этого поколения. Кажется, что это похоже по смыслу. Это считается reinforcement training или нет?
АНДРЕЙ: Нет, генетические алгоритмы — это все-таки несколько иное.
СТАС: Они относятся к машинному обучению?
АНДРЕЙ: Я бы так не сказал. Не возьмусь сейчас утверждать, но генетические алгоритмы мы проходили в университете, как и все, и мне кажется, что это вещь несколько более простая и более нерегламентированная что ли — короче, императивная. То есть заранее известно, что какой будет input, такой будет output. В машинном обучении все-таки несколько иначе обстоят дела — есть какая-то вероятность, точность предсказаний и все в этом духе.
Возможно, меня поправят люди, которые в терминологии разбираются лучше, чем я, но from top of my head я бы сказал, что нет.
СТАС: Получается, что генетические алгоритмы для решения большинства реальных задач не используются?
АНДРЕЙ: Да, они в основном более алгоритмические и я в практике крайне редко с ними встречался.
Про капсульные сети
ГЛЕБ: Есть еще одно подмножество машинного обучения — так называемые капсульные сети. Опять, не будем слишком углубляться. Расскажи буквально в двух словах, что это такое и почему сейчас есть этот тренд?
АНДРЕЙ: Это прямо супер новая тема, ей всего несколько месяцев. Джеффри Хинтон выпустил статью и сказал, что текущие сверточные сети — это путь в никуда, и мы предлагаем новое видение того, как это будет развиваться. Сообщество это заявление приняло неоднозначно и разделилось на два лагеря: одни говорят, что это оверхайп, другие — big thing и все такое.
Но если прямо совсем на пальцах объяснить, то как работают сверточные сети? Возьмем, к примеру, нейронки, которые работают с изображениями. Есть свертка — столбик из матриц, который пробегает по картинке с некоторым шагом, как бы сканируя ее. На каждой итерации такого шажка вся эта свертка применяется к этому кусочку, и каждая свертка превращается в новый условный пиксель, но гораздо большей размерности, эта операция повторяется для все сетки.
Но проблема со сверточными сетями такова, что все данные, которые приходят на первый слой, доходят до самого конца — может быть, не в полном объеме, но они все влияют и все доходят до финального этапа. Грубо говоря, если нужно определить какую-то часть изображения, например, одного котика, не требуется сканировать все изображение. Достаточно в какой-то момент локализовать зону, где, скорее всего, расположен котик, и рассматривать только ее, как это делает человек.
Именно так работают капсульные сети. Не возьмусь экспертно объяснять их внутренности, но из того, что я понял: внутри капсульных сетей существуют определенные деревья, и каждая последующая капсула принимает на вход только релевантные ей данные. То есть сквозь них не проходит все-все-все, что мы изначально приняли на вход, а с каждым новым слоем (не знаю, как это в терминологии капсульных сетей можно говорить) обрабатываются лишь те данные, которые действительно нужны — только важные кусочки данных. В этом ключевое отличие между сверточными и капсульными сетями.
ГЛЕБ: Звучит интересно, только я не совсем понимаю — это только про изображения идет речь?
АНДРЕЙ: Нет, это про все. Я использовал изображения просто для того, чтобы объяснить. Ключевая идея такая: давайте не будем гонять все данные и все фичи, а только те, которые релевантны к следующему слою.
Еще про игры
СТАС: Слышал о том, что после AlphaGo ребята собираются победить всех в StarCraft?
АНДРЕЙ: Вынужден тебя разочаровать, но я не очень за этим слежу. Мне не то, чтобы был интересен киберспорт, но уже становится понятно, что за этим будущее. Например, уже есть стартапы, которые обучают играть в Доту. Они, как личный тренер, анализируют то, как ты играешь, и говорят, где ты недостаточно хорош, у них есть свои обученные на киберспортивных матчах данные. Есть стартапы для ставок, которые предсказывают, кто победит, и прочее.
В этой сфере сейчас работает много людей в первую очередь потому, что в ней вертится много денег. Но лично мне это просто абсолютно неинтересно, поэтому я за новостями и трендами не слежу, к сожалению.
СТАС: Как ты думаешь, в чем сложность создания хорошего искусственного интеллекта именно для стратегических игр? Я правильно понимаю, что в основном это очень большое количество вариантов?
АНДРЕЙ: Да. На самом деле мы уже обсуждали этот момент, когда я объяснял, что в AAA играх искусственный интеллект до сих пор не применяется, но при этом он есть в AlphaGo и, возможно, где-то еще.
Игра го при всей своей сложности состоит в том, что ты на каждом шаге просто кладешь фишку для того, чтобы очертить камень, а игра StarCraft — это очень комплексная вещь. Там ты можешь своих юнитов послать по фактически неограниченному количеству траекторий, возвести разные наборы своих построений и пр. Все это является параметрами.
Плюс сложность заключается в том, что нейронные сети не всегда мыслят, как человек. Когда мы, например, строим юнит, мы это запоминаем. Но многие нейронки запускаются каждый раз. Конечно, есть рекурсивные сети, которые умеют запоминать прошлые свои достижения. Они, в частности, используются для перевода и текстовой информации, когда по мере того, как предложение генерируется, нейронка использует все больше данных.
Тут существуют огромные сложности c тем, что весь объем информации и вариантов нужно формализовать, то есть найти такой датасет для обучения, чтобы это все еще как-то адекватно реагировало на поступки вашего противника, которых тоже может быть миллион, в отличие от игры в го или в шахматы.
СТАС: Понятно — очень много параметров.
ГЛЕБ: А я вот что не понимаю, понятно, что в Доте меньше параметров, но это все равно примерно то же самое в том смысле, что куда угодно послали и т.д.
СТАС: Тут Андрей свел к тому, что, во-первых, у тебя юнит один и количество вариантов намного меньше.
АНДРЕЙ: Если честно, я во вторую Доту вообще ни разу в жизни не играл, но в оригинале, насколько я знаю, это супер детерминированная игра. Там есть 3 коридора и башни, которые нужно разрушать.
ГЛЕБ: Да, но в StarCraft, хотя я вообще не играю, тоже есть какие-то пути и те же самые юниты. Ты говоришь, что их много, но, скорее всего, их всегда водят пачками. То есть примерно то же самое получается.
СТАС: Тебе еще нужно во время боя правильно расставить каждый юнит отдельно. В тот момент, когда их не пачкой водят, а начинают расставлять, параметров сразу больше становится.
АНДРЕЙ: Ваша проблема в том, что вы мыслите такими категориями: поставить юнит и т.д., но все время забываете, что нейронка — это просто матрица — числа, которые перемножаются. Там вы должны формализовать, например, такие вещи, как задачи. Скажем, есть карта для StarCraft и есть какая-то задача на ней — не важно, победить игрока или что-то еще. Все это нужно представить в виде математических примитивов, и именно это самое сложное.
Если бы это действительно был искусственный интеллект, пропасть между Дотой и StarCraft была бы минимальной. StarCraft, может быть, чуть сложнее по механике, но все равно примерно то же самое. Но в силу того, что мы оперируем числами, то формализовывать это сложнее.
Про взаимообучение сетей
СТАС: У меня последний вопрос, который хочется задать перед тем, как мы пойдем в родную мобилку. Я не знаю, как это правильно называется, но есть способ, когда одна нейронная сеть по сути следит за другой и пытается найти закономерности.
АНДРЕЙ: Не возьмусь объяснять сейчас, как это работает, но я точно знаю, что существуют суперкрутые алгоритмы, о которых я слышу иногда на работе, когда две нейронные сети учатся за счет друг друга. Эта зона экспертизы мне уже совершенно недоступна, но звучит это все прикольно. Насколько я знаю, это используется для генеративных сетей. Большего, к сожалению, я не могу сказать.
СТАС: Хорошо. Ты самые главные ключевые слова дал, остальное Глеб и читатели легко нагуглят.
Про мобилки (Apple)
ГЛЕБ: Давайте перейдем к мобилкам, к которым мы уже давно идем. Во-первых, что мы уже можем, говоря про машинное обучение, делать на мобильных устройствах?
АНДРЕЙ: У вас, кстати, подкаст для iOS разработчиков?
ГЛЕБ: Мы не iOS’ный подкаст. Да, Стас?
СТАС: Да, для мобильных разработчиков. К чему вопрос?
АНДРЕЙ: К тому, что просто ситуация очень разнится. Компания Apple в силу того, что у нее всегда было хорошо с интеграцией софта и железа, и она славится этим, очень элегантно подсела на hype train с машинным обучением.
В 2014 году Apple представила графический API Metal. В нем были вшиты такие вещи, как, например, компьютшейдеры и пр. Все это позволило с приходом iOS 10 включить во фреймворк Metal Performance Shaders очень много слоев, активаций и других операторов из нейронных сетей, в частности, convolutional neural networks.
Это дало просто огромнейший буст, потому что, как правило, расчеты на видеокарте в разы быстрее, чем на центральном процессоре. Когда Apple дали возможность считать на мобильных видеокартах, причем быстро, не нужно стало писать свои математические операторы и прочее. Это прямо очень сильно выстрелило. А годом позже они выпустили CoreML (мы поговорим о нем чуть позже).
У Apple был очень удачный фундамент. Уж не знаю, было ли у них такое видение, или так совпало, но они сейчас объективно лидеры в индустрии машинного обучения на мобильных устройствах.
Про мобилки (Android)
То, что работает относительно круто и здорово в реалтайме на iOS, к сожалению, не работает так же круто на Android. Это связано не только с тем, что Android — отстой. Есть еще другие факторы — в первую очередь то, что у Android очень разноплановая инфраструктура: есть слабые девайсы, есть сильные — под все не подгонишь.
Если на всех iOS устройствах поддерживается Metal, то на Android уже сложнее — где-то поддерживается OpenGL одной версии, где-то другой, где-то не поддерживается вовсе. Где-то есть Vulkan, где-то его нет. У всех производителей свои драйвера, которые, понятное дело, никак не оптимизированы, а просто минимально поддерживают стандарт. Бывает даже такое, что вы запускаете на Android на GPU какие-то нейронные сети, а они работают по скорости так же, как на CPU, потому что работа с общей памятью организована очень неэффективно и все такое.
На Android сейчас дела плохи. Это, скорее, удивительно, потому что Google является одним из лидеров, но немножко в этом плане проседает. На Android есть прямо нехватка качественно реализации возможностей современного машинного обучения.
У нас, например, даже в приложении не все фичи работают одинаково. То, что на iOS работает быстро, на Android работает помедленнее даже на сравнимых по мощности флагманских устройствах. В этом смысле на данный момент Android как платформа проседает.
Про CoreML
СТАС: Раз сказали про CoreML, наверное, правильно было бы сказать и про TensorFlow Lite.
АНДРЕЙ: CoreML, на самом деле, — темная лошадка. Когда он вышел в прошлом году, все сначала сказали: «Вау, круто!» Но потом стало понятно, что это просто небольшая обертка над Metal. У компаний, которые всерьез занимаются машинным обучением, в том числе, нашей, уже давно были свои решения. Например, наши решения в тестах показывали результаты лучше, чем CoreML и по скорости, и по другим параметрам.
Но главная проблема CoreML была в том, что его нельзя было кастомизировать. Иногда бывает такое, что нужен сложный слой в нейронной сети, которого нет, например, в Metal, и его нужно написать самому. В CoreML не было возможности встроить свои слои, и поэтому приходилось делать downgrade до Metal на нижний уровень и писать все самим.
Недавно в CoreML это добавили, и теперь этот фреймворк стал более интересен. Если вы — разработчик, у которого вообще в компании или в приложении пока что нет ничего, связанного с машинным обучением, вы можете прямо в две строчки запустить какую-то нейронку и быстро прогнать ее на GPU. Результаты, которые показывают performance-тесты для CoreML, сравнимы с кастомными решениями и голым Metal.
То есть работает CoreML достаточно хорошо. Он немножко сыроватый, в нем есть баги, но с каждым месяцем становится лучше. Apple активно выкатывает апдейты — не так, как мы привыкли, что апдейты фреймворков от Apple выходят раз в год или на полумажорных версиях iOS. CoreML активно обновляется, в этом смысле все здорово.
TensorFlow Lite предоставляют конвертор в CoreML, CatBoost тоже поддерживает конвертор в CoreML. Короче, Apple все опять сделали, как надо. Они выпустили опенсорсный конвертор и сказали: «Давайте-ка вы все напишите конверторы в CoreML» — и многие learning фреймворки это поддержали.
Сначала был некоторый скепсис насчет CoreML, на прошлой WWDC самый частый вопрос разработчикам CoreML был: «Почему вы не позволяете скачивать модели из интернета? Почему не позволяете их шифровать?» Можно было эти модели достать, и, получается, украсть интеллектуальную собственность.
Сейчас это все починили, добавили функциональности, и на текущий момент CoreML — точно лидирующая платформа в этом смысле.
СТАС: Можешь про это поподробнее. Получается, что сейчас можно уже не хранить модель, а просто загружать ее откуда-то?
АНДРЕЙ: Да, уже можно. Раньше, когда мы спрашивали об этом, разработчики улыбались и говорили: «Просто посмотрите хэдеры». Там действительно были конструкторы, которым можно передать файлы и все соберется.
Но модели CoreML внутри сделаны довольно интересно. Они на самом деле являются обычными бинарниками, которые хранят веса, но плюс к ним генерируются swift-файлы, которые потом создают неявные классы. Эти классы вы используете у себя в приложении, и компиляторы эту модель компилируют в какие-то файлы.
Сейчас, используя определенные хаки и подходы, можно сделать так, что эта модель станет портируемой. Вы можете и защитить свою интеллектуальную собственность путем шифрования, и облегчить вес приложения.
В общем, сейчас CoreML движется в правильную сторону. Не все можно сделать законно с точки зрения App Review, не все можно сделать легко, без хаков, но заметно, как разработчики улучшают фреймворк.
СТАС: Круто! Хотел добавить, что CoreML выглядит типовым решением. Условно говоря, он удобен, когда ты хочешь что-нибудь простенькое сделать с использованием машинного обучениея у себя в приложении. Кажется, что если это типовая задача, то Apple постарался сделать максимально простым весь этот путь, если ты найдешь готовую модель, датасет и прочее. Это как раз история про типовую задачу, потому что для них, наверное, уже все готово.
АНДРЕЙ: Для типовых задач это вообще супер! Без гипербол — там действительно нужны две строчки кода для того, чтобы запустить модель. В этом смысле — да, это очень здорово, особенно для инди-разработчиков или компаний, которые не имеют в штате отдел R&D, но хотят тоже добавить что-то прикольное.
Но это не так интересно, потому что типовые задачи были решены на Github и с Metal — можно было просто скопировать этот код себе и наколхозить — пусть, чуть сложнее.
Важно, что сейчас этот фреймворк движется не только в сторону классических повседневных задач, но и в сторону комплексных решений. Это действительно круто!
Про обучение на мобилках
ГЛЕБ: Ты говоришь, что после появления Metal стало возможно обучать модели на мобилках?
АНДРЕЙ: Нет, обучать на мобилках никогда нельзя было. Это не имеет смысла, можно только запускать. Если я так и сказал, то оговорился. На мобилках, конечно, никто ничего не обучает.
СТАС: Я тоже ничего не слышал про обучение на мобилке.
ГЛЕБ: Я тоже не слышал, но я об этом думал. Конечно, интуитивно кажется, что это странная штука. Но точно нет интересных задач, когда это было бы актуально?
АНДРЕЙ: Сложно представить их. Если есть что-то такое, то только распределенное обучение. Есть даже научные статьи про то, как это делать, но я так понимаю, что вы спрашиваете, как обучиться на данных, собранных на этом же телефоне? Просто даже если вы столько соберете (чего не случится), обучаться это будет так долго, что никогда не закончится, и никто не будет портировать код для обучения на мобильные платформы, потому что зачем? Обучение всегда происходит на серверах, а inference — на устройствах.
СТАС: Но в конечном счете все-таки получается так. Если ты — компания, хочешь иметь что-то подобное, тебе нужны данные, и ты можешь их собрать у своих пользователей, то есть периодически их себе подгружать.
АНДРЕЙ: Да, но это работает несколько иначе. Ты собираешь в одно место к себе на горячий сервер данные со всех пользователей, там обучаешь, потом обратно высылаешь готовую модельку. Но не так, чтобы каждый у себя что-то обучил.
СТАС: С другой стороны, мобилка бы грелась — и зимой было бы актуально, но уж очень, наверное, долго.
Про мобилки и будущее
ГЛЕБ: Есть ли еще интересные вещи с точки зрения применения машинного обучения к мобильным устройствам? Мы поговорили о том, что у нас уже есть сейчас. Интересно было бы заглянуть немножко в будущее — чтобы мы вообще хотели получить на наших мобильных платформах для каких-то суперпродуктов, суперрешений.
АНДРЕЙ: Сейчас, как ни странно, бутылочным горлышком является performance — потому что многое, что мы хотим запускать, айфоны не тянут. Конечно, нужно подождать еще какое-то время, когда станет можно запускать более сложные задачи.
Есть некоторые проблемы с реалтаймом. Например, даже в нашем флагманском приложении видео стримить со style-трансфером не со всеми стилями получается, потому что это слишком долго и трудозатратно. Есть узкие места связанные именно с уровнем развития железа.
На самом деле CoreML очень сильно развивается. В будущем, я думаю, что с ним будет все хорошо. Больше всего хочется, чтобы индустрия уже успокоилась, начала происходить стандартизация: побольше общих форматов, конвертеров, конвенций — побольше вещей, которые работают одинаково хорошо и на Android, и на iOS, потому что для бизнеса это очень важно. У нас часто бывает такое, что мы не можем интегрировать крутую фичу только потому, что не можем выкатить ее только на iOS или только на Android.
Было бы здорово, всем было бы на руку, если бы началась активная, здоровая конкуренция, чтобы везде это здорово работало — и на Android, и на iOS, чтобы уже Github перестало лихорадить от бесконечных фреймворков для обучения. Сейчас это какое-то мракобесие — даже у Uber есть свой фреймворк, который называется Horovod. У Apple есть свой фреймворк — просто у всех есть свой фреймворк, у некоторых их несколько. Мне кажется, это все увеличивает порог входа, сложность конвертации, в том числе, на мобилку — поэтому в будущем хочется стабильного улучшения и развития всего подряд.
Думаю, что революции в ближайшее время не будет. Я не эксперт, и, возможно, не имею права такое говорить — но из того, что я вижу, пока не предвидится чего-то супернового. Хочется просто стабильного улучшения того, что есть сейчас.
Про обучение машинному обучению
ГЛЕБ: Что ты посоветуешь людям, которые не особо в теме, но хотят попробовать? Что почитать, посмотреть, как вообще в эту тему входить? Стас уже рассказывал про курсы от Яндекса и МФТИ.
АНДРЕЙ: Если бы вы спросили моих напарников, они бы вам ответили — читай Бишопа (M. Bishop. Pattern Recognition and Machine Learning. Christopher. Springer. 2006), еще какие-нибудь сложные книжки. Но в силу того, что у меня есть математический бэкграунд, я долго работал с 3D графикой, где тоже много линейной алгебры, я более-менее подкован. Все равно это довольно комплексный подход. Вам очень повезло, если вы это проходите в университете — ходите на эти пары, слушайте — и не пожалеете об этом.
Но если так сложилось, что этот момент уже упущен, или вы поступили на другую кафедру или факультет, то однозначно советую самообучение. Уже есть курсы, которые стали стандартом де-факто, например, курсы по машинному обучению от Andrew Ng на Coursera. Нет даже смысла ссылку на него давать, потому что он первый везде во всех списках.
Однозначно надо пройти несколько таких курсов, чтобы понять, как это работает внутри хотя бы на уровне ощущений, чтобы попробовать покодить свои простенькие модельки — начать хотя бы с распознавания букв на датасете от MNIST. Это как Hello World, только в мире машинного обучения.
Наверное, это не та сфера, где можно создать проект, войти, что-то там потыкать и посмотреть, что будет. Тут надо все-таки более фундаментально подойти, освоить набор знаний, который необходим для фундамента, и потом уже наращивать экспертизу.
СТАС: А после курсов?
АНДРЕЙ: После курсов есть advanced-курсы от Andrew Ng! Есть, например, портал Kaggle, где происходят соревнования, в которых можно поучаствовать и попробовать пообучать. Когда вы уже немного подкованы и можете обучить классические архитектуры, с этого момента приходится читать уже полунаучные или научные статьи, разбираться в тонкостях — если вы видите себя именно в роли Data Scientist.
Если вы — мобильный разработчик, который хочет к этому прикоснуться, наверное, этого уровня вам будет достаточно. Я примерно на этом уровне освоил, и дальше не лезу — у меня нет нужды лезть в сам R&D процесс. Я занимаюсь именно делами, которыми занимается разработчик. Но при этом все равно мне был необходим бэкграунд. На первых порах и команда меня обучала, проводили семинары с основами для программистов, чтобы мы быстро вникли.
Но набрать минимальный уровень знаний довольно просто. Нужно пройти несколько курсов, попробовать себя на Kaggle, еще что-то поделать — и вы уже в принципе будете готовы решать 90% существующих задач.
Итоги
ГЛЕБ: Давайте тогда черту подводить. Мне кажется, мы довольно лаконично и при этом четко и интересно обсудили то, что есть вокруг машинного обучения, по крайней мере, до чего у нас дотянулись наши программистские ручки.
Большое спасибо Андрею Володину за то, что нам рассказал это все.
Воспользовавшись моментом, Стас Цыганов (Туту.ру) и Глеб Новик (Тинькофф Банк), во-первых, раз и навсегда прояснили, что никто не обучает нейронные сети на мобильных устройствах. А также разобрались, что в машинном обучении, к сожалению, нет маги; обсудили современные техники вроде глубокого обучения, обучения с подкреплением и капсульных сетей.
В итоге, поскольку Podlodka — аудиошоу про мобильную разработку, к ней и пришли и узнали, как это все работает для мобильных устройств.
![](https://habrastorage.org/webt/fw/ph/db/fwphdbn4sxovfbminez_irgn6pm.jpeg)
Далее текстовая версия этой беседы, а запись подкаста здесь.
Про Андрея Володина, cocos2d и Fiber2d
ГЛЕБ: Расскажи, пожалуйста, нам немножко о себе. Чем ты занимаешься?
АНДРЕЙ: Я мобильный разработчик, но очень мало занимаюсь классической iOS разработкой. В мои обязанности практически не входит работа с UIKit. Я — главный разработчик довольно популярного на GitHub игрового движка Cocos2d. На данный момент я занимаю позицию GPU инженера в компании Prisma. В мои обязанности входит интеграция нейронных сетей на видеокарты и работа с дополненной реальностью, в частности, с VR-kit.
ГЛЕБ: Круто! Особенно интересно насчет cocos2d. Насколько я знаю, этот фреймворк появился достаточно давно.
АНДРЕЙ: Да, где-то в 2009 году.
ГЛЕБ: Ты его с самого начала применял?
АНДРЕЙ: Нет. Я стал главным разработчиком только в 2015 году. До этого я был Core контрибьютором. Компания Apportable, которая финансировала разработку, обанкротилась, люди, получавшие деньги за разработку, ушли, и лидом стал я. Сейчас я администратор на форуме, помогаю новичкам с какими-то проблемами, последние несколько версий выпущены мной. То есть я — главный майнтейнер на данный момент.
ГЛЕБ: Но cocos2d еще жив?
АНДРЕЙ: Уже скорее нет, в первую очередь в силу того, что написан на Objective-C, и там очень много legacy. Я, например, поддерживаю свои какие-то старые игрушки, написанные с его использованием, другие разработчики — свои legacy-проекты. Из актуальных движков вы могли слышать о Fiber2d. Это тоже мой проект.
Fiber2d — первый игровой движок на Swift, который был портирован на Android. Мы запустили игру, полностью написанную на Swift, и на iOS, и на Android. Про это тоже можно найти на Гитхабе. Это следующая веха в развитии cocos2d сообщества.
Про машинное обучение на пальцах
ГЛЕБ: Давайте начнем постепенно двигаться к нашей сегодняшней теме. Сегодня мы будем говорить про машинное обучение и обо всем вокруг этого — связанном и несвязанном с мобилками. Для начала давай разберемся, что такое вообще машинное обучение. Мы будем стараться объяснять максимально на пальцах, потому что не все мобильные разработчики с ним хорошо знакомы. Можешь нам рассказать, что это такое?
АНДРЕЙ: Если руководствоваться классическим определением, то машинное обучение — это поиск закономерностей в наборе данных. Классический пример — это нейронные сети, которые сейчас очень популярны. Среди них есть сети, связанные с классификацией. Простой пример задачи классификации это определение того, что нарисовано на картинке: есть какое-то изображение, и мы хотим понять, что это: собака, кошка или прочее.
Написать это с помощью стандартного кода очень сложно, потому что непонятно, как это делать. Поэтому используются математические модели, которые принято называть машинным обучением. Они строятся на том, что из большого количества примеров извлекаются определенные закономерности, и потом, используя эти закономерности, можно делать предсказания с некоторой точностью на новых примерах, которых не было в изначальном наборе данных. Это, если в двух словах.
ГЛЕБ: Соответственно, обучение — это история про изменение модели при помощи обучающего датасета?
АНДРЕЙ: Во время обучения модель, как правило, остается постоянной. То есть вы выбираете какую-то архитектуру и учите ее. Если взять для примера нейронные сети, которыми не ограничивается все машинное обучение, там изначально, грубо говоря, все веса нули или другие одинаковые значения. По ходу того, как мы скармливаем learning фреймворку наши данные, веса по чуть-чуть изменяются с каждым новым примером, и в конце выливаются в обученную машину.
СТАС: Конечное предназначение этой модели в том, чтобы, быстро подавая какие-то данные не из обучающей выборки, быстро получать результат?
АНДРЕЙ: Да, но дело не только в скорости. Например, некоторые задачи по-другому нельзя было решить — скажем, пример с классификацией очень нетривиальный. До того, как выстрелили классификационные сети, решения для того, чтобы понимать, что изображено на картинке, особенно и не было. То есть в некоторых сферах это прямо революционная технология.
Про ручной труд и машинное обучение
СТАС: Я недавно рассказывал своей бабушке, что такое машинное обучение. Она вначале думала, что машинное обучение — это когда машина учит кого-то. Я ей стал объяснять, что на самом деле, наоборот, это мы пытаемся научить машину, чтобы она потом выполняла какую-то задачу.
Я представил задачи, которые решает машинное обучение. Большинство из них, до того как машинное обучение выстрелило, выполняли люди. Причем это считалось не то чтобы низкоквалифицированной работой, но не слишком наукоемкой, скажем так. Это простейшие операции, которые во многом может выполнить человек. Можно так представить?
АНДРЕЙ: Так тоже можно сказать. На самом деле сейчас такая работа все равно нужна, но только для того, чтобы подготавливать датасеты для машинного обучения. Действительно, в некоторых сферах, например, в медицине, машинное обучение позволяет немного сгладить рутинные задачи и несколько облегчить процесс. Но не всегда. Я бы не сказал, что машинное обучение замыкается на том, чтобы облегчить тупую работу. Иногда оно делает довольно интеллектуальную работу.
СТАС: Можешь привести пример такой интеллектуальной работы?
АНДРЕЙ: Например, наше приложение Prisma — наверняка многие им пользовались (это не реклама!) Нельзя сказать, что это именно интеллектуальная работа и люди часто перерисовывали изображение в картины, а нейронная сеть это делает — вы даете ей обычную картинку и получаете нечто новое. Дальше можно спорить о том, красиво это или нет, но неоспорим сам факт, что это нечто, что человек сам не может сделать, или это занимает колоссальное количество времени.
Про историю
ГЛЕБ: Да, мне кажется, это отличный пример. Наверное, стоит немного обратиться к истории. Насколько давно эта тема развивается? Мне кажется, что чуть ли не от самых истоков программирования, во всяком случае очень-очень давно.
АНДРЕЙ: Да, в целом большинство концепций, которые сейчас применяются, уже были разработаны в 90-х годах. Естественно, сейчас появились новые алгоритмы, а качество тогдашних алгоритмов повысилось. И хотя есть ощущение, что внезапный интерес к машинному обучению возник из ниоткуда, на самом деле люди интересовались им давно.
Прогресс на первых этапах был обусловлен тем, что это по большей части математические модели, а математика уже достаточно давно стабилизировалась в плане открытий.
Текущий взрыв связан исключительно с тем, что мощности железа вокруг нас сильно выросли, в первую очередь, за счет использования видеокарт. Благодаря тому, что сегодня мы умеем делать огромные параллельные вычисления, появились новые технологии — машинное обучение, криптовалюта и пр.
По большей части текущий интерес и вообще текущая волна связаны с тем, что это просто стало возможным. Эти вычисления можно было делать и раньше, но катастрофически долго. Сейчас на них уходит вполне разумное время, и поэтому все начали это использовать.
Про железо
СТАС: Я сейчас прохожу курс, и там, в том числе, нужно обучать всевозможные модели. Часть из них я обучаю на своем рабочем Макбуке. Да, в каких-то случаях приходится подождать, может быть, минут 5, и модели получаются не самыми лучшими, средняя точность в районе 85%, но главное — они работают. Понятно, что в бою хочется иметь этот процент получше и возможно для продакшена она не совсем подходят.
АНДРЕЙ: Да, такие модели, наверное, не очень интересны. Скорее всего, это связано с простейшими предсказаниями и прочим. В реальности у нас, например, обучающая выборка может весить 90Гб, и обучаться это все может неделю. Такие компании, как Nvidia, хвастаются, что теперь они выпустили новую специальную видеокарту Tesla и на ней можно обучить Inception V3 за 24 часа! Это считается прямо прорывом, потому что раньше это занимало несколько недель.
Чем больше датасет и чем сложнее структура модели, тем больше времени занимает обучение. Но проблема с производительностью не только в этом. В принципе, если очень нужно, можно и месяц подождать. Проблема связана с inference — как потом применять потом эту нейронную сеть. Нужно, чтобы во время ее использования она тоже показывала хороший результат с точки зрения performance.
СТАС: Потому что, в том числе, хочется, чтобы на мобильных устройствах все работало, и работало быстро.
АНДРЕЙ: Я не думаю, что изначально это начало развиваться с прицелом работы на мобильные приложения. Такой бум начался где-то в 2011 году, и тогда все-таки это были десктопные решения. Но сейчас истинный интерес сообщества подкрепляется тем, что на айфонах, в том числе, стало возможным запускать сети, которые работают в реал-тайме.
ГЛЕБ: Стас, ты сказал, что от того, какая мощная у тебя видеокарта и вообще система, зависит окончательный результат. То есть иначе не работает?
АНДРЕЙ: Это не так, но я не уверен, что на маломощной машине модель будет обучаться.
ГЛЕБ: Кстати, помню, 5 лет назад, когда как раз был бум нейросетей, наши преподаватели говорили о том, что все новое — просто хорошо забытье старое. Это все уже было в 70-80-х годах и это не сработает, раз тогда не получилось. Наверное, они все-таки были не правы.
АНДРЕЙ: Да. Для каких-то задач машинное обучение сейчас очень сильно выстрелило. Объективно можно сказать, что они работают.
Про deep learning
ГЛЕБ: Есть такая модная штука — deep learning (глубокое обучение). В чем его отличие от того, о чем мы говорили для этого?
АНДРЕЙ: Я бы не сказал, что есть отличия. Существуют просто какие-то подмножества машинного обучения, и их громадное количество. Нужно понимать, что то, что называется deep learning — это та часть машинного обучения, которую принято относить к нейронным сетям. Глубоким оно называется потому, что в нейронных сетях есть много слоёв, и чем больше слоев, тем глубже получается нейронная сеть. От этого появилось название.
Но существуют и другие виды машинного обучения. Например, машинное обучение, построенное на деревьях, успешно применяется для face tracking до сих пор, потому что это гораздо быстрее, чем нейронки. Оно также используется для ранжирования, показа рекламы и прочего.
То есть глубокое обучение — это не что-то другое. На самом деле это подмножество машинного обучения, которое включает в себя кучу всего. Просто deep learning стал сегодня самым популярным.
Про теорию нейронных сетей
СТАС: Я хотел поговорить немножко про теорию нейронных сетей, постараюсь попроще. Ты сказал, что в них много слоев. По идее, если у нас есть один слой, и есть какие-то объекты, расположенные на плоскости, при помощи одного слоя мы фактически можем разделить эту плоскость на две части, правильно?
АНДРЕЙ: Нет, не совсем.
СТАС: Что нам дает большое количество слоев, если на пальцах?
АНДРЕЙ: Что такое нейронная сеть? Давай прямо разложим. Это просто математическая функция, которая на вход принимает набор чисел, а на выход тоже дает набор чисел — все.
Что внутри? Сейчас популярнее всего сверточные сети, внутри которых происходит convolution — просто очень много умножений матриц друг на друга, результаты складываются, эти операции выполняются в каждом слое. Плюс между слоями существует так называемая активация, которая как раз позволяет нейронным сетям быть глубокими.
Поскольку комбинация из линейных преобразований — это линейное преобразование, то сделав 10 линейных слоев, их можно все равно представить, как один линейный слой. Для того, чтобы слои не схлопывались, между ними существуют определенные математические действия, которые делают функцию нелинейной. Это нужно для того, чтобы увеличивать количество параметров.
Грубо говоря, нейронная сеть — это просто огромный массив чисел, которые потом как-то применяются к нашим данным, например, к картинке. Но картинка — тоже набор чисел на самом деле — это просто череда пикселей. Когда мы обучаем сеть, мы рассматриваем, например, 15 млн параметров (каждое число — это отдельный параметр), которые можно немножко с помощью некоторых эвристик сдвигать чуть влево, чуть вправо. Благодаря такому огромному количеству параметров получаются такие крутые результаты.
Глубокое обучение нужно именно для того, чтобы этих параметров было много, и все не схлопывалось до одного слоя.
ГЛЕБ: Кажется, что более-менее понятно.
АНДРЕЙ: Глубокое обучение — это подмножество машинного обучения. Но почему-то на эту тему поднялся хайп — особенно какое-то время назад из всех щелей, мне кажется, можно было услышать про deep learning. Не знаю, обосновано это или нет.
ГЛЕБ: Я думаю, что такая популярность вызвана тем, что оно дает впечатляющие результаты.
Про задачи
СТАС: При помощи нейронных сетей можно решать большинство задач машинного обучения, правильно?
АНДРЕЙ: Да.
СТАС: Давай тогда проговорим, какие задачи могут быть решены при помощи методов машинного обучения?
АНДРЕЙ: На самом деле, это щепетильная тема, потому что в реальности нужно перестать идеализировать и романтизировать то, что происходит. Как я уже сказал, там нет никакого искусственного интеллекта. Это чисто математическая модель и математическая функция, которая что-то перемножает и т.д.
Со стороны кажется, что сейчас машинное обучение немножко забуксовало на определенных категориях задач. Это, например, классификация (пример, о котором мы говорили в самом начале), трекинг объектов и их сегментация. Последнее есть в нашем приложении Sticky AI — оно выделяет человека, а фон убирает. Также есть биологическая медицинская сегментация, когда, например, определяются раковые клетки. Есть генеративные сети, которые учатся на наборе случайных чисел, и потом могут создавать что-то новое. Есть задачи Style Transfer и прочие.
Но на данный момент нет удобной площадки и инфраструктуры для использования машинного обучения. Например, у вас есть какая-то задача, которую вы, как человек, решаете легко, а как программист, вы не можете ее решить в силу комплексности и потому, что нельзя просто написать императивный алгоритм. Но при этом обучить нейронную сеть тоже не представляется возможным в первую очередь потому, что есть проблема с нехваткой данных. Для того, чтобы обучить нейронку, нужны большие датасеты с множеством примеров, к тому же очень сильно формализованных, описанных в определенном регламенте и т.д. Плюс нужна архитектура этой нейронной сети.
То есть сначала нужно формализовать входные данные в виде чисел, сделать саму архитектуру модели, потом формализовать выходные данные в виде чисел, как-то их интерпретировать. Для этого нужен довольно мощный математический аппарат и вообще понимание того, как все работает. Поэтому сейчас применение нейронок, как мне кажется, вне специализированных компаний типа нашей немножко проседает.
Какие-то задачи, которые раньше не решались, нейронки научились решать очень круто. Но нет такого, что нейронки пришли и решили весь спектр нерешенных задач.
ГЛЕБ: В каких областях ты видишь глобальные задачи, для решения которых нейронные сети вообще не подходят?
АНДРЕЙ: С ходу сложно ответить. Нам встречаются задачи, над которыми мы работаем и на которых не получается обучить нейронную сеть. Например, сейчас игровая индустрия очень интересуется обучением, и даже есть какие-то нейронки, которые имеют искусственный интеллект. Но, например, в AAA играх это пока не используется, потому что все равно на данный момент нельзя обучить искусственный интеллект абстрактного солдата вести себя как человек, чтобы это выглядело естественно. Сложно.
Про Доту
СТАС: Ты слышал, что искусственный интеллект уже побеждает в Доте?
АНДРЕЙ: Да, но это все равно несколько иное. Дота — это довольно математическая игра, ее можно описать. Никого не хочу обидеть, но это фактически, как шашки — игра в одно и то же. Там есть определенные правила, и вы просто по ним играете.
Но при этом пока есть сложности, чтобы создать какое-то естественное поведение, связанные прежде всего с малым количеством данных и малым количеством инженеров, которые умеют это делать.
Например, в Google инженеры пытаются при помощи нейронных сетей обучить ходить 3D модель человека — просто чтобы она передвигалась. Это выглядит всегда ужасно, люди так не ходят.
Про TensorFlow
СТАС: Ты сказал, что сейчас по сути нет, легкого и дешевого способа, не разбираясь вообще в машинном обучении, решать задачи машинного обучения. В любом случае получается, что в этом надо шарить. Хотел бы узнать по поводу TensorFlow. Кажется, что Google пытается сделать так, чтобы даже люди, которые не очень в этом всем разбираются и у которых не очень большой бэкграунд, могли решать какие-то простейшие задачи. Расскажи, что такое TensorFlow и как ты думаешь, возможно ли такое?
АНДРЕЙ: Давай по порядку. TensorFlow — это на самом деле не самая простая вещь из всех. Это один из самых популярных так называемых learning фреймворков — фреймворк для обучения общего назначения, не обязательно нейронок. Это не самый высокоуровневый фреймворк из существующих. Есть, например, Keras, который является более высокоуровневой абстракцией на TensorFlow. Там можно гораздо меньшим количеством кода сделать то же самое.
Типовые задачи решаются довольно просто, потому что, в частности, Github уже полон примерами и репозиториями. Скажем, если ваша компания делает поиск по картинкам для книжного магазина, то у вас, в принципе, все хорошо. Вы заходите на Github, там есть примеры, как можно взять фичи картинки, вы пишите поиск по фичам — все готово!
На самом деле так обстоит дело с большим количеством задач. Если вы можете переложить свои проблемы на уже решенные или около того задачи в машинном обучении типовыми способами, тогда у вас все круто. Но если у вас что-то прямо уникальное, такое, что нельзя закодить, и при этом нужно нечто, что принято называть искусственным интеллектом, то я бы не сказал, что TensorFlow — это самый простой путь. Чтобы в нем разобраться, нужно потратить приличное количество времени.
СТАС: Я так понимаю, на стороне Google играет то, что они предлагают вместе с фреймворком и мощности?
АНДРЕЙ: Да, они очень сильно сейчас активно развивают, и вообще стремятся, чтобы в сообществе все друг с другом шарили нейронки. У них есть платформа, на которой, если вы готовы делиться своими результатами, они будут давать вам сервера и прочее. Единственное условие, что вы должны поделиться этим со всеми, то есть платформа не предназначена для коммерческого использования.
Про проблемы
ГЛЕБ: Давайте еще раз пробежимся по проблемам, которые сейчас есть в области машинного обучения. Что наиболее актуально? Во-первых, это данные.
АНДРЕЙ: Да. Недавно даже видел мем — грустная картинка и подпись «Когда нашел крутую архитектуру, но нет датасета, чтобы ее обучить». Действительно, такая проблема существует.
ГЛЕБ: Хорошо, но, допустим, у нас есть большой датасет, на котором модель обучается неделю. Как решаются проблемы со временем? Грубо говоря, для нас это как компиляция, только компиляция идет в худшем случае 15 минут на каком-нибудь жестком iOS проекте, обычно все-таки быстрее. Тут такая же ситуация, только уже две недели. Если налажать, это время пропадет.
АНДРЕЙ: Две недели — это, наверное, все-таки уже ушедшие реалии. Сейчас это сутки — двое — трое. Но твои опасения имеют место быть. Действительно, бывает такое, что работа R&D заключается в том, что они думают: «О, попробуем вот это!» — что-то изменяют, запускают обучение, а через два дня узнают, что метрики упали на 0,5%: «ОК, это не сработало, попробуем вот это!» И снова ждут. Такая проблема действительно существует, и от нее никуда не деться.
СТАС: Хотел бы вернуться к истории про мой бедненький ноут, про то, что все-таки крутость модели и успешность ее предсказаний, наверное, связана со временем обучения. Есть такая корреляция? Приведу пример. Ты можешь вначале убедиться, что твоя модель более или менее решает твою задачу — допустим, на 70%. После этого ты понимаешь, что точно у тебя все будет лучше работать, если добавить количество признаков. Чем больше признаков, тем дольше все будет обсчитываться. Пусть ты запустишь на день, но практически будешь уверен, что модель будет работать лучше.
АНДРЕЙ: Да, такая оптимизация работает, скорее, на первых этапах. Когда ты совершенствуешь уже существующую модель, так не получается делать. Просто для того, чтобы осознать какое-то преимущество, приходится иногда переучивать модель с нуля. Это действительно времязатратный процесс.
СТАС: Я почувствовал, что все мои примеры на уровне второго класса.
Про работу разработчиков
ГЛЕБ: Я вспомнил еще известную картинку, про компиляцию. А тут сеть обучается.
![](https://habrastorage.org/webt/wl/fb/eo/wlfbeojhnc13z4_wcooqk5bhu4e.png)
СТАС: Если обучение занимает целый день, то что в это время делают разработчики? С утра пришел, заварил себе кофе, отправил обучаться, пошел домой — встретимся завтра?
АНДРЕЙ: Вообще сама по себе работа, связанная с машинным обучением, не очень похожа на классическую разработку. Я сам ей практически не занимаюсь, но могу рассказать из опыта своих коллег.
Во-первых, это люди, у которых очень сильный математический бэкграунд. В основном они закончили факультеты прикладной математики, а не computer science. Их профессиональная черта заключается в том, что они постоянно читают научные статьи и находятся в постоянном поиске новых гипотез.
В реальности это работа больше в сторону науки. Чтобы запрограммировать даже довольно сложную нейронную сеть, нужно написать примерно 500 строчек на Python, причем довольно однотипного. Эти люди обычно не ощущают себя классическими кодерами. У них нет репозиториев с ветками и всего такого. Они несколько оперируют другими категориями, и их работа заключается в другом. Зачастую они занимаются очень хардкорными вещами, им всегда есть чем заняться, пока нейронка обучается.
Это из того, что я вижу со стороны. Я все-таки больше разработчик, больше пишу код и интегрирую результаты их работы в мобильные приложения. Но могу с уверенностью сказать, что это довольно существенно отличается от классической работы программиста.
СТАС: Получается ли, что в конечном счете модель обучения с Python переписывается на что-то более быстрое, например, на C++? Чтобы оптимизировать код как раз для того, чтобы обучение происходило быстрее.
АНДРЕЙ: Нет, не совсем так. Обычно обучается модель на каком-то learning фреймворке, скажем, на TensorFlow, и по итогу получается модель в формате TensorFlow. Дальше есть несколько вариантов, как ее запускать
Первый вариант — это запускать ее там, где может запускаться сам TensorFlow. Для этого нужно скомпилировать ядро TensorFlow — это статическая библиотека примерно на 1 Гб — поставить его, куда мы хотим, и запускать.
Естественно у такого варианта есть ограничения. Например, на iOS это сложно и долго. Поэтому чаще всего существуют так называемые конвертеры, которые умеют из моделей разных learning фреймворков, не важно, будь то Caffe, Torch, TensorFlow и пр., доставать веса которые потом можно применить и использовать у себя в продакшене.
Хотя это тоже уже ушедшие реалии, но буквально полтора года назад работа таких разработчиков, как я, состояла в следующем. R&D обучили какую-то нейронку, получилась модель. Они из нее вынули веса и записали их просто в буферы из действительных чисел. Дальше отдают их разработчику (мне) и говорят: «Закодь эту нейронку!» — и ты пишешь все эти слои, потом подгружаешь к ним веса из буферов и запускаешь это все. Но саму нейронную сеть никто не переписывает на C++.
То есть это два отдельных этапа:
- Обучение, которое является абстракцией. То есть неважно, на каком фреймворке оно выполняется.
- Использование обученной модели разными способами.
Про получение датасетов
ГЛЕБ: Давайте вернемся опять к актуальным проблемам. Мы поговорили о том, что есть проблемы с данными, и начали говорить про инженеров.
СТАС: Да, расскажи как же решить проблему получения датасетов? Не будешь же ты сам сидеть и размечать миллион примеров, правильно?
АНДРЕЙ: К сожалению, это ровно так и работает. Единственное решение, и другого не существует и не будет существовать очень долго — это ручной труд. Обычно это выглядит так: есть армия фрилансеров, которым дают миллион фотографий, они визуально определяют: «Так, на этой фотографии кошка, на этой — собака», в каком-то формате это фиксируют и отдают компаниям. Существуют специальные биржи, например, Яндекс-Толока, где можно оставить задание разметить данные за какую-то плату. У Амазона тоже есть своя биржа, на которой работают в основном индусы. Это довольно большая индустрия.
Сейчас это решается только ручным трудом и вложением средств. Для того, чтобы собрать датасет, нужна приличная сумма денег, чтобы оплатить ручной труд и потом использовать размеченные данные.
СТАС: Мне вспомнилась история про Google и их капчу, где они за счет пользователей распознавали фотографии для Google Street Maps. Получается, это тоже оттуда же.
АНДРЕЙ: Да, иногда компании хитрят и как-то используют вас в качестве фрилансеров.
Про профессию Data Scientist
ГЛЕБ: А как обстоят дела с инженерами. Я хочу понять, как вообще обстоят дела с рынком — их не хватает, их слишком много, где их брать?
СТАС: Ставлю на то, что не хватает.
АНДРЕЙ: Да, есть определенная нехватка, но даже не инженеров, а, скорее data scientist’ов. Не хватает именно людей, которые могут что-то крутое делать. Сейчас это оверхайп тема. В той же ВШЭ переполнены все кафедры с машинным обучением, все им хотят заниматься, у каждого второго диплом с машинным обучением. Оно везде — даже на экономфаках уже есть!
Но не хватает именно хардкорных людей, их тут же расхватывают. Если вы показываете даже минимальные скилы, то просто сразу отъезжаете в Маунтин-Вью, потому что вас там очень ждут. Это действительно правда.
СТАС: Ты сейчас закинул еще угля в топку hype train.
АНДРЕЙ: Наверное, это рано или поздно сойдет на нет, но сейчас специальность data scientist стабильно популярна. Если вы делаете крутые штуки, то компании готовы платить крутые деньги.
ГЛЕБ: Есть некоторые стереотипы, как выглядят программисты. Есть ли какое-то отличие для data scientist’ов?
АНДРЕЙ: Я бы не сказал. Но они не такие, как мы. Программисты в основном очень дотошные, им нравится, чтобы все было по полочкам, чтобы Git-репозиторий был идеальный и все такое. Data scientist все-таки больше математик, ему главное найти решение проблемы. У них нет таких странных вещей, как code review, unit-тесты — всей этой чепухой они не занимаются. Они используют программирование только лишь как инструмент, а их основная деятельность более интеллектуальная.
СТАС: Как раз хотел сказать, что у них нет культа инструмента, как есть у многих разработчиков.
АНДРЕЙ: Да, и они меняют фреймворки чуть ли не каждую неделю, потому что как только появляется что-то новое, например, Kaffe 2, PyTorch — они это пробуют! У них нет такого: «Я Data scientist на TensorFlow».
Про GPU-инженеров
Основная проблема есть на самом деле с разработчиками типа меня. Мне кажется, что сложно найти компанию, которая была была заинтересована в разработчике, который пишет на Swift, но при этом занимается не UI-kit, а хардкорными штуками. Честно говоря, даже с ходу не знаю, кто такие вакансии может в принципе иметь.
Понятное дело, что это какие-то технологические стартапы, но стартапы не могут взять всех. В этом смысле я очень дорожу своей работой, пусть она иногда и не такая выгодная. Есть мало инженеров, которые это умеют, но и востребованность очень маленькая. Поэтому есть компромисс между интересными проектами и работой на enterprise.
Если вам интересно работать над чем-то уникальным, более сложным, чем верстка экранов и прочее, то стоит однозначно искать такие вакансии. Думаю, с годами их будет появляться больше, потому что рынок растет. Но я пока слабо представляю, куда можно устроиться.
АНДРЕЙ: Я в этом смысле прямо очень ей дорожу, потому что такую работу довольно сложно найти. Просто обычно GPU разработка нужна все-таки в основном игровым компаниям. Чтобы ты был относительно классическим разработчиком, но занимался хардкорными вещами — в этом смысле рынок труда очень маленький и узкий. Я не думаю, что можно сходу устроиться на Junior GPU инженером или стажером. Нужно сначала самому разобраться, набраться опыта, и приходить уже в компанию готовым решать задачи самостоятельно.
Про железки
СТАС: К железкам пора — к нехватке железок.
ГЛЕБ: Потому что все разобрали на биткоины, ты хочешь сказать?
АНДРЕЙ: Да, Сбертех недавно заявили, что весь дефицит на рынке видеокарт был из-за них.
ГЛЕБ: А зачем им — для машинного обучения или для майнинга?
АНДРЕЙ: Не возьмусь точно сказать, но, по-моему, все-таки для обучения.
ГЛЕБ: А вообще есть проблема, что не все могут себе позволить необходимое оборудование?
АНДРЕЙ: Обычно это никто не делает дома. Чаще всего это арендованный сервер, скажем, на Амазоне, у которого есть эластичная оплата в зависимости от того, как много ресурсов вы используете. В реальности вы можете заниматься машинным обучением хоть с Macbook Air. То есть вы просто через терминал запускаете расчет на сервере — где-то далеко на горячих видеокартах он считается, а потом вы скачиваете результат, и все.
В реальности никто на ноутбуках ничего не учит, и ни у кого дома Nvidia Titan тоже не стоит, потому что это невыгодно. Каждый год выходят новые видеокарты, в основном все на серверах.
Про тестирование
ГЛЕБ: Как обстоят дела с тестированием? У меня есть друг, который работает в Nvidia и занимается тестированием производительности программ, которые обучают сети. Это все, что я слышал про тестирование, связанное с машинным обучением. Какие процессы в этом смысле есть?
АНДРЕЙ: На самом деле сейчас это по большей части выглядит как аналог дебага с помощью многих print из нашего мира, то есть когда ты несколько вручную это делаешь. Но недавно была конференция NIPS, на которой рассказали, что в Стэнфорде ребята разработали хранилище нейронок и моделей, которые считывают метрики из нескольких разных итераций и вариаций. Их можно сравнивать, смотреть, как и что меняется. То есть сейчас что-то есть, но инфраструктура пока несколько сырая — очень много разнородных инструментов, которые плохо друг с другом работают.
Но есть подвижки. Сейчас запускается стандарт ONNX для описания нейронных сетей в унифицированном стиле, который принимается уже многими компаниями. Но все равно инфраструктура сырая. Насколько могу судить, очень многое пока делается вручную. То есть чтобы протестировать, нужно запустить и посмотреть, работает или нет. Понятное дело, что можно считать какие-то метрики, но иногда есть и субъективное тестирование на глаз. Оно до сих пор имеет место быть.
Про бенчмарки
СТАС: Я подумал о том, какие можно применять бенчмарки. Я правильно понимаю, что когда обучаешь модель на конкретном датасете и на конкретном железе, можно судить о том, сколько времени она будет гоняться?
АНДРЕЙ: Нет, датасет вообще ни на что не влияет. И не обученная, и обученная модель будет работать одно количество времени. Обученная модель отличается от необученной только циферками внутри, но количество циферок одинаковое. Если конкретно оперировать в терминах нейронных сетей, то скорость напрямую зависит от толщины модели — как много слоев, насколько толстые эти слои и т.д.
Есть легковесные нейронки, которые запоминают не так много параметров. Есть тяжеловесные, которые запоминают их больше. Это всегда компромисс — нет такого, что ты берешь в два раза больше слоев, и у тебя результат в два раза лучше. Это нелинейная корреляция. Всегда нужно находить компромисс, чтобы для одного набора данных сеть получилась не слишком тонкой, выучила довольно много критериев и обучилась правильно. Но при этом она не должна быть излишне толстой, потому что количество данных все равно недостаточно для того, чтобы все задействовать.
Про reinforcement training и игру в го
ГЛЕБ: Мы сейчас говорили о самых общих аспектах машинного обучения. Но есть, особенно последние пару лет, прорывные штуки, например, AlphaGo. Я думал, что это глубокое обучение, но как выясняется, правильно называть это reinforcement training.
АНДРЕЙ: Reinforcement training — обучение с подкреплением. Это такой вид обучения, который работает несколько иначе. Допустим, вы обучаете модель, например, искать выход из лабиринта или играть в шашки. Вы берете свой алгоритм, свою структуру и кладете в эту среду и предопределяете набор действий, которые в этой среде можно совершить. Модель перебирает варианты, условно пытаясь пойти влево или вправо. Reinforcement training заключается в том, что каждый раз, когда машина выполняет действие, вы ее либо бьете по рукам, либо говорите: «Все норм!»
Действительно, был алгоритм AlphaGo — кто не знает, есть такая игра го. Долгое время го была единственной игрой, в которой машина не могла обыграть человека. Там настолько много комбинаций, что чтобы все их просчитать, требуется очень много времени. Человек в прямом смысле этого слова не занимается перебором вариантов, поэтому может справиться с поиском ходов быстрее. Алгоритм AlphaGo на основе нейронной сети, обученной с помощью reinforcement training, стал первым алгоритмом, который смог обыграть профессионального игрока в го.
Конечно, обучение с подкреплением развивается не чтобы машина могла выиграть в го, есть более важные кейсы, и это трендовая тема в машинном обучении, которая сейчас активно развивается.
ГЛЕБ: Если я ничего не путаю, в го порядка 10170 комбинаций — это астрономические цифры. Я следил, когда был самый первый матч AlphaGo против Ли Седоля. Это был не самый крутой игрок в мире, но один из сильнейших. Когда его обыграли, все сообщество, конечно, поникло. Было ощущение — черт побери, все-таки добрались они до нас!
Когда играли во второй раз через год, программа стала совсем ненормальная, она обучалась сама с собой без исходных данных уже, совсем без начального обучения. К тому же она стала во много раз мощнее первой, и сейчас может выполняться на одном компьютере, а раньше требовалась распределенная сеть из машин. Короче, нас окончательно победили!
Про генетические алгоритмы
СТАС: Хочу спросить про генетические алгоритмы. По описанию кажется, что генетические алгоритмы тоже можно отнести к обучению с подкреплением. Как я себе их представляю — есть какое-то поколение, мы берем каждый отдельный субъект в поколении, он выполняет какую-то задачу, мы даем оценку его действиям, и потом, исходя из этих оценок, отбираем лучших. Потом мы скрещиваем их определенные свойства, создаем новое поколение, добавляем немножко мутации, и вот у нас появилось новое поколение. И повторяем эти операции, пытаясь увеличить финальную полезность у каждого конкретного члена этого поколения. Кажется, что это похоже по смыслу. Это считается reinforcement training или нет?
АНДРЕЙ: Нет, генетические алгоритмы — это все-таки несколько иное.
СТАС: Они относятся к машинному обучению?
АНДРЕЙ: Я бы так не сказал. Не возьмусь сейчас утверждать, но генетические алгоритмы мы проходили в университете, как и все, и мне кажется, что это вещь несколько более простая и более нерегламентированная что ли — короче, императивная. То есть заранее известно, что какой будет input, такой будет output. В машинном обучении все-таки несколько иначе обстоят дела — есть какая-то вероятность, точность предсказаний и все в этом духе.
Возможно, меня поправят люди, которые в терминологии разбираются лучше, чем я, но from top of my head я бы сказал, что нет.
СТАС: Получается, что генетические алгоритмы для решения большинства реальных задач не используются?
АНДРЕЙ: Да, они в основном более алгоритмические и я в практике крайне редко с ними встречался.
Про капсульные сети
ГЛЕБ: Есть еще одно подмножество машинного обучения — так называемые капсульные сети. Опять, не будем слишком углубляться. Расскажи буквально в двух словах, что это такое и почему сейчас есть этот тренд?
АНДРЕЙ: Это прямо супер новая тема, ей всего несколько месяцев. Джеффри Хинтон выпустил статью и сказал, что текущие сверточные сети — это путь в никуда, и мы предлагаем новое видение того, как это будет развиваться. Сообщество это заявление приняло неоднозначно и разделилось на два лагеря: одни говорят, что это оверхайп, другие — big thing и все такое.
Но если прямо совсем на пальцах объяснить, то как работают сверточные сети? Возьмем, к примеру, нейронки, которые работают с изображениями. Есть свертка — столбик из матриц, который пробегает по картинке с некоторым шагом, как бы сканируя ее. На каждой итерации такого шажка вся эта свертка применяется к этому кусочку, и каждая свертка превращается в новый условный пиксель, но гораздо большей размерности, эта операция повторяется для все сетки.
Но проблема со сверточными сетями такова, что все данные, которые приходят на первый слой, доходят до самого конца — может быть, не в полном объеме, но они все влияют и все доходят до финального этапа. Грубо говоря, если нужно определить какую-то часть изображения, например, одного котика, не требуется сканировать все изображение. Достаточно в какой-то момент локализовать зону, где, скорее всего, расположен котик, и рассматривать только ее, как это делает человек.
Именно так работают капсульные сети. Не возьмусь экспертно объяснять их внутренности, но из того, что я понял: внутри капсульных сетей существуют определенные деревья, и каждая последующая капсула принимает на вход только релевантные ей данные. То есть сквозь них не проходит все-все-все, что мы изначально приняли на вход, а с каждым новым слоем (не знаю, как это в терминологии капсульных сетей можно говорить) обрабатываются лишь те данные, которые действительно нужны — только важные кусочки данных. В этом ключевое отличие между сверточными и капсульными сетями.
ГЛЕБ: Звучит интересно, только я не совсем понимаю — это только про изображения идет речь?
АНДРЕЙ: Нет, это про все. Я использовал изображения просто для того, чтобы объяснить. Ключевая идея такая: давайте не будем гонять все данные и все фичи, а только те, которые релевантны к следующему слою.
Еще про игры
СТАС: Слышал о том, что после AlphaGo ребята собираются победить всех в StarCraft?
АНДРЕЙ: Вынужден тебя разочаровать, но я не очень за этим слежу. Мне не то, чтобы был интересен киберспорт, но уже становится понятно, что за этим будущее. Например, уже есть стартапы, которые обучают играть в Доту. Они, как личный тренер, анализируют то, как ты играешь, и говорят, где ты недостаточно хорош, у них есть свои обученные на киберспортивных матчах данные. Есть стартапы для ставок, которые предсказывают, кто победит, и прочее.
В этой сфере сейчас работает много людей в первую очередь потому, что в ней вертится много денег. Но лично мне это просто абсолютно неинтересно, поэтому я за новостями и трендами не слежу, к сожалению.
СТАС: Как ты думаешь, в чем сложность создания хорошего искусственного интеллекта именно для стратегических игр? Я правильно понимаю, что в основном это очень большое количество вариантов?
АНДРЕЙ: Да. На самом деле мы уже обсуждали этот момент, когда я объяснял, что в AAA играх искусственный интеллект до сих пор не применяется, но при этом он есть в AlphaGo и, возможно, где-то еще.
Игра го при всей своей сложности состоит в том, что ты на каждом шаге просто кладешь фишку для того, чтобы очертить камень, а игра StarCraft — это очень комплексная вещь. Там ты можешь своих юнитов послать по фактически неограниченному количеству траекторий, возвести разные наборы своих построений и пр. Все это является параметрами.
Плюс сложность заключается в том, что нейронные сети не всегда мыслят, как человек. Когда мы, например, строим юнит, мы это запоминаем. Но многие нейронки запускаются каждый раз. Конечно, есть рекурсивные сети, которые умеют запоминать прошлые свои достижения. Они, в частности, используются для перевода и текстовой информации, когда по мере того, как предложение генерируется, нейронка использует все больше данных.
Тут существуют огромные сложности c тем, что весь объем информации и вариантов нужно формализовать, то есть найти такой датасет для обучения, чтобы это все еще как-то адекватно реагировало на поступки вашего противника, которых тоже может быть миллион, в отличие от игры в го или в шахматы.
СТАС: Понятно — очень много параметров.
ГЛЕБ: А я вот что не понимаю, понятно, что в Доте меньше параметров, но это все равно примерно то же самое в том смысле, что куда угодно послали и т.д.
СТАС: Тут Андрей свел к тому, что, во-первых, у тебя юнит один и количество вариантов намного меньше.
АНДРЕЙ: Если честно, я во вторую Доту вообще ни разу в жизни не играл, но в оригинале, насколько я знаю, это супер детерминированная игра. Там есть 3 коридора и башни, которые нужно разрушать.
ГЛЕБ: Да, но в StarCraft, хотя я вообще не играю, тоже есть какие-то пути и те же самые юниты. Ты говоришь, что их много, но, скорее всего, их всегда водят пачками. То есть примерно то же самое получается.
СТАС: Тебе еще нужно во время боя правильно расставить каждый юнит отдельно. В тот момент, когда их не пачкой водят, а начинают расставлять, параметров сразу больше становится.
АНДРЕЙ: Ваша проблема в том, что вы мыслите такими категориями: поставить юнит и т.д., но все время забываете, что нейронка — это просто матрица — числа, которые перемножаются. Там вы должны формализовать, например, такие вещи, как задачи. Скажем, есть карта для StarCraft и есть какая-то задача на ней — не важно, победить игрока или что-то еще. Все это нужно представить в виде математических примитивов, и именно это самое сложное.
Если бы это действительно был искусственный интеллект, пропасть между Дотой и StarCraft была бы минимальной. StarCraft, может быть, чуть сложнее по механике, но все равно примерно то же самое. Но в силу того, что мы оперируем числами, то формализовывать это сложнее.
Про взаимообучение сетей
СТАС: У меня последний вопрос, который хочется задать перед тем, как мы пойдем в родную мобилку. Я не знаю, как это правильно называется, но есть способ, когда одна нейронная сеть по сути следит за другой и пытается найти закономерности.
АНДРЕЙ: Не возьмусь объяснять сейчас, как это работает, но я точно знаю, что существуют суперкрутые алгоритмы, о которых я слышу иногда на работе, когда две нейронные сети учатся за счет друг друга. Эта зона экспертизы мне уже совершенно недоступна, но звучит это все прикольно. Насколько я знаю, это используется для генеративных сетей. Большего, к сожалению, я не могу сказать.
СТАС: Хорошо. Ты самые главные ключевые слова дал, остальное Глеб и читатели легко нагуглят.
Про мобилки (Apple)
ГЛЕБ: Давайте перейдем к мобилкам, к которым мы уже давно идем. Во-первых, что мы уже можем, говоря про машинное обучение, делать на мобильных устройствах?
АНДРЕЙ: У вас, кстати, подкаст для iOS разработчиков?
ГЛЕБ: Мы не iOS’ный подкаст. Да, Стас?
СТАС: Да, для мобильных разработчиков. К чему вопрос?
АНДРЕЙ: К тому, что просто ситуация очень разнится. Компания Apple в силу того, что у нее всегда было хорошо с интеграцией софта и железа, и она славится этим, очень элегантно подсела на hype train с машинным обучением.
В 2014 году Apple представила графический API Metal. В нем были вшиты такие вещи, как, например, компьютшейдеры и пр. Все это позволило с приходом iOS 10 включить во фреймворк Metal Performance Shaders очень много слоев, активаций и других операторов из нейронных сетей, в частности, convolutional neural networks.
Это дало просто огромнейший буст, потому что, как правило, расчеты на видеокарте в разы быстрее, чем на центральном процессоре. Когда Apple дали возможность считать на мобильных видеокартах, причем быстро, не нужно стало писать свои математические операторы и прочее. Это прямо очень сильно выстрелило. А годом позже они выпустили CoreML (мы поговорим о нем чуть позже).
У Apple был очень удачный фундамент. Уж не знаю, было ли у них такое видение, или так совпало, но они сейчас объективно лидеры в индустрии машинного обучения на мобильных устройствах.
Про мобилки (Android)
То, что работает относительно круто и здорово в реалтайме на iOS, к сожалению, не работает так же круто на Android. Это связано не только с тем, что Android — отстой. Есть еще другие факторы — в первую очередь то, что у Android очень разноплановая инфраструктура: есть слабые девайсы, есть сильные — под все не подгонишь.
Если на всех iOS устройствах поддерживается Metal, то на Android уже сложнее — где-то поддерживается OpenGL одной версии, где-то другой, где-то не поддерживается вовсе. Где-то есть Vulkan, где-то его нет. У всех производителей свои драйвера, которые, понятное дело, никак не оптимизированы, а просто минимально поддерживают стандарт. Бывает даже такое, что вы запускаете на Android на GPU какие-то нейронные сети, а они работают по скорости так же, как на CPU, потому что работа с общей памятью организована очень неэффективно и все такое.
На Android сейчас дела плохи. Это, скорее, удивительно, потому что Google является одним из лидеров, но немножко в этом плане проседает. На Android есть прямо нехватка качественно реализации возможностей современного машинного обучения.
У нас, например, даже в приложении не все фичи работают одинаково. То, что на iOS работает быстро, на Android работает помедленнее даже на сравнимых по мощности флагманских устройствах. В этом смысле на данный момент Android как платформа проседает.
Про CoreML
СТАС: Раз сказали про CoreML, наверное, правильно было бы сказать и про TensorFlow Lite.
АНДРЕЙ: CoreML, на самом деле, — темная лошадка. Когда он вышел в прошлом году, все сначала сказали: «Вау, круто!» Но потом стало понятно, что это просто небольшая обертка над Metal. У компаний, которые всерьез занимаются машинным обучением, в том числе, нашей, уже давно были свои решения. Например, наши решения в тестах показывали результаты лучше, чем CoreML и по скорости, и по другим параметрам.
Но главная проблема CoreML была в том, что его нельзя было кастомизировать. Иногда бывает такое, что нужен сложный слой в нейронной сети, которого нет, например, в Metal, и его нужно написать самому. В CoreML не было возможности встроить свои слои, и поэтому приходилось делать downgrade до Metal на нижний уровень и писать все самим.
Недавно в CoreML это добавили, и теперь этот фреймворк стал более интересен. Если вы — разработчик, у которого вообще в компании или в приложении пока что нет ничего, связанного с машинным обучением, вы можете прямо в две строчки запустить какую-то нейронку и быстро прогнать ее на GPU. Результаты, которые показывают performance-тесты для CoreML, сравнимы с кастомными решениями и голым Metal.
То есть работает CoreML достаточно хорошо. Он немножко сыроватый, в нем есть баги, но с каждым месяцем становится лучше. Apple активно выкатывает апдейты — не так, как мы привыкли, что апдейты фреймворков от Apple выходят раз в год или на полумажорных версиях iOS. CoreML активно обновляется, в этом смысле все здорово.
TensorFlow Lite предоставляют конвертор в CoreML, CatBoost тоже поддерживает конвертор в CoreML. Короче, Apple все опять сделали, как надо. Они выпустили опенсорсный конвертор и сказали: «Давайте-ка вы все напишите конверторы в CoreML» — и многие learning фреймворки это поддержали.
Сначала был некоторый скепсис насчет CoreML, на прошлой WWDC самый частый вопрос разработчикам CoreML был: «Почему вы не позволяете скачивать модели из интернета? Почему не позволяете их шифровать?» Можно было эти модели достать, и, получается, украсть интеллектуальную собственность.
Сейчас это все починили, добавили функциональности, и на текущий момент CoreML — точно лидирующая платформа в этом смысле.
СТАС: Можешь про это поподробнее. Получается, что сейчас можно уже не хранить модель, а просто загружать ее откуда-то?
АНДРЕЙ: Да, уже можно. Раньше, когда мы спрашивали об этом, разработчики улыбались и говорили: «Просто посмотрите хэдеры». Там действительно были конструкторы, которым можно передать файлы и все соберется.
Но модели CoreML внутри сделаны довольно интересно. Они на самом деле являются обычными бинарниками, которые хранят веса, но плюс к ним генерируются swift-файлы, которые потом создают неявные классы. Эти классы вы используете у себя в приложении, и компиляторы эту модель компилируют в какие-то файлы.
Сейчас, используя определенные хаки и подходы, можно сделать так, что эта модель станет портируемой. Вы можете и защитить свою интеллектуальную собственность путем шифрования, и облегчить вес приложения.
В общем, сейчас CoreML движется в правильную сторону. Не все можно сделать законно с точки зрения App Review, не все можно сделать легко, без хаков, но заметно, как разработчики улучшают фреймворк.
СТАС: Круто! Хотел добавить, что CoreML выглядит типовым решением. Условно говоря, он удобен, когда ты хочешь что-нибудь простенькое сделать с использованием машинного обучениея у себя в приложении. Кажется, что если это типовая задача, то Apple постарался сделать максимально простым весь этот путь, если ты найдешь готовую модель, датасет и прочее. Это как раз история про типовую задачу, потому что для них, наверное, уже все готово.
АНДРЕЙ: Для типовых задач это вообще супер! Без гипербол — там действительно нужны две строчки кода для того, чтобы запустить модель. В этом смысле — да, это очень здорово, особенно для инди-разработчиков или компаний, которые не имеют в штате отдел R&D, но хотят тоже добавить что-то прикольное.
Но это не так интересно, потому что типовые задачи были решены на Github и с Metal — можно было просто скопировать этот код себе и наколхозить — пусть, чуть сложнее.
Важно, что сейчас этот фреймворк движется не только в сторону классических повседневных задач, но и в сторону комплексных решений. Это действительно круто!
Про обучение на мобилках
ГЛЕБ: Ты говоришь, что после появления Metal стало возможно обучать модели на мобилках?
АНДРЕЙ: Нет, обучать на мобилках никогда нельзя было. Это не имеет смысла, можно только запускать. Если я так и сказал, то оговорился. На мобилках, конечно, никто ничего не обучает.
СТАС: Я тоже ничего не слышал про обучение на мобилке.
ГЛЕБ: Я тоже не слышал, но я об этом думал. Конечно, интуитивно кажется, что это странная штука. Но точно нет интересных задач, когда это было бы актуально?
АНДРЕЙ: Сложно представить их. Если есть что-то такое, то только распределенное обучение. Есть даже научные статьи про то, как это делать, но я так понимаю, что вы спрашиваете, как обучиться на данных, собранных на этом же телефоне? Просто даже если вы столько соберете (чего не случится), обучаться это будет так долго, что никогда не закончится, и никто не будет портировать код для обучения на мобильные платформы, потому что зачем? Обучение всегда происходит на серверах, а inference — на устройствах.
СТАС: Но в конечном счете все-таки получается так. Если ты — компания, хочешь иметь что-то подобное, тебе нужны данные, и ты можешь их собрать у своих пользователей, то есть периодически их себе подгружать.
АНДРЕЙ: Да, но это работает несколько иначе. Ты собираешь в одно место к себе на горячий сервер данные со всех пользователей, там обучаешь, потом обратно высылаешь готовую модельку. Но не так, чтобы каждый у себя что-то обучил.
СТАС: С другой стороны, мобилка бы грелась — и зимой было бы актуально, но уж очень, наверное, долго.
Про мобилки и будущее
ГЛЕБ: Есть ли еще интересные вещи с точки зрения применения машинного обучения к мобильным устройствам? Мы поговорили о том, что у нас уже есть сейчас. Интересно было бы заглянуть немножко в будущее — чтобы мы вообще хотели получить на наших мобильных платформах для каких-то суперпродуктов, суперрешений.
АНДРЕЙ: Сейчас, как ни странно, бутылочным горлышком является performance — потому что многое, что мы хотим запускать, айфоны не тянут. Конечно, нужно подождать еще какое-то время, когда станет можно запускать более сложные задачи.
Есть некоторые проблемы с реалтаймом. Например, даже в нашем флагманском приложении видео стримить со style-трансфером не со всеми стилями получается, потому что это слишком долго и трудозатратно. Есть узкие места связанные именно с уровнем развития железа.
На самом деле CoreML очень сильно развивается. В будущем, я думаю, что с ним будет все хорошо. Больше всего хочется, чтобы индустрия уже успокоилась, начала происходить стандартизация: побольше общих форматов, конвертеров, конвенций — побольше вещей, которые работают одинаково хорошо и на Android, и на iOS, потому что для бизнеса это очень важно. У нас часто бывает такое, что мы не можем интегрировать крутую фичу только потому, что не можем выкатить ее только на iOS или только на Android.
Было бы здорово, всем было бы на руку, если бы началась активная, здоровая конкуренция, чтобы везде это здорово работало — и на Android, и на iOS, чтобы уже Github перестало лихорадить от бесконечных фреймворков для обучения. Сейчас это какое-то мракобесие — даже у Uber есть свой фреймворк, который называется Horovod. У Apple есть свой фреймворк — просто у всех есть свой фреймворк, у некоторых их несколько. Мне кажется, это все увеличивает порог входа, сложность конвертации, в том числе, на мобилку — поэтому в будущем хочется стабильного улучшения и развития всего подряд.
Думаю, что революции в ближайшее время не будет. Я не эксперт, и, возможно, не имею права такое говорить — но из того, что я вижу, пока не предвидится чего-то супернового. Хочется просто стабильного улучшения того, что есть сейчас.
Про обучение машинному обучению
ГЛЕБ: Что ты посоветуешь людям, которые не особо в теме, но хотят попробовать? Что почитать, посмотреть, как вообще в эту тему входить? Стас уже рассказывал про курсы от Яндекса и МФТИ.
АНДРЕЙ: Если бы вы спросили моих напарников, они бы вам ответили — читай Бишопа (M. Bishop. Pattern Recognition and Machine Learning. Christopher. Springer. 2006), еще какие-нибудь сложные книжки. Но в силу того, что у меня есть математический бэкграунд, я долго работал с 3D графикой, где тоже много линейной алгебры, я более-менее подкован. Все равно это довольно комплексный подход. Вам очень повезло, если вы это проходите в университете — ходите на эти пары, слушайте — и не пожалеете об этом.
Но если так сложилось, что этот момент уже упущен, или вы поступили на другую кафедру или факультет, то однозначно советую самообучение. Уже есть курсы, которые стали стандартом де-факто, например, курсы по машинному обучению от Andrew Ng на Coursera. Нет даже смысла ссылку на него давать, потому что он первый везде во всех списках.
Однозначно надо пройти несколько таких курсов, чтобы понять, как это работает внутри хотя бы на уровне ощущений, чтобы попробовать покодить свои простенькие модельки — начать хотя бы с распознавания букв на датасете от MNIST. Это как Hello World, только в мире машинного обучения.
Наверное, это не та сфера, где можно создать проект, войти, что-то там потыкать и посмотреть, что будет. Тут надо все-таки более фундаментально подойти, освоить набор знаний, который необходим для фундамента, и потом уже наращивать экспертизу.
СТАС: А после курсов?
АНДРЕЙ: После курсов есть advanced-курсы от Andrew Ng! Есть, например, портал Kaggle, где происходят соревнования, в которых можно поучаствовать и попробовать пообучать. Когда вы уже немного подкованы и можете обучить классические архитектуры, с этого момента приходится читать уже полунаучные или научные статьи, разбираться в тонкостях — если вы видите себя именно в роли Data Scientist.
Если вы — мобильный разработчик, который хочет к этому прикоснуться, наверное, этого уровня вам будет достаточно. Я примерно на этом уровне освоил, и дальше не лезу — у меня нет нужды лезть в сам R&D процесс. Я занимаюсь именно делами, которыми занимается разработчик. Но при этом все равно мне был необходим бэкграунд. На первых порах и команда меня обучала, проводили семинары с основами для программистов, чтобы мы быстро вникли.
Но набрать минимальный уровень знаний довольно просто. Нужно пройти несколько курсов, попробовать себя на Kaggle, еще что-то поделать — и вы уже в принципе будете готовы решать 90% существующих задач.
Итоги
ГЛЕБ: Давайте тогда черту подводить. Мне кажется, мы довольно лаконично и при этом четко и интересно обсудили то, что есть вокруг машинного обучения, по крайней мере, до чего у нас дотянулись наши программистские ручки.
- Мы узнали, что машинное обучение — это просто перемножение матриц. Конечно, не совсем так, но да — это математическая модель без магии внутри.
- Мы вспомнили про всякие модные штуки типа глубокого обучения.
- Обсудили более современные техники вроде обучения с подкреплением.
- Чуть-чуть поговорили про капсульные сети.
- Обсудили, какие есть актуальные проблемы машинного обучения, а именно, что очень важно добыть данные для хорошего обучения.
- Немножко поговорили про рынок и о том, что инженеров мало. Спрос, правда, тоже не очень большой, но все-таки в Маунтин-Вью ждут!
- В итоге мы скатились до нашей любимой темы — мобильная разработка, и узнали о том, что CoreML — это здорово, он очень быстро развивается.
Большое спасибо Андрею Володину за то, что нам рассказал это все.
Кстати, Андрей планирует сделать подробный доклад в продолжение этой темы на AppsConf 2018, которая пройдет 8 и 9 октября в Москве.
Программный комитет уже получил более 80 заявок, но Call for Papers еще открыт — подавайте заявки до 3 августа. Напомню, мы ждем хардкорные, прикладные и местами хайповые доклады и проводим жесткий отбор.