Найти в Дзене

Автоматический синтез программ и машинное обучение

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

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

И вот одно из перспективных направлений тут — program synthesis. Идея в том, что, имея например обучающую выборку, или некоторую модель явления, мы не тренируем на ней неведомо как работающую нейронную сеть, а генерируем программный код, который работает с примерно такой же эффективностью, как нейронка, однако в нём мы можем разобраться. Алгоритм генерации кода по возможности сопровождает его логику комментариями. При этом мы можем использовать самые разные структуры данных, экспериментировать с ограничениями, вводить более абстрактные обобщения и т. д. Подобным тюнингом параметров алгоритма генерации могут успешно заниматься SMT-солверы например :)

Пока проблема подобного символьного подхода в высокой вычислительной сложности. Тут активно развиваются исследования в сфере вероятностного и дифференциального программирования
https://vk.com/wall-152484379_1085

в частности, PyTorch, позволяющий по сути дифференцировать любой код на питоне. Скорее всего, работающее решение возникнет на стыке чистого program synthesis и машинного обучения, тут основной тренд — это обобщение глубокого обучения через символические модели. Например, нейросетки распознают что-то на нижних уровнях, а поиск в пространстве знаний и автоматическое доказательство теорем выполняется уже на более высоком абстрактном уровне. Это так называемые нейросимволические (neurosymbolic) методы.

Свежие примеры:
https://arxiv.org/abs/1906.04604
...synthesizing text editing programs and inferring 2D and 3D graphics programs.
https://arxiv.org/pdf/1904.12584.pdf
...our model builds an object-based scene representation and translates sentences into executable, symbolic programs.
https://arxiv.org/abs/1804.00218
...a neurosymbolic framework for the lifelong learning of algorithmic tasks that mix perception and procedural reasoning.
https://arxiv.org/abs/1907.05431
...we study the problem of programmatic reinforcement learning, in which policies are represented as short programs in a symbolic language.
===

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

Резюме такое, что если вам действительно интересно крайне перспективное, безусловно, направление машинного обучения, data science и всё подобное, то всё же на освоение нейронных сетей и прочих чёрных ящиков стоит отводить не более 49% времени, а вот формальным методам и символическим вычислениям (в частности, птичкам Смаллиана), уделять не менее 51%.

Далее рассмотрим тут две своеобразные крайности: одна весьма сложная, но добравшись до которой вы будете реальным топчиком в теме, и другая наоборот совсем прозаическая, совсем простая, вы скорее всего её знаете. Но почему-то это малоизвестная фича в системе типов многих популярных языков. Ей к сожалению уделяют мало внимания, но при осознанном акценте она может как раз стать хорошей дорогой в область формального проектирования на основе качественной системы типов.
Хинт: эта фича появилась в PHP 7.0 например :)