Программное обеспечение 2.0

Конспект материала главы отдела ИИ в Tesla Андрея Карпатого о том, какими инструментами будут пользоваться разработчики в будущем.

Программное обеспечение 2.0

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

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

Нам всем знаком традиционный стек для создания ПО 1.0, в него входят языки вроде Python и C++. В каждой строке кода программист определяет особую точку в пространстве программы, задавая её поведение.

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

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

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

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

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

  • Распознавание визуальных образов, как правило, базировалось на разработанных вручную средствах, лишь немного дополненных машинным обучением (SVM). Теперь же у нас есть механизмы, позволяющие создать гораздо более мощные программы по анализу изображений (в семье платформ ConvNet), а не так давно мы начали поиск по архитектурам.
  • Ранее распознавание речи строилось на предварительной обработке данных, смеси гауссовых распределений и скрытых марковских моделей. Сегодня же технологии речевого распознавания почти полностью работают на нейронных сетях. Тут можно вспомнить часто цитируемые слова Фредерика Йелинека: «Каждый раз, когда лингвист покидает коллектив, качество распознавания речи возрастает».
  • Исторически в синтезе речи применялось комбинирование записанных человеком фрагментов речи, сейчас же синтезаторы представляют собой массивные свёрточные нейронные сети, как например WaveNet, которая генерирует звуковой сигнал по семплам.
  • В машинном переводе нейронные сети быстро заняли доминирующее положение, заменив собой техники с опорой на статистику употребления фраз. Мои любимые алгоритмы обучаются сразу на нескольких языках, где одна модель переводит с любого языка на любой другой почти или вовсе без вмешательства человека.
  • Игры. Системы для игры в го существуют уже довольно давно, но только AlphaGo Zero, которая делает ход, опираясь исключительно на положение камней на доске, удалось стать сильнейшим игроком. Думаю, рано или поздно мы увидим нечто похожее в Dota 2 или StarCraft.
  • В робототехнике задачи традиционно разбиваются на блоки: моделирование неопределённости, восприятие, положение, планирование движения и их контроль. Задействованы при этом не промежуточные представления, а представления в явной форме. Обратного добиться пока не выходит, но исследования Калифорнийского университета в Беркли и Google подсказывают: ПО следующего поколения справится с репрезентацией кода гораздо лучше.
  • Базы данных. Более традиционные системы, не задействующие ИИ, также показывают первые признаки перемен. Так, например, обученные индексные структуры заменяют нейронными сетями основные компоненты систем по управлению данными, работая на 70% быстрее B-деревьев с оптимизированным кэшем и при этом сохраняя в памяти порядок величины.

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

Преимущества ПО второго поколения

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

  • Вычислительная гомогенность. Типичная нейронная сеть вплоть до первого порядка состоит из наслоения двух операций — умножения матриц и порогового перехода в нуле (нейроны ReLu). Существующее ПО устроено значительно сложнее и более гетерогенно, набор команд в нём значительно шире. А так как для создания ПО 2.0 потребуется описать лишь небольшое число базовых операций при помощи инструментов ПО 1.0 (например, умножение матриц), обеспечивать корректность и устойчивость кода станет гораздо проще.
  • В результате нейронные сети гораздо легче реализовать в системах на кристалле, используя, например, различные интегральные схемы (ASIC) и нейроморфные чипы. Мир изменится, когда нас полностью окружит более энергоэффективный искусственный интеллект. Так, недорогие чипы можно поставлять с уже обученными нейронной сетью, системами распознавания и синтеза речи, интегрированными в небольшой протомозг, который можно приладить к чему угодно.
  • Постоянное время выполнения. Каждый цикл прямого прохода нейронной сети выполняет одно и то же количество флопов. Такому коду не присуща изменчивость, свойственная, например, «расползающемуся» коду на C++. Конечно, вы можете использовать динамические графы, но поток выполнения всё равно ограничен. Выходит, мы почти полностью защищены от непреднамеренного попадания в бесконечный цикл.
  • Постоянное распределение памяти. В таком случае не происходит динамического выделения памяти, что снижает вероятность сбрасывания на диски и потери доступа к памяти, за которым нужно охотиться в коде.
  • Лёгкое портирование. В вычислительных системах произвольного типа последовательность умножений матрицы запустить куда легче, чем типичные двоичные системы и скрипты.
  • Гибкость. Если вам, скажем, понадобилось увеличить скорость работы кода на C++ в два раза (даже ценой снижения производительности), настроить систему по-новому будет очень нелегко. Задачу облегчит ПО следующего поколения: возьмём нашу сеть, уберём половину синапсов, заново обучим и готово — система работает в два раза быстрее и немногим хуже. Магия. Это работает и в обратном направлении — при необходимости можно добавить синапсов и заново обучить модель.
  • Модули могут соединяться в органичное целое. Программное обеспечение часто разбито на модули, которые общаются между собой через открытые функции, API или конечные точки. Однако при взаимодействии двух модулей ПО 2.0, обученных независимо, мы можем с лёгкостью применить метод обратного распространения ошибки на всю систему. Представьте, как здорово было бы, если бы ваш браузер мог автоматически переписывать низкоуровневый системный код, увеличивая эффективность загрузки веб-страниц. ПО второго поколения будет по умолчанию обрабатывать данные таким образом.
  • Наконец, что наиболее важно, нейронная сеть просто-напросто представляет собой более организованный код, чем вам или мне под силу придумать, — для большого количества направлений: как минимум это касается любых программ по обработке изображений, видео, звука и текста.

Ограничения ПО второго поколения

Разумеется, такое ПО имеет и свои недостатки. После оптимизации у нас на руках остаются огромные отлаженные сети, но о принципах их работы мы едва ли можем что-то сказать. Область применения таких разработок очень широка, и рано или поздно нам придётся выбирать между понятными нам моделями с точностью 90% и моделями, точность которых близится к 100%, но мы их не будем понимать вовсе.

Кроме того, причины сбоев ПО 2.0 могут оказаться бессознательными и досадными, или ещё хуже — сбои могут проходить незаметно, допустим, система молча принимает смещения в тренировочных данных, которые сложно проанализировать и изучить должным образом, ведь их объёмы зачастую исчисляются миллионами.

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

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

Более того, смотря под таким углом, вы тут же заметите, сколько ещё предстоит сделать. Для примера: в нынешнем наборе инструментов LLVM IR формирует средний слой между языками и архитектурой, давая возможность для оптимизации. В случае с нейронными сетями мы уже наблюдаем взрыв и в языках (PyTorch, TF, Chainer, mxnet), и в архитектуре (CPU, GPU, TPU?, IPU?). Но что насчёт IR — промежуточного представления кода? Что оно собой представляет и как его можно оптимизировать (нечто похожее на Halide)?

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

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

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

А что до третьего поколения ПО, то его судьба полностью в руках ИИ.

2525
13 комментариев

Кирилл, спасибо за конспект! Жутковато.

Неужели традиционная профессия программиста отмирает? Как когда-то умение писать остроумный машинный код для определенных ЭВМ (их заменили оптимизирующие кроссплатформенные компиляторы)?

1

Комментарий недоступен

1

Ссылку подправьте на слово "атак".

1

Глава отдела ИИ в Tesla Андрей Карпатый!

Молодец, приятно что славяне делают великие вещи. Одну из главных фишек Tesla

1