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


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.