Kod geliştirmeye uygulanan makine öğrenimi


17

Geçmişim makine mühendisliğindedir, bu yüzden lütfen bu bölgeye cehaletimi affet

Programlama ve yazılım geliştirmeyi gerçekten çok seviyorum. Ayrıca, kısa bir süre önce Stanford profesörü Andrew Ng tarafından öğretilen ücretsiz bir çevrimiçi Machine Learning (ML) dersi aldım. Buraya bağla .

Bu profesörün ML'nin asla etkilemeyeceği alanları bulmanın zor olduğunu söylediğini duydum.

Soru

Benim sorum şu ki, makine öğrenimini kod geliştirmeye uygulamak için şimdiye kadar hangi araştırmalar yapıldı? Hata ayıklamaya ne dersiniz?

Lütfen mümkünse kaynakları / kaynakları / bilimsel makaleleri ekleyin.

Bunu araştırmakta şansım olmadı, çünkü genellikle ML ve yazılım geliştirme (veya programlama) aramaları, ML uygulamalarının yazılım geliştirme (veya programlama) sonuçlarına yol açar.


Kod yazan kodla ilgili sorunuz mu var veya makine öğrenimini uygulamak için kodlama tekniklerini mi soruyorsunuz?
Robert Harvey

Kod yazan veya kodu geliştiren kod (ML kodu) veya koddaki hataları kontrol eder (web geliştirme, sayısal çözücü vb. İçin). Makine öğrenimini uygulama teknikleri değil.
Charles

Bunun asla gerçekleşmeyeceğini söylememekle birlikte, üst düzey programlama dilleri, yavaş kimyasal olarak aktive edilen kontrol üniteleri olan insanlar için bilgisayar talimatı vermeyi kolaylaştırmak için tasarlanmıştır. En temel düzeyde ML, makinelerin ne yapması gerektiğini belirleyen makinelerdir. Gelecekte, yumuşacık su poşetleri için tasarlanan diller insanların kendileri kadar gereksiz olacaktır.
JimmyJames

Bu sorunun Yapay Zeka sitesine taşınması gerekiyordu.Yüksek oy alanlar bize nedenini söyleyebilir mi ??
quintumnia

Bu gerçekten harika bir soru!
Rhys Johns

Yanıtlar:


6

Fuzzing , makine öğreniminin uygulanabildiği ve uygulandığı bir test yöntemidir. Fuzzing, otomatik keşif testi alanında bir test yöntemidir. Çok sayıda girdi çalıştırarak ve hata arayarak yazılımdaki hataları bulmaya çalışır. İşlenmeyen istisnalar en basit kategoridir, ancak akıllı bir uygulama şüpheli çıktıları bulmak için ML'yi kullanabilir. Bununla birlikte, ML bu alanda daha verimli olmak için kullanılır. Bu, "ilginç" girdiler üzerine eğitim vererek olası tüm girdileri test etmekten kaçınmak için ML kullanarak çalışır. (Arızaya neden olması muhtemel, benzer olmayan girişler.)


İlginç. Yani bu tür kod testi kategorisine giriyor, değil mi? Testten ziyade geliştirme ile ilgili olduğu için RJB'nin cevabını biraz daha seviyorum. Ancak test / hata ayıklama kesinlikle faydalıdır.
Charles

Evet. Kesinlikle test alanında ve yeterince insan denemedi, ancak bulut bilişim giderek daha normal hale geldikçe uygulanabilir bir teknik olarak ivme kazanıyor. Kendinize bir makine kümesi almak, bir hafta boyunca testler yapmak, ardından bir dahaki sefere kadar kümeyi atmak daha kolay hale gelir.
RubberDuck

4

Evet. Bu alan şu anda sıcak. Buna "büyük kod" denir ve DARPA buna 40 milyon dolar koymuştur: http://www.darpa.mil/program/mining-and-understanding-software-enclaves . Fan Long'un Peygamber ve Genesis sistemleri gibi, öğrenilen doğru yama modelini kullanarak programlardaki hataları otomatik olarak düzeltebilen bazı etkileyici sonuçlar ortaya çıktı. Martin Vechev ve öğrencisi Veselin Raychev de bu alanda öncü oldular. Belki de en etkileyici sonuçları "JavaScript kodunu en aza indirgeyebilen JSNice'dir ( http://jsnice.org/ ).

Genel olarak, büyük kod fikri vaadini yerine getirmedi: veriler, değişken isimlerden çok daha ilginç bir şey öğrenmek için çok seyrek. Hala bu DARPA programı tarafından finanse edilmekle birlikte, laboratuvarım çoğunlukla üzerinde çalışmayı bıraktı. Bu notta, DeepCoder hakkında son duyduğum şey, program sentezinde son teknoloji ile karşılaştırıldığında oldukça acıklı sonuçlar almasıdır.

Otomatik programlama için en başarılı araçlar hala SMT çözücüleri gibi ML olmayan yöntemlere dayanmaktadır. Herhangi bir PL konferansının (örneğin: PLDI, POPL, OOPSLA) veya herhangi bir akademik yazılım mühendisliği konferansının (örneğin: ICSE, FSE, ISSTA, ASE) işlemlerine bir göz atın ve çok sayıda örnek göreceksiniz.


3

Microsoft, belirli bir girdi ve çıktıdan bir yöntem gövdesi tahmin etmek için derin öğrenme kullanmak için DeepCoder geliştirmektedir . Bu hazırlıksız bildiğim tek örnek.

Ben söyleyebilirim Meta Genetik Programlama benzer hırsla bir çalışma alanıdır, ama ben bilgili olmak bu konuda yeterli bilgiye sahip diyemeyiz.

Genetik Programlama 2015 yılında muScalpel'in bir özelliği bir programdan diğerine nakletmek için bir çözüm geliştirdiği ve her ikisi için de bir tür eğitim seti olarak birim testlerini kullandığı haberlerde yer aldı .


Bu genetik bir model kullanarak algoritma üretmek gibi, değil mi? Kod geliştirmeye yardımcı olacak herhangi bir uygulama biliyor musunuz? Tamamen makine güdümlü (genetik tabanlı bir model) yerine insan-makine birlikte çalışmayı düşünüyorum. Bunun kulağa özgü gelebileceğini biliyorum, ama çoğunlukla merak ediyorum çünkü bu alanda yeniyim.
Charles

Tabii, haklısın, yanlış anladım, ML'yi ML yapmak için kullanmayla ilgili çok tekrarlı düşünüyordum :) #edited
RJB

2

Benim sorum şu ki, makine öğrenimini kod geliştirmeye uygulamak için şimdiye kadar hangi araştırmalar yapıldı? Hata ayıklamaya ne dersiniz?

İlgili bir soru, kod oluşturma ve derleme için makine öğrenimi teknikleri hakkındadır ( transpilleri ve derleyicileri , daha üst düzey bir dilden otomatik olarak "kod yazmanın" - kodu gerçekten yazmanın - bir yolu olarak hayal edebileceğiniz için).

Bu konuda birkaç makale var, örneğin MILEPOST GCC .

Ayrıca, hata ayıklama için makine öğrenme teknikleri hakkında makaleler veya statik kaynak kodu analizi (veya herhangi bir statik program analizi ) için google da yapabilirsiniz .

Ayrıca, sorunuzla ilgili J.Pitrat'ın yapay zeka önyükleme hakkındaki bloguna bakın .


1

ACM'nin Communications'da matematik kullanarak para kazanma ile ilgili yakın tarihli bir makalesinde Erik Meijer, Google Kıdemli Üyesi, Sistemler ve Altyapı Grubu Jeff Dean'den alıntı yaptı:

Google bugün sıfırdan oluşturulmuş olsaydı, çoğu kodlanmadan öğrenilirdi.

Makale, araştırma alanındaki son etkinlikler hakkında genel bir bakış sunmaktadır. Bir ödeme duvarının arkasındadır, ancak kodlama ve makine öğrenimi / istatistikleri arasındaki teorik paralelliklerle ilgileniyorsanız okumaya değer olabilir. Belki makalenin sonundaki referans listesi de yardımcı olabilir.

Örnek olarak makale web için olasılıksal programlama olan WebPPL ile ilgilidir .


0

Mikro hizmetlerde hata ayıklamak için makine öğrenimi kullanma konusunda bir kullanım örneği. Mikro hizmet performans verilerinin makine öğrenimi ile analiz edilmesinde bazı çabaları belgeledim ve burada bir mikro hizmetin yük testinden toplanan performans verilerinden bir karar ağacı yetiştirdim, daha sonra çevresel bir konu hakkında fikir veren ve bir performans hatasını teşhis etmeme ve düzeltmeme yardımcı olan ağacı inceledim.


0

Kodlamayla ilgili tüm makine öğrenimi konularında oldukça kapsamlı bir okuma listesi buldum .

Gördüğünüz gibi, insanlar kodlama için makine öğrenmesini uygulamaya çalışıyorlar, ama sadece her türlü kodlama veya hata ayıklamayı kaldırabilecek bir makine değil, her zaman çok dar alanlarda çalışıyorlar.
Bu yanıtın geri kalanı, nispeten geniş kapsamlı "hata ayıklama" makinenize ve bunun neden henüz gerçekten denenmediğine (konu hakkındaki araştırmamın gösterdiği gibi) odaklanıyor.


Cevabın uzun bir kısmını düzelttim. Özetlemek gerekirse (bir sonraki bölüm için önemlidir): mevcut makine öğrenme metodolojisine, bir insanın öğrenebileceği her şeye, bir makineye de gidebilirsiniz. Biz sadece öğrenme alanı algoritmasının kendisi için sınırlı bir uygulanabilirlik değil, fiziksel bölge (CPU hızı, bir makinenin boyutu, ...) ile sınırlıyız.

kod geliştirmeye makine öğrenmesini uygulamak için şimdiye kadar hangi araştırmalar yapıldı? Hata ayıklamaya ne dersiniz?

Buradaki mesele imkansız değil, aksine oldukça karmaşık bir konu.

İnsanlar herkesin hemfikir olduğu evrensel bir kodlama standardı tanımlamaya bile yaklaşmadılar. SOLID gibi en yaygın olarak üzerinde anlaşılan ilkeler bile, ne kadar derinlemesine uygulanması gerektiği konusunda hala bir tartışma kaynağıdır . Tüm pratik amaçlar için, herhangi bir mali (veya zaman) kısıtlamanız olmadığı sürece SOLID'e mükemmel bir şekilde uymak imkansızdır; bu da çoğu gelişmenin gerçekleştiği özel sektörde mümkün değil. SOLID zor bir sınır değil bir kılavuzdur.

Doğru ve yanlış için nesnel bir ölçüt olmadığında, öğrenmesi için bir makineye nasıl olumlu / olumsuz geribildirim verebiliriz?
En iyi ihtimalle, birçok kişinin makineye kendi fikirlerini vermesini sağlayabiliriz ("bu iyi / kötü kod") ve makinenin sonucu daha sonra "ortalama bir görüş" olacaktır. Ancak bu doğru bir çözümle aynı olmak zorunda değildir . Olabilir, ancak olması garanti edilmez.

İkincisi, özellikle hata ayıklama için, belirli geliştiricilerin belirli bir hata / hata türünü uygulamaya eğilimli olduklarını kabul etmek önemlidir. Hatanın doğası, bazı durumlarda, onu tanıtan geliştiriciden etkilenebilir.

Örneğin, sık sık işyerinde başkalarının kodunu düzeltmekle meşgul olduğum için, her geliştiricinin ne tür bir hata yapmaya eğilimli olduğuna dair bir beklentim var. Belirli bir sorun göz önüne alındığında, dev A'nın yapılandırma dosyasını güncellemeyi unutmasının muhtemel olduğunu biliyorum, oysa dev B genellikle kötü LINQ sorguları yazıyor. Geliştiriciye dayanarak, önce config dosyasına veya LINQ'ya bakabilirim.
Benzer şekilde, şu anda birkaç şirkette danışman olarak çalıştım ve hata türlerinin belirli şirket türlerine karşı önyargılı olabileceğini açıkça görebiliyorum. Kesin olarak işaret edebileceğim zor ve hızlı bir kural değil, ama kesin bir eğilim var.

Bir makine bunu öğrenebilir mi? Dev A'nın yapılandırmayı bozma ve dev B'nin LINQ sorgusunu bozma olasılığının daha yüksek olduğunu fark edebilir misiniz? Tabii ki yapabilir. Daha önce söylediğim gibi, bir insanın öğrenebileceği her şey, bir makine de yapabilir.
Ancak, makineye tüm olasılıkları öğrettiğinizi nasıl anlarsınız? Nasıl küçük (küresel değil) bir veri kümesi sağlayabilir ve hataların tüm spektrumunu temsil ettiği gerçeğini nasıl bilebilirsiniz? Veya evrensel olarak kullanılabilen bir hata ayıklayıcı oluşturmak yerine belirli geliştiricilere / şirketlere yardımcı olmak için belirli hata ayıklayıcılar oluşturmak ister misiniz?

Makine öğrenimli bir hata ayıklayıcı istemek, makine öğrenimli bir Sherlock Holmes istemek gibidir. Bir tane oluşturmak muhtemelen imkansız değildir, ancak genellikle bir hata ayıklayıcı / Sherlock olmanın temel mantığı, konudan özneye değişen ve inanılmaz derecede geniş bir bilgi / olası kusurlara dokunan öznel değerlendirmelere dayanır.
Hızla kanıtlanabilir doğru / yanlış sonuçların olmaması, bir makineye kolayca öğretmeyi ve iyi ilerleme kaydettiğini doğrulamayı zorlaştırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.