Tic-Tac-Toe 인공지능 에이전트 구현: 강화학습 기반 Deep Q-Learning
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
인공지능
대상자
Go 언어 및 강화학습 기초 지식을 가진 개발자 (중급 이상)
핵심 요약
- Double DQN 아키텍처 사용: Q-네트워크와 타겟 네트워크를 통해 Q값 과대평가 최소화
- Board 상태 벡터 표현: 9개 셀의 상태를
1.0
(에이전트),-1.0
(상대),0.0
(빈 셀)로 매핑 - 경험 재생 버퍼:
ReplayBuffer
구조체를 통해 과거 경험 샘플링 기반 학습 - Epsilon-greedy 전략: 탐색(ε)과 활용(1-ε)의 균형 유지
섹션별 세부 요약
1. 게임 메커니즘 및 핵심 개념
- 게임 상태: 3x3 보드의 X/O 배치로 정의
- 행동: 빈 셀 선택 (9가지 가능한 행동)
- 결과: 승리(60%), 패배(30%), 무승부(10%) 확률 분포
- 최초 수리 유리: 최적 전략 시 무승부 확률 10%
2. 보드 상태 표현 및 벡터화
Board
구조체:Cells [9]int
배열로 상태 저장GetStateVector()
메서드:
```go
func (item *Board) GetStateVector(agentPlayer int) []float64 { ... }
```
- 1.0
: 에이전트의 셀
- -1.0
: 상대의 셀
- 0.0
: 빈 셀
3. 신경망 아키텍처
- 입력층: 9개 뉴런 (보드 셀 상태)
- 은닉층: 27/45/72 뉴런,
Tanh
활성화 함수 - 출력층: 9개 뉴런 (가능한 행동)
- 최소 효과적 뉴런 수: 9개
4. 경험 재생 버퍼 구현
ReplayBuffer
구조체:
```go
type ReplayBuffer struct {
Experiences []Experience
Capacity int
Index int
Size int
}
```
- Add()
메서드: 경험 저장
- Sample()
메서드: 랜덤 배치 샘플링
5. DQNAgent 구조 및 행동 선택
DQNAgent
구조체:
```go
type DQNAgent struct {
QNetwork *NeuralNetwork
TargetNetwork *NeuralNetwork
ReplayBuffer *ReplayBuffer
Gamma float64
MaxEpsilon float64
...
}
```
ChooseAction()
메서드:
- epsilon-greedy
전략:
```go
if rand.Float64() < item.MaxEpsilon {
return emptyCells[rand.Intn(len(emptyCells))]
} else {
qValues := item.QNetwork.Predict(stateVec)
...
}
```
6. 에이전트 학습 프로세스
Train()
메서드:
- ReplayBuffer
샘플링
- Q-값 예측 및 타겟 Q-값 계산:
```go
targetQ := exp.Reward + item.Gamma * maxNextQ
```
- 타겟 네트워크 갱신 주기: UpdateTarget
인터벌
결론
- 실무 적용 팁: Double DQN 사용 시 Q값 과대평가 감소,
ReplayBuffer
크기 조정으로 학습 효율성 극대화 - 성능 지표: 최초 수리 시 60% 승리 확률 달성 (실험 결과)
- 코드 구현 주의사항:
Tanh
활성화 함수 사용,Epsilon
감소율 적절히 설정 - 확장성: 보드 크기 확장 시 상태 벡터 표현 방식 수정 필요