Машинне навчання застосовується для розробки коду


17

Моя професія в машинобудуванні, тому, будь ласка, пробачте моє невігластво до цієї області.

Мені дуже подобається програмування та розробка програмного забезпечення. Також нещодавно я взяв безкоштовний онлайн-клас з машинного навчання (ML), який дуже рекомендую, викладав професор Стенфорда Ендрю Нг. Посилання тут .

Я чув, як цей професор говорив, що важко знайти сфери, на які ML ніколи не вплине.

Питання

Отже, моє запитання полягає в тому, які дослідження були зроблені поки що щодо застосування машинного навчання до розробки коду? Як щодо налагодження?

Будь ласка, включіть ресурси / джерела / наукові праці, якщо це можливо.

Мені не пощастило шукати цього, тому що часто пошук ML та розробки програмного забезпечення (або програмування) в кінцевому підсумку призводить до розробки програмного забезпечення (або програмування) програм ML.


Ваше запитання щодо коду, який пише код, чи ви питаєте про методи кодування для впровадження машинного навчання?
— Роберт Харві

Код (код ML), який записує код, або вдосконалює код, або перевіряє на помилки в коді (будь то для веб-розробки, чисельного вирішення тощо). Не методи впровадження машинного навчання.
— Чарльз

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

Це питання, як передбачається, буде перенесено на сайт штучного інтелекту. Чи можуть ті, хто голосував, сказати нам, чому ??
— квінтумнія

Це насправді дуже цікаве питання!
— Rhys Johns

Відповіді:


6

Fuzzing - метод тестування, при якому може застосовуватися машинне навчання. Плавлення - це метод випробування в царині автоматизованих дослідницьких випробувань. Він намагається знайти дефекти програмного забезпечення шляхом запуску великої кількості входів та пошуку помилок. Невиправлені винятки - найпростіша категорія, але розумна реалізація може використовувати ML для пошуку підозрілих результатів. ML в основному використовується в цій області для того, щоб зробити процес більш ефективним. Це працює, використовуючи ML, щоб уникнути тестування кожного можливого вводу, тренуючись на "цікавих" входах. (Dis-подібні входи, які можуть спричинити збій.)


Цікаво. Тож цей вид потрапляє до категорії тестування коду, правда? Мені подобається відповідь RJB трохи більше, оскільки вона стосується розвитку, а не тестування. Але тестування / налагодження, безумовно, все ще корисні.
— Чарльз

Так. Це безумовно в царині тестування, і недостатньо людей спробували це, але він набирає обертів як життєздатна техніка, оскільки хмарні обчислення стають все більш нормальними. Ставати простіше придбати собі групу машин, провести тести на тиждень, а потім відкинути кластер до наступного разу.
— RubberDuck

4

Так. Ця область зараз гаряча. Це називається "великий код", і DARPA вклав у нього 40 мільйонів доларів: http://www.darpa.mil/program/mining-and-understanding-software-enclaves . Цей грант отримав кілька вражаючих результатів, такі як системи Prophet і Genesis Fan Fan, які можуть автоматично виправляти помилки в програмах, використовуючи вивчену модель правильних патчів. Мартін Вечев та його учень Веселін Райчев також були піонерами у цій галузі. Можливо, їх найбільш вражаючий результат - JSNice ( http://jsnice.org/ ), який може "знизити код JavaScript.

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

Більшість успішних інструментів автоматизованого програмування все ще покладаються на такі методи, як MLT, як розв'язувачі SMT. Погляньте на матеріали будь-якої конференції з ПЛ (наприклад: PLDI, POPL, OOPSLA) або будь-якої академічної конференції з інженерного програмного забезпечення (наприклад, ICSE, FSE, ISSTA, ASE), і ви побачите безліч прикладів.


3

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

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

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


Це як генерувати алгоритми, використовуючи генетичну модель, правда? Чи знаєте ви про будь-які програми для сприяння розробці коду? Я думаю про те, щоб людина-машина працювала разом, а не суто машиною (модель, заснована на генетиці). Я знаю, що це може здатися специфічним, але я здебільшого цікавий, тому що я новачок у цій галузі.
— Чарльз

Звичайно, ви праві, я неправильно прочитав, я занадто рекурсивно думав над тим, як використовувати ML для того, щоб зробити ML :) #edited
— RJB

2

Отже, моє запитання полягає в тому, які дослідження були зроблені поки що щодо застосування машинного навчання до розробки коду? Як щодо налагодження?

Питання, пов'язане з цим, стосується методів машинного навчання для генерації та компіляції коду (оскільки ви могли уявити транспілятори та компілятори як спосіб автоматичного "розробки коду" - власне написання коду - з якоїсь мови вищого рівня).

Про це було декілька робіт, наприклад, MILEPOST GCC .

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

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


1

В останній статті в повідомленнях АСМ про заробляння грошей за допомогою математики Ерік Мейєр цитував Джеффа Діна, старшого наукового співробітника Google, Група з систем та інфраструктури:

Якби Google сьогодні був створений з нуля, велика частина цього буде вивчена, а не закодована.

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

Як приклад у статті йдеться про WebPPL, ймовірнісне програмування для Інтернету .


0

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


0

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

Як бачите, люди намагаються застосувати машинне навчання до кодування, але завжди в дуже вузьких областях, а не лише в машині, яка може обробляти всі способи кодування або налагодження.
Решта цієї відповіді зосереджена на вашій відносно широкій області «налагодження» машини, і чому цього ще не було зроблено на спробах (наскільки показує моє дослідження з цієї теми).


Я відредагував довгу частину відповіді. Підводячи підсумок (це важливо для наступної частини): виконуючи діючу методологію машинного навчання, все, чому людина може навчитися, також може і машина. Нас обмежує лише фізична область (швидкість процесора, розмір машини, ...), а не передбачувана обмеженість застосування самого алгоритму навчання.

які дослідження були зроблені поки що щодо застосування машинного навчання до розробки коду? Як щодо налагодження?

Проблема тут не в тому, що це неможливо, а в тому, що це надзвичайно складна тема.

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

За відсутності об'єктивної міри правильності та неправильності, як ми зможемо дати машині позитивний / негативний зворотний зв’язок, щоб він навчився?
У кращому випадку ми можемо багато людей висловити власну думку машині ("це хороший / поганий код"), а результат машини буде "середньою думкою". Але це не обов’язково те саме, що правильне рішення . Це може бути, але це не гарантовано.

По-друге, для налагодження, зокрема, важливо визнати, що конкретні розробники схильні до введення конкретного типу помилки / помилки. На характер помилки може в деяких випадках впливати розробник, який її ввів.

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

Чи може машина це навчитися? Чи можна зрозуміти, що розширення A швидше зіпсує конфігурацію, а dev B швидше зіпсує запит LINQ? Звичайно, це може. Як я вже говорив раніше, все, чому людина може навчитися, може і машина.
Однак як ви знаєте, що ви навчили машині повного спектру можливостей? Як ви можете коли-небудь надати йому невеликий (тобто не глобальний) набір даних і знати, що він представляє весь спектр помилок? Або ви б замість цього створили конкретні налагоджувачі, щоб допомогти певним розробникам / компаніям, а не створювати налагоджувач, який є універсальним для використання?

Просити налагодженого на машині налагоджувача - це як просити машинознавчого Шерлока Холмса. Це неможливо неможливо створити, але часто основна аргументація бути налагоджувачем / Шерлок залежить від суб'єктивних оцінок, які залежать від предмета до теми та стосуються неймовірно широкого спектру знань / можливих недоліків.
Відсутність швидко доказових правильних / неправильних результатів ускладнює легко навчати машині та перевіряти, чи добре вона прогресує.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.