Có thể tưởng tượng để dạy một máy làm thế nào để tự lập trình cho một đặc tả được xác định? [đóng cửa]


12

Một người bạn của tôi không có kiến ​​thức lập trình đã hỏi tôi câu hỏi này và tôi thấy nó thú vị.

Tôi nghĩ rằng điều đó là không thể bởi vì nó sẽ đòi hỏi một trí thông minh nhân tạo thực sự tiên tiến có khả năng phân tích văn bản của một vấn đề, suy nghĩ về một giải pháp và lập trình nó. Chỉ cần nghĩ về một chiếc máy có thể lập trình một máy tính đơn giản có vẻ khá tiên tiến đối với tôi.

Nhưng có lẽ tôi đã sai và tôi muốn biết bạn nghĩ gì về nó và nếu bạn biết bất kỳ bài báo / nghiên cứu nào về chủ đề này, hoặc nếu nó đã tồn tại hoặc nếu khả năng tồn tại của việc chọn một đặc điểm kỹ thuật và nhận được Máy để tự lập trình cho "thông số kỹ thuật này?"


4
Xác định lập trình. Tôi có thể xây dựng một chương trình sẽ làm cho các chương trình khác. Nhưng nó sẽ thực sự học?
Pieter B

Vâng, câu hỏi không phải là về việc tạo mã mà là về lập trình thực như chúng ta làm với tư cách là nhà phát triển.
florian

Nó phụ thuộc vào chương trình là gì. Một chương trình có nhiều logic kinh doanh theo thủ tục sẽ khó khăn hơn nhiều (và ít khả thi hơn) so với một cái gì đó có chức năng và hoàn toàn dựa trên toán học. (Dù sao đó cũng là một trực giác, nhưng tôi không có cách nào để sao lưu điều đó, thật không may.)
lunchmeat317

@florian: Bản thân chúng tôi là những cỗ máy đã học cách lập trình (giả sử người ngoài hành tinh / thần tạo ra chúng tôi :-)). Tất nhiên, chúng tôi chưa có khả năng lập trình trình tự DNA, v.v., vì vậy nếu bạn tạo ra một cỗ máy phải học cách lập trình cuối cùng, bạn phải lập trình nó để "tiến hóa" và cuối cùng là học cách nó được lập trình.
Nav

2
@maple_shaft: Tôi đã đặt câu hỏi khách quan hơn bằng cách đưa nó phù hợp với các câu trả lời hiện có và tự hỏi liệu nó có thể được mở lại ở dạng hiện tại không.
Tom Au

Câu trả lời:


15

Joel thực sự đã trả lời điều này một vài năm trước . Ý nghĩa thực sự của "dạy cho máy một cách tự lập trình" là "dạy cho máy cách lấy thông số và tạo chương trình tương ứng với thông số đó". Và với ý nghĩ đó:

Vấn đề, ở đây, là rất cơ bản. Để chứng minh một cách máy móc rằng một chương trình tương ứng với một số thông số kỹ thuật, bản thân thông số kỹ thuật cần phải cực kỳ chi tiết. Trong thực tế, thông số kỹ thuật phải xác định mọi thứ về chương trình, nếu không, không có gì có thể được chứng minh tự động và cơ học. Bây giờ, nếu thông số kỹ thuật xác định mọi thứ về cách chương trình sẽ hoạt động, thì, lo và kìa, nó chứa tất cả thông tin cần thiết để tạo chương trình! Và bây giờ, những người đam mê nhất định đi đến một nơi rất tối, nơi họ bắt đầu nghĩ về việc tự động biên dịch thông số kỹ thuật thành các chương trình, và họ bắt đầu nghĩ rằng họ vừa phát minh ra một cách để lập trình máy tính mà không cần lập trình.

Bây giờ, đây là kỹ thuật phần mềm tương đương với một máy chuyển động vĩnh cửu. Đó là một trong những điều mà crackpots tiếp tục cố gắng thực hiện, bất kể bạn nói với chúng bao nhiêu thì nó cũng không bao giờ có thể hoạt động được. Nếu thông số kỹ thuật xác định chính xác những gì một chương trình sẽ làm, với đủ chi tiết mà nó có thể được sử dụng để tự tạo chương trình, thì điều này chỉ đặt ra câu hỏi: làm thế nào để bạn viết thông số kỹ thuật? Một thông số kỹ thuật hoàn chỉnh như vậy cũng khó viết như chương trình máy tính cơ bản, bởi vì cũng như nhiều chi tiết phải được trả lời bởi nhà văn spec như lập trình viên. Để sử dụng thuật ngữ từ lý thuyết thông tin: thông số kỹ thuật cần nhiều bit của entropy Shannon như chính chương trình máy tính sẽ có. Mỗi bit của entropy là một quyết định được đưa ra bởi người viết đặc tả hoặc người lập trình.

Vì vậy, điểm mấu chốt là nếu thực sự có một cách máy móc để chứng minh mọi thứ về tính đúng đắn của chương trình, tất cả những gì bạn có thể chứng minh là liệu chương trình đó có giống với một chương trình khác phải chứa cùng một lượng entropy không là chương trình đầu tiên, nếu không, một số hành vi sẽ không được xác định, và do đó không được chứng minh. Vì vậy, bây giờ việc viết thông số kỹ thuật cũng khó như viết một chương trình, và tất cả những gì bạn đã làm được chuyển một vấn đề từ đây sang kia, và không đạt được bất cứ điều gì.

Cách duy nhất để giải quyết vấn đề này là tạo ra một máy tính thực tế có đủ trực giác để thực hiện tất cả các thao tác điền mà bạn và tôi tự động làm mọi lúc, khi sản xuất phần mềm ... trong trường hợp đó là bạn Kết thúc với một máy tính tự lập trình cũng như nhà phát triển con người. ;)


7
Tôi có thể viết một thông số kỹ thuật hoàn chỉnh cho một thuật toán sắp xếp dễ dàng hơn nhiều so với tôi có thể đưa ra cách sắp xếp chèn, sắp xếp nhanh hoặc sắp xếp xô. Tuy nhiên, bạn cho rằng thật dễ dàng để chuyển đổi thứ nhất thành thứ hai.
raptortech97

Joel ... Đủ nói! ;-) Tôi hiểu rằng để làm được điều đó, chúng ta sẽ cần một thông số kỹ thuật trong một ngôn ngữ nhất định. Nhưng tôi không hoàn toàn bị thuyết phục về lập luận rằng thông số kỹ thuật nên rất chi tiết. Chúng tôi, với tư cách là nhà phát triển, có khả năng phát triển một chương trình mà không cần thông số kỹ thuật rất chi tiết. Chúng ta không thể phát triển trí thông minh nhân tạo có thể đưa ra một số quyết định "ngẫu nhiên" về thiết kế chương trình?
florian

6
@florian Vậy bạn có muốn chương trình thực hiện nhiệm vụ phiên dịch đặc biệt mà các lập trình viên con người thực hiện không? Sau đó, nó trở thành vấn đề muôn thuở của "AI mạnh mẽ", mà nhiều người thông minh đã nghiên cứu trong nhiều thập kỷ mà không có bất kỳ tiến triển nào cho thấy. Có một cuộc tranh luận triết học nóng bỏng về việc liệu AI thậm chí có thể siêu hình, ít thực tế hơn trong tương lai xa, và theo kinh nghiệm của tôi, không ai khác ngoài những người bán hàng rắn dự đoán AI mạnh mẽ trong tương lai gần.

Tôi không thực sự muốn nó Tôi đã tự hỏi mình (như bạn tôi đã hỏi tôi) nếu có thể. Tôi hoàn toàn hiểu rằng AI không thực sự tồn tại và nó chỉ đi đến một số lựa chọn được lập trình "ngẫu nhiên".
florian

2
@ raptortech97: Không, bạn không thể. Không "hoàn thành" theo nghĩa của câu hỏi này. Để thông số kỹ thuật của bạn hoàn thiện đến mức có khả năng chuyển đổi cơ học thành chương trình thực thi, về cơ bản nó phải được viết bằng ngôn ngữ lập trình. Nếu không, thông số kỹ thuật của bạn sẽ có hành vi không xác định hoặc bạn chỉ đang viết mã trong tài liệu MSWord.
tên gì là

4

Chắc chắn, chúng tôi làm này tất cả các thời gian (đối với các tập con cực kỳ hạn chế của vấn đề). Thật là tầm thường khi tưởng tượng thực hiện một hoặc hai bước nữa và buộc một thứ gì đó như Siri vào đầu vào của các trình tạo mã này (hoặc một cái gì đó như Wolfram Alpha) để lần lượt viết mã và giải quyết vấn đề của bạn. Tôi hy vọng rằng một cái gì đó đã tồn tại ở đâu đó để làm những điều cơ bản nhất.

Vấn đề với việc viết phần mềm phức tạp cho doanh nghiệp không tạo ra một chương trình để viết mã - đó là viết một chương trình để đạt được các yêu cầu.


Cảm ơn các liên kết. Mặc dù Yacc & Xamarin là các trình tạo mã hoàn toàn xác định. Họ không tạo ra thứ gì từ đầu.
florian

@florian - không có gì tạo ra công cụ từ đầu. Luôn có một số đầu vào, chúng chỉ cầu kỳ hơn hầu hết.
Telastyn

1
@Telastyn: so sánh đầu vào / đầu ra của trình tạo trình phân tích cú pháp với đầu vào / đầu ra cho tâm trí con người là "kén chọn hơn" là không rõ ràng nhất.
whatsisname

2

Tôi nghĩ rằng câu trả lời của @Mason Wheeler nắm giữ ý chính. Nó như thế này:

Entropy Shannon của Tic-tac-toe thực sự rất nhỏ. Vì vậy, chúng tôi gọi tic-tac-toe là một trò chơi "giải quyết" hoặc "xác định". Nó không thực sự thú vị một khi bạn đã qua lớp. Cờ đam có entropy cao hơn, nếu bạn xem xét entropy của tất cả các trò chơi có thể bạn có thể chơi. Nhưng cờ đam cũng là một trò chơi "giải quyết" hoặc "xác định". Nếu bạn di chuyển trước, bạn chỉ nên giành chiến thắng hoặc hòa. Cờ vua có entropy cao hơn rất nhiều, nhưng không có con người nào đánh bại được những người chơi máy tính giỏi nhất kể từ năm 2006. Vì vậy, theo một cách nào đó, máy tính đã thành thạo cờ vua theo cách mà con người không thể. Big Blue đã phân tích wikipedia, và sau đó chơi Jeopardy chống lại người chơi và đánh bại họ một cách hợp lý.

Cái gì tiếp theo? Entropy của một cuốn tiểu thuyết, hay những bản sonnet của Shakepeare là gì?

Tương tự như vậy, trong không gian lập trình, những gì có thể sẽ xuất hiện là một tập hợp các năng lực ngày càng tăng. Prolog đã giải quyết một tập hợp các vấn đề máy tính nơi bạn thiết lập vấn đề và máy tính đã giải quyết câu trả lời. Ai đó có thể sẽ tìm thấy các lớp vấn đề lập trình đơn giản mà máy tính có thể đáp ứng, v.v. Sau đó, ai đó sẽ xây dựng dựa trên đó để tạo ra "tùy chỉnh theo yêu cầu" trong một số không gian vấn đề. Và vì vậy nó đi.

Tôi nghĩ câu hỏi biến thành, mất bao lâu để một AI có thể làm chủ được một lượng entropy nhất định ... và cần bao nhiêu tài nguyên máy tính? Tôi nghĩ rằng nó không thể tưởng tượng được rằng một chiếc máy tính không thể làm chủ được entropy được làm chủ bởi bộ não con người tốt nhất - không có gì kỳ diệu về bộ não - nhưng câu hỏi là, bạn cần bao nhiêu lõi, và phải mất bao nhiêu thế kỷ để đến đó?

Nhưng ... liệu một chiếc máy tính có thể làm được việc của tôi không? Không thể hiểu được!


Tôi nghĩ thật công bằng khi nói rằng Jeopardy là một trường hợp đặc biệt: nó tập trung vào việc nhớ lại và liên kết các sự kiện. Lấy ngay cả những chuyên gia giỏi nhất, và sẽ có những cố gắng về kiến ​​thức công cộng mà họ không biết hoặc không thể nhớ lại dưới áp lực. Mặt khác, đối với một máy tính có khả năng phân tích bách khoa toàn thư (như Wikipedia, bách khoa toàn thư Britannica hoặc bất kỳ loại nào khác), không có sự thật nào được nêu trong bách khoa toàn thư là kỳ lạ hơn (hoặc ít hơn).
một CVn

1

Điều này thật khó để trả lời bởi vì, giống như với trí tuệ nhân tạo, một khi chúng ta đã hoàn thành điều này thì đó là vì chúng ta sẽ viết một chương trình thực hiện nó. Và các nhà phê bình sẽ nói, "tốt, chiếc máy này không thực sự tự lập trình! Nó chỉ tuân theo chính xác chương trình bạn đã đưa ra!"

Vâng vâng. Bất cứ điều gì chúng ta sẽ thực hiện với máy tính, chúng ta sẽ làm bằng cách cung cấp cho nó một số chương trình và nó sẽ thực hiện nó. Nếu đó là một cuộc tranh cãi, thì chúng ta không thể hoàn thành bất cứ điều gì. Tuy nhiên, tại một số điểm, mọi người nghĩ rằng một máy tính chơi cờ sẽ rõ ràng là thông minh. Bây giờ họ có thể, và chúng tôi biết chính xác làm thế nào và chúng tôi không nghĩ rằng đó là thông minh. Tàu ngầm vẫn không biết bơi.

Vì vậy - hãy xem xét một vài ví dụ.

Từ nhiều thập kỷ, chúng tôi đã có trình tạo phân tích cú pháp . Bạn cung cấp cho họ một mô tả về một ngôn ngữ, nó được xử lý và kết quả là mã cho trình phân tích cú pháp cho ngôn ngữ đó. Chúng tôi biết chính xác làm thế nào nó được thực hiện, nhưng đó không phải là một chương trình máy tính chính nó?

Thứ hai - các biên tập viên cho bạn biết bạn đã mắc lỗi (lỗi cú pháp, biến không tồn tại, v.v.). Nó không tự lập trình bất cứ điều gì, nhưng nó có thể cho bạn biết rằng bạn đã làm sai điều gì đó. Nó chỉ có rất nhiều trên bề mặt.

Các ngôn ngữ mà bạn có thể chỉ cần nhấp và kéo các điều khiển UI và mã thực sự sẽ khiến chúng hoạt động được tạo tự động.

Trình biên dịch JIT. Phần mềm có thể nhận ra các điểm nóng trong phần mềm hiện đang chạy và thay thế một số phần mềm đó bằng mã được biên dịch tối ưu hóa cao, tối ưu hóa chính nó trong khi chạy. Tôi nghĩ rằng đây là một ví dụ về những gì dường như là một chương trình máy móc, cho đến khi bạn biết chính xác nó xảy ra như thế nào, và sau đó nó chỉ là làm những gì mà lập trình viên đã nói với nó, như mọi khi.

Chơi trò chơi nói chung. Đây là một lĩnh vực nghiên cứu thú vị, trong đó các nhà nghiên cứu viết các chương trình có thể đọc các mô tả về các quy tắc của trò chơi, rằng các chương trình sau đó chơi với nhau. Vì vậy, thay vì chương trình tic-tac-toe hoặc chương trình cờ vua, đây là những chương trình đọc các quy tắc của tic-tac-toe hoặc cờ vua hoặc một số trò chơi mới được tạo ra tại chỗ, và sau đó có thể chơi chúng. Chương trình không tự lập trình, nhưng nó chơi cờ mà không có luật cờ đã bị mã hóa cứng. Đã có lúc điều này rõ ràng sẽ được coi là máy tính tự dạy mình một cái gì đó.

Chúng tôi đã thực hiện rất nhiều bước nhỏ theo hướng chung.

Nhưng tôi không thể nghĩ ra bất kỳ chương trình nào tự viết lại dựa trên kết quả của các lần chạy trước đó hoặc có thể nhận ra các thói quen lỗi thời hoặc không hiệu quả trong mã của riêng họ. Tôi nghĩ rằng một ngày nào đó chúng ta sẽ có điều đó, và chúng ta sẽ coi nó không có gì đặc biệt, vì nó sẽ chỉ là một số tính năng của trình biên dịch mới nhất ...


0

Không phải hiện tại và không có trong tương lai gần bởi vì bạn cần tất cả sự phức tạp tuyệt vời của bộ não con người để tạo ra một chương trình. Và thậm chí sau đó những bộ não đó cần phải được đào tạo cao để làm điều đó đúng cách, và thậm chí sau đó không phải tất cả chúng đều có khả năng thực hiện nhiệm vụ mặc dù người ta có thể lập luận rằng với đủ thời gian bạn có thể đào tạo bất cứ ai để lập trình.

Tôi lấy nó từ cách bạn đặt câu hỏi của bạn rằng bạn không nói về các nhiệm vụ giả lập đơn giản.

Bạn đã yêu cầu các bài báo và bài viết trên Blog Khoa học này về Phát triển câu trả lời Thông minh cho câu hỏi đó theo nhiều cách.

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.