Машинное обучение и мобильная разработка
Как правило, data scientist имеет смутное представление о мобильной разработке, а разработчики мобильных приложений не занимаются машинным обучением. Андрей Володин — инженер Prisma AI живет на стыке этих двух миров и рассказал ведущим подкаста Podlodka, каково это.
Воспользовавшись моментом, Стас Цыганов (Туту.ру) и Глеб Новик (Тинькофф Банк), во-первых, раз и навсегда прояснили, что никто не обучает нейронные сети на мобильных устройствах. А также разобрались, что в машинном обучении, к сожалению, нет маги; обсудили современные техники вроде глубокого обучения, обучения с подкреплением и капсульных сетей.
В итоге, поскольку Podlodka — аудиошоу про мобильную разработку, к ней и пришли и узнали, как это все работает для мобильных устройств.
Далее текстовая версия этой беседы, а запись подкаста здесь.
ГЛЕБ: Расскажи, пожалуйста, нам немножко о себе. Чем ты занимаешься?
АНДРЕЙ: Я мобильный разработчик, но очень мало занимаюсь классической 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 — это та часть машинного обучения, которую принято относить к нейронным сетям. Глубоким оно называется потому, что в нейронных сетях есть много слоёв, и чем больше слоев, тем глубже получается нейронная сеть. От этого появилось название.
Но существуют и другие виды машинного обучения. Например, машинное обучение, построенное на деревьях, успешно применяется для face tracking до сих пор, потому что это гораздо быстрее, чем нейронки. Оно также используется для ранжирования, показа рекламы и прочего.
То есть глубокое обучение — это не что-то другое. На самом деле это подмножество машинного обучения, которое включает в себя кучу всего. Просто deep learning стал сегодня самым популярным.
СТАС: Я хотел поговорить немножко про теорию нейронных сетей, постараюсь попроще. Ты сказал, что в них много слоев. По идее, если у нас есть один слой, и есть какие-то объекты, расположенные на плоскости, при помощи одного слоя мы фактически можем разделить эту плоскость на две части, правильно?
АНДРЕЙ: Нет, не совсем.
СТАС: Что нам дает большое количество слоев, если на пальцах?
АНДРЕЙ: Что такое нейронная сеть? Давай прямо разложим. Это просто математическая функция, которая на вход принимает набор чисел, а на выход тоже дает набор чисел — все.
Что внутри? Сейчас популярнее всего сверточные сети, внутри которых происходит convolution — просто очень много умножений матриц друг на друга, результаты складываются, эти операции выполняются в каждом слое. Плюс между слоями существует так называемая активация, которая как раз позволяет нейронным сетям быть глубокими.
Поскольку комбинация из линейных преобразований — это линейное преобразование, то сделав 10 линейных слоев, их можно все равно представить, как один линейный слой. Для того, чтобы слои не схлопывались, между ними существуют определенные математические действия, которые делают функцию нелинейной. Это нужно для того, чтобы увеличивать количество параметров.
Грубо говоря, нейронная сеть — это просто огромный массив чисел, которые потом как-то применяются к нашим данным, например, к картинке. Но картинка — тоже набор чисел на самом деле — это просто череда пикселей. Когда мы обучаем сеть, мы рассматриваем, например, 15 млн параметров (каждое число — это отдельный параметр), которые можно немножко с помощью некоторых эвристик сдвигать чуть влево, чуть вправо. Благодаря такому огромному количеству параметров получаются такие крутые результаты.
Глубокое обучение нужно именно для того, чтобы этих параметров было много, и все не схлопывалось до одного слоя.
ГЛЕБ: Кажется, что более-менее понятно.
АНДРЕЙ: Глубокое обучение — это подмножество машинного обучения. Но почему-то на эту тему поднялся хайп — особенно какое-то время назад из всех щелей, мне кажется, можно было услышать про deep learning. Не знаю, обосновано это или нет.
ГЛЕБ: Я думаю, что такая популярность вызвана тем, что оно дает впечатляющие результаты.
СТАС: При помощи нейронных сетей можно решать большинство задач машинного обучения, правильно?
АНДРЕЙ: Да.
СТАС: Давай тогда проговорим, какие задачи могут быть решены при помощи методов машинного обучения?
АНДРЕЙ: На самом деле, это щепетильная тема, потому что в реальности нужно перестать идеализировать и романтизировать то, что происходит. Как я уже сказал, там нет никакого искусственного интеллекта. Это чисто математическая модель и математическая функция, которая что-то перемножает и т.д.
Со стороны кажется, что сейчас машинное обучение немножко забуксовало на определенных категориях задач. Это, например, классификация (пример, о котором мы говорили в самом начале), трекинг объектов и их сегментация. Последнее есть в нашем приложении Sticky AI — оно выделяет человека, а фон убирает. Также есть биологическая медицинская сегментация, когда, например, определяются раковые клетки. Есть генеративные сети, которые учатся на наборе случайных чисел, и потом могут создавать что-то новое. Есть задачи Style Transfer и прочие.
Но на данный момент нет удобной площадки и инфраструктуры для использования машинного обучения. Например, у вас есть какая-то задача, которую вы, как человек, решаете легко, а как программист, вы не можете ее решить в силу комплексности и потому, что нельзя просто написать императивный алгоритм. Но при этом обучить нейронную сеть тоже не представляется возможным в первую очередь потому, что есть проблема с нехваткой данных. Для того, чтобы обучить нейронку, нужны большие датасеты с множеством примеров, к тому же очень сильно формализованных, описанных в определенном регламенте и т.д. Плюс нужна архитектура этой нейронной сети.
То есть сначала нужно формализовать входные данные в виде чисел, сделать саму архитектуру модели, потом формализовать выходные данные в виде чисел, как-то их интерпретировать. Для этого нужен довольно мощный математический аппарат и вообще понимание того, как все работает. Поэтому сейчас применение нейронок, как мне кажется, вне специализированных компаний типа нашей немножко проседает.
Какие-то задачи, которые раньше не решались, нейронки научились решать очень круто. Но нет такого, что нейронки пришли и решили весь спектр нерешенных задач.
ГЛЕБ: В каких областях ты видишь глобальные задачи, для решения которых нейронные сети вообще не подходят?
АНДРЕЙ: С ходу сложно ответить. Нам встречаются задачи, над которыми мы работаем и на которых не получается обучить нейронную сеть. Например, сейчас игровая индустрия очень интересуется обучением, и даже есть какие-то нейронки, которые имеют искусственный интеллект. Но, например, в AAA играх это пока не используется, потому что все равно на данный момент нельзя обучить искусственный интеллект абстрактного солдата вести себя как человек, чтобы это выглядело естественно. Сложно.
СТАС: Ты слышал, что искусственный интеллект уже побеждает в Доте?
АНДРЕЙ: Да, но это все равно несколько иное. Дота — это довольно математическая игра, ее можно описать. Никого не хочу обидеть, но это фактически, как шашки — игра в одно и то же. Там есть определенные правила, и вы просто по ним играете.
Но при этом пока есть сложности, чтобы создать какое-то естественное поведение, связанные прежде всего с малым количеством данных и малым количеством инженеров, которые умеют это делать.
Например, в Google инженеры пытаются при помощи нейронных сетей обучить ходить 3D модель человека — просто чтобы она передвигалась. Это выглядит всегда ужасно, люди так не ходят.
СТАС: Ты сказал, что сейчас по сути нет, легкого и дешевого способа, не разбираясь вообще в машинном обучении, решать задачи машинного обучения. В любом случае получается, что в этом надо шарить. Хотел бы узнать по поводу TensorFlow. Кажется, что Google пытается сделать так, чтобы даже люди, которые не очень в этом всем разбираются и у которых не очень большой бэкграунд, могли решать какие-то простейшие задачи. Расскажи, что такое TensorFlow и как ты думаешь, возможно ли такое?
АНДРЕЙ: Давай по порядку. TensorFlow — это на самом деле не самая простая вещь из всех. Это один из самых популярных так называемых learning фреймворков — фреймворк для обучения общего назначения, не обязательно нейронок. Это не самый высокоуровневый фреймворк из существующих. Есть, например, Keras, который является более высокоуровневой абстракцией на TensorFlow. Там можно гораздо меньшим количеством кода сделать то же самое.
Типовые задачи решаются довольно просто, потому что, в частности, Github уже полон примерами и репозиториями. Скажем, если ваша компания делает поиск по картинкам для книжного магазина, то у вас, в принципе, все хорошо. Вы заходите на Github, там есть примеры, как можно взять фичи картинки, вы пишите поиск по фичам — все готово!
На самом деле так обстоит дело с большим количеством задач. Если вы можете переложить свои проблемы на уже решенные или около того задачи в машинном обучении типовыми способами, тогда у вас все круто. Но если у вас что-то прямо уникальное, такое, что нельзя закодить, и при этом нужно нечто, что принято называть искусственным интеллектом, то я бы не сказал, что TensorFlow — это самый простой путь. Чтобы в нем разобраться, нужно потратить приличное количество времени.
СТАС: Я так понимаю, на стороне Google играет то, что они предлагают вместе с фреймворком и мощности?
АНДРЕЙ: Да, они очень сильно сейчас активно развивают, и вообще стремятся, чтобы в сообществе все друг с другом шарили нейронки. У них есть платформа, на которой, если вы готовы делиться своими результатами, они будут давать вам сервера и прочее. Единственное условие, что вы должны поделиться этим со всеми, то есть платформа не предназначена для коммерческого использования.
ГЛЕБ: Давайте еще раз пробежимся по проблемам, которые сейчас есть в области машинного обучения. Что наиболее актуально? Во-первых, это данные.
АНДРЕЙ: Да. Недавно даже видел мем — грустная картинка и подпись «Когда нашел крутую архитектуру, но нет датасета, чтобы ее обучить». Действительно, такая проблема существует.
ГЛЕБ: Хорошо, но, допустим, у нас есть большой датасет, на котором модель обучается неделю. Как решаются проблемы со временем? Грубо говоря, для нас это как компиляция, только компиляция идет в худшем случае 15 минут на каком-нибудь жестком iOS проекте, обычно все-таки быстрее. Тут такая же ситуация, только уже две недели. Если налажать, это время пропадет.
АНДРЕЙ: Две недели — это, наверное, все-таки уже ушедшие реалии. Сейчас это сутки — двое — трое. Но твои опасения имеют место быть. Действительно, бывает такое, что работа R&D заключается в том, что они думают: «О, попробуем вот это!» — что-то изменяют, запускают обучение, а через два дня узнают, что метрики упали на 0,5%: «ОК, это не сработало, попробуем вот это!» И снова ждут. Такая проблема действительно существует, и от нее никуда не деться.
СТАС: Хотел бы вернуться к истории про мой бедненький ноут, про то, что все-таки крутость модели и успешность ее предсказаний, наверное, связана со временем обучения. Есть такая корреляция? Приведу пример. Ты можешь вначале убедиться, что твоя модель более или менее решает твою задачу — допустим, на 70%. После этого ты понимаешь, что точно у тебя все будет лучше работать, если добавить количество признаков. Чем больше признаков, тем дольше все будет обсчитываться. Пусть ты запустишь на день, но практически будешь уверен, что модель будет работать лучше.
АНДРЕЙ: Да, такая оптимизация работает, скорее, на первых этапах. Когда ты совершенствуешь уже существующую модель, так не получается делать. Просто для того, чтобы осознать какое-то преимущество, приходится иногда переучивать модель с нуля. Это действительно времязатратный процесс.
СТАС: Я почувствовал, что все мои примеры на уровне второго класса.
ГЛЕБ: Я вспомнил еще известную картинку, про компиляцию. А тут сеть обучается.
СТАС: Если обучение занимает целый день, то что в это время делают разработчики? С утра пришел, заварил себе кофе, отправил обучаться, пошел домой — встретимся завтра?
АНДРЕЙ: Вообще сама по себе работа, связанная с машинным обучением, не очень похожа на классическую разработку. Я сам ей практически не занимаюсь, но могу рассказать из опыта своих коллег.
Во-первых, это люди, у которых очень сильный математический бэкграунд. В основном они закончили факультеты прикладной математики, а не 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«ов. Не хватает именно людей, которые могут что-то крутое делать. Сейчас это оверхайп тема. В той же ВШЭ переполнены все кафедры с машинным обучением, все им хотят заниматься, у каждого второго диплом с машинным обучением. Оно везде — даже на экономфаках уже есть!
Но не хватает именно хардкорных людей, их тут же расхватывают. Если вы показываете даже минимальные скилы, то просто сразу отъезжаете в Маунтин-Вью, потому что вас там очень ждут. Это действительно правда.
СТАС: Ты сейчас закинул еще угля в топку hype train.
АНДРЕЙ: Наверное, это рано или поздно сойдет на нет, но сейчас специальность data scientist стабильно популярна. Если вы делаете крутые штуки, то компании готовы платить крутые деньги.
ГЛЕБ: Есть некоторые стереотипы, как выглядят программисты. Есть ли какое-то отличие для data scientist«ов?
АНДРЕЙ: Я бы не сказал. Но они не такие, как мы. Программисты в основном очень дотошные, им нравится, чтобы все было по полочкам, чтобы Git-репозиторий был идеальный и все такое. Data scientist все-таки больше математик, ему главное найти решение проблемы. У них нет таких странных вещей, как code review, unit-тесты — всей этой чепухой они не занимаются. Они используют программирование только лишь как инструмент, а их основная деятельность более интеллектуальная.
СТАС: Как раз хотел сказать, что у них нет культа инструмента, как есть у многих разработчиков.
АНДРЕЙ: Да, и они меняют фреймворки чуть ли не каждую неделю, потому что как только появляется что-то новое, например, Kaffe 2, PyTorch — они это пробуют! У них нет такого: «Я Data scientist на TensorFlow».
Основная проблема есть на самом деле с разработчиками типа меня. Мне кажется, что сложно найти компанию, которая была была заинтересована в разработчике, который пишет на Swift, но при этом занимается не UI-kit, а хардкорными штуками. Честно говоря, даже с ходу не знаю, кто такие вакансии может в принципе иметь.
Понятное дело, что это какие-то технологические стартапы, но стартапы не могут взять всех. В этом смысле я очень дорожу своей работой, пусть она иногда и не такая выгодная. Есть мало инженеров, которые это умеют, но и востребованность очень маленькая. Поэтому есть компромисс между интересными проектами и работой на enterprise.
Если вам интересно работать над чем-то уникальным, более сложным, чем верстка экранов и прочее, то стоит однозначно искать такие вакансии. Думаю, с годами их будет появляться больше, потому что рынок растет. Но я пока слабо представляю, куда можно устроиться.
АНДРЕЙ: Я в этом смысле прямо очень ей дорожу, потому что такую работу довольно сложно найти. Просто обычно GPU разработка нужна все-таки в основном игровым компаниям. Чтобы ты был относительно классическим разработчиком, но занимался хардкорными вещами — в этом смысле рынок труда очень маленький и узкий. Я не думаю, что можно сходу устроиться на Junior GPU инженером или стажером. Нужно сначала самому разобраться, набраться опыта, и приходить уже в компанию готовым решать задачи самостоятельно.
СТАС: К железкам пора — к нехватке железок.
ГЛЕБ: Потому что все разобрали на биткоины, ты хочешь сказать?
АНДРЕЙ: Да, Сбертех недавно заявили, что весь дефицит на рынке видеокарт был из-за них.
ГЛЕБ: А зачем им — для машинного обучения или для майнинга?
АНДРЕЙ: Не возьмусь точно сказать, но, по-моему, все-таки для обучения.
ГЛЕБ: А вообще есть проблема, что не все могут себе позволить необходимое оборудование?
АНДРЕЙ: Обычно это никто не делает дома. Чаще всего это арендованный сервер, скажем, на Амазоне, у которого есть эластичная оплата в зависимости от того, как много ресурсов вы используете. В реальности вы можете заниматься машинным обучением хоть с Macbook Air. То есть вы просто через терминал запускаете расчет на сервере — где-то далеко на горячих видеокартах он считается, а потом вы скачиваете результат, и все.
В реальности никто на ноутбуках ничего не учит, и ни у кого дома Nvidia Titan тоже не стоит, потому что это невыгодно. Каждый год выходят новые видеокарты, в основном все на серверах.
ГЛЕБ: Как обстоят дела с тестированием? У меня есть друг, который работает в Nvidia и занимается тестированием производительности программ, которые обучают сети. Это все, что я слышал про тестирование, связанное с машинным обучением. Какие процессы в этом смысле есть?
АНДРЕЙ: На самом деле сейчас это по большей части выглядит как аналог дебага с помощью многих print из нашего мира, то есть когда ты несколько вручную это делаешь. Но недавно была конференция NIPS, на которой рассказали, что в Стэнфорде ребята разработали хранилище нейронок и моделей, которые считывают метрики из нескольких разных итераций и вариаций. Их можно сравнивать, смотреть, как и что меняется. То есть сейчас что-то есть, но инфраструктура пока несколько сырая — очень много разнородных инструментов, которые плохо друг с другом работают.
Но есть подвижки. Сейчас запускается стандарт ONNX для описания нейронных сетей в унифицированном стиле, который принимается уже многими компаниями. Но все равно инфраструктура сырая. Насколько могу судить, очень многое пока делается вручную. То есть чтобы протестировать, нужно запустить и посмотреть, работает или нет. Понятное дело, что можно считать какие-то метрики, но иногда есть и субъективное тестирование на глаз. Оно до сих пор имеет место быть.
СТАС: Я подумал о том, какие можно применять бенчмарки. Я правильно понимаю, что когда обучаешь модель на конкретном датасете и на конкретном железе, можно судить о том, сколько времени она будет гоняться?
АНДРЕЙ: Нет, датасет вообще ни на что не влияет. И не обученная, и обученная модель будет работать одно количество времени. Обученная модель отличается от необученной только циферками внутри, но количество циферок одинаковое. Если конкретно оперировать в терминах нейронных сетей, то скорость напрямую зависит от толщины модели — как много слоев, насколько толстые эти слои и т.д.
Есть легковесные нейронки, которые запоминают не так много параметров. Есть тяжеловесные, которые запоминают их больше. Это всегда компромисс — нет такого, что ты берешь в два раза больше слоев, и у тебя результат в два раза лучше. Это нелинейная корреляция. Всегда нужно находить компромисс, чтобы для одного набора данных сеть получилась не слишком тонкой, выучила довольно много критериев и обучилась правильно. Но при этом она не должна быть излишне толстой, потому что количество данных все равно недостаточно для того, чтобы все задействовать.
ГЛЕБ: Мы сейчас говорили о самых общих аспектах машинного обучения. Но есть, особенно последние пару лет, прорывные штуки, например, AlphaGo. Я думал, что это глубокое обучение, но как выясняется, правильно называть это reinforcement training.
АНДРЕЙ: Reinforcement training — обучение с подкреплением. Это такой вид обучения, который работает несколько иначе. Допустим, вы обучаете модель, например, искать выход из лабиринта или играть в шашки. Вы берете свой алгоритм, свою структуру и кладете в эту среду и предопределяете набор действий, которые в этой среде можно совершить. Модель перебирает варианты, условно пытаясь пойти влево или вправо. Reinforcement training заключается в том, что каждый раз, когда машина выполняет действие, вы ее либо бьете по рукам, либо говорите: «Все норм