
오목 강화학습을 해보았다.
https://www.youtube.com/watch?v=SvE2tEFq7j4
직접 학습한 ai들끼리 대결하는 영상이다.
오목은 가능한 경우의 수가 매우 많기 때문에
표에 기반한 강화학습 방법으로는 해결이 불가능하다.
따라서 인공신경망을 이용하여 해결하였다.
간략히 설명하자면
가장 가치가 높은 상태가 되도록 하는 수를 선택하며,
각 상태에 대한 가치는 인공신경망을 이용하여 근사한다.
사실 가치를 근사함으로 인해
정책이 최적으로 수렴한다는 보장은 사라졌지만,
최적에 가까워질 가능성을 이용해 보았다.
보드를 이미지처럼 다루며, Convolution계층을 사용하는 가치값 회귀모델을 학습한다.
(전체 코드, t4기준 30분정도 돌리면 영상 재현 가능)
https://github.com/nrye4286/reinforcementLearning/blob/main/omok.ipynb
좀더 자세한 설명으로는
4개의 모델을 사용하며, 이들끼리의 시뮬레이션을 통해 학습한다.
승리시 10의 보상, 패배시 -10의 보상을 획득하고
0.95의 할인율을 적용한 2단계 TD방법으로 표본을 만들었다.
이때 여러개의 모델, 더 깊은 CNN모델을 이용하게 된다면 더 좋은 성능을 보일것으로 예측된다.
한개 혹은 두개의 모델로 시뮬레이션을 한 결과
여러판을 해도 대부분의 에피소드가 같은 양상으로 끝나는 모습을 보였다.
이론상 승리를 통해 10의 보상을 획득해야 부트스트랩을 통해 다른 가치들도 갱신되는데, 계속 같은 양상을 그리며 지게 된다면 학습이 제대로 이루어지지 않게 된다.
따라서 여러 모델을 이용하는 방법으로 해결하였다.
나랑 상대할때에는 처참한 실력을 보였다.
하지만 ai끼리 대결하는 모습을 지켜봤을때,
'랜덤하게 놓지는 않는구나' 하는 생각이 들었다.
아직 강화학습의 여러 테크닉을 공부하진 않아서
학습시에 높은 분산, 학습 멈춤 등의 문제로 불안정한 모습을 해결하진 못하였다.
오차를 줄이게 될 때 표본의 이득은 .detach()해줘야 하지만, 하지 않았다.
하지 않게 되면 이는 완전한 SGD방식이 된다.
이는 이론상 더 낮은 loss값으로 수렴하게 되나,
정확하지 않은 가중치로 수렴한다고 한다.
우리의 목표는 loss를 줄이는것이 아닌,
더 정확한 이득값으로 w를 이동시키는 개념으로 이해하면 되겠다.