Машинное обучение применяется для разработки кода


17

Мой опыт в области машиностроения, поэтому, пожалуйста, прости мое невежество в этой области.

Мне очень нравится программирование и разработка программного обеспечения. Кроме того, недавно я взял бесплатный онлайн-курс по машинному обучению (ML), который я очень рекомендую, преподаватель из Стэнфордского университета Эндрю Нг. Ссылка здесь .

Я слышал, как этот профессор сказал, что трудно найти области, на которые ML никогда не повлияет.

Вопрос

Итак, мой вопрос: какие исследования были проведены до сих пор в применении машинного обучения к разработке кода? Как насчет отладки?

Пожалуйста, включите ресурсы / источники / научные статьи, если это возможно.

Мне не повезло в поисках этого, потому что частый поиск ML и разработка программного обеспечения (или программирование) приводят к результатам в разработке программного обеспечения (или программировании) приложений ML.


Ваш вопрос о коде, который пишет код, или вы спрашиваете о методах кодирования для реализации машинного обучения?
Роберт Харви

Код (ML-код), который пишет код, или улучшает код, или проверяет ошибки в коде (будь то веб-разработка, числовое решение и т. Д.). Не техники для реализации машинного обучения.
Чарльз

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

Предполагается, что этот вопрос будет перенесен на сайт Искусственного интеллекта. Могут ли те, кто проголосовал, сказать нам, почему?
пятнадцатое

На самом деле это действительно крутой вопрос!
Рис Джонс

Ответы:


6

Fuzzing - это метод тестирования, в котором машинное обучение может быть применено. Fuzzing - это метод тестирования в области автоматизированного поискового тестирования. Он пытается найти дефекты в программном обеспечении, запустив большое количество входных данных и ища ошибки. Необработанные исключения - самая простая категория, но умная реализация может использовать ML для поиска подозрительных выходных данных. ML в основном используется в этой области, чтобы сделать процесс более эффективным. Это работает с использованием ML, чтобы избежать тестирования всевозможных входных данных путем обучения «интересным» входным данным. (Несходные входы, которые могут вызвать сбой.)


Интересный. Так что этот вид попадает в категорию тестирования кода, верно? Мне больше нравится ответ RJB, так как он касается разработки, а не тестирования. Но тестирование / отладка, безусловно, все еще полезно.
Чарльз

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

4

Да. Эта область сейчас горячая. Он называется «большой код», и DARPA вложила в него 40 миллионов долларов: http://www.darpa.mil/program/mining-and-understanding-software-enclaves . Некоторые грандиозные результаты были получены благодаря этому гранту, например, системы Prop Long и Genesis от Fan Long, которые могут автоматически исправлять ошибки в программах, используя изученную модель правильных исправлений. Мартин Вечев и его ученик Веселин Райчев также были пионерами в этой области. Возможно, их самый впечатляющий результат - JSNice ( http://jsnice.org/ ), который может «минимизировать код JavaScript.

В целом, идея большого кода не оправдала своего обещания: данные слишком скудны, чтобы изучать что-то гораздо более интересное, чем имена переменных. Хотя я все еще частично финансирую эту программу DARPA, моя лаборатория в основном перестала работать над ней. В этой связи последнее, что я услышал о DeepCoder, - это то, что он дает довольно жалкие результаты по сравнению с современным уровнем синтеза программ.

Наиболее успешные инструменты для автоматического программирования все еще полагаются на не-ML методы, такие как решатели SMT. Посмотрите материалы любой конференции по PL (например, PLDI, POPL, OOPSLA) или любой научной конференции по разработке программного обеспечения (например, ICSE, FSE, ISSTA, ASE), и вы увидите множество примеров.


3

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

Я могу сказать вам, что метагенетическое программирование - это область исследований со схожими целями, но я не могу сказать, что знаю об этом достаточно, чтобы быть осведомленным.

Генетическое программирование появилось в новостях в 2015 году, когда muScalpel разработала решение для переноса функции из одной программы в другую, используя модульные тесты для обоих в качестве своего рода учебного набора.


Это похоже на генерацию алгоритмов с использованием генетической модели, верно? Знаете ли вы какие-либо приложения для помощи в разработке кода? Я думаю о человеке-машине, работающей вместе, а не о чисто управляемой машиной (генетическая модель). Я знаю, что это может звучать определенно, но мне в основном любопытно, потому что я новичок в этой области.
Чарльз

Конечно , вы правы, я неправильно понял, я думал слишком рекурсивно об использовании ML сделать ML :) #edited
RJB

2

Итак, мой вопрос: какие исследования были проведены до сих пор в применении машинного обучения к разработке кода? Как насчет отладки?

Смежный вопрос касается методов машинного обучения для генерации и компиляции кода (поскольку вы можете представить себе транспиляторы и компиляторы как способ автоматически «разрабатывать код» - фактически писать код - из некоторого языка более высокого уровня).

Об этом было несколько статей, например, MILEPOST GCC .

Вы также можете поискать статьи о методах машинного обучения для отладки или статического анализа исходного кода (или любого другого статического анализа программы ).

См. Также блог Дж. Питрата о начальной загрузке искусственного интеллекта, который связан с вашим вопросом.


1

В недавней статье в Коммуникациях ACM о зарабатывании денег с помощью математики Эрик Мейер процитировал Джеффа Дина, старшего научного сотрудника Google, группы систем и инфраструктуры:

Если бы Google был создан с нуля сегодня, многое из этого было бы изучено, а не закодировано.

В статье дается обзор последних мероприятий в области исследований. Он стоит за стеной оплаты, но, возможно, стоит почитать, если вас интересуют теоретические параллели между кодированием и машинным обучением / статистикой. Возможно, список ссылок в конце статьи тоже может быть полезен.

В качестве примера в статье упоминается WebPPL, вероятностное программирование для Интернета .


0

Вот один пример использования машинного обучения для отладки микросервисов. Я задокументировал некоторые усилия по анализу данных о производительности микросервисов с помощью машинного обучения, где я обучил дерево решений на основе данных о производительности, собранных при нагрузочном тестировании микросервисов, а затем изучил дерево, которое дало мне представление об экологической проблеме и помогло мне диагностировать и исправить ошибку производительности.


0

Я нашел довольно обширный список для чтения по всем темам машинного обучения, связанным с кодированием .

Как вы можете видеть, люди пытались применить машинное обучение к кодированию, но всегда в очень узких областях, а не просто на машине, которая может обрабатывать все виды кодирования или отладки.
Остальная часть этого ответа посвящена вашему относительно широкому объему «отладочной» машины и тому, почему это еще не было предпринято (насколько показывает мое исследование по этой теме).


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

Какие исследования были сделаны до сих пор в применении машинного обучения для разработки кода? Как насчет отладки?

Проблема здесь не в том, что это невозможно, а в том, что это невероятно сложная тема.

Люди даже не приблизились к определению универсального стандарта кодирования, с которым все согласны. Даже самые широко согласованные принципы, такие как SOLID, все еще являются источником для обсуждения того, насколько глубоко это должно быть реализовано. Для всех практических целей невозможно полностью придерживаться SOLID, если у вас нет финансовых (или временных) ограничений; что просто невозможно в частном секторе, где происходит большая часть развития. SOLID - это руководство, а не жесткий предел.

В отсутствие объективного измерения правильного и неправильного, как мы сможем дать машине положительный / отрицательный отзыв, чтобы она научилась?
В лучшем случае у нас может быть много людей, которые высказывают свое мнение о машине («это хороший / плохой код»), и тогда результатом машины будет «среднее мнение». Но это не обязательно то же самое, что правильное решение . Это может быть, но это не гарантировано.

Во-вторых, для отладки, в частности, важно признать, что определенные разработчики склонны вносить определенный тип ошибок / ошибок. На природу ошибки в некоторых случаях может повлиять разработчик, который ее допустил.

Например, поскольку я часто участвую в исправлении чужого кода на работе, у меня есть своего рода ожидание того, какую ошибку допускает каждый разработчик. Учитывая определенную проблему, я знаю, что dev A, скорее всего, забудет обновить файл конфигурации, тогда как dev B часто пишет некорректные запросы LINQ. Основываясь на разработчике, я могу сначала посмотреть на файл конфигурации или LINQ.
Точно так же я работал в нескольких компаниях в качестве консультанта, и я ясно вижу, что типы ошибок могут быть смещены в отношении определенных типов компаний. Это не жесткое и быстрое правило, на которое я могу окончательно указать, но есть определенная тенденция.

Может ли машина научиться этому? Может ли он понять, что dev A, скорее всего, испортит конфигурацию, а dev B, скорее всего, испортит запрос LINQ? Конечно может. Как я уже говорил, все, что человек может выучить, может и машина.
Однако откуда вы знаете, что вы научили машину всем возможностям? Как вы можете предоставить ему небольшой (т.е. не глобальный) набор данных и точно знать, что он представляет полный спектр ошибок? Или вы вместо этого создадите специальные отладчики, чтобы помочь конкретным разработчикам / компаниям, а не создадите универсальный отладчик?

Запрашивать машинно-обученный отладчик - все равно, что просить машинно-обученного Шерлока Холмса. Это невозможно доказать невозможно, но зачастую основной аргумент в пользу того, чтобы быть отладчиком / Шерлоком, зависит от субъективных оценок, которые варьируются от предмета к предмету и затрагивают невероятно широкий спектр знаний / возможных недостатков.
Отсутствие быстро доказываемых правильных / неправильных результатов затрудняет простое обучение машины и проверку того, что она успешно работает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.