reinforcement-learning-kr / alpha_omok Goto Github PK
View Code? Open in Web Editor NEWMinimal version of DeepMind AlphaZero
Minimal version of DeepMind AlphaZero
저희 이번 7월 7일 중간발표 때 master에 한번 merge하는게 어떨까요?
무려 developer가 master에 비해 100 커밋 이상 앞서있네요 ㅎㅎㅎ
master로 merge 전에 개인적으로 진행하신 부분들에 최종적으로 이상이 없는지 재확인 부탁드릴게요!
tau가 1인 6수 이내임에도 1000번이상 방문한 수가 있었다면 거의 원핫 백터가 됐을 겁니다.
학습에 영향이 있었겠습니다. 급하게 수정합니다. ㅠㅠ
기존 알파제로 에이전트가 학습이 안되는 문제를 해결하기 위해 강화학습 만으로 학습.
학습한 에이전트가 MCTS 400회 돌린 에이전트와 붙어서 이길 정도로만 강화학습 시킴.
그 이후에 MCTS를 붙여서 알파제로 알고리즘 만들 계획
디버깅용 폴더를 따로 만들어서 다음 과정으로 테스트 해볼 예정
p_batch -> torch.exp(p_batch)
loss = F.mse_loss(v_batch, z_batch) + F.kl_div(p_batch, pi_batch)
에서 모델의 아웃풋인 p_batch의 값이 log_softmax 이므로 torch.exp(p_batch) 로 바꾸어야 softmax값이 됨.
pi_batch는 원래 softmax 값임.
(1) PUCTAgent의 Tree 알고리즘 수정
(2) get_state_pt
(3) nural_net.py
(4) HumanAgent 추가
맥에서 pygame 마우스 이벤트 동작이 제대로 안되는 문제가 발생합니다.
알파고 제로 논문을 다시 읽어 봤습니다.
현재 저희 MCTS에서는 루트 노드의 p에 노이즈를 주고 있습니다. (오버피팅으로 인한 exploration의 부재를 막는 것으로 생각하고 있습니다.) 그런데 논문에서는 추가적으로 이런 식의 코멘트를 합니다.
"이 노이즈로 인해 좋지 않은 수를 두는 경우도 생기기 때문에 V_resign으로 필터링한다."
좋지 않은 샘플이 데이터 셋에 많이 포함되면 학습에 좋지 않으니 중간에 자른다는 개념 같습니다.
디테일을 보면 V_resign 이하의 Value가 나오는 State에서 게임을 중단하고 데이터를 저장하는데, V_resign을 정하는 방법은,
저희의 경우 self-play 횟수가 그다지 많지 않기 때문에 하위 5% 미만이 아닌 최솟값으로 설정하면 될 것 같습니다.
현재 코드 구현하여 main에 붙여서 테스트 중입니다.
안녕하세요! RLKorea의 알파오목을 참고하며 많은 도움을 받았습니다!
이리저리 실험을 하다가 학습된 정책에 비정상적인 대칭성이 발견되어서 디버깅하던 도중 np.fliplr
이 3D ndarray에 대해서 의도와 다르게 동작하는 것을 발견했습니다.
# alpha_omok/2_AlphaOmok/utils.py:235
s_flip = np.fliplr(s_rot).copy()
pi_flip = np.fliplr(pi_rot).flatten().copy()
여기서 pi_rot
은 2D array라서 의도한대로 좌우 반전을 합니다. 하지만 s_rot
의 경우 3D array인데 fliplr
시 상하반전이 되더군요. fliplr
이 단순히 1번 축에대해 반전하도록 구현되어 있나봅니다.
따라서 이 부분을 np.flip
을 사용해 다음과같이 수정해야 의도하는 좌우반전이 되는 것 같습니다.
s_flip = np.flip(s_rot, 2).copy()
pi_flip = np.fliplr(pi_rot).flatten().copy()
규식님과 슬랙에서 논의하던 중 해당 이슈로 다같이 논의해보자고 하셔서 올리게 되었습니다.
실제 경기를 할 때에 노이즈를 줘야하는지에 대한 이슈입니다.
처음엔 실제 경기이기에 빼는게 당연하다고 생각했는데..
그러면 같은 상태에서 매번 같은 답이 나올 겁니다. (같은 mcts 횟수라면)
그런데 제로 vs 제로 경기를 보면 초반부터 매번 다른 판이 생성되거든요.
그래서 생각해본 대안으로는,
등의 아이디어가 있을 것 같습니다. 좋은 방법을 정해보죠. :-)
현재는 selection 에서 root_id를 방문 할때마다 child들의 p에 노이즈를 합쳐줘서 U의 계산에만 쓰는 방법인데 이 방법이 노이즈를 너무 과도하게 주는 것으로 보입니다.
그 근거는 이 방식으로 1000step 학습한 모델을 평가 했을때 raw 모델조차 이기지 못했습니다.
그래서 selection 에서 노이즈를 주는 것 아니라,
그 결과, 200step 학습한 모델을 raw 모델과 평가해봤을때, 8:2 로 이겨서 학습이 된 걸 확인할 수 있었습니다.
3_alphazero/
aganets/
local.py
server.py
data/
__init__.py
env/
env_regular.py
env_small.py
info/
agent.py
game.py
logs/
__init__.py
static/
agent.js
board.png
...
templates/
agent_view.html
dashboard.html
...
eval_local.py
eval_server.py
main.py
model.py
util.py
레포지토리 이름을 alphaomok이나 alpha_omok으로 하는게 어떨까요?
그리고 go 관련해서 만들어놓은 폴더를 지우는게 어떨까요?
학습속도를 빠르게하기 위해서 train전에 데이터를 대칭변환으로 Augmentation하는 기능이 있으면 좋을 것 같습니다. 이전에 만든 함수는 현재 state의 대칭변환 중 하나를 랜덤 선택하여 리턴하는 함수였는데 랜덤 선택이 아니라 가능한 변환 전부를 데이터 셋에 포함시켜서 학습하면 확실히 빨리 늘지 않을까 싶습니다.
저장된 모델의 파라미터를 불러와서 대결. 승률과 ELO 점수 계산.
기능1. 모델_new vs 모델_old
기능2. 모델_new vs PUCT
"기능1"의 목적: 학습의 진행정도에 따라 Policy가 개선되고 있는지 확인.
"기능2"의 목적: 절대적인 실력 확인. Random Policy 기반의 PUCT를 base로 잡아 어느 정도 실력인지 확인.
PUCT: 모델이 없는 MCTS 버전. P = 1 / 착수가능 수의 개수, V = Random Rollout의 결과 사용.
평가 방법
(1) ZeroAgent 버그 수정
(2) pi temperature 적용
(3) softmax temperature
흑의 경우
백의 경우
P를 re-nomalization 하는 부분이 다 안 고쳐져 있어서 수정하였습니다.
python evaluator.py으로 실행시킨다음 크롬 등 브라우저에서 아래 주소를 입력하면 게임 및 에이전트 상태를 볼 수 있습니다.
http://127.0.0.1:5000/gameboard_view
http://127.0.0.1:5000/agent_view/player/visit
http://127.0.0.1:5000/agent_view/player/pi
http://127.0.0.1:5000/agent_view/enemy/visit
http://127.0.0.1:5000/agent_view/enemy/pi
착수금지인 곳의 P가 존재하는 경우 착수금지가 아닌 곳의 확률을 받아서 re-nomalizing 했다고 Alpha Zero 논문에 언급되어 있네요.
추가하겠습니다!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.