Uczenie maszynowe stosowane do rozwoju kodu


17

Mam doświadczenie w inżynierii mechanicznej, więc proszę wybaczyć moją ignorancję w tym obszarze.

Naprawdę lubię programować i rozwijać oprogramowanie. Niedawno wziąłem także udział w darmowym kursie Machine Learning (ML), który gorąco polecam, prowadzony przez profesora Stanforda Andrew Ng. Link tutaj .

Słyszałem, jak profesor powiedział, że trudno jest znaleźć obszary, na które ML nigdy nie wpłynie.

Pytanie

Moje pytanie brzmi: jakie badania przeprowadzono do tej pory w zastosowaniu uczenia maszynowego do tworzenia kodu? Co powiesz na debugowanie?

Jeśli to możliwe, proszę podać zasoby / źródła / artykuły naukowe.

Nie miałem szczęścia, szukając tego, ponieważ często wyszukiwanie ML i rozwój oprogramowania (lub programowanie) kończy się prowadzeniem do rozwoju oprogramowania (lub programowania) aplikacji ML.


Czy masz pytanie dotyczące kodu, który pisze kod, czy pytasz o techniki kodowania w celu wdrożenia uczenia maszynowego?
Robert Harvey,

Kod (kod ML), który zapisuje kod, poprawia kod lub sprawdza błędy w kodzie (czy to w przypadku tworzenia stron internetowych, rozwiązywania numerycznego itp.). Nie techniki wdrażania uczenia maszynowego.
Charles

Nie znaczy to, że tak się nigdy nie stanie, ale języki programowania wysokiego poziomu zostały zaprojektowane, aby ułatwić ludziom instrukcje komputerowe z powolnymi chemicznie aktywowanymi jednostkami sterującymi. Na najbardziej podstawowym poziomie ML to maszyny określające, co maszyny powinny zrobić. W przyszłości języki zaprojektowane dla miękkich worków na wodę będą tak samo niepotrzebne, jak ludzie.
JimmyJames,

To pytanie należy przenieść na stronę sztucznej inteligencji. Czy osoby, które głosowały za głosowaniem, powiedzą nam dlaczego?
kwintumnia

To naprawdę fajne pytanie!
Rhys Johns

Odpowiedzi:


6

Fuzzing to metoda testowania, w której można i zastosowano uczenie maszynowe. Fuzzing to metoda testowania w dziedzinie automatycznych testów eksploracyjnych. Próbuje znaleźć defekty w oprogramowaniu, uruchamiając dużą liczbę danych wejściowych i szukając błędów. Nieobsługiwane wyjątki są najprostszą kategorią, ale inteligentna implementacja może wykorzystywać ML do wyszukiwania podejrzanych wyników. ML jest jednak w dużej mierze wykorzystywany w tej dziedzinie, aby jednak proces był bardziej wydajny. Działa to przy użyciu ML, aby uniknąć testowania każdego możliwego wkładu poprzez szkolenie na temat „interesujących” wkładów. (Dis-podobne dane wejściowe, które mogą powodować awarię).


Ciekawy. Więc ten rodzaj należy do kategorii testowania kodu, prawda? Bardziej podoba mi się odpowiedź RJB, ponieważ dotyczy ona programowania, a nie testowania. Ale testowanie / debugowanie jest z pewnością nadal przydatne.
Charles

Tak. Zdecydowanie znajduje się w dziedzinie testowania i mało osób go wypróbowało, ale nabiera tempa tak realnej techniki, jak przetwarzanie w chmurze staje się coraz bardziej normalne. Łatwiej jest zdobyć klaster maszyn, przeprowadzić testy przez tydzień, a następnie odrzucić klaster do następnego razu.
RubberDuck,

4

Tak. Ten obszar jest teraz gorący. Nazywa się to „dużym kodem”, a DARPA włożyła w to 40 milionów dolarów: http://www.darpa.mil/program/mining-and-understanding-software-enclaves . Z tego grantu wyszły imponujące wyniki, takie jak systemy Proroka i Genesis w Fan Long, które mogą automatycznie naprawiać błędy w programach, wykorzystując wyuczony model poprawek. Martin Vechev i jego uczeń Veselin Raychev również byli pionierami w tej dziedzinie. Być może ich najbardziej imponującym wynikiem jest JSNice ( http://jsnice.org/ ), który może „zminimalizować kod JavaScript.

Ogólnie rzecz biorąc, idea dużego kodu nie spełniła swojej obietnicy: dane są zbyt rzadkie, aby nauczyć się czegoś znacznie bardziej interesującego niż nazwy zmiennych. Chociaż nadal jestem częściowo finansowany z tego programu DARPA, moje laboratorium w większości przestało nad nim pracować. W związku z tym ostatnią rzeczą, którą usłyszałem o DeepCoder, jest to, że uzyskuje dość żałosne wyniki w porównaniu do najnowocześniejszych metod syntezy programów.

Najbardziej skuteczne narzędzia do automatycznego programowania nadal polegają na metodach innych niż ML, takich jak solvery SMT. Zapoznaj się z przebiegiem każdej konferencji PL (np .: PLDI, POPL, OOPSLA) lub dowolnej akademickiej konferencji inżynierii oprogramowania (np .: ICSE, FSE, ISSTA, ASE), a zobaczysz wiele przykładów.


3

Microsoft opracowuje DeepCoder do głębokiego uczenia się, aby przewidzieć treść metody na podstawie danych wejściowych i wyjściowych. To jedyny znany mi przykład.

Mogę powiedzieć, że programowanie meta-genetyczne jest dziedziną badań o podobnych ambicjach, ale nie mogę powiedzieć, że wiem wystarczająco dużo na ten temat, aby mieć wiedzę.

Programowanie genetyczne pojawiło się w wiadomościach w 2015 r., Kiedy muScalpel opracował rozwiązanie do przeszczepiania funkcji z jednego programu do drugiego, wykorzystując testy jednostkowe dla obu jako rodzaj zestawu szkoleniowego.


To jest jak generowanie algorytmów przy użyciu modelu genetycznego, prawda? Czy znasz jakieś aplikacje wspomagające tworzenie kodu? Myślę o współpracy człowieka z maszyną, a nie wyłącznie maszynie (model oparty na genetyce). Wiem, że to może brzmieć specyficznie, ale jestem głównie ciekawy, ponieważ jestem nowy w tej dziedzinie.
Charles

Pewnie masz rację, źle odczytałem, zbyt rekurencyjnie myślałem o użyciu ML do robienia ML :) #edytowano
RJB

2

Moje pytanie brzmi: jakie badania przeprowadzono do tej pory w zastosowaniu uczenia maszynowego do tworzenia kodu? Co powiesz na debugowanie?

Powiązane pytanie dotyczy technik uczenia maszynowego do generowania i kompilacji kodu (ponieważ można sobie wyobrazić transpilatory i kompilatory jako sposób automatycznego „rozwijania kodu” - w rzeczywistości pisania kodu - z języka wyższego poziomu).

Było na ten temat kilka artykułów, na przykład MILEPOST GCC .

Możesz także znaleźć artykuły na temat technik uczenia maszynowego do debugowania lub analizy statycznego kodu źródłowego (lub dowolnego rodzaju analizy statycznej programu ).

Zobacz także blog J.Pitrat na temat sztucznej inteligencji inicjującej, która jest związana z twoim pytaniem.


1

W ostatnim artykule w Komunikacie ACM na temat zarabiania pieniędzy za pomocą matematyki Erik Meijer zacytował Jeffa Deana, starszego członka Google, Systems and Infrastructure Group:

Gdyby dziś Google stworzono od zera, wiele z nich można by się nauczyć, a nie zakodować.

Artykuł zawiera przegląd ostatnich działań w dziedzinie badań. Jest za ścianą płatną, ale warto ją przeczytać, jeśli jesteś zainteresowany teoretycznymi podobieństwami między kodowaniem a uczeniem maszynowym / statystykami. Może lista referencyjna na końcu artykułu może być również pomocna.

Jako przykład artykuł odnosi się do WebPPL, programowania probabilistycznego w Internecie .



0

Znalazłem dość obszerną listę lektur na wszystkie tematy związane z uczeniem maszynowym związanym z kodowaniem .

Jak widać, ludzie próbują zastosować uczenie maszynowe do kodowania, ale zawsze w bardzo wąskich dziedzinach, nie tylko maszynie, która może obsłużyć wszystkie rodzaje kodowania lub debugowania.
Pozostała część odpowiedzi skupia się na twojej stosunkowo szerokiej maszynie do „debugowania” i dlaczego tak naprawdę nie została jeszcze podjęta próba (o ile pokazują moje badania na ten temat).


Zredagowałem długą część odpowiedzi. Podsumowując (ważne w następnej części): postępując zgodnie z obecną metodologią uczenia maszynowego, wszystko, czego człowiek może się nauczyć, może także maszyna. Ogranicza nas jedynie sfera fizyczna (szybkość procesora, wielkość maszyny, ...), a nie domniemana ograniczona możliwość zastosowania samego algorytmu uczenia się.

jakie badania przeprowadzono dotychczas w zakresie zastosowania uczenia maszynowego do opracowywania kodu? Co powiesz na debugowanie?

Nie chodzi tu o to, że jest to niemożliwe, ale o to, że jest to niezwykle złożony temat.

Ludzie nawet nie zbliżyli się do zdefiniowania uniwersalnego standardu kodowania, z którym wszyscy się zgadzają. Nawet najszerzej uzgodnione zasady, takie jak SOLID, są nadal źródłem dyskusji na temat tego, jak głęboko należy je wdrożyć. Ze względów praktycznych nie jest możliwe całkowite przestrzeganie SOLID, chyba że masz jakiekolwiek ograniczenia finansowe (lub czasowe); co po prostu nie jest możliwe w sektorze prywatnym, w którym następuje największy rozwój. SOLID jest wytyczną, a nie twardym limitem.

W przypadku braku obiektywnej miary dobra i zła, w jaki sposób będziemy w stanie przekazać maszynie pozytywne / negatywne informacje zwrotne, aby mogła się uczyć?
W najlepszym wypadku możemy sprawić, że wiele osób wyrazi swoją opinię na temat maszyny („to jest dobry / zły kod”), a wynik maszyny będzie wtedy „przeciętną opinią”. Ale to niekoniecznie to samo, co prawidłowe rozwiązanie . Może być, ale nie ma takiej gwarancji.

Po drugie, szczególnie w przypadku debugowania ważne jest, aby pamiętać, że konkretni programiści są skłonni do wprowadzania określonego rodzaju błędu / pomyłki. Na charakter błędu może w niektórych przypadkach wpływać programista, który go wprowadził.

Na przykład, ponieważ często jestem zaangażowany w naprawianie błędów w cudzym kodzie w pracy, mam pewien rodzaj błędu, który każdy programista może popełnić. Biorąc pod uwagę pewien problem, wiem, że dev A może zapomnieć o aktualizacji pliku konfiguracyjnego, podczas gdy dev B często pisze złe zapytania LINQ. W zależności od dewelopera mogę najpierw spojrzeć na plik konfiguracyjny lub LINQ.
Podobnie, pracowałem teraz w kilku firmach jako konsultant i wyraźnie widzę, że rodzaje błędów mogą być stronnicze w stosunku do niektórych rodzajów firm. Nie jest to trudna i szybka zasada, którą mogę jednoznacznie wskazać, ale istnieje wyraźny trend.

Czy maszyna może się tego nauczyć? Czy może zdawać sobie sprawę, że dev A może zepsuć konfigurację, a dev B może zepsuć zapytanie LINQ? Oczywiście że tak. Jak powiedziałem wcześniej, wszystko, czego człowiek może się nauczyć, może także maszyna.
Skąd jednak wiesz, że nauczyłeś maszynę pełnego zakresu możliwości? Jak możesz kiedykolwiek dostarczyć mu niewielki (tj. Nie globalny) zestaw danych i wiedzieć, że reprezentuje on pełne spektrum błędów? A może zamiast tego stworzyłbyś konkretne debuggery, aby pomóc konkretnym programistom / firmom, zamiast tworzyć debuger, który byłby uniwersalnie użyteczny?

Pytanie o uczonego maszynowo debuggera jest jak proszenie o uczonego maszynowo Sherlocka Holmesa. Stworzenie takiego nie jest niemożliwe, ale często głównym powodem debuggera / Sherlocka są subiektywne oceny, które różnią się w zależności od tematu i dotyczą niewiarygodnie szerokiej gamy wiedzy / możliwych wad.
Brak szybko dających się udowodnić poprawnych / niepoprawnych wyników utrudnia łatwe nauczenie maszyny i sprawdzenie, czy robi dobre postępy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.