
BinProp는 두 수로 이어지는 체스 포지션을 비교하고, 엔진이 더 나은 수를 고른 이유를 자연어로 설명하는 방법을 보여준다. 데모에서는 언어 모델이 승리한 포지션에서 패배한 포지션보다 자주 나타나는 체스 패턴을 제안하고, 전체 표본에서의 빈도를 기준으로 채택하거나 제외한다.
예를 들어 폰으로 잡으면 기물 우세가 생기고 나이트로 잡으면 기물 수가 같아지는 경우, 설명은 폰으로 잡는 수가 기물 우세를 만든다고 요약한다. BinProp는 이런 패턴을 모티프라고 부른다. 자료에 따르면 기물 우세는 승리 포지션의 61.5%, 패배 포지션의 5.5%에서 나타났다.
언어 모델이 제안한 비숍 쌍 우세는 승리 포지션의 17.76%, 패배 포지션의 15.15%에서 나타나 채택됐다. 통과 폰은 각각 15.62%와 9.32%로 역시 채택됐다. 반면 더블 폰은 승리 포지션의 19.56%, 패배 포지션의 19.81%에서 나타나 패배 포지션에 더 흔하다는 이유로 제외됐다.
이 모티프를 이용한 사례에서는 흑의 최선 수 Re2가 통과 폰을 유지하지만, 대안 Nd6를 두면 통과 폰을 잃는다고 설명한다. 또 다른 사례에서는 최선 수 c4 뒤 흑 나이트가 백 폰에게 쫓기지 않는 d3 칸에 전초기지를 만들고, 흑 룩은 반개방 파일에 놓이며, 흑 기물의 평균 도달 칸 수가 백보다 많다는 점을 제시한다. 이 설명은 각 수 이후의 포지션을 모티프와 연결해 비교한다.
데모에서 제시한 모티프는 다음 파이썬 코드로 판별한다.
import chess
def bishop_pair(board):
us = board.turn
ours = len(board.pieces(chess.BISHOP, us))
theirs = len(board.pieces(chess.BISHOP, not us))
return ours == 2 and theirs <= 1
import chess
def passed_pawn(board):
us = board.turn
forward = 1 if us == chess.WHITE else -1
enemies = board.pieces(chess.PAWN, not us)
for pawn in board.pieces(chess.PAWN, us):
file = chess.square_file(pawn)
rank = chess.square_rank(pawn)
if not any(
abs(chess.square_file(p) - file) <= 1
and (chess.square_rank(p) - rank) * forward > 0
for p in enemies
):
return True
return False
import chess
def doubled_pawns(board):
pawns = board.pieces(chess.PAWN, board.turn)
files = [chess.square_file(pawn) for pawn in pawns]
return len(files) > len(set(files))
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요