Tạo động cơ cờ vua, máy học so với động cơ truyền thống?


17

Tôi vừa là một người chơi cờ vừa là lập trình viên máy tính. Tôi muốn nói rằng chơi cờ và lập trình là hai việc tôi dành nhiều thời gian nhất để làm. Đương nhiên, tôi muốn tạo ra công cụ của riêng mình và cuối cùng là Lichess bot.

Trước hiệu suất nghiền nát của AlphaZero đối với Stockfish năm ngoái, tôi đang xem xét liệu tôi có nên tạo ra công cụ này bằng máy học (một số loại mạng thần kinh, có thể sử dụng Tensorflow) hoặc phương pháp phỏng đoán mã hóa cứng truyền thống.

Tôi ít quen thuộc với các mạng thần kinh hơn các loại mã hóa cứng khác. Tuy nhiên, nó có thể là một cách tốt để tôi học cách làm việc với các mạng lưới thần kinh.

Một điều nữa tôi đang xem xét là liệu điều quan trọng mà tôi sử dụng ngôn ngữ để mã hóa động cơ. Tôi biết nhiều công cụ cờ vua sử dụng C ++, điều mà tôi chưa từng sử dụng trước đây. Tôi đã sử dụng các ngôn ngữ dựa trên C khác để thực hiện nhiều điều tương tự, với hầu hết các cú pháp khác nhau. Tôi quen thuộc nhất với Swift và Javascript, nhưng tôi cũng quen thuộc với Python và cảm thấy rằng nó có thể giúp tôi.

Vì vậy, về mặt tạo ra động cơ cờ vua mạnh nhất có thể, tôi nên đi mạng thần kinh hay mã hóa cứng?


4
Chìa khóa cho các công cụ AI mới không phải là quá nhiều NN như học tập củng cố. RL là một chủ đề phức tạp, nhưng có nhiều tài liệu giới thiệu trực tuyến tốt như các bài giảng RL của David Silver tại UCL (trình chiếu trên trang web của anh ấy và các bài giảng trên YouTube. Anh ấy đã làm việc với Deepmind và truyền thống về alphago trong bài giảng trước. động cơ không có NN sử dụng phương pháp phỏng đoán mã hóa cứng và RL. Đây là cách alphago bắt đầu!
asac - Tái lập lại

Đó không phải là cờ vua, nhưng cuốn sách gần đây "Deep Learning và Game Go" chỉ ra cách sử dụng NN cho công cụ trò chơi. Alpha-Go và Alpha-Zero tương tự nhau dưới mui xe.
John Coleman

Với trải nghiệm Python của bạn, có thể đáng để xem Nim
Darren H

Nếu bạn muốn đi chơi tại NN, điều này thật thú vị: arxiv.org/abs/1509.01549 Ngoài ra còn có mã trên github :)
Ant

@Ant lưu ý rằng Gi hươu cao cổ chưa bao giờ rất mạnh so với các động cơ hàng đầu. (~ 2800 elo)
Oscar Smith

Câu trả lời:


8

Bước đầu tiên: Xác định mục tiêu / lý do của bạn

Tôi nghĩ rằng đây là yếu tố chiếm ưu thế. Những điều này phù hợp nhất với bạn? ( Chỉ chọn một )

  1. Bạn muốn tận hưởng một nhiệm vụ mã hóa thú vị, đầy thách thức
  2. Bạn muốn tạo ra một công cụ cờ vua cực kỳ tốt
  3. Bạn muốn tìm hiểu về cách thức hoạt động của động cơ cờ vua
  4. Bạn muốn học / thực hành kỹ năng mã hóa
  5. Bạn muốn học / thực hiện các khái niệm / lý thuyết khoa học máy tính (ví dụ: học máy)
  6. (Khác)

IMO thật tốt khi "tung đồng xu" cho bất cứ điều gì ngoại trừ 2. Đối với tất cả những người khác, bạn sẽ đáp ứng mục tiêu của mình cho dù bạn chọn ML hay mã hóa cứng. Tuy nhiên, bạn có thể muốn so sánh giữa các lựa chọn để giúp bạn quyết định.

Trường hợp mã hóa cứng

Chơi cờ (như một con người) liên quan đến tư duy logic. Bạn khám phá không gian của những hành động có thể bạn và đối thủ có thể thực hiện. Điều này đã sinh ra một lĩnh vực gọi là lý thuyết trò chơi chứa các khung lý thuyết để phân tích các trò chơi nói chung.

Nếu bạn thích làm việc với các chi tiết và cụ thể và lý luận về mọi thứ thì điều này có thể làm việc tốt cho bạn. So sánh, học máy liên quan đến nhiều thuật toán "hộp đen" mờ hơn và mờ hơn. Bạn không biết chính xác những gì đang xảy ra.

Ngoài ra tôi cho rằng bạn sẽ có một thời gian dễ dàng hơn "tự mình tìm ra" nếu bạn đi theo con đường mã hóa cứng hơn là học máy. Công cụ dán ít sao chép mà bạn không hiểu đầy đủ.

Trường hợp học máy

Nó có thể thú vị để sinh ra một sáng tạo và xem nó có một cuộc sống của riêng mình. Trong khi mã hóa cứng là tất cả về độ chính xác và chi tiết, máy học là linh hoạt. Lấy đi một số tế bào thần kinh và kết quả có thể sẽ tương tự.

Mã hóa cứng là về nghiên cứu cờ vua. Học máy là về nghiên cứu sinh vật bạn đã tạo ra.

Và máy học, tất nhiên, là một chủ đề rất nóng.

Lựa chọn ngôn ngữ cho mã hóa cứng

Tôi không chắc ý của bạn là "các ngôn ngữ dựa trên C khác". C ++ là ngôn ngữ chính duy nhất giống như C. Ưu điểm của C / C ++ là chúng nhanh . Mặc dù các ngôn ngữ khác đã bắt kịp trong nhiều năm qua, C ++ vẫn giúp họ kiếm tiền.

C ++ không dễ. Bạn sẽ có được hiệu suất tuyệt vời từ các ngôn ngữ được biên dịch hiện đại hơn như Rust, Golang hoặc Swift. Nhưng nó không nên tệ hơn nhiều nếu bạn sử dụng ngôn ngữ JIT. Tức là không sử dụng trình thông dịch CPython ; sử dụng IronPython hoặc Jython hoặc Node hoặc C # hoặc Java.

Lập trình GPU đòi hỏi một cách tiếp cận khác và tôi sẽ khuyên bạn nên chống lại nó vào thời điểm này.

Lựa chọn ngôn ngữ cho máy học

Vấn đề với TensorFlow là nó rất thấp. Nó liên quan nhiều hơn đến việc viết các thuật toán bẻ khóa số (có thể được trang bị cho phần cứng song song) hơn là về một giao diện dành riêng cho học máy.

Tất nhiên, nó có thể là một kinh nghiệm học tập tuyệt vời! Và chắc chắn là rất đáng học tập ngày hôm nay. Tuy nhiên, bạn có thể muốn bắt đầu với Keras hoặc PyTorch.


1
Đây là một phản ứng phi thường, thực sự đạt tất cả các điểm tôi đã đề cập. Thật khó để nói tại sao chính xác tôi muốn chế tạo một động cơ. Trên thực tế, tôi có khả năng sẽ không cạnh tranh với Stockfish, Komodo và Leela (rốt cuộc tôi chỉ là một sinh viên đại học). Tuy nhiên, sẽ rất vui khi thấy công việc của tôi đưa ngón chân lên các động cơ khác và không bị nghiền nát mỗi lần. Ngay cả khi lý do chính của tôi là tạo ra một động cơ mạnh mẽ, tôi có thể sẽ học một ngôn ngữ lập trình mới và cải thiện kiến ​​thức cờ vua của tôi như là một sản phẩm phụ của việc chế tạo động cơ.
David Chopin

1
Tôi nghĩ nhiều hơn bất cứ điều gì tôi muốn một cái gì đó tôi có thể làm, nuôi dưỡng và tinh chỉnh trong thời gian dài. Tôi cũng muốn một dự án sẽ cho tôi biết một cách khách quan mã của tôi tốt như thế nào (Thắng / Rút / Mất, ELO, v.v.).
David Chopin

1
Đây là một câu trả lời rất thú vị nhưng bạn có nghiêm túc giới thiệu Node hơn Cpython vì những lo ngại về hiệu suất không?
Evpok

> "C ++ là ngôn ngữ chính duy nhất giống với ngôn ngữ C." C #? Rỉ sét? Java? Có rất nhiều ngôn ngữ ít nhất là "bất cứ thứ gì như C"
Maaark

Tôi đã sử dụng "like C" để trở thành một ngôn ngữ được biên dịch, được tối ưu hóa, được triển khai cho máy với cú pháp kiểu C. Tất cả C #, Java và PHP đều sử dụng các máy ảo, với mã được biên dịch thành mã thay vì mã byte cụ thể của CPU (và quá trình biên dịch của PHP hoàn toàn trong suốt, như Python và Bash). Và Rust không phải là chủ đạo. Chỉ C ++ là "giống như C" trong các khía cạnh này, mặc dù chia sẻ các kiểu cú pháp với một số ngôn ngữ chính khác.
Ghedipunk

24

Nếu bạn đang cố gắng tạo ra động cơ mạnh nhất có thể, hoàn toàn nên dùng động cơ NN.

Động cơ truyền thống là tuyệt vời - Stockfish được cho là vẫn là động cơ mạnh nhất trên hành tinh về sự đồng thuận phần cứng bằng nhau - nhưng chúng rất khó viết. Những động cơ này đã không nhận được nơi họ đã qua đêm; họ mất nhiều năm và nhiều năm làm việc. Stockfish chẳng hạn đã liên tục đạt được elo trong sáu năm . Nếu bạn bắt đầu từ đầu, bạn sẽ không nhận được bất cứ nơi nào gần sức mạnh Stockfish một cách nhanh chóng; trong thực tế, bạn có khả năng trì hoãn hàng trăm elo từ nơi Stockfish hiện đang ở. Để so sánh một số công cụ tác giả đơn mạnh nhất hiện nay là Ethereal , LaserXiphos (Tôi bỏ qua Houdini & Fire vì chúng không phải là nguồn mở). Những động cơ này đều yếu hơn đáng kể so với Stockfish.

Tại sao họ yếu hơn nhiều? Hai lý do:

  1. Ở cấp độ này, việc phát triển một động cơ cần rất nhiều sức mạnh tính toán. Những gì bạn làm là xem qua mã của bạn và xác định một ý tưởng có thể đạt được elo. Một ý tưởng ví dụ là: "nếu chúng ta biết động thái này có thể là tốt, đừng tìm kiếm các nhánh đảo ngược chuyển động đó" (nếu điều này không có ý nghĩa với bạn, điều đó có nghĩa là cũng sẽ có một đường cong học tập cao). Sau đó, bạn viết một bản vá thực hiện ý tưởng và kiểm tra công cụ sửa đổi so với phiên bản trước. Ở cấp độ này, phải mất hàng chục ngàn trò chơi để có được cỡ mẫu đủ lớn để biết bản vá có hiệu quả hay không. Chơi các trò chơi này cần một lượng lớn sức mạnh tính toán. Stockfish có quyền truy cập vào siêu phần cứng: tại thời điểm viết bài, Stockfish đang thử nghiệm Fishtestingđang chạy với 1038 lõi. Để so sánh một máy tính để bàn thông thường có thể có 4-8 lõi.

  2. Lý do khác là Stockfish được hỗ trợ bởi nhiều bộ não. Tính đến thời điểm viết bài, có 8 bản vá được viết bởi 5 người đang được thử nghiệm. Nếu bạn xem qua lịch sử bản vá, bạn sẽ tìm thấy nhiều nhà phát triển hơn đã viết bản vá. Tôi không biết có bao nhiêu nhà phát triển Stockfish đang hoạt động, nhưng chắc chắn là> 20.

Mặt khác, các động cơ NN (tương đối) dễ dàng đạt được một sức mạnh vượt xa Ethereal / Laser / Xiphos. Xem cho chính mình trong giải đấu Top Chess Engine Championship mới nhất . Ethereal / Laser / Xiphos ở League 1, đủ đáng tin cậy, nhưng các động cơ trong bộ phận hàng đầu (Division P) là:

  • Stockfish (động cơ truyền thống được cộng đồng hỗ trợ, chạy với Fishtesting)
  • Komodo (động cơ truyền thống thương mại, có các nhà phát triển toàn thời gian)
  • Komodo MCTS (động cơ bán truyền thống thương mại, có các nhà phát triển toàn thời gian)
  • Houdini (động cơ truyền thống thương mại, là nỗ lực của một người, đã không được cập nhật trong hai năm)
  • Leela Chess Zero (công cụ NN hỗ trợ cộng đồng, chạy tương tự như Fishtesting hay còn gọi là một tấn phần cứng)
  • AllieStein (động cơ NN 2 người)
  • Staggervlees (động cơ NN)
  • ScorpioNN (động cơ NN)

Ba công cụ cuối cùng - AllieStein, Stoustvlees và ScorpioNN - đều là những sự hợp tác nhỏ của những người, theo như tôi biết, là những người đam mê như bạn chứ không phải nhà phát triển toàn thời gian. Họ đã đạt được sức mạnh Div P sau chưa đầy hai năm cố gắng (tất cả các công cụ NN này chỉ xuất hiện sau AlphaZero). Để so sánh, trong lịch sử cờ vua máy tính gần đây, chỉ có một người từng viết một động cơ truyền thống cạnh tranh thành công với Stockfish & Komodo một mình (Robert Houdart, tác giả của Houdini).

Đúng là bạn có thể sẽ không có phần cứng để cạnh tranh với Lc0, nhưng Lc0 có được sức mạnh tính toán lớn này bởi vì nó là một công cụ "không" - nó được cho là chơi cờ mà không cần bất kỳ kiến ​​thức nào của con người ngoại trừ các quy tắc. Bạn không cần phải sử dụng cùng một phương pháp. Bạn có thể sử dụng ví dụ phương pháp Stein sử dụng phương pháp học có giám sát. Nó thậm chí còn tốt hơn so với việc đi "không" - sau tất cả, đó là AllieStein chơi ở bề ngoài, không phải Lc0.

Kết quả cuối cùng là: nếu mục tiêu của bạn là cạnh tranh với các động cơ tốt nhất trên thế giới, bạn có nhiều khả năng thành công hơn với các động cơ NN so với các động cơ truyền thống.


6
Có thể đề cập đến khía cạnh khác của kết luận của bạn: Nếu mục đích của bạn là đào sâu sự hiểu biết về cờ vua trong khi thực hiện một số chương trình, hãy đi truyền thống.
blues

1
Tôi đồng ý với kết luận của bạn, nhưng tôi cũng khuyên bạn nên sử dụng mạng gần đây từ một công cụ mạnh (tất nhiên có sự cho phép) làm điểm bắt đầu thay vì bắt đầu từ đầu (nhưng tiếp tục theo cách khác với "đào tạo qua tự chơi và cập nhật trọng số ", bằng cách thêm hoặc xóa các lớp, thêm các tính năng đầu vào, yêu cầu đầu ra bổ sung, v.v.). Tôi không thể nhớ nếu Lc0 là đầu đơn hoặc đầu kép, nhưng tôi tin rằng 3 đầu ( ijcai.org/proceedings/2018/0523.pdf ) hiện không được thực hiện bởi bất kỳ động cơ cờ vua nào và cuối cùng có thể cải thiện về trạng thái -nghệ thuật.
Steven Jackson

Tôi nghĩ rằng tìm kiếm của Allie làm cho nó mạnh hơn so với các động cơ yếu hơn (KMCST, Stoustvlees), chứ không phải mạng Stein.
tôi '

@blues Tôi nghĩ rằng lập trình một công cụ cờ vua thực sự không làm cho một người chơi cờ giỏi hơn - ngoại trừ Larry Kaufman (một trong những nhà phát triển của Komodo), không một công cụ hàng đầu nào có tiêu đề người chơi là nhà phát triển, hoặc đã trở thành nhà phát triển của họ người chơi có tiêu đề.
Allure

@me 'điều đó là có thể nhưng Leelenstein là mạng Stein sử dụng nhị phân Lc0 và nó đã hoạt động tốt tại giải vô địch cờ vua máy tính của Chess.com, vì vậy các mạng Stein ít nhất có thể so sánh với các mạng Lc0.
Allure

9

Vì vậy, về mặt tạo ra động cơ cờ vua mạnh nhất có thể, tôi nên đi mạng thần kinh hay mã hóa cứng?

Đừng chọn NN trừ khi bạn có quyền truy cập vô lý (Vài trăm Nvidia V100). Đào tạo một NN để chơi cờ cần rất nhiều phần cứng. Xem những người đóng góp cho Lc0 để đào tạo hơn 200 triệu trò chơi. Vì bạn có thể sẽ gặp khó khăn khi truy cập phần cứng (bạn có thể thử lấy một số tại Google Colabatory , nhưng chỉ với điều đó, việc đào tạo sẽ rất chậm).

Chỉnh sửa: Sử dụng NN với việc học được giám sát, bạn có thể thoát khỏi chỉ với Google Colab và có thể là một GPU mạnh (2080, 2080Ti, Radeon VII).

Một điều nữa tôi đang xem xét là liệu điều quan trọng mà tôi sử dụng ngôn ngữ để mã hóa động cơ. Tôi biết nhiều công cụ cờ vua sử dụng C ++, điều mà tôi chưa từng sử dụng trước đây. Tôi đã sử dụng các ngôn ngữ dựa trên C khác để thực hiện nhiều điều tương tự, với hầu hết các cú pháp khác nhau. Tôi quen thuộc nhất với Swift và Javascript, nhưng tôi cũng quen thuộc với Python và cảm thấy rằng nó có thể giúp tôi.

Python và Javascript có lẽ quá chậm đối với một công cụ cờ vua mạnh mẽ. Tôi chưa sử dụng Swift nhưng có lẽ nó sẽ không thích các nền tảng khác ngoài macOS, vì vậy có lẽ tốt hơn khi sử dụng C hoặc C ++. Bạn cũng có thể sử dụng Rust, nhưng điều đó có nhiều tính năng an toàn gây khó chịu và bạn không thực sự cần, điều này có thể gây phiền nhiễu. Nó cũng sẽ khó hơn để có được hiệu suất tốt từ nó vì một số tối ưu hóa ở mức độ thấp nhất định rất khó thực hiện. Tất nhiên, bạn luôn có thể viết nó trong tập hợp nhưng điều đó có thể sẽ là quá nhiều công việc. xem https://www.chessprogramming.org/Lôn /


1
Tuyệt vời, cảm ơn rất nhiều cho thông tin! Có lẽ tôi sẽ cố gắng tạo một API có vị trí FEN và đưa ra bước di chuyển được tính toán. Tôi nghĩ rằng đây là cách tốt nhất để tích hợp với bot Lichess.
David Chopin


1
Đây có phải là một tùy chọn để thực hiện một công cụ NN khác chỉ sử dụng mạng của lc0 không?
RemcoGerlich

1
@RemcoGerlich theo tôi hiểu, các công cụ NN sử dụng hai thứ: mạng nhị phân và mạng nơ ron. Viết một nhị phân không dễ, nhưng đào tạo một mạng lưới thần kinh là tương đối dễ dàng. Theo nghĩa này, các dẫn xuất Lc0 đã tồn tại - Leelenstein & Deus X (hay còn gọi là Fat Fritz) là các dẫn xuất như vậy.
Allure

@RemcoGerlich trong trường hợp đó sẽ không thực sự là một công cụ khác, đó sẽ là công cụ Ic0 chỉ với một gói / giao diện / bất cứ thứ gì khác.
Peteris

3

Tôi đã xây dựng một công cụ cờ vua đồ chơi hoàn toàn bằng cách sử dụng: cờ vua trăn thật tuyệt khi không phải tự mình viết mã các quy tắc của trò chơi và chỉ tập trung vào logic; tuy nhiên, số lượng vị trí tôi có thể đánh giá mỗi giây là rất thấp. Đây có thể là một điểm khởi đầu 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.