Нейросеть DeepCoder учится программировать, заимствуя код у других программ
Условная матрица неточностей для нейросети и тестового набора из 500 программ длиной в 3 строчки. Каждая ячейка содержит среднюю вероятность ложно-положительного результата (крупным шрифтом) и количество тестовых программ, из которых это значение выведено (меньшим шрифтом, в скобках). Насыщенность цвета коррелирует с вероятностью ложно-положительного результата
У программистов скоро появится хороший помощник: умная нейросеть, которая способна выполнять рутинные задачи. Более того, с помощью такой нейросети люди могут создавать программы, даже не зная синтаксиса конкретного языка и фактически не умея программировать. Нужно составить алгоритм и поставить задачи —, а нейросеть напишет код для их решения.
В итоге вся работа станет гораздо более продуктивной: «Люди смогут создавать системы, которые было невозможно создать раньше», — считает независимый эксперт Армандо Солар-Лезама (Armando Solar-Lezama) из Массачусетского технологического института, в комментарии для New Scientist.
Исследователи из Microsoft и Кембриджского университета разработали систему под названием DeepCoder, которая уже сейчас правильно решает простые задачи со школьных конкурсов по программированию. DeepCoder использует технику под названием «программный синтез» (Inductive Program Synthesis), которая известна многим разработчикам. Она заимствует строчки кода из других программ — и составляет свою собственную уникальную программу. Важно иметь в виду, что DeepCoder как и другие системы программного синтеза использует предметно-ориентированный язык (DSL), специализированный для конкретной области применения. Его можно назвать «мини-язык» или «урезанный язык программирования». Он содержит только девять функций первого порядка:
HEAD, LAST, TAKE, DROP, ACCESS, MINIMUM, MAXIMUM, REVERSE, SORT, SUM
и шесть функций высшего порядка:
MAP, FILTER, COUNT, ZIPWITH, SCANL1
Сфера применения предметно-ориентированный языка ограничена относительно языков программирования общего назначения.
Выбор строчек для составления программы осуществляется после анализа входных и выходных значений каждого фрагмента кода. В научной работе можно изучить девять примеров 5-строчных программ, которые написала нейросеть DeepCoder. Например, вот решение задачки про конфеты (слева) с текстовым описанием (справа) и входящими значениями (по центру):
В поиске подходящих строчек кода DeepCoder превосходит человека: он способен проиндексировать и проанализировать гораздо больше исходников, чем способен человек. Система машинного обучения учится понимать, как использовать эти образцы — и заранее составляет базу. Кроме того, нейросеть соединит найденные строчки таким способом, каким никогда не придёт в голову соединить их живому человеку. Методом проб и ошибок нейросеть постепенно учится добиваться поставленной цели. Данная реализация программного синтеза в системе DeepCoder получила название Learning Inductive Program Synthesis (LIPS).
Схематическое представление кодера с прямой связью и декодера DeepCoder
На иллюстрации ниже показано, как нейросеть DeepCoder предсказывает вероятность появления каждой функции в исходном коде.
Все эти достоинства позволяют DeepCoder писать программы гораздо быстрее, чем её предшественницам. Она пишет программа из трёх строчек за доли секунды, в то время как предыдущим системам требовалось в разы или в десятки раз больше времени, чтобы перепробовать все возможные варианты. Например, в таблице показана скорость генерации программ из трёх строчек кода с различными задачами.
Программы из пяти строчек кода генерируются на порядок медленнее. На графике справа показана зависимость скорости от длины программы.
По мере обучения система понимает, какие комбинации кода работают, а какие нет. Она совершенствуется в программировании с каждой новой задачей.
Технологию потенциально можно использовать для рефакторинга и поиска багов в программах. Она найдёт некорректные строчки и заменит их на правильные строчки из других программ. Авторы считают, что с её помощью легко создавать рутинные программы в стиле знаменитой IFTTT — автоматизировать базовые взаимодействия между разными веб-сервисами. Даже непрограммист может составить простые инструкции вроде выбора фотографий с Facebook и сортировки по заданным критериям. Такие простые программы можно будет создавать за минуты без знания программирования.
Конечно же, такие инструменты пока не могут заменить настоящего программиста. Они рассматриваются только как вспомогательный инструмент. Самим разработчикам DeepCoder будет очень полезен в будущем: он снимет с себя груз рутинных операций и позволит сконцентрироваться на более сложных и важных задачах.
В данный момент DeepCoder способен решать задачи по программированию, работая примерно с пятью строками кодами. Конечно, в продвинутых языках программирования пять строчек кода позволяют написать очень полезную программу, но это всё равно достаточно простые, базовые вещи. Эксперты считают, что сгенерировать сложную программу с большим количеством кода невозможно с помощью программного синтеза. С другой стороны, с человеческой помощью такое возможно. В конце концов, большие программы состоят из большого количества маленьких фрагментов.
По крайней мере, в ближайшие несколько лет большинству программистов не грозит потеря работы из-за автоматизации кодинга. Но методы машинного обучения очень быстро совершенствуются. Поразительно, как много сделано в этой области в последнее время.