Deep Q-Learning으로 구현한 틱택토 AI 에이전트
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

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 감소율 적절히 설정
  • 확장성: 보드 크기 확장 시 상태 벡터 표현 방식 수정 필요