GithubHelp home page GithubHelp logo

alpha_omok's People

Contributors

dnddnjs avatar kekmodel avatar kyushik avatar tykimos avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

alpha_omok's Issues

모델 평가 파일 (evauator.py) 추가 제안

저장된 모델의 파라미터를 불러와서 대결. 승률과 ELO 점수 계산.

기능1. 모델_new vs 모델_old
기능2. 모델_new vs PUCT

"기능1"의 목적: 학습의 진행정도에 따라 Policy가 개선되고 있는지 확인.
"기능2"의 목적: 절대적인 실력 확인. Random Policy 기반의 PUCT를 base로 잡아 어느 정도 실력인지 확인.


PUCT: 모델이 없는 MCTS 버전. P = 1 / 착수가능 수의 개수, V = Random Rollout의 결과 사용.


평가 방법

  • 시뮬레이션 횟수는 400회로 통일.
  • Dirichlet Noise 사용 안함.
  • 항상 Greedy하게 Action 선택.
  • 대결 횟수 30회.
  • 승률: (승리 수 + 0.5 x 무승부 수) / 전체 대결 수
  • ELO 점수: PUCT를 0점으로 계산. k-factor = 32. (참고: https://en.wikipedia.org/wiki/Elo_rating_system)

Noise 주는 방식 변경

현재는 selection 에서 root_id를 방문 할때마다 child들의 p에 노이즈를 합쳐줘서 U의 계산에만 쓰는 방법인데 이 방법이 노이즈를 너무 과도하게 주는 것으로 보입니다.

그 근거는 이 방식으로 1000step 학습한 모델을 평가 했을때 raw 모델조차 이기지 못했습니다.

그래서 selection 에서 노이즈를 주는 것 아니라,

  • root_id에 방문시 1회만 child_id의 기존 p에 합쳐서 다시 p에 넣는 방법으로 변경하였습니다.

그 결과, 200step 학습한 모델을 raw 모델과 평가해봤을때, 8:2 로 이겨서 학습이 된 걸 확인할 수 있었습니다.

Debug ZeroAgent , Add pi temperature, etc.

(1) ZeroAgent 버그 수정

  • expansion 함수에서 p값이 action_index가 아닌 순차적으로 들어가던 문제 수정
  • main.py에서 step변수 중복되는 것 수정

(2) pi temperature 적용

  • 일정 진행까지 tau=1, 그 이후 tau->0 적용되는 것을 play만이 아니라 dataset에도 저장하여 학습되게 함

(3) softmax temperature

  • 알파고 논문에 나온 0.67파라미터를 적용하여 실험 중
  • 네트워크 마지막단에 적용. out = self.log_softmax(out / 0.67)

Dataset Augmentation

학습속도를 빠르게하기 위해서 train전에 데이터를 대칭변환으로 Augmentation하는 기능이 있으면 좋을 것 같습니다. 이전에 만든 함수는 현재 state의 대칭변환 중 하나를 랜덤 선택하여 리턴하는 함수였는데 랜덤 선택이 아니라 가능한 변환 전부를 데이터 셋에 포함시켜서 학습하면 확실히 빨리 늘지 않을까 싶습니다.

loss 수식 수정

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 값임.

3-alphazero 업데이트

Test에서 좋았던 방법 3번 폴더에 업데이트 + 코드 최적화 + 학습모니터링

  • ZeroAgent 최적화
    • id를 적극 활용하도록 변경
    • 필요없는 tree 삭제 기능 추가 (evaluator)
    • 메모리 사용 감소, 탐색속도 향상
  • online_eval.py 추가
    • 셀프플레이시 실시간 평가를 위한 파일, evaluator와 구분함
  • main.py 변화
    • 실시간 평가 적용
    • logs 폴더에 학습 로그 기록되도록 기능 추가
    • 셀프플레이 화면 출력 온오프 지원
    • 기권기능 온오프 지원
    • 텐서보드 온오프 지원
  • neural_net.py에 웅원님 네트워크 추가
    • PVNetW
  • tensor 스타일 수정
    • pytorch 0.4 style로 깔끔하게 수정

Debug ZeroAgent

P를 re-nomalization 하는 부분이 다 안 고쳐져 있어서 수정하였습니다.

실제 경기를 할 때 root node에 noise 포함할지 여부

규식님과 슬랙에서 논의하던 중 해당 이슈로 다같이 논의해보자고 하셔서 올리게 되었습니다.

실제 경기를 할 때에 노이즈를 줘야하는지에 대한 이슈입니다.

처음엔 실제 경기이기에 빼는게 당연하다고 생각했는데..

그러면 같은 상태에서 매번 같은 답이 나올 겁니다. (같은 mcts 횟수라면)

그런데 제로 vs 제로 경기를 보면 초반부터 매번 다른 판이 생성되거든요.

그래서 생각해본 대안으로는,

  1. root node noise + 항상 pi의 최댓값을 선택한다.
  2. root node noise + 초반 몇 수 까지 pi의 확률 분포대로 선택한다. (현재 셀프플레이 기보 생성 방식)
  3. root node noise를 빼고 초반 몇 수 까지 pi의 확률 분포대로 선택한다.
  4. softmax temperature 디스카운트
  5. 기타

등의 아이디어가 있을 것 같습니다. 좋은 방법을 정해보죠. :-)

Master로 merge하기!

저희 이번 7월 7일 중간발표 때 master에 한번 merge하는게 어떨까요?
무려 developer가 master에 비해 100 커밋 이상 앞서있네요 ㅎㅎㅎ
master로 merge 전에 개인적으로 진행하신 부분들에 최종적으로 이상이 없는지 재확인 부탁드릴게요!

렌쥬룰 적용하기

흑의 경우

  • 3-3 금지
  • 4-4 금지
  • 장목 금지

백의 경우

  • 3-3, 4-4 가능
  • 백이 장목을 두면 이김

Alpha_Zero 수정사항

Debug to backup value incorrectly

  • value가 음양이 교대로 백업되지 않았던 치명적인 버그 수정함
  • 이제 학습이 되는 것으로 보여지며 현재 테스트 중

Add module tensorboardX to use tensorboard

  • 학습 관찰을 위해 tensorboardX 모듈 추가
  • pip install tensorboardX 설치 필요
  • tensorboardX를 사용한 코드 실행시 코드가 포함된 폴더에 runs라는 폴더가 자동 생성됨
  • 그 위치에서 tensorboard --logdir runs(=폴더경로) 으로 실행하면 웹 브라우저로 실시간 관찰 가능

Add symmetry_choice function

  • 8대칭 변형을 해주는 함수 utils.py 에 추가

Add code to control tau so pi is not nan

  • tau가 지수여서 N이 너무 큰경우 nan이 발생할 수 있음
  • 실험을 통해 nan이 발생하는 크기에서 tau를 조절하도록 코드 추가

Change memory storage method

  • 데이터셋 저장시 흑위주, 백위주로 편향되어 저장되는 것 수정
  • shuffle을 하여도 영향을 받을 수 있을 것 같았음
  • 타임스텝 순서대로 저장되도록 수정하였음

Change neural network initialization method

  • None끼리 붙여봤을때 승률 젤 좋은 놈으로 세팅하였음
  • kaiming_normal
  • pytorch 0.4 설치 필요

Cleanup codebase

  • 지저분한 코드들 함수 만들어서 정리
  • pytorch 0.4 설치 필요

master에 올리기 전에 구조 조정

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
  • 이름 변경
    utils의 함수 argmax_pi() -> argmax_onehot()
    neural_net -> model

ZeroAgent, UCTAgent, HumanAgent 추가, state 생성함수 디버그

(1) PUCTAgent의 Tree 알고리즘 수정

  • total_n이 차이나는 원인 발견하여 문제 해결
  • 셀프플레이 뿐만 아니라 평가 모드에서도 버그가 생기지 않도록 구조 변경
  • id에 많은 정보가 담겨있으므로 좀 더 활용 (id를 활용한 함수들 utils.py에 추가)
  • PEP8 형식, 변수이름 일관성있게 수정
  • tree에 저장되는 데이터들을 일일이 확인하였는데 아직은 생각대로 돌아감. (버그 발견시 알려주세요 :-P)
  • 에이전트 클래스가 많아져서 agent.py -> agents.py 로 파일명 바꿈.

(2) get_state_pt

  • 기존에 흑턴에 백 state, 백턴에 흑 state가 생성되던 문제 해결
  • AlphaGo Zero 방법이 좀 복잡해서 Alpha Zero 방법으로 만듦 (논문 참조)

(3) nural_net.py

  • PolicyHead에서 filter 2개로 받는 것이 pass move의 확률을 구하기 위함임 발견 -> filter 1개로 수정

(4) HumanAgent 추가

  • 평가모드에서 사람과 대결할 수 있도록 추가함 (model_path = 'human' 으로 사용가능함)

강화학습 에이전트로 PUCT 에이전트(simulation 400회) 이기기

기존 알파제로 에이전트가 학습이 안되는 문제를 해결하기 위해 강화학습 만으로 학습.
학습한 에이전트가 MCTS 400회 돌린 에이전트와 붙어서 이길 정도로만 강화학습 시킴.
그 이후에 MCTS를 붙여서 알파제로 알고리즘 만들 계획

Alpha_Zero Resign

알파고 제로 논문을 다시 읽어 봤습니다.
현재 저희 MCTS에서는 루트 노드의 p에 노이즈를 주고 있습니다. (오버피팅으로 인한 exploration의 부재를 막는 것으로 생각하고 있습니다.) 그런데 논문에서는 추가적으로 이런 식의 코멘트를 합니다.

"이 노이즈로 인해 좋지 않은 수를 두는 경우도 생기기 때문에 V_resign으로 필터링한다."

좋지 않은 샘플이 데이터 셋에 많이 포함되면 학습에 좋지 않으니 중간에 자른다는 개념 같습니다.

디테일을 보면 V_resign 이하의 Value가 나오는 State에서 게임을 중단하고 데이터를 저장하는데, V_resign을 정하는 방법은,

  • 먼저 self-play 횟수의 10% 까지는 resign없이 진행합니다.
  • 진행하면서 이기거나 비긴게임 대한 State의 Value들을 저장합니다.
  • 이 Value들 중 하위 5% 미만에 해당하는 값으로 V_resign을 정합니다.
    (즉, 이기거나 비길건데 resign하는 경우를 5% 미만으로 한정합니다.)
  • 나머지 90%의 게임에선 V_resign 이하의 Value를 갖는 State에서 게임을 중단합니다.

저희의 경우 self-play 횟수가 그다지 많지 않기 때문에 하위 5% 미만이 아닌 최솟값으로 설정하면 될 것 같습니다.
현재 코드 구현하여 main에 붙여서 테스트 중입니다.

3D ndarray에 대한 np.fliplr 문제

안녕하세요! 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()

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.