Học máy áp dụng cho phát triển mã


16

Nền tảng của tôi là về kỹ thuật cơ khí, vì vậy xin vui lòng tha thứ cho sự thiếu hiểu biết của tôi đối với lĩnh vực này.

Tôi thực sự thích lập trình và phát triển phần mềm. Ngoài ra, gần đây tôi đã tham gia một lớp học máy trực tuyến (ML) miễn phí, mà tôi rất khuyến khích, được giảng dạy bởi giáo sư Stanford Andrew Ng. Liên kết tại đây .

Tôi đã nghe giáo sư này nói rằng thật khó để tìm ra những khu vực mà ML sẽ không bao giờ tác động.

Câu hỏi

Vì vậy, câu hỏi của tôi là, nghiên cứu nào đã được thực hiện cho đến nay trong việc áp dụng học máy vào phát triển mã? Làm thế nào về gỡ lỗi?

Vui lòng bao gồm tài nguyên / nguồn / bài báo khoa học nếu có thể.

Tôi đã không may mắn tìm kiếm điều này bởi vì thường tìm kiếm ML phát triển phần mềm (hoặc lập trình) kết thúc dẫn đến kết quả trong việc phát triển phần mềm (hoặc lập trình) các ứng dụng ML.


Là câu hỏi của bạn về mã viết mã, hoặc bạn đang hỏi về các kỹ thuật mã hóa để thực hiện học máy?
Robert Harvey

Mã (mã ML) viết mã, hoặc cải thiện mã hoặc kiểm tra các lỗi trong mã (cho dù đó là để phát triển web, giải quyết số, v.v.). Không phải kỹ thuật để thực hiện học máy.
Charles

Không nói điều này sẽ không bao giờ xảy ra nhưng các ngôn ngữ lập trình cấp cao được thiết kế để giúp cho con người hướng dẫn sử dụng máy tính dễ dàng hơn với các đơn vị điều khiển kích hoạt hóa học chậm. Ở cấp độ cơ bản nhất, ML là máy xác định máy móc nên làm gì. Trong tương lai, các ngôn ngữ được thiết kế cho túi nước squishy sẽ không cần thiết như chính con người.
JimmyJames

Câu hỏi này được cho là sẽ được chuyển sang trang Trí tuệ nhân tạo. Những người đã bỏ phiếu cho chúng tôi biết lý do ??
quintumnia

Đây thực sự là một câu hỏi thực sự hay!
Rhys Johns

Câu trả lời:


6

Fuzzing là một phương pháp thử nghiệm trong đó máy học có thể & đã được áp dụng. Fuzzing là một phương pháp thử nghiệm trong lĩnh vực thử nghiệm thăm dò tự động. Nó cố gắng tìm lỗi trong phần mềm bằng cách chạy một số lượng lớn đầu vào và tìm kiếm lỗi. Các ngoại lệ chưa được xử lý là loại đơn giản nhất, nhưng một triển khai thông minh có thể sử dụng ML để tìm đầu ra nghi ngờ. ML được sử dụng chủ yếu trong lĩnh vực này để làm cho quá trình hiệu quả hơn. Điều này hoạt động bằng cách sử dụng ML để tránh kiểm tra mọi đầu vào có thể bằng cách đào tạo về các đầu vào "thú vị". (Đầu vào không giống nhau có khả năng gây ra lỗi.)


Hấp dẫn. Vì vậy, loại này rơi vào thể loại thử nghiệm mã, phải không? Tôi thích câu trả lời của RJB hơn một chút, vì nó liên quan đến sự phát triển, thay vì thử nghiệm. Nhưng kiểm tra / gỡ lỗi chắc chắn vẫn hữu ích.
Charles

Vâng. Nó chắc chắn trong lĩnh vực thử nghiệm, và không đủ người đã thử nó, nhưng nó đạt được động lực là kỹ thuật khả thi khi điện toán đám mây ngày càng trở nên bình thường. Việc kiếm cho mình một cụm máy trở nên dễ dàng hơn, chạy thử nghiệm trong một tuần, sau đó loại bỏ cụm cho đến lần tiếp theo.
RubberDuck

4

Đúng. Khu vực này đang nóng ngay bây giờ. Nó được gọi là "mã lớn" và DARPA đặt 40 triệu đô la vào đó: http://www.darpa.mil/program/mining-and-under Hiểu-software-enclaves . Một số kết quả ấn tượng đã được đưa ra từ khoản tài trợ này, chẳng hạn như hệ thống Tiên tri và Genesis của Fan Long, có thể tự động sửa lỗi trong các chương trình bằng cách sử dụng một mô hình chính xác đã học. Martin Vechev và học trò Veselin Raychev của ông cũng là những người tiên phong trong lĩnh vực này. Có lẽ kết quả ấn tượng nhất của họ là JSNice ( http://jsnice.org/ ), có thể "giảm thiểu mã JavaScript.

Nhìn chung, ý tưởng về mã lớn đã không tuân theo lời hứa của nó: dữ liệu quá thưa thớt để học bất cứ điều gì thú vị hơn nhiều so với tên biến. Mặc dù tôi vẫn được tài trợ một phần bởi chương trình DARPA này, nhưng phòng thí nghiệm của tôi hầu như đã ngừng làm việc với nó. Về lưu ý đó, điều cuối cùng tôi nghe về DeepCoder là nó nhận được kết quả khá thảm hại so với trạng thái của nghệ thuật trong tổng hợp chương trình.

Hầu hết các công cụ thành công để lập trình tự động vẫn dựa vào các phương pháp không ML như bộ giải SMT. Hãy xem các thủ tục tố tụng của bất kỳ hội nghị PL nào (ví dụ: PLDI, POPL, OOPSLA) hoặc bất kỳ hội nghị kỹ thuật phần mềm học thuật nào (ví dụ: ICSE, FSE, ISSTA, ASE), và bạn sẽ thấy nhiều ví dụ.


3

Microsoft đã phát triển DeepCoder để sử dụng phương pháp học sâu để dự đoán phần thân phương thức từ một đầu vào và đầu ra nhất định. Đó là ví dụ duy nhất tôi biết rõ.

Tôi có thể nói với bạn rằng Lập trình siêu gen là một lĩnh vực nghiên cứu có tham vọng tương tự, nhưng tôi không thể nói rằng tôi biết đủ về nó để có kiến ​​thức.

Lập trình di truyền đã có trong bản tin năm 2015 khi muScalpel phát triển một giải pháp ghép một tính năng từ chương trình này sang chương trình khác, sử dụng các bài kiểm tra đơn vị cho cả hai như một loại tập huấn luyện.


Điều này giống như tạo ra các thuật toán bằng cách sử dụng một mô hình di truyền, phải không? Bạn có biết bất kỳ ứng dụng nào để hỗ trợ phát triển mã không? Tôi đang nghĩ về máy móc của con người làm việc cùng nhau, chứ không phải là một cỗ máy hoàn toàn điều khiển (mô hình dựa trên di truyền). Tôi biết rằng điều này nghe có vẻ cụ thể, nhưng tôi chủ yếu tò mò vì tôi mới đến khu vực này.
Charles

Chắc chắn là bạn đúng, tôi đã đọc sai, tôi đã suy nghĩ quá nhiều về việc sử dụng ML để làm ML :) #edited
RJB

2

Vì vậy, câu hỏi của tôi là, nghiên cứu nào đã được thực hiện cho đến nay trong việc áp dụng học máy vào phát triển mã? Làm thế nào về gỡ lỗi?

Một câu hỏi liên quan là về các kỹ thuật học máy để tạo và biên dịch mã (vì bạn có thể tưởng tượng các bộ chuyển đổitrình biên dịch như một cách để tự động "phát triển mã" - thực sự viết mã - từ một số ngôn ngữ cấp cao hơn).

Đã có một số bài viết về điều đó, ví dụ như MILEPOST GCC .

Bạn cũng có thể google cho các bài viết về các kỹ thuật học máy để gỡ lỗi hoặc phân tích mã nguồn tĩnh (hoặc bất kỳ loại phân tích chương trình tĩnh nào ).

Xem thêm blog của J.Pitrat về trí thông minh nhân tạo bootstrapping có liên quan đến câu hỏi của bạn.


1

Trong một bài viết gần đây trên Truyền thông của ACM về Kiếm tiền bằng toán học Erik Meijer đã trích dẫn Jeff Dean, Uỷ viên cao cấp của Google, Nhóm hệ thống và cơ sở hạ tầng:

Nếu Google được tạo ra từ đầu ngày hôm nay, phần lớn nó sẽ được học, không được mã hóa.

Bài báo cung cấp một cái nhìn tổng quan về các hoạt động gần đây trong lĩnh vực nghiên cứu. Nó đứng sau một bức tường trả tiền nhưng có thể đáng đọc nếu bạn quan tâm đến sự tương đồng về mặt lý thuyết giữa mã hóa và học máy / thống kê. Có lẽ danh sách tham khảo ở cuối bài viết cũng có thể hữu ích.

Như một ví dụ bài viết đề cập đến WebPPL, lập trình xác suất cho web .


0

Đây là một trường hợp sử dụng về việc sử dụng máy học để gỡ lỗi microservice. Tôi đã ghi lại một số nỗ lực trong việc phân tích dữ liệu hiệu suất microservice với học máy , nơi tôi đã đào tạo cây quyết định từ dữ liệu hiệu suất được thu thập từ kiểm tra tải, sau đó nghiên cứu cây giúp tôi hiểu rõ hơn về vấn đề môi trường và giúp tôi chẩn đoán và khắc phục lỗi hiệu suất.


0

Tôi tìm thấy khá nhiều danh sách đọc rộng rãi về tất cả các chủ đề học máy liên quan đến mã hóa .

Như bạn có thể thấy, mọi người đã cố gắng áp dụng học máy vào mã hóa, nhưng luôn trong các lĩnh vực rất hẹp, không chỉ là một máy có thể xử lý tất cả các cách mã hóa hoặc gỡ lỗi.
Phần còn lại của câu trả lời này tập trung vào máy "gỡ lỗi" phạm vi tương đối rộng của bạn và tại sao điều này chưa thực sự được thử (theo như nghiên cứu của tôi về chủ đề này cho thấy).


Tôi đã làm lại một phần dài của câu trả lời. Tóm lại (điều quan trọng đối với phần tiếp theo): theo phương pháp học máy hiện tại, bất cứ điều gì con người có thể học, máy cũng có thể. Chúng tôi chỉ bị giới hạn bởi lĩnh vực vật lý (tốc độ CPU, kích thước của máy, ...), không phải là khả năng áp dụng giới hạn được cho là của chính thuật toán học tập.

Những nghiên cứu nào đã được thực hiện cho đến nay trong việc áp dụng học máy vào phát triển mã? Làm thế nào về gỡ lỗi?

Vấn đề ở đây không phải là không thể, mà là nó là một chủ đề cực kỳ phức tạp.

Con người thậm chí không tiến gần đến việc xác định một tiêu chuẩn mã hóa phổ quát mà mọi người đều đồng ý. Ngay cả những nguyên tắc được thống nhất rộng rãi nhất như RẮN vẫn là một nguồn để thảo luận về việc nó phải được thực hiện sâu đến mức nào . Đối với tất cả các mục đích thực tế, nó hoàn toàn có thể tuân thủ RẮN trừ khi bạn không có ràng buộc tài chính (hoặc thời gian) nào; điều đơn giản là không thể trong khu vực tư nhân nơi phát triển nhất. RẮN là một hướng dẫn, không phải là một giới hạn cứng.

Trong trường hợp không có thước đo khách quan về đúng và sai, làm thế nào chúng ta có thể đưa ra một phản hồi tích cực / tiêu cực để làm cho nó học hỏi?
Tốt nhất, chúng ta có thể có nhiều người đưa ra ý kiến ​​của riêng họ cho máy ("đây là mã tốt / xấu") và kết quả của máy sau đó sẽ là "ý kiến ​​trung bình". Nhưng điều đó không nhất thiết giống như một giải pháp chính xác . Nó có thể, nhưng nó không được đảm bảo.

Thứ hai, để gỡ lỗi nói riêng, điều quan trọng là phải thừa nhận rằng các nhà phát triển cụ thể có xu hướng đưa ra một loại lỗi / lỗi cụ thể. Bản chất của lỗi có thể trong một số trường hợp bị ảnh hưởng bởi nhà phát triển đã giới thiệu nó.

Ví dụ, vì tôi thường liên quan đến việc sửa lỗi mã của người khác tại nơi làm việc, tôi có một loại kỳ vọng về loại lỗi mà mỗi nhà phát triển dễ mắc phải. Đưa ra một vấn đề nhất định, tôi biết rằng dev A có khả năng quên cập nhật tệp cấu hình, trong khi dev B thường ghi các truy vấn LINQ xấu. Dựa trên nhà phát triển, tôi có thể hướng tới tệp cấu hình hoặc LINQ trước.
Tương tự, bây giờ tôi đã làm việc tại một số công ty với tư cách là một nhà tư vấn và tôi có thể thấy rõ rằng các loại lỗi có thể bị thiên vị đối với một số loại công ty. Đó không phải là một quy tắc khó và nhanh mà tôi có thể chỉ ra, nhưng có một xu hướng nhất định.

Máy có thể học cái này không? Nó có thể nhận ra rằng dev A có nhiều khả năng làm rối cấu hình và dev B có nhiều khả năng làm rối một truy vấn LINQ không? Tất nhiên là có thể. Như tôi đã nói trước đây, bất cứ điều gì con người có thể học, một chiếc máy cũng có thể.
Tuy nhiên, làm thế nào để bạn biết rằng bạn đã dạy cho máy đầy đủ các khả năng? Làm thế nào bạn có thể cung cấp cho nó một bộ dữ liệu nhỏ (không phải toàn cầu) và biết thực tế là nó đại diện cho toàn bộ lỗi? Hoặc, thay vào đó, bạn sẽ tạo các trình gỡ lỗi cụ thể để giúp các nhà phát triển / công ty cụ thể, thay vì tạo một trình gỡ lỗi có thể sử dụng chung?

Yêu cầu một trình gỡ lỗi học máy cũng giống như yêu cầu một Sherlock Holmes học máy. Không thể tạo ra một thứ, nhưng thường là lý do cốt lõi để trở thành một trình gỡ lỗi / Sherlock dựa trên các đánh giá chủ quan khác nhau tùy theo từng đối tượng và chạm vào nhiều kiến ​​thức / lỗ hổng có thể có.
Việc thiếu các kết quả chính xác / không chính xác có thể chứng minh nhanh chóng khiến bạn khó có thể dễ dàng dạy máy và xác minh rằng nó đang tiến triển tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.