Программное обеспечение 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)?
Другой пример: у нас полно инструментов, помогающих писать код. Мощная интегрированная среда разработки подсвечивает элементы синтаксиса, устраняет баги, делает профилирование, переходит к определению функции, метода, чего угодно. С ПО нового поколения мы код не пишем, а собираем данные, которые выдают код через оптимизацию.
Кто разработает первую мощную среду разработки для ПО нового поколения, которая поможет аккумулировать, визуализировать, вычищать, маркировать и представлять исходный код данных? Такая среда, похоже, будет выявлять изображения, которые, как кажется сети, помечены неверно, или помогать с разметкой, или искать больше примеров для мест, где нейронная сеть пока не может принять решение самостоятельно.
И наконец, в долгосрочной перспективе будущее ПО второго поколения вселяет уверенность, так как для многих становится всё более очевидным: при разработке сильного искусственного интеллекта мы будем пользоваться новыми инструментами.
А что до третьего поколения ПО, то его судьба полностью в руках ИИ.
#будущее #разработка #инструменты
Я, бывает, встречаю людей, которые относятся к нейронным сетям как к очередному инструменту в машинном обучении. У нейронных сетей есть свои преимущества и недостатки, они работают тут и там, иногда с помощью них можно выиграть в соревновании 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)?
Другой пример: у нас полно инструментов, помогающих писать код. Мощная интегрированная среда разработки подсвечивает элементы синтаксиса, устраняет баги, делает профилирование, переходит к определению функции, метода, чего угодно. С ПО нового поколения мы код не пишем, а собираем данные, которые выдают код через оптимизацию.
Кто разработает первую мощную среду разработки для ПО нового поколения, которая поможет аккумулировать, визуализировать, вычищать, маркировать и представлять исходный код данных? Такая среда, похоже, будет выявлять изображения, которые, как кажется сети, помечены неверно, или помогать с разметкой, или искать больше примеров для мест, где нейронная сеть пока не может принять решение самостоятельно.
И наконец, в долгосрочной перспективе будущее ПО второго поколения вселяет уверенность, так как для многих становится всё более очевидным: при разработке сильного искусственного интеллекта мы будем пользоваться новыми инструментами.
А что до третьего поколения ПО, то его судьба полностью в руках ИИ.
#будущее #разработка #инструменты
Ещё новости по теме:
18:20