การเรียนรู้ของเครื่องนำไปใช้กับการพัฒนารหัส


17

พื้นหลังของฉันอยู่ในงานวิศวกรรมเครื่องกลดังนั้นโปรดให้อภัยความไม่รู้ของฉันไปยังพื้นที่นี้

ฉันสนุกกับการเขียนโปรแกรมและการพัฒนาซอฟต์แวร์ นอกจากนี้เมื่อเร็ว ๆ นี้ฉันเข้าเรียน Machine Machine (ML) ออนไลน์ฟรีซึ่งฉันขอแนะนำเป็นอย่างยิ่ง เชื่อมโยงที่นี่

ฉันเคยได้ยินอาจารย์คนนี้พูดว่ามันยากที่จะหาพื้นที่ที่ ML จะไม่ส่งผลกระทบ

คำถาม

ดังนั้นคำถามของฉันคือการวิจัยอะไรที่ได้ทำไปแล้วในการนำการเรียนรู้ของเครื่องไปใช้ในการพัฒนาโค้ด? วิธีการเกี่ยวกับการแก้จุดบกพร่อง?

โปรดระบุแหล่งข้อมูล / แหล่งที่มา / เอกสารทางวิทยาศาสตร์หากเป็นไปได้

ฉันไม่ได้โชคดีที่ค้นหาสิ่งนี้เพราะบ่อยครั้งที่การค้นหา ML และการพัฒนาซอฟต์แวร์ (หรือการเขียนโปรแกรม) สิ้นสุดลงนำไปสู่ผลลัพธ์ในการพัฒนาซอฟต์แวร์ (หรือการเขียนโปรแกรม) ของแอปพลิเคชัน ML


คำถามของคุณเกี่ยวกับรหัสที่เขียนรหัสหรือคุณถามเกี่ยวกับเทคนิคการเขียนโค้ดเพื่อใช้การเรียนรู้ของเครื่อง?
Robert Harvey

รหัส (รหัส ML) ที่เขียนรหัสหรือปรับปรุงรหัสหรือตรวจสอบข้อผิดพลาดในรหัส (ไม่ว่าจะเป็นการพัฒนาเว็บไซต์การแก้ปัญหาเชิงตัวเลข ฯลฯ ) ไม่ใช่เทคนิคสำหรับการนำการเรียนรู้ของเครื่องไปใช้
ชาร์ลส์

อย่าบอกว่าสิ่งนี้จะไม่เกิดขึ้น แต่ภาษาการเขียนโปรแกรมระดับสูงได้รับการออกแบบมาเพื่อให้การสอนคอมพิวเตอร์ง่ายขึ้นสำหรับคนที่มีชุดควบคุมที่เปิดใช้งานทางเคมีช้า ในระดับพื้นฐานที่สุด ML คือเครื่องจักรที่กำหนดว่าเครื่องควรทำอะไร ในอนาคตภาษาที่ออกแบบมาสำหรับถุงน้ำที่มีความนุ่มจะไม่จำเป็นสำหรับมนุษย์
JimmyJames

คำถามนี้ควรจะถูกโยกย้ายไปยังไซต์ปัญญาประดิษฐ์ผู้ที่ได้รับการโหวตบอกเราทำไม?
quintumnia

นี่เป็นคำถามที่ยอดเยี่ยมจริงๆ!
ริสจอห์น

คำตอบ:


6

Fuzzingเป็นวิธีการทดสอบที่สามารถเรียนรู้และใช้งานเครื่องได้ Fuzzing เป็นวิธีการทดสอบในขอบเขตของการทดสอบเชิงสำรวจอัตโนมัติ จะพยายามค้นหาข้อบกพร่องในซอฟต์แวร์โดยใช้อินพุตจำนวนมากและค้นหาข้อผิดพลาด ข้อยกเว้นที่ไม่สามารถจัดการได้เป็นหมวดหมู่ที่ง่ายที่สุด แต่การใช้งานอย่างชาญฉลาดสามารถใช้ ML เพื่อค้นหาผลลัพธ์ที่น่าสงสัย ML ส่วนใหญ่จะใช้ในโดเมนนี้เพื่อให้กระบวนการมีประสิทธิภาพมากขึ้น สิ่งนี้ทำงานโดยใช้ ML เพื่อหลีกเลี่ยงการทดสอบอินพุตที่เป็นไปได้ทั้งหมดโดยการฝึกอบรมเกี่ยวกับอินพุต "น่าสนใจ" (อินพุตไม่เหมือนกันซึ่งมีแนวโน้มว่าจะทำให้เกิดความล้มเหลว)


น่าสนใจ ดังนั้นการตกอยู่ในหมวดหมู่ของการทดสอบโค้ดใช่ไหม? ฉันชอบคำตอบของ RJB มากกว่านี้เพราะเกี่ยวข้องกับการพัฒนามากกว่าการทดสอบ แต่การทดสอบ / แก้ไขข้อบกพร่องยังคงมีประโยชน์อย่างแน่นอน
ชาร์ลส์

ใช่. แน่นอนว่ามันอยู่ในขอบเขตการทดสอบและมีคนไม่มากพอที่จะลองใช้ แต่ได้รับแรงผลักดันว่าเป็นเทคนิคที่ใช้งานได้เมื่อคอมพิวเตอร์คลาวด์กลายเป็นปกติมากขึ้น การทำให้กลุ่มเครื่องเป็นเรื่องง่ายขึ้นให้ทำการทดสอบเป็นเวลาหนึ่งสัปดาห์จากนั้นทิ้งกลุ่มจนกว่าจะถึงครั้งต่อไป
RubberDuck

4

ใช่. บริเวณนี้อากาศร้อนตอนนี้ มันเรียกว่า "รหัสใหญ่" และ DARPA ใส่ $ 40 ล้านบาทเป็นมัน: http://www.darpa.mil/program/mining-and-understanding-software-enclaves ผลลัพธ์ที่น่าประทับใจบางอย่างได้มาจากการบริจาคนี้เช่นระบบศาสดาและเจเนซิสของ Fan Long ซึ่งสามารถแก้ไขข้อบกพร่องในโปรแกรมโดยอัตโนมัติโดยใช้โมเดลการเรียนรู้ของแพทช์ที่ถูกต้อง มาร์ติน Vechev และนักเรียนของเขา Veselin Raychev ยังเป็นผู้บุกเบิกในพื้นที่นี้ บางทีผลลัพธ์ที่น่าประทับใจที่สุดคือ JSNice ( http://jsnice.org/ ) ซึ่งสามารถ "ลดรหัส JavaScript ได้

โดยรวมแล้วความคิดของโค้ดขนาดใหญ่นั้นไม่ได้ขึ้นอยู่กับคำสัญญา: ข้อมูลนั้นเบาบางเกินไปที่จะเรียนรู้สิ่งที่น่าสนใจกว่าชื่อตัวแปร ในขณะที่ฉันยังได้รับเงินสนับสนุนบางส่วนจากโปรแกรม DARPA นี้แล็บของฉันส่วนใหญ่หยุดทำงาน ในบันทึกนั้นสิ่งสุดท้ายที่ฉันได้ยินเกี่ยวกับ DeepCoder คือมันได้ผลลัพธ์ที่น่าสมเพชค่อนข้างเมื่อเทียบกับสถานะของศิลปะในการสังเคราะห์โปรแกรม

เครื่องมือที่ประสบความสำเร็จส่วนใหญ่สำหรับการเขียนโปรแกรมอัตโนมัติยังคงใช้วิธีการที่ไม่ใช่ ML เช่นตัวแก้ปัญหา SMT ดูการประชุมของการประชุม PL (เช่น PLDI, POPL, OOPSLA) หรือการประชุมวิศวกรรมซอฟต์แวร์ทางวิชาการ (เช่น ICSE, FSE, ISSTA, ASE) และคุณจะเห็นตัวอย่างมากมาย


3

Microsoft ได้พัฒนาDeepCoderเพื่อใช้การเรียนรู้อย่างลึกซึ้งในการทำนายเนื้อความของเมธอดจากอินพุตและเอาต์พุตที่กำหนด นั่นเป็นเพียงตัวอย่างเดียวที่ฉันรู้ทันที

ฉันสามารถบอกคุณได้ว่าการเขียนโปรแกรม Meta-Geneticเป็นสาขาของการศึกษาที่มีความใฝ่ฝันที่คล้ายกัน แต่ฉันไม่สามารถพูดได้ว่าฉันรู้เพียงพอเกี่ยวกับเรื่องนี้ที่จะมีความรู้

การเขียนโปรแกรมทางพันธุกรรมเป็นข่าวในปี 2015 เมื่อmuScalpelพัฒนาวิธีการปลูกถ่ายคุณลักษณะจากโปรแกรมหนึ่งไปยังอีกโปรแกรมหนึ่งโดยใช้การทดสอบหน่วยสำหรับทั้งชุดฝึกอบรม


นี่เหมือนกับการสร้างอัลกอริทึมโดยใช้แบบจำลองทางพันธุกรรมใช่ไหม คุณรู้จักแอพพลิเคชั่นใด ๆ ในการพัฒนาโค้ดหรือไม่? ฉันกำลังคิดว่าเครื่องจักรของมนุษย์ทำงานร่วมกันแทนที่จะขับเคลื่อนด้วยเครื่องจักรล้วนๆ ฉันรู้ว่านี่อาจฟังดูเฉพาะ แต่ฉันส่วนใหญ่อยากรู้อยากเห็นเพราะฉันใหม่ในพื้นที่นี้
Charles

แน่ใจว่าคุณกำลังขวาฉันผิดฉันคิดซ้ำมากเกินไปเกี่ยวกับการใช้ ML จะทำ ML :) #edited
RJB

2

ดังนั้นคำถามของฉันคือการวิจัยอะไรที่ได้ทำไปแล้วในการนำการเรียนรู้ของเครื่องไปใช้ในการพัฒนาโค้ด? วิธีการเกี่ยวกับการแก้จุดบกพร่อง?

คำถามที่เกี่ยวข้องกับเทคนิคการเรียนรู้ของเครื่องสำหรับการสร้างรหัสและการคอมไพล์ (เนื่องจากคุณสามารถจินตนาการถึงทรานสฟิลเลอร์และคอมไพเลอร์เป็นวิธีในการ "พัฒนารหัส" โดยอัตโนมัติ - การเขียนโค้ด - จากภาษาระดับสูงกว่า)

มีการเอกสารหลายประการเกี่ยวกับว่าตัวอย่างเช่นMILEPOST GCC

นอกจากนี้คุณยังสามารถ google สำหรับเอกสารเกี่ยวกับเทคนิคการเรียนรู้ของเครื่องจักรสำหรับการดีบักหรือการวิเคราะห์ซอร์สโค้ดแบบคงที่ (หรือการวิเคราะห์โปรแกรมแบบคงที่ชนิดใดก็ได้ )

ดูบล็อกของ J.Pitrat เรื่องปัญญาประดิษฐ์การบูตสแตรปซึ่งเกี่ยวข้องกับคำถามของคุณ


1

ในบทความล่าสุดใน Communications of ACM เกี่ยวกับการทำเงินโดยใช้คณิตศาสตร์ Erik Meijer อ้างถึง Jeff Dean, Google Senior Fellow, ระบบและกลุ่มโครงสร้างพื้นฐาน:

หาก Google ถูกสร้างขึ้นตั้งแต่เริ่มต้นวันนี้ส่วนมากจะได้รับการเรียนรู้ไม่ใช่รหัส

บทความนี้ให้ภาพรวมเกี่ยวกับกิจกรรมล่าสุดในสาขาการวิจัย มันอยู่เบื้องหลังกำแพงการจ่ายเงิน แต่อาจคุ้มค่าในการอ่านหากคุณสนใจในแนวทฤษฎีระหว่างการเข้ารหัสและการเรียนรู้ / สถิติของเครื่อง บางทีรายการอ้างอิงท้ายบทความอาจมีประโยชน์เช่นกัน

ตัวอย่างเช่นบทความหมายถึงWebPPL โปรแกรมน่าจะเป็นสำหรับเว็บ


0

นี่คือกรณีการใช้งานอย่างหนึ่งในการใช้การเรียนรู้ของเครื่องในการดีบักไมโครไซต์ ฉันบันทึกความพยายามในการวิเคราะห์ข้อมูลประสิทธิภาพการทำงานของ microservice ด้วยการเรียนรู้ของเครื่องโดยที่ฉันฝึกอบรมต้นไม้ตัดสินใจจากข้อมูลประสิทธิภาพที่รวบรวมจากการทดสอบโหลดไมโครบริการจากนั้นศึกษาต้นไม้ที่ให้ข้อมูลเชิงลึกเกี่ยวกับปัญหาสิ่งแวดล้อมและช่วยฉันวินิจฉัยและแก้ไขข้อบกพร่อง


0

ผมพบว่าค่อนข้างรายการอ่านอย่างกว้างขวางในทุกการเข้ารหัสที่เกี่ยวข้องกับหัวข้อการเรียนรู้เครื่อง

อย่างที่คุณเห็นผู้คนพยายามใช้การเรียนรู้ของเครื่องกับการเข้ารหัส แต่มักจะอยู่ในเขตแคบ ๆ ไม่ใช่เฉพาะเครื่องที่สามารถจัดการการเข้ารหัสหรือการดีบักได้ทุกรูปแบบ
ส่วนที่เหลือของคำตอบนี้จะเน้นไปที่เครื่อง "ดีบั๊ก" ในขอบเขตที่ค่อนข้างกว้างของคุณและสาเหตุที่ยังไม่ได้รับการทดลองจริง ๆ (เท่าที่งานวิจัยของฉันแสดงให้เห็นในหัวข้อ)


ฉันแก้ไขส่วนที่มีความยาวของคำตอบอีกครั้ง เพื่อสรุป (เป็นสิ่งสำคัญสำหรับส่วนถัดไป): ดำเนินการตามวิธีการเรียนรู้ของเครื่องจักรในปัจจุบันทุกสิ่งที่มนุษย์สามารถเรียนรู้ได้เครื่องจักรก็สามารถทำได้เช่นกัน เราถูก จำกัด ด้วยขอบเขตทางกายภาพเท่านั้น (ความเร็ว CPU, ขนาดของเครื่อง, ... ) ไม่ใช่การบังคับใช้ขั้นตอนวิธีการเรียนรู้ที่ จำกัด อย่างแน่นอน

มีการวิจัยอะไรบ้างที่นำการเรียนรู้ของเครื่องไปใช้ในการพัฒนาโค้ด วิธีการเกี่ยวกับการแก้จุดบกพร่อง?

ปัญหาที่นี่ไม่ได้เป็นไปไม่ได้ แต่เป็นเรื่องที่ซับซ้อนอย่างเหลือเชื่อ

มนุษย์ไม่ได้เข้ามาใกล้เพื่อกำหนดมาตรฐานการเข้ารหัสสากลที่ทุกคนเห็นด้วย แม้แต่หลักการที่ตกลงกันอย่างกว้างขวางที่สุดอย่างเช่น SOLID ก็ยังเป็นแหล่งข้อมูลสำหรับการอภิปรายว่าจะต้องนำไปปฏิบัติอย่างไร สำหรับจุดประสงค์ในทางปฏิบัติทุกประการคุณไม่สามารถปฏิบัติตาม SOLID ได้อย่างสมบูรณ์เว้นแต่คุณจะไม่มีข้อ จำกัด ด้านการเงิน (หรือเวลา) ใด ๆ ซึ่งเป็นไปไม่ได้ในภาคเอกชนที่การพัฒนาส่วนใหญ่เกิดขึ้น SOLID เป็นแนวทางไม่ใช่ข้อ จำกัด อย่างหนัก

หากไม่มีการวัดวัตถุประสงค์ที่ถูกและผิดเราจะสามารถให้เครื่องตอบรับเชิงบวก / ลบเพื่อให้เรียนรู้ได้อย่างไร
ที่ดีที่สุดเราสามารถมีคนจำนวนมากให้ความเห็นของตัวเองกับเครื่อง ("นี่คือรหัสที่ดี / ไม่ดี") และผลลัพธ์ของเครื่องจะเป็น "ความเห็นเฉลี่ย" แต่นั่นไม่จำเป็นต้องเหมือนกับโซลูชันที่ถูกต้องวิธีการแก้ปัญหาที่ถูกต้องอาจเป็นไปได้ แต่ไม่รับประกันว่าจะเป็น

ประการที่สองสำหรับการดีบักโดยเฉพาะเป็นสิ่งสำคัญที่ต้องยอมรับว่านักพัฒนาเฉพาะมีแนวโน้มที่จะแนะนำข้อผิดพลาดประเภท / ข้อผิดพลาดเฉพาะ ธรรมชาติของความผิดพลาดในบางกรณีอาจได้รับอิทธิพลจากผู้พัฒนาที่นำมาใช้

ตัวอย่างเช่นเมื่อฉันมีส่วนร่วมในการแก้ไขข้อผิดพลาดของรหัสของผู้อื่นในที่ทำงานฉันมีความคาดหวังว่าผู้พัฒนาแต่ละคนจะทำผิดพลาดประเภทใด ด้วยปัญหาบางอย่างฉันรู้ว่า dev A น่าจะลืมอัปเดตไฟล์ปรับแต่งในขณะที่ dev B มักจะเขียนคำสั่ง LINQ ที่ไม่ดี จากนักพัฒนาฉันอาจมองไปที่ไฟล์ปรับแต่งหรือ LINQ ก่อน
ในทำนองเดียวกันฉันได้ทำงานกับ บริษัท หลายแห่งในฐานะที่ปรึกษาในตอนนี้และฉันสามารถเห็นได้อย่างชัดเจนว่าข้อบกพร่องประเภทต่างๆสามารถมีอคติต่อ บริษัท บางประเภทได้ ไม่ใช่กฎที่ยากและรวดเร็วที่ฉันสามารถชี้ให้เห็นอย่างชัดเจน แต่ก็มีแนวโน้มที่ชัดเจน

เครื่องเรียนรู้สิ่งนี้ได้ไหม? มันสามารถรู้ได้หรือไม่ว่า dev A มีแนวโน้มที่จะทำให้การกำหนดค่าล้มเหลวและ dev B นั้นมีแนวโน้มที่จะทำให้แบบสอบถาม LINQ สับสนมากขึ้นหรือไม่ แน่นอนมันสามารถ อย่างที่ฉันพูดไปก่อนหน้านี้ทุกอย่างที่มนุษย์เรียนรู้ได้เครื่องจักรก็เช่นกัน
อย่างไรก็ตามคุณจะรู้ได้อย่างไรว่าคุณได้สอนเครื่องจักรให้มีความเป็นไปได้อย่างเต็มรูปแบบ? คุณจะให้ชุดข้อมูลขนาดเล็ก (เช่นไม่ใช่ระดับโลก) และรู้ได้อย่างไรว่าเป็นชุดของข้อบกพร่องแบบเต็มรูปแบบ หรือคุณจะสร้าง debuggers ที่เฉพาะเจาะจงแทนเพื่อช่วยนักพัฒนา / บริษัท ที่เฉพาะเจาะจงแทนที่จะสร้างดีบักเกอร์ที่ใช้งานได้ในระดับสากลหรือไม่

การขอดีบักเกอร์ที่เรียนรู้ด้วยเครื่องเปรียบเสมือนการขอ Sherlock Holmes ที่เรียนรู้ด้วยเครื่อง มันเป็นไปไม่ได้ที่จะสร้างมันขึ้นมาไม่ได้ แต่บ่อยครั้งที่เหตุผลหลักในการเป็นผู้ดีบั๊ก / เชอร์ล็อคในการประเมินอัตนัยที่แตกต่างกันไปจากเรื่องหนึ่งไปยังอีกกลุ่มหนึ่งและสัมผัสกับความรู้ / ข้อบกพร่องต่างๆ
การขาดผลลัพธ์ที่ถูกต้อง / ไม่ถูกต้องที่พิสูจน์ได้อย่างรวดเร็วทำให้ยากที่จะสอนเครื่องจักรได้ง่ายและตรวจสอบว่ามีความก้าวหน้าที่ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.