체스 엔진, 머신 러닝 및 기존 엔진 생성?


17

나는 열렬한 체스 플레이어이자 컴퓨터 프로그래머입니다. 체스와 프로그래밍을하는 것이 내가 가장 많은 시간을 소비하는 두 가지라고 말하고 싶습니다. 당연히 나는 내 자신의 엔진과 궁극적으로 Lichess 봇을 만들고 싶습니다.

작년에 AlphaZero의 Stockfish에 대한 분쇄 성능을 깨달았 기 때문에 기계 학습 (일부 신경망 유형, 아마도 Tensorflow 사용) 또는 전통적인 하드 코딩 된 휴리스틱 으로이 엔진을 만들어야하는지 고려하고 있습니다.

다른 종류의 하드 코딩보다 신경망에 익숙하지 않습니다. 그래도 신경망을 다루는 법을 배우는 것이 좋은 방법 일 수 있습니다.

내가 고려하고있는 또 다른 것은 엔진을 코딩하는 데 사용하는 언어가 중요한지 여부입니다. 많은 체스 엔진이 C ++을 사용한다는 것을 알고 있습니다. 필자는 다양한 구문을 사용하여 동일한 작업을 수행하는 다른 C 기반 언어를 사용했습니다. 나는 Swift와 Javascript에 대해 잘 알고 있지만 Python에도 익숙하며 그것이 나를 위해 속임수를 쓸 수 있다고 생각합니다.

따라서 가능한 가장 강력한 체스 엔진을 만들려면 신경망이나 하드 코딩해야합니까?


4
새로운 AI 엔진의 핵심은 강화 학습만큼 NN이 아닙니다. RL은 복잡한 주제이지만 UCL에서 David Silver의 RL 강의 (웹 사이트의 슬라이드 및 YouTube 강의)와 같은 온라인에 대한 유용한 소개 리소스가 있습니다. 그는 마지막 강의에서 Deepmind와 함께 일했으며 전통적으로 알파 고를 다루었습니다. . NN은 하드 코딩 휴리스틱 및 RL을 사용하지 않고 엔진이 alphago 어떻게 시작입니다!
ASAC - 분석 재개 모니카

체스는 아니지만 최근의 "딥 러닝과 게임 바둑"책은 게임 엔진에 NN을 사용하는 방법을 보여줍니다. Alpha-Go와 Alpha-Zero는 후드에서 유사합니다.
John Coleman

이 님을보고 가치가있을 수도 있습니다 파이썬 경험을 감안할 때
대런 H

NN에 가고 싶다면 흥미 롭습니다 : arxiv.org/abs/1509.01549 github에 대한 코드도 있습니다 :)
Ant

@Ant는 기린이 최고 엔진에 비해 결코 강력하지 않았다는 점에 유의하십시오. (~ 2800 elo)
Oscar Smith

답변:


8

첫 단계 : 목표 / 이유 정의

이것이 가장 큰 요인이라고 생각합니다. 이 중 가장 적합한 것은 무엇입니까? ( 하나만 선택 )

  1. 재미 있고 도전적인 코딩 작업을 즐기고 싶습니다.
  2. 아주 좋은 체스 엔진을 만들고 싶습니다
  3. 체스 엔진의 작동 방식에 대해 배우고 싶습니다
  4. 코딩 기술을 배우고 연습하고 싶다
  5. 컴퓨터 과학 개념 / 이론을 배우고 / 구현하고 싶습니다 (예 : 기계 학습).
  6. (다른)

IMO 2를 제외한 모든 것을 위해 "동전 던지기"를하는 것은 좋습니다. 그러나 결정에 도움이되도록 선택 사항을 비교하고 싶을 것입니다.

하드 코딩의 경우

체스를 인간으로하는 것은 논리적 사고와 관련이 있습니다. 당신은 당신과 상대방이 취할 수있는 행동의 공간을 탐구합니다. 이것은 일반적으로 게임을 분석하기위한 이론적 프레임 워크를 포함하는 게임 이론 이라는 분야를 낳았습니다 .

세부 사항을 다루고 구체적이고 사물에 대해 추론하는 것을 즐긴다면 이것이 잘 작동 할 수 있습니다. 이에 비해 머신 러닝에는 퍼지 및 불투명 한 훨씬 더 많은 "블랙 박스"알고리즘이 포함됩니다. 당신은 무슨 일이 일어나고 있는지 정확히 모른다.

또한 기계 학습이 아닌 하드 코딩 경로를 사용하는 경우 "자신이 직접 그림을 작성하는"시간이 더 쉬울 것입니다. 완전히 이해하지 못하는 복사 붙여 넣기가 적습니다.

머신 러닝 사례

창조물을 낳고 자신의 삶을 사는 것을 보는 것은 흥미로울 수 있습니다. 하드 코딩은 정밀성과 세부 사항에 관한 것이지만 머신 러닝은 유연합니다. 일부 뉴런을 제거하면 결과가 비슷할 것입니다.

하드 코딩은 체스 공부에 관한 것입니다. 기계 학습은 당신이 창조 한 생물을 연구하는 것입니다.

그리고 머신 러닝은 물론 매우 화제가되는 주제입니다.

하드 코딩을위한 언어 선택

"다른 C 기반 언어"의 의미를 잘 모르겠습니다. C ++는 C와 같은 유일한 주류 언어입니다. C / C ++의 장점은 속도빠르다는 것 입니다. 다른 언어는 수년에 걸쳐 잡혔지만 C ++은 여전히 ​​돈을 벌 수 있습니다.

C ++은 쉽지 않습니다. Rust, Golang 또는 Swift와 같은 최신 컴파일 언어에서 뛰어난 성능을 얻을 수 있습니다. 그러나 JIT 언어를 사용한다면 더 나쁘지 않아야합니다. 즉 CPython 인터프리터를 사용하지 마십시오 . IronPython 또는 Jython, Node 또는 C # 또는 Java를 사용하십시오.

GPU 프로그래밍에는 다른 접근 방식이 필요하므로이 시점에서 이에 대해 조언합니다.

기계 학습을위한 언어 선택

TensorFlow의 문제점은 레벨이 매우 낮다는 것입니다. 머신 러닝 전용 인터페이스보다는 병렬 하드웨어로 팜을 생성 할 수있는 수 처리 알고리즘을 작성하는 것입니다.

물론, 그것은 훌륭한 학습 경험이 될 수 있습니다! 그리고 오늘 배울 가치가 있습니다. 그러나 Keras 또는 PyTorch로 시작할 수 있습니다.


1
이것은 경이로운 반응으로, 내가 언급 한 모든 사항에 영향을 미칩니다. 왜 내가 정확히 엔진을 만들고 싶어하는지 말하기는 어렵습니다. 사실, 나는 Stockfish, Komodo 및 Leela와 같은 경쟁을하지 않을 것입니다 (나는 결국 대학생 일뿐입니다). 그럼에도 불구하고 제 작품이 다른 엔진에 맞대고 매번 짓 눌리지 않는 것을 보는 것이 재미있을 것입니다. 나의 주요한 추론이 강력한 엔진을 만드는 것이더라도, 나는 새로운 프로그래밍 언어를 배우고 엔진 제작의 부산물로서 체스 지식을 향상시킬 것입니다.
David Chopin

1
나는 장기적으로 내가 만들고, 양육하고, 잘 조정할 수있는 것을 원한다고 생각합니다. 또한 코드가 얼마나 좋은지 객관적으로 알려주는 프로젝트 (Wins / Draws / Losses, ELO 등)를 원합니다.
David Chopin

1
이것은 매우 흥미로운 답변이지만 성능 문제로 Node over Cpython을 진지하게 추천하고 있습니까?
Evpok

""C ++는 C와 같은 유일한 주류 언어입니다. " 씨#? 녹? 자바? 적어도 "아무것도 C처럼"있는 언어가 많이있다
Maaark

나는 C 스타일 구문을 사용하여 컴파일되고 고도로 최적화되어 기계에 구현 된 언어로 "like C"를 사용했습니다. C #, Java 및 PHP는 모두 가상 머신을 사용하며 코드는 CPU 별 바이트 코드가 아닌 opcode로 컴파일됩니다 (PHP 컴파일은 Python 및 Bash와 같이 완전히 투명합니다). 그리고 녹은 주류가 아닙니다. 몇 가지 다른 주류 언어와 구문 스타일을 공유 함에도 불구하고 C ++만이 C와 유사합니다.
Ghedipunk

24

가장 강력한 엔진을 만들려면 NN 엔진을 사용하십시오.

전통적인 엔진은 훌륭합니다. Stockfish는 합의 된 동일한 하드웨어에서 여전히 지구상에서 가장 강력한 엔진이지만 작성하기는 어렵습니다. 이 엔진은 하룻밤 사이에 도착하지 못했습니다. 그들은 수년과 수년간의 일을했다. 예를 들어 스탁 피쉬는 6 년 동안 꾸준히 명예를 얻고있다 . 처음부터 시작하면 Stockfish 강도 근처의 어느 곳이든 빠르게 얻을 수 없습니다. 사실 당신은 Stockfish가 현재있는 곳에서 수백 개의 명예를 멈출 것입니다. 비교를 위해 가장 강력한 단일 저자 엔진 중 일부는 Ethereal , LaserXiphos입니다 (오픈 소스가 아니기 때문에 Houdini & Fire를 무시합니다). 이 엔진은 모두 Stockfish보다 약합니다.

왜 그렇게 약해? 두 가지 이유 :

  1. 이 수준에서 엔진을 개발하려면 많은 계산 능력이 필요합니다. 당신이하는 일은 코드를 살펴보고 elo를 얻을 수있는 아이디어를 식별하는 것입니다. 예를 들어 "이 움직임이 좋을 것 같다는 것을 알고 있다면, 그 동작을 반대로하는 분기를 검색하지 마십시오"(이것이 당신에게 의미가 없다면, 높은 학습 곡선이있을 것이라는 의미입니다)입니다. 그런 다음 아이디어를 구현하는 패치를 작성하고 이전 버전에 대해 수정 된 엔진을 테스트하십시오. 이 수준에서 패치가 효과적인지 알 수있는 충분한 샘플 크기를 얻으려면 수만 개의 게임이 필요합니다. 이 게임을 플레이하려면 엄청난 양의 계산 능력이 필요합니다. Stockfish는 수퍼 하드웨어에 액세스 할 수 있습니다. 작성 시점에, Stockfish 시험장 Fishtesting1038 코어로 실행 중입니다. 비교를 위해 일반적인 데스크탑 컴퓨터에는 4-8 개의 코어가있을 수 있습니다.

  2. 다른 이유는 Stockfish가 많은 두뇌에 의해 뒷받침되기 때문입니다. 글을 쓰는 시점에서 5 명이 테스트 한 8 개의 패치가 있습니다. 패치 기록을 살펴보면 패치를 작성한 개발자가 더 많아 질 것입니다. 현재 활발한 스톡 피쉬 개발자가 몇 명인지는 모르지만 확실히> 20입니다.

다른 한편으로, NN 엔진은 (상대적으로) Ethereal / Laser / Xiphos보다 훨씬 높은 강도에 쉽게 도달합니다. 최신 Top Chess Engine Championship 토너먼트에 참가하십시오 . Ethereal / Laser / Xiphos는 리그 1에 있으며 충분히 신뢰할 만하지 만 최상위 부문 (Division P)의 엔진은 다음과 같습니다.

  • Stockfish (커뮤니티 지원 전통 엔진, Fishtesting으로 실행)
  • 코모도 (상업 전통 엔진, 풀 타임 개발자 보유)
  • 코모도 MCTS (상업적 전통적 엔진, 풀 타임 개발자 보유)
  • 후디니
  • Leela Chess Zero (커뮤니티 지원 NN 엔진, 일명 하드웨어의 Fishtesting 아날로그로 실행)
  • AllieStein (2 인 NN 엔진)
  • Stoofvlees (NN 엔진)
  • ScorpioNN (NN 엔진)

마지막 세 가지 엔진 인 AllieStein, Stoofvlees 및 ScorpioNN은 모두 내가 아는 한, 풀 타임 개발자가 아닌 귀하와 같은 애호가 인 사람들의 소규모 협업입니다. 그들은 2 년 미만의 노력 끝에 Div P 강도에 도달했습니다 (이 모든 NN 엔진은 AlphaZero 이후에 나타남). 비교를 위해, 최근 컴퓨터 체스의 역사에는 Stockfish & Komodo와 성공적으로 경쟁하는 전통적인 엔진을 만든 사람이 한 명뿐입니다 (Roudin Houdart, Houdini의 저자).

Lc0과 경쟁 할 하드웨어는 없을 것입니다. 그러나 Lc0은 "제로"엔진이기 때문에 계산 능력을 많이 사용합니다. 규칙을 제외한 어떠한 인간 지식도없이 체스를해야합니다. 동일한 방법론을 사용할 필요는 없습니다. 예를 들어 지도 학습을 사용 하는 Stein 방법론 을 사용할 수 있습니다 . 그것은 "제로"가는 것보다 훨씬 더 낫습니다. 결국 Lc0이 아니라 초 최종에서 AllieStein을 플레이하게됩니다.

결론은 세계 최고의 엔진과 경쟁하는 것이 목표라면 기존 엔진보다 NN 엔진으로 성공할 가능성이 훨씬 높다는 것입니다.


6
아마도 당신의 결론의 반대편을 언급 할 수도 있습니다 : 당신의 목표가 프로그래밍을하는 동안 체스에 대한 이해를 깊게하는 것이면 전통을 찾으십시오.
blues '

1
귀하의 결론에 동의하지만 처음부터 시작하는 것이 아니라 강력한 엔진의 최신 네트워크 (물론 권한이있는)를 시작점으로 사용하는 것이 좋습니다 (하지만 "자기 재생 및 업데이트를 통한 학습"과는 다른 방식으로 계속 진행하십시오) "레이어 추가 또는 제거, 입력 기능 추가, 추가 출력 요구 등). Lc0이 싱글 헤드인지 듀얼 헤드인지 기억이 나지 않지만 3 헤드 ( ijcai.org/proceedings/2018/0523.pdf )는 현재 체스 엔진에서 구현되지 않았으며 상태가 개선 될 수 있다고 생각합니다 -예술.
Steven Jackson

나는 Stein 네트워크가 아닌 약한 엔진 (KMCST, Stoofvlees)에 대해 더 강력하게 만드는 Allie의 검색을 생각합니다.

@blues 체스 엔진을 프로그래밍한다고해서 실제로 더 나은 체스 선수가되는 것은 아니라고 생각합니다. Larry Kaufman (Komodo 개발자 중 한 명)을 제외하고는 최고의 엔진 중 어느 것도 개발자로서 개발자라는 제목을 갖지 않았거나 개발자가되었습니다. 타이틀 플레이어.
Allure

가능한 @me '이지만 Leelenstein은 Lc0 바이너리를 사용하는 Stein 네트워크이며 chess.com의 컴퓨터 체스 챔피언십에서 잘 이루어 지므로 Stein 네트워크는 Lc0 네트워크와 비교할 수 있습니다.
Allure

9

따라서 가능한 가장 강력한 체스 엔진을 만들려면 신경망이나 하드 코딩해야합니까?

말도 안되는 (수백 개의 Nvidia V100) 액세스 권한이 없으면 NN을 선택하지 마십시오. 체스를하기 위해 NN을 훈련시키는 것은 많은 하드웨어를 필요로한다. 2 억 건 이상의 게임을 훈련 하기 위해 Lc0 에 기여하는 사람들을 보십시오 . 하드웨어에 액세스하는 데 문제가있을 수 있기 때문에 ( Google Colabatory 에서 일부를 가져 오려고 시도 할 수 있지만, 그렇게하면 교육 속도가 매우 느려집니다).

편집 : NN 사용 Supervised learning을 사용하면 Google Colab과 강력한 GPU (2080, 2080Ti, Radeon VII)를 사용할 수 있습니다.

내가 고려하고있는 또 다른 것은 엔진을 코딩하는 데 사용하는 언어가 중요한지 여부입니다. 많은 체스 엔진이 C ++을 사용한다는 것을 알고 있습니다. 필자는 다양한 구문을 사용하여 동일한 작업을 수행하는 다른 C 기반 언어를 사용했습니다. 나는 Swift와 Javascript에 대해 잘 알고 있지만 Python에도 익숙하며 그것이 나를 위해 속임수를 쓸 수 있다고 생각합니다.

강력한 체스 엔진으로는 파이썬과 자바 스크립트가 너무 느릴 수 있습니다. Swift를 사용하지는 않았지만 macOS 이외의 플랫폼은 좋아하지 않을 것이므로 C 또는 C ++를 사용하는 것이 좋습니다. Rust를 사용할 수도 있지만 성가신 많은 안전 기능이 있으며 실제로는 필요하지 않으므로 성 가실 수 있습니다. 특정 하위 수준 최적화를 수행하기가 어렵 기 때문에 성능을 향상시키기가 더 어려워 질 것입니다. 물론 항상 어셈블리로 작성할 수 있지만 너무 많은 작업이 필요할 것입니다. 참조 https://www.chessprogramming.org/Languages/를


1
대단한 정보 감사합니다! 아마도 FEN 위치에서 계산 된 이동을 출력하는 API를 만들려고합니다. 이것이 이것이 리치 봇과 통합하는 가장 좋은 방법이라고 생각합니다.
David Chopin


1
lc0의 네트워크를 사용하는 다른 NN 엔진을 구현하는 옵션입니까?
RemcoGerlich

1
@RemcoGerlich 내가 이해하는 것처럼 NN 엔진은 바이너리와 신경망이라는 두 가지를 사용합니다. 바이너리를 작성하는 것은 쉽지 않지만 신경망을 훈련시키는 것은 비교적 쉽다. 이런 의미에서 Lc0 유도체가 이미 존재합니다. Leelenstein & Deus X (일명 Fat Fritz)가 그러한 유도체입니다.
Allure의

이 경우 실제로는 다른 엔진이 아닌 @RemcoGerlich는 다른 랩핑 / 인터페이스 / 무엇을 가진 Ic0 엔진이 될 것입니다.
Peteris

3

나는 다음을 사용하여 순전히 장난감 체스 엔진을 만들었습니다 : python chess 게임 규칙을 직접 코딩 할 필요가없고 논리에만 집중할 수있어서 정말 좋았습니다. 그러나 초당 평가할 수있는 위치 수가 매우 적습니다. 이것은 좋은 출발점이 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.