Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя
Кандидат физ.-мат. наук, делаю Яндекс, увлекаюсь всем на свете  · 7 февр 2022

AlphaCode

Что случилось
Компания DeepMind, принадлежащая Google, создала систему, способную участвовать в олимпиадах по программированию с неплохими результатами (на уровне среднего участника-человека). Естественно, это заявление вызвало большой хайп. Не заменит ли программистов искусственный интеллект? Давайте разберёмся.
Постановка честная: на вход AlphaCode, как и человек, получает только задачу в текстовом виде. Задача состоит из описания на естественном (английском) языке и нескольких примеров: что будет подано на вход и что должно получиться на выходе. Система, как и человек, как-то "пишет" программу, делает несколько попыток "сдать работу" и если какая-то попытка проходит все тесты (в том числе скрытые, не входящие в исходное описание задачи), задача засчитывается как решенная.
Задачи при этом достаточно сложные даже для человека, это вам не FizzBuzz. На глазок возможности системы оказываются где-то на уровне LeetCode medium. Программы, которые генерирует система, выглядят прям как человеческие. Когда в статье и в блоге задачу и сгенерированное решение показывают бок о бок, всё это шокирует.
В чем подвох
Из вышесказанного складывается наивное представление о том, что происходит под капотом: система "читает" описание задачи и затем "пишет" программу, которая должна её решать. Если прочитать статью, а не только запись в блоге DeepMind, выясняется, что это представление неверно. На самом деле происходит следующее:
1) нейросеть-трансформер смотрит на описание задачи и генерирует очень много программ, вплоть до миллионов для некоторых задач. Помимо стандартного случайного сэмплирования при этом используются два забавных "чита": во-первых, система пытается генерировать код и на Питоне, и на С++ (что примерно удваивает разнообразие). Во-вторых, система в каждой из этих миллионов попыток случайным образом приклеивает к описанию задачу тэг (например, "динамическое программирование" или "два указателя") и цифру, обозначающую сложность.
2) прогоняет на каждой из них тесты, входящие в условие задачи. Эти тесты сразу отсеивают 99% сгенерированных на первом этапе программ. В самых необычных олимпиадных задачах система терпит поражение прямо на этом этапе: тесты отсеивают всё, что она сумела сгенерировать.
3) ещё одна нейросетка смотрит только на примеры в описании задачи и генерирует из них новые примеры входов. Эта нейросетка простая, она не стремится "понимать" задачу, а тем более решать её и, соответственно, не знает, что в этих примерах должно получиться на выходе, но этого и не требуется. Главное, что это позволяет прогнать на новых примерах оставшиеся десятки тысяч сгенерированных программ. После этого в них можно выявить предполагаемые дубликаты: программы, которые выглядят по-разному, но выдают одинаковые результаты на тесте.
4) Из десяти кластеров дубликатов, начиная с самых крупных, система выбирает по экземпляру и пытается "сдать" как решение. Если одно из них принято, бинго! Задача "решена".
Почему ничего особенно важного не случилось
Работа AlphaCode опирается сразу на три особенности, означающие, что живым программистам пока что не нужно бояться за свою работу
  • неограниченный доступ к железу. Даже просто прогнать готовую большую нейросеть-трансформер миллионы раз дорого. Очень дорого. Это больше вычислений на GPU, чем некоторым вполне себе коммерческим продакшн-сервисам (например, наисовременнейшим чат-ботам поддержки) требуется за неделю, и больше, чем они могут себе позволить. А полученные миллионы программ потом нужно ешё и скомпилировать и запустить, но тут хоть GPU-шки не нужны, достаточно "всего лишь" обычного кластера, серверов так на тысячу.
  • наличие данных для четких юнит-тестов как в момент постановки задачи, так и в момент проверки решения, и возможности распределенно прогнать их миллионы раз. Любая хоть насколько-то неизолированная задача (например, требующая обратиться к БД или соседнему микросервису) сразу не подходит. Любая задача, не являющаяся принципиально stateless (например, требующая в эту самую БД что-нибудь записать) не подходит ещё сильнее.
  • в целом AlphaCode очень помогает некоторая шаблонность олимпиадного программирования, знакомая всем, кто в нем активно участвовал, и наличие в нём повторяющихся мотивов. На самом важном и загадочном первом этапе, на этапе генерации миллиона кандидатов, всё-таки очень важно уметь генерировать хоть что-нибудь похожее на реальные решения. Конечно, наличие знакомых "профи" правил вроде "задача найти подстроку с определенными свойствами или диапазон в массиве? заводи два указателя и хэш-таблицу, а дальше думать будешь" в этом здорово помогает.
Почему случилось что-то очень важное
И тем не менее. Принимая во внимание всё вышесказанное. Слушайте, ну это всё-таки очень круто, хотя бы как произведение современного искусства. Да, немного фокус, но насколько впечатляющий! Пусть к трансформерам все уже привыкли, но все равно, априори было совершенно не очевидно, что они сумеют выучить чисто "из данных" (и не такого уж большого их количества) типичные паттерны и повторяющиеся мотивы программирования, пусть и олимпиадного, до такой степени, что экспоненциальный перебор вариантов окажется можно свести к жалким миллионам.
Более того, я практически на 100% уверен, что даже такой вот подход, прямо со всеми его миллионами попыток и прочими ограничениями, имеет огромный потенциал, в том числе и коммерческий. Например, писать компиляторы и стандартные библиотеки. Или автоматизировать всех Verilog-программистов, что уже в общем недалеко от обещанного фантастами "ИИ, самостоятельно улучшающего своё железо". Это только то, что top of mind в голову приходит.
Это всё на сегодня, ставьте лайки, --подписывайтесь на наш канал--.
10 экспертов согласны
Наверное можно попробовать с помощью такого трансформера портировать библиотеки с Python на Go, c Go на Rust и... Читать дальше
@Артёменко Александр, офигенная идея, да
Все что связано с построениями (генерацией или как угодно) предсказательных моделей используя технологии ИНС, имеет вероятностный характер, тк они в своей основе используют статистические наборы данных. Такая модель не способна обьяснить (пояснить) почему ей получен (выбран) именно такой а не иной результат (решение) даже если он будет и на 100 % верным. Она, например, не докажет от обратного простое утверждение, что если А > В, а В > С, то и А > С. Отсутствие способностей для логических рассуждений (не только в математике и логике), а также умения планировать свои действия не позволят такой модели правильно проектировать и корректно разрабатывать надёжное программное обеспечение, а будет только умение, как сейчас говорят в народе, "писания" небольших программ.
Вообще об автоматическом генераторе программ речь идёт уже лет этак 60. Максимальные успехи и главное практические результаты для автоматизации разработки ПО достигнуты современными CASE - системами, но это тема отдельного разговора.
наличие данных для четких юнит-тестов как в момент постановки задачи, так и в момент проверки решения, и возможности распределенно прогнать их миллионы раз.
Ясно-понятно.
Если все покрыть тестами и _пользоваться_ этим, то программистов можно будет отключать бочками..
Ффууух, следующие 100500 лет парни могут расслабиться. Этот топор всегда некогда точить, рубить надо..
привет я новенький
я занимаюсь програмированим
Андрей, а можно ли на машинном языке или вообще в математике создать "будущее время" и "прошлое время" для, например, точки "А"? Чтобы мы могли математически отличить "А-будущее" от "А-прошлой" в "А-настоящем". Сейчас это невозможно в том виде, в каком это существует в человеческом языке. Насколько я знаю, в математике и физике по причине представления "времени" в виде отсчета циклов, все формулы обратимы. Т.о. математика не отличает "будущее" от "прошлого". Она имеет только параметр счетчика колебаний, который может идти в обе стороны, и не имеет математически обоснованного направления.
К чему это может понадобиться: именно система времен языка дает человеку феномен "понимания". А в данном случае, да и вообще все ИИ спотыкаются о феномен "понимания".  Если бы эта задача была решена, то препятствия в виде "неспособности к пониманию" задач у ИИ не было бы.
Как философский довесок к этой точке зрения. Мартин Хайдеггер в своей книге "Бытие и время" так говорит о понимании: «В интерпретации времени как возможного горизонта любой понятности бытия вообще ее предварительная цель». 
Возможно гугл решили проверить свои задачки для собеседований и нагородили для этого велосипед который отсеивает совсем уж паттерновые задачи?