2024년 10월 2일 수요일

[Playground] Lightzero training 1

 저번에 이런저런 실험을 통해 빠르고 효율적으로 학습을 할 수 있는 환경을 세팅해두었으니, 이제 제대로 학습을 시켜볼 차례다.

저번에 오델로를 돌릴 수 있도록 env를 만들어주고, 기타 cython 코드들 빌드 후 잘 돌아가는 것도 확인했었는데 뭔가 결과가 계속 이상하게 나와서 점검이 필요하다는 생각은 계속 하고있었다.


이상하다고 진단한 이유는 랜덤 액션을 취하는 봇 상대로 무승부가 나오기 힘든데 무승부의 비중이 너무 높은것 + 승리 비중이 너무 작은것이다.

승리 비중은 그럴 수 있다 쳐도 (모델이 계속 한쪽의 액션만 취하도록 뱉으면 그럴 수 있다고 생각함) 랜덤 상대로 무승부가 이렇게 자주 나올 수 있나 싶어서 점검을 해주었다.

결론은 env 자체 (step시 보드 변경 / legal_action 서치 / winner 및 terminate 여부 판정)에는 문제가 없는데 이걸 품고 돌리는 training단 코드에 이상한 부분이 있었다.

lightzero에 포함된 다른 보드게임들 코드를 참조하여 env만 새로 짜주었는데, 이게 룰이 다르다보니 오델로를 플레이할 때 수정해주어야 하는 부분이 있었다.

틱택토 / connect4 등 코드를 수정해서 새로 짜주었는데 오델로는 이 게임들과 다른 점이 2가지 있어서 모체코드에서 수정이 필요했던 것이다...

1. 틱택토 / connect4의 경우 착수한 플레이어만 승리가 가능하기에, 착수 시 승패를 판정하고 만약 승리 조건을 달성하지 못했는데 legal_action이 없는 경우 무승부 판정

=> 가장 큰 차이는 여기에서 기인했다. 오델로는 대체로 64칸이 꽉 찼을 때 게임이 종료되기에 마지막 수를 착수한 플레이어도 패배할 수 있다. 기존 코드에서는 착수시 착수 플레이어의 승리 여부를 체크한 뒤 착수 플레이어가 승리하지 못했으면 무승부로 판정해서 자꾸 플레이어2가 패배한 경우 training 단에서 무승부라고 판단해서 리워드를 주고 있던 것이었다..

2. 틱택토 / connect4의 경우 게임이 종료되지 않았으면 legal_action이 있어서 턴이 넘어가는 경우가 없음

=> 오델로는 한 플레이어가 legal_action이 없으면 상대 턴으로 넘어가기 때문에, evaluation 과정에서 단순히 턴 기준으로 플레이어를 판단하도록 짜여져 있는 코드가 있었는데, 이 부분의 수정이 필요했다.

이렇게 수정하고 돌려보니, 이제 적어도 evaluation 단에는 문제가 없는 것을 확인했다.

그리고 설레는 마음으로 학습을 돌렸는데...

윽 아직 뭔가 디버깅할 부분이 남아있는 것 같다 - 랜덤 봇 상대로도 잘 이기지 못하는 모습이다

evaluation에는 이제 문제가 없는걸 확인했으니 training 단을 뜯어봐야 할 것 같다.


한 7~8000번까지는 오르는 모습이어서 기대하고 잤는데 웬걸, 그냥 우연이었다.

legal_action이 없으면 턴이 넘어가는 조건이 기존 코드와 호환되지 않는 가장 큰 이유인 것 같은데, 자세한 내용은 좀 더 뜯어봐야 할 것 같다.

같이 오델로 봇을 만드는 친구가 있는데, 10월 15일에 중간고사 끝나면 배틀을 하기로 했으니 due가 생겨서 좀 더 열심히 하게 되는 것 같다ㅋㅋㅋ

댓글 없음:

댓글 쓰기