Kirill Kazakov
5 219

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

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

Поделиться

В избранное

В избранном

Я, бывает, встречаю людей, которые относятся к нейронным сетям как к очередному инструменту в машинном обучении. У нейронных сетей есть свои преимущества и недостатки, они работают тут и там, иногда с помощью них можно выиграть в соревновании 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)?

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

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

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

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

#будущее #разработка #инструменты

{ "author_name": "Kirill Kazakov", "author_type": "self", "tags": ["\u0431\u0443\u0434\u0443\u0449\u0435\u0435","\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430","\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b"], "comments": 14, "likes": 35, "favorites": 37, "is_advertisement": false, "section_name": "default", "id": "38879", "is_wide": "" }
{ "is_needs_advanced_access": false }

Комментарии Комм.

Популярные

По порядку

0

Прямой эфир

Подписаться на push-уведомления
[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } } ]