SlideShare a Scribd company logo
<하스스톤> 강화학습 환경 개발기
옥찬호, Nexon Korea
@utilForever
발표자 소개
Nexon Korea 게임 클라이언트 프로그래머
Microsoft Developer Technologies MVP
페이스북 그룹 C++ Korea 대표
이메일 : utilForever@gmail.com
페이스북, 트위터 : @utilForever
깃허브 : https://github.com/utilForever
안내
이 발표는 개인 연구 프로젝트입니다.
블리자드 엔터테인먼트의 후원, 보증, 제휴 관계는 없습니다.
Hearthstone®
©2014-2019 Blizzard Entertainment, Inc. 모든 권리는 Blizzard Entertainment
에게 있습니다. 미국 및 다른 국가에서 Hearthstone과 Blizzard Entertainment는
Blizzard Entertainment, Inc.의 상표 또는 등록 상표입니다.
안내
이 발표는 강화학습을 하기 위한 환경을 만드는 과정을 설명합니다.
주로 하스스톤 게임 개발에 관한 내용과 코드를 다루고 있습니다.
하스스톤 게임을 알고 있지 않다면 이해하는데 어려움이 있을 수 있습니다.
강화학습 환경을 만들게 된 이유?
강화학습 환경을 만들게 된 이유?
강화학습 환경을 만들게 된 이유?
???
하스스톤
블리자드 엔터테인먼트가 개발한 디지털 카드 수집 게임
2013년 3월 페니 아케이드 엑스포에서 처음 발표
2014년 3월 13일 PC 버전부터 출시
현재까지 12개의 확장팩과 4개의 모험 모드가 추가됨
2018년 11월 발표 기준 전세계 이용자수 1억명 돌파
왜 하스스톤인가?
카드 수집 게임(CCG)이며 불완전한 정보가 주어집니다.
내 덱에서 다음에 무슨 카드가 나올지 알 수 없습니다.
상대방이 현재 손에 무슨 카드를 들고 있는지 알 수 없습니다.
상대방 덱에서 다음에 무슨 카드가 나올지 알 수 없습니다.
왜 하스스톤인가?
무작위 카드가 많아서 결과를 추론하기 힘듭니다.
개발 목표
강화학습을 통해
영리한 플레이를 할 수 있게 만들자. (프로게이머와 대적할 수준)
승률이 높은 덱을 만들어 보자. (1티어 덱보다 높은 승률 : >= 60%)
플레이어가 덱을 만들 때 어떤 카드가 없을 경우,
대체 카드를 추천하는 기능을 만들어 보자.
게임을 활용해 강화학습을 하려면…?
첫번째 방법 : 게임 회사에서 제공하는 API를 사용합니다.
게임을 활용해 강화학습을 하려면…?
첫번째 방법 : 게임 회사에서 제공하는 API를 사용합니다.
스타크래프트2는 있는데, 하스스톤은 없습니다. (실패)
게임을 활용해 강화학습을 하려면…?
첫번째 방법 : 게임 회사에서 제공하는 API를 사용합니다.
스타크래프트2는 있는데, 하스스톤은 없습니다. (실패)
두번째 방법 : 게임을 후킹(Hooking)해 알아낸 정보를 사용합니다.
게임을 활용해 강화학습을 하려면…?
첫번째 방법 : 게임 회사에서 제공하는 API를 사용합니다.
스타크래프트2는 있는데, 하스스톤은 없습니다. (실패)
두번째 방법 : 게임을 후킹(Hooking)해 알아낸 정보를 사용합니다.
서비스 중인 게임에 영향을 주는 행위는 불법입니다. (실패)
게임을 활용해 강화학습을 하려면…?
첫번째 방법 : 게임 회사에서 제공하는 API를 사용합니다.
스타크래프트2는 있는데, 하스스톤은 없습니다. (실패)
두번째 방법 : 게임을 후킹(Hooking)해 알아낸 정보를 사용합니다.
서비스 중인 게임에 영향을 주는 행위는 불법입니다. (실패)
세번째 방법 : 하스스톤을 직접 만들어서 사용합니다.
최후의 방법, 대안이 없습니다.
직접 만들어 봅시다, 하스스톤!
하스스톤의 구조
카드 구현
카드 게임에서 카드를 구현하지 않는다면 아무런 의미가 없습니다.
카드를 구현할 때 고려해야 할 부분
카드 데이터를 어떻게 구할 것인가
카드 데이터를 어떻게 가져올 것인가
카드 효과를 어떻게 인식할 것인가
카드 데이터 처리
하스스톤에는 다양한 카드가 존재하며 서로 다른 데이터를 갖습니다.
모든 카드는 마나 코스트를 갖습니다.
하수인 카드는 공격력과 체력을 갖습니다.
무기 카드는 공격력과 내구도를 갖습니다.
어떤 카드는 어빌리티나 특별한 능력을 갖습니다.
다양한 카드 데이터를 어떻게 가져올 수 있을까요?
HearthstoneJSON (https://hearthstonejson.com/)
하스스톤 카드 데이터를 JSON 형태로 제공하는 사이트
패치가 될 때마다 최신 카드 데이터를 제공합니다.
카드의 동작을 구현하는데 필요한 데이터가 있습니다.
HearthstoneJSON (https://hearthstonejson.com/)
{
"id": "EX1_116",
"name": "Leeroy Jenkins",
"text": "Charge. Battlecry: Summon two 1/1 Whelps for your opponent.",
"attack": 6,
"cardClass": "NEUTRAL",
"collectible": true,
"cost": 5,
"health": 2,
"mechanics": ["BATTLECRY", "CHARGE"],
"rarity": "LEGENDARY",
"set": "EXPERT1",
"type": "MINION"
}
카드 효과 처리
하스스톤에는 고유한 효과를 갖는 카드가 많습니다.
일부 하수인들은 능력을 발동하려면 조건이 필요합니다.
일부 하수인들은 필드에 낼 때 효과를 발동합니다.
일부 하수인들은 죽을 때 효과를 발동합니다.
비밀은 특정 조건에 부합하는 상황이 일어나면 저절로 발동합니다.
다양한 카드 효과를 어떻게 처리할 수 있을까요?
첫번째 문제 – 카드 데이터에 효과가 없습니다
{
"id": "EX1_116",
"name": "Leeroy Jenkins",
"text": "Charge. Battlecry: Summon two 1/1 Whelps for your opponent.",
"attack": 6,
"cardClass": "NEUTRAL",
"collectible": true,
"cost": 5,
"health": 2,
"mechanics": ["BATTLECRY", "CHARGE"],
"rarity": "LEGENDARY",
"set": "EXPERT1",
"type": "MINION"
}
두번째 문제 – 보이는 게 전부가 아닙니다
두번째 문제 – 보이는 게 전부가 아닙니다
그럼 카드 효과를 어떻게 구현하나요?
첫번째 방법 : 카드를 읽어 효과를 자동으로 생성하는 방법을 찾아봅니다.
Latent Predictor Networks for Code Generation (2016)
그럼 카드 효과를 어떻게 구현하나요?
첫번째 방법 : 카드를 읽어 효과를 자동으로 생성하는 방법을 찾아봅니다.
선행 연구가 있긴 한데 쉽지 않고 올바르게 생성이 되지 않는 경우도 많습니다. (실패)
그럼 카드 효과를 어떻게 구현하나요?
첫번째 방법 : 카드를 읽어 효과를 자동으로 생성하는 방법을 찾아봅니다.
선행 연구가 있긴 한데 쉽지 않고 올바르게 생성이 되지 않는 경우도 많습니다. (실패)
두번째 방법 : 카드마다 효과를 직접 구현합니다.
정말로 하기 힘들지만 가장 확실한 방법입니다.
카드 효과 구현
ArmorTask::ArmorTask(int amount) : m_amount(amount) { }
TaskID ArmorTask::GetTaskID() const {
return TaskID::ARMOR;
}
TaskStatus ArmorTask::Impl(Player& player) {
player.GetHero()->GainArmor(m_amount);
return TaskStatus::COMPLETE;
}
DrawTask::DrawTask(int amount) : m_amount(amount) { }
TaskID DrawTask::GetTaskID() const {
return TaskID::DRAW;
}
TaskStatus DrawTask::Impl(Player& player) {
for (int i = 0; i < m_amount; ++i)
Generic::Draw(player, nullptr);
return TaskStatus::COMPLETE;
}
하스스톤 게임 개발
이외에도 많은 작업들을 했습니다.
멀리건, 카드 뽑기 등 게임 진행 로직 구현
대상 지정, 공격, 회복 등 전투 관련 로직 구현
오라, 트리거, 인챈트 등 효과 관련 로직 구현
카드 동작을 확인하기 위한 테스트 코드 구현
…
GameConfig gameConfig;
gameConfig.player1Class = CardClass::WARLOCK;
gameConfig.player2Class = CardClass::WARLOCK;
gameConfig.startPlayer = PlayerType::PLAYER1;
gameConfig.doShuffle = false;
gameConfig.doFillDecks = false;
gameConfig.skipMulligan = true;
gameConfig.autoRun = true;
const std::string INNKEEPER_EXPERT_WARLOCK =
"AAEBAfqUAwAPMJMB3ALVA9AE9wTOBtwGkgeeB/sHsQjCCMQI9ggA";
auto deck = DeckCode::Decode(INNKEEPER_EXPERT_WARLOCK).GetCardIDs();
for (size_t j = 0; j < deck.size(); ++j)
{
gameConfig.player1Deck[j] = *Cards::FindCardByID(deck[j]);
gameConfig.player2Deck[j] = *Cards::FindCardByID(deck[j]);
}
Game game(gameConfig);
game.Start();
EXPECT_EQ(game.state, State::COMPLETE);
EXPECT_TRUE(game.GetPlayer1()->playState == PlayState::WON ||
game.GetPlayer1()->playState == PlayState::LOST);
EXPECT_TRUE(game.GetPlayer2()->playState == PlayState::WON ||
game.GetPlayer2()->playState == PlayState::LOST);
하스스톤 강화학습 환경 개발
지금까지 우리는 하스스톤 게임을 만들었습니다.
하지만 우리의 목표는 AI가 하스스톤 게임을 하도록 만드는 것입니다.
따라서 AI가 게임을 플레이 할 수 있게 만들어야 합니다.
현재 게임의 상황을 AI에게 전달합니다.
AI가 정책에 따라 어떤 행동을 할 것인지를 결정합니다.
AI가 결정한 행동에 따라 게임을 진행합니다.
하스스톤 = 보드 게임
하스스톤은 보드(Board) 게임입니다.
보드 게임에서는 다양한 알고리즘을 사용해 최선의 수를 구합니다.
Minimax Algorithm
Negamax Algorithm
Branch and Bound
Alpha-Beta Pruning
Monte-Carlo Tree Search
Monte-Carlo Tree Search (MCTS)
Monte-Carlo Tree Search (MCTS)
몬테카를로 트리 탐색의 4단계
선택(Selection) : 현재 게임 상태가 트리 내에 존재하는 동안 다음에 수행할 행동을 선택합니다.
이 때 활용(Exploitation)과 탐험(Exploration)의 균형을 맞춰 저장된 통계 값에 따라 선택합니다.
확장(Expansion) : 현재 게임 상태가 트리 내에 존재하지 않으면 새로운 노드로 확장합니다.
시뮬레이션(Simulation) : 게임이 끝날 때까지 다음에 수행할 행동을 임의로 선택합니다.
역전파(Backpropagation) : 게임을 실행한 노드부터 루트 노드까지 통계 값을 갱신합니다.
여기서 통계 값이란 총 게임 실행 횟수, 승리 횟수 등을 말합니다.
Monte-Carlo Tree Search (MCTS)
몬테카를로 트리 탐색의 4단계
선택(Selection) : 현재 게임 상태가 트리 내에 존재하는 동안 다음에 수행할 행동을 선택합니다.
이 때 활용(Exploitation)과 탐험(Exploration)의 균형을 맞춰 저장된 통계 값에 따라 선택합니다.
확장(Expansion) : 현재 게임 상태가 트리 내에 존재하지 않으면 새로운 노드로 확장합니다.
시뮬레이션(Simulation) : 게임이 끝날 때까지 다음에 수행할 행동을 임의로 선택합니다.
역전파(Backpropagation) : 게임을 실행한 노드부터 루트 노드까지 통계 값을 갱신합니다.
여기서 통계 값이란 총 게임 실행 횟수, 승리 횟수 등을 말합니다.
MCTS의 구조
MOMCTS
SOMCTS
Selection Expansion Simulation Backpropagation
강화학습의 3요소 = 상태(State), 행동(Action), 보상(Reward)
하스스톤 RL 환경에서 상태, 행동, 보상이란?
상태 = 현재 게임 정보, 즉 게임 상태
행동 = 게임에서 현재 수행 가능한 행동(카드 내기, 공격하기, 영웅 능력 사용하기, 턴 종료하기)
보상 = 게임에서 승리하면 +, 패배하면 -, 비기면 0
게임 상태, 이대로 괜찮은가?
RosettaStone 프로젝트에서는 Game 클래스를 통해 하나의 게임을 관리합니다.
두 플레이어의 정보, 게임과 관련된 정보, 기타 필요한 변수들을 저장하고 있습니다.
따라서 Game 객체 하나의 크기는 약 1,000바이트로 상당히 큽니다.
MCTS는 트리의 각 노드에 게임의 상태를 저장합니다.
하지만 Game 객체의 크기가 크다 보니 메모리 공간의 낭비가 심합니다.
뭔가 좋은 방법이 없을까요?
게임 상태, 이대로 괜찮은가?
사실 Game 객체에 있는 모든 정보가 필요하진 않습니다.
최적의 행동을 결정하는데 필요한 정보만 있으면 됩니다.
그리고 플레이어 관점에서 볼 수 있는 정보만 가지고 있어야 합니다.
따라서 이 정보를 저장하기 위한 별도의 클래스를 만들어야 합니다.
보드(Board) 클래스
Game : 게임과 관련된 정보를 저장하고 있는 클래스
Board : MCTS에서 행동을 결정하는데 필요한 정보를 담은 클래스
BoardRefView : 플레이어 관점에서 알고 있는 정보를 담은 클래스
ReducedBoardRefView : 해시 함수로 변환한 정보를 담은 클래스
Game Board BoardRefView ReducedBoardRefView
신경망 모델 구현
PyTorch (https://pytorch.org/)
Python 기반의 오픈 소스 머신 러닝 라이브러리입니다.
C++ API(libtorch)와 Python API를 동시 지원합니다.
C++ 기반의 머신러닝 모델 설계에 용이합니다.
하스스톤의 강화학습 환경을 구성하기 위해 libtorch를 사용했습니다.
현재 CNN 기반의 모델을 사용하고 있습니다.
constexpr static int HERO_IN_DIM = 1;
constexpr static int HERO_OUT_DIM = 1;
constexpr static int MINION_IN_DIM = 7;
constexpr static int MINION_OUT_DIM = 3;
constexpr static int MINION_COUNT = 7;
constexpr static int STANDALONE_IN_DIM = 17;
constexpr static int CONCAT_UNIT = 2 * HERO_OUT_DIM +
2 * MINION_COUNT * MINION_OUT_DIM +
STANDALONE_IN_DIM;
constexpr static int FC_UNIT = 10;
torch::nn::Conv1d m_heroConv = torch::nn::Conv1d(
torch::nn::Conv1dOptions(HERO_IN_DIM, HERO_OUT_DIM, 1));
torch::nn::Conv1d m_minionConv = torch::nn::Conv1d(
torch::nn::Conv1dOptions(MINION_IN_DIM, MINION_OUT_DIM, 1));
torch::nn::Linear m_fc1 = torch::nn::Linear(CONCAT_UNIT, FC_UNIT);
torch::nn::Linear m_fc2 = torch::nn::Linear(FC_UNIT, 1);
CNNModel::CNNModel() {
register_module("heroConv1", m_heroConv);
register_module("minionConv1", m_minionConv);
register_module("fc1", m_fc1);
register_module("fc2", m_fc2);
}
torch::Tensor CNNModel::EncodeHero(torch::Tensor x) {
x = x.view({ 1, HERO_IN_DIM, 2 }); // output shape : bs, 1, 2
x = m_heroConv->forward(x); // output shape : bs, 1, 2
x = torch::leaky_relu(x, .2); // output shape : bs, 1, 2
x = x.view({ x.size(0), -1 }); // output shape : bs, 1 * 2
return x;
}
torch::Tensor CNNModel::EncodeMinion(torch::Tensor x) {
x = x.view({ 1, MINION_IN_DIM, MINION_COUNT * 2 }); // output shape : bs, 7, 14
x = m_minionConv->forward(x); // output shape : bs, 3, 14
x = torch::leaky_relu(x, .2); // output shape : bs, 3, 14
x = x.view({ x.size(0), -1 }); // output shape : bs, 3 * 14
return x;
}
torch::Tensor CNNModel::EncodeStandalone(torch::Tensor x) {
x = x.view({ 1, -1 }); // output shape : bs, 17
return x;
}
torch::Tensor CNNModel::forward(torch::Tensor hero, torch::Tensor minion,
torch::Tensor standalone) {
// Input shape : (2), (7, 14), (17,)
// Output shape : (1)
// Encodes the information of heros
auto outHero = EncodeHero(hero);
// Encodes the information of minions
auto outMinion = EncodeMinion(minion);
// Encodes the information of 'standalone'
auto outStandalone = EncodeStandalone(standalone);
auto concatFeatures = torch::cat({ outHero, outMinion, outStandalone }, -1);
concatFeatures = m_fc1->forward(concatFeatures);
concatFeatures = torch::leaky_relu(concatFeatures, .2);
concatFeatures = m_fc2->forward(concatFeatures);
concatFeatures = torch::tanh(concatFeatures);
return concatFeatures;
}
AlphaZero 구현 (진행중)
오랜 시간에 걸쳐 강화학습을 하기 위해 수많은 코드를 구현했습니다.
이제 정말로 강화학습을 구현할 차례입니다. 여기서는 AlphaZero를 구현합니다.
알파제로를 사용하면 하스스톤 리플레이 데이터가 없어도
자체 학습만으로 게임 플레이를 더 잘하게 만들 수 있습니다.
Python API 지원 (진행중)
많은 사람들은 Tensorflow나 PyTorch를 사용해 강화학습 모델을 만듭니다.
비록 libtorch의 성능이 훨신 뛰어나지만 편의성 측면에서는 한계가 있습니다.
저희는 많은 사람들이 새로운 환경에서 연구하기를 원합니다.
따라서 Python API를 지원하기로 결정했습니다.
RosettaStone (https://github.com/utilForever/RosettaStone)
하스스톤 시뮬레이터 + 강화학습 환경 제공
작성 언어 : C++17
지원 컴파일러
g++ (7.0 버전 이상)
clang (5 버전 이상)
Microsoft Visual C++ (2017 버전 이상)
프로젝트 구조
RosettaStone : 하스스톤 시뮬레이터 라이브러리
RosettaTorch : 강화학습과 관련된 코드를 구현하는 라이브러리
RosettaConsole : 하스스톤 게임을 해볼 수 있는 콘솔 프로그램
UnitTests : 카드 효과 및 동작을 테스트하는 프로그램
MCTSTests, AlphaZeroTests : MCTS 및 AlphaZero 동작을 테스트하는 프로그램
강화학습 환경 개발 상황
MCTS 개발 완료
libtorch 연결 완료
AlphaZero 구현중
여관주인과의 대결 시연 준비중 (올해 중으로…?)
앞으로의 계획
모든 카드를 구현할 예정입니다.
우선적으로 오리지널 카드와 정규전에서 사용하는 카드를 구현합니다.
이후 야생전에서 사용하는 카드를 차례대로 구현할 예정입니다.
콘솔 및 GUI 프로그램을 개선해 AI와 대전할 수 있게 만들 예정입니다.
다른 언어에서 사용할 수 있도록 API를 제공할 예정입니다.
우선적으로 Python을 생각하고 있습니다.
앞으로의 계획
앞으로의 계획
앞으로의 계획
감사의 말
RosettaStone 및 다른 RL 환경 개발 프로젝트에 함께 참여하고 있는
한양대학교 소프트웨어학부 학생들
경기과학고등학교 학생들
언급하지 못한 다른 모든 팀원 분들
에게 감사의 말씀을 드립니다.
함께 사이드 프로젝트를 진행할 분들을 언제나 기다리고 있습니다. 
마치며

More Related Content

Similar to GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기

[RLKorea] <하스스톤> 강화학습 환경 개발기
[RLKorea] <하스스톤> 강화학습 환경 개발기[RLKorea] <하스스톤> 강화학습 환경 개발기
[RLKorea] <하스스톤> 강화학습 환경 개발기
Chris Ohk
 
All That Puzzle Games
All That Puzzle GamesAll That Puzzle Games
All That Puzzle Games
Shin Dongwon
 
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법ChangHyun Won
 
NDC2013 - 심리학으로 다시 보는 게임 디자인
NDC2013 - 심리학으로 다시 보는 게임 디자인NDC2013 - 심리학으로 다시 보는 게임 디자인
NDC2013 - 심리학으로 다시 보는 게임 디자인Jubok Kim
 
기획과 디자인(1)
기획과 디자인(1)기획과 디자인(1)
기획과 디자인(1)
태성 이
 
게임밸런싱과 머신러닝, 활용사례 & Tensorflow
게임밸런싱과 머신러닝, 활용사례 & Tensorflow게임밸런싱과 머신러닝, 활용사례 & Tensorflow
게임밸런싱과 머신러닝, 활용사례 & Tensorflow
현철 허
 
what is_tabs_share
what is_tabs_sharewhat is_tabs_share
what is_tabs_share
NAVER D2
 
[RLKorea] Unity ML-agents 발표
[RLKorea] Unity ML-agents 발표[RLKorea] Unity ML-agents 발표
[RLKorea] Unity ML-agents 발표
Kyushik Min
 
에코노베이션 3차 세미나 교안
에코노베이션 3차 세미나 교안에코노베이션 3차 세미나 교안
에코노베이션 3차 세미나 교안
Lee Jungpyo
 
Gdc2016 summary 번역
Gdc2016 summary 번역Gdc2016 summary 번역
Gdc2016 summary 번역
Charlie Hichul Jung
 
위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점
Ryan Park
 
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
devCAT Studio, NEXON
 
LOL win prediction
LOL win predictionLOL win prediction
LOL win prediction
Dong Heon Cho
 
아이폰게임 인피니트블레이드
아이폰게임 인피니트블레이드아이폰게임 인피니트블레이드
아이폰게임 인피니트블레이드
sketchout
 
게임 기획자의 생존 전략
게임 기획자의 생존 전략게임 기획자의 생존 전략
게임 기획자의 생존 전략태성 이
 
iOS7 Sprite Kit을 이용한 게임 개발
iOS7 Sprite Kit을 이용한 게임 개발iOS7 Sprite Kit을 이용한 게임 개발
iOS7 Sprite Kit을 이용한 게임 개발
Changwon National University
 
브릿지 Unity3D 기초 스터디 3회
브릿지 Unity3D 기초 스터디 3회브릿지 Unity3D 기초 스터디 3회
브릿지 Unity3D 기초 스터디 3회
BridgeGames
 
Duroom_SaraNagi_BusinessPlan
Duroom_SaraNagi_BusinessPlanDuroom_SaraNagi_BusinessPlan
Duroom_SaraNagi_BusinessPlan
진영 최
 
04게임의뼈대세우기
04게임의뼈대세우기04게임의뼈대세우기
04게임의뼈대세우기
태성 이
 
탐사분석을통한작업장탐지
탐사분석을통한작업장탐지탐사분석을통한작업장탐지
탐사분석을통한작업장탐지Eun-Jo Lee
 

Similar to GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기 (20)

[RLKorea] <하스스톤> 강화학습 환경 개발기
[RLKorea] <하스스톤> 강화학습 환경 개발기[RLKorea] <하스스톤> 강화학습 환경 개발기
[RLKorea] <하스스톤> 강화학습 환경 개발기
 
All That Puzzle Games
All That Puzzle GamesAll That Puzzle Games
All That Puzzle Games
 
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
 
NDC2013 - 심리학으로 다시 보는 게임 디자인
NDC2013 - 심리학으로 다시 보는 게임 디자인NDC2013 - 심리학으로 다시 보는 게임 디자인
NDC2013 - 심리학으로 다시 보는 게임 디자인
 
기획과 디자인(1)
기획과 디자인(1)기획과 디자인(1)
기획과 디자인(1)
 
게임밸런싱과 머신러닝, 활용사례 & Tensorflow
게임밸런싱과 머신러닝, 활용사례 & Tensorflow게임밸런싱과 머신러닝, 활용사례 & Tensorflow
게임밸런싱과 머신러닝, 활용사례 & Tensorflow
 
what is_tabs_share
what is_tabs_sharewhat is_tabs_share
what is_tabs_share
 
[RLKorea] Unity ML-agents 발표
[RLKorea] Unity ML-agents 발표[RLKorea] Unity ML-agents 발표
[RLKorea] Unity ML-agents 발표
 
에코노베이션 3차 세미나 교안
에코노베이션 3차 세미나 교안에코노베이션 3차 세미나 교안
에코노베이션 3차 세미나 교안
 
Gdc2016 summary 번역
Gdc2016 summary 번역Gdc2016 summary 번역
Gdc2016 summary 번역
 
위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점
 
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
 
LOL win prediction
LOL win predictionLOL win prediction
LOL win prediction
 
아이폰게임 인피니트블레이드
아이폰게임 인피니트블레이드아이폰게임 인피니트블레이드
아이폰게임 인피니트블레이드
 
게임 기획자의 생존 전략
게임 기획자의 생존 전략게임 기획자의 생존 전략
게임 기획자의 생존 전략
 
iOS7 Sprite Kit을 이용한 게임 개발
iOS7 Sprite Kit을 이용한 게임 개발iOS7 Sprite Kit을 이용한 게임 개발
iOS7 Sprite Kit을 이용한 게임 개발
 
브릿지 Unity3D 기초 스터디 3회
브릿지 Unity3D 기초 스터디 3회브릿지 Unity3D 기초 스터디 3회
브릿지 Unity3D 기초 스터디 3회
 
Duroom_SaraNagi_BusinessPlan
Duroom_SaraNagi_BusinessPlanDuroom_SaraNagi_BusinessPlan
Duroom_SaraNagi_BusinessPlan
 
04게임의뼈대세우기
04게임의뼈대세우기04게임의뼈대세우기
04게임의뼈대세우기
 
탐사분석을통한작업장탐지
탐사분석을통한작업장탐지탐사분석을통한작업장탐지
탐사분석을통한작업장탐지
 

More from Chris Ohk

인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
Chris Ohk
 
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
Chris Ohk
 
Momenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStoneMomenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStone
Chris Ohk
 
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
Chris Ohk
 
Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2
Chris Ohk
 
Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1
Chris Ohk
 
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Chris Ohk
 
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Chris Ohk
 
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Chris Ohk
 
Proximal Policy Optimization Algorithms, Schulman et al, 2017
Proximal Policy Optimization Algorithms, Schulman et al, 2017Proximal Policy Optimization Algorithms, Schulman et al, 2017
Proximal Policy Optimization Algorithms, Schulman et al, 2017
Chris Ohk
 
Trust Region Policy Optimization, Schulman et al, 2015
Trust Region Policy Optimization, Schulman et al, 2015Trust Region Policy Optimization, Schulman et al, 2015
Trust Region Policy Optimization, Schulman et al, 2015
Chris Ohk
 
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Chris Ohk
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
Chris Ohk
 
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
Chris Ohk
 
디미고 특강 - 개발을 시작하려는 여러분에게
디미고 특강 - 개발을 시작하려는 여러분에게디미고 특강 - 개발을 시작하려는 여러분에게
디미고 특강 - 개발을 시작하려는 여러분에게
Chris Ohk
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
Chris Ohk
 
[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기
Chris Ohk
 
My Way, Your Way
My Way, Your WayMy Way, Your Way
My Way, Your Way
Chris Ohk
 
Re:Zero부터 시작하지 않는 오픈소스 개발
Re:Zero부터 시작하지 않는 오픈소스 개발Re:Zero부터 시작하지 않는 오픈소스 개발
Re:Zero부터 시작하지 않는 오픈소스 개발
Chris Ohk
 
[9XD] Introduction to Computer Graphics
[9XD] Introduction to Computer Graphics[9XD] Introduction to Computer Graphics
[9XD] Introduction to Computer Graphics
Chris Ohk
 

More from Chris Ohk (20)

인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
 
Momenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStoneMomenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStone
 
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
 
Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2
 
Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1
 
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
 
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
 
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
 
Proximal Policy Optimization Algorithms, Schulman et al, 2017
Proximal Policy Optimization Algorithms, Schulman et al, 2017Proximal Policy Optimization Algorithms, Schulman et al, 2017
Proximal Policy Optimization Algorithms, Schulman et al, 2017
 
Trust Region Policy Optimization, Schulman et al, 2015
Trust Region Policy Optimization, Schulman et al, 2015Trust Region Policy Optimization, Schulman et al, 2015
Trust Region Policy Optimization, Schulman et al, 2015
 
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
 
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
 
디미고 특강 - 개발을 시작하려는 여러분에게
디미고 특강 - 개발을 시작하려는 여러분에게디미고 특강 - 개발을 시작하려는 여러분에게
디미고 특강 - 개발을 시작하려는 여러분에게
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
 
[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기
 
My Way, Your Way
My Way, Your WayMy Way, Your Way
My Way, Your Way
 
Re:Zero부터 시작하지 않는 오픈소스 개발
Re:Zero부터 시작하지 않는 오픈소스 개발Re:Zero부터 시작하지 않는 오픈소스 개발
Re:Zero부터 시작하지 않는 오픈소스 개발
 
[9XD] Introduction to Computer Graphics
[9XD] Introduction to Computer Graphics[9XD] Introduction to Computer Graphics
[9XD] Introduction to Computer Graphics
 

GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기

  • 1.
  • 2. <하스스톤> 강화학습 환경 개발기 옥찬호, Nexon Korea @utilForever
  • 3. 발표자 소개 Nexon Korea 게임 클라이언트 프로그래머 Microsoft Developer Technologies MVP 페이스북 그룹 C++ Korea 대표 이메일 : utilForever@gmail.com 페이스북, 트위터 : @utilForever 깃허브 : https://github.com/utilForever
  • 4. 안내 이 발표는 개인 연구 프로젝트입니다. 블리자드 엔터테인먼트의 후원, 보증, 제휴 관계는 없습니다. Hearthstone® ©2014-2019 Blizzard Entertainment, Inc. 모든 권리는 Blizzard Entertainment 에게 있습니다. 미국 및 다른 국가에서 Hearthstone과 Blizzard Entertainment는 Blizzard Entertainment, Inc.의 상표 또는 등록 상표입니다.
  • 5. 안내 이 발표는 강화학습을 하기 위한 환경을 만드는 과정을 설명합니다. 주로 하스스톤 게임 개발에 관한 내용과 코드를 다루고 있습니다. 하스스톤 게임을 알고 있지 않다면 이해하는데 어려움이 있을 수 있습니다.
  • 9. 하스스톤 블리자드 엔터테인먼트가 개발한 디지털 카드 수집 게임 2013년 3월 페니 아케이드 엑스포에서 처음 발표 2014년 3월 13일 PC 버전부터 출시 현재까지 12개의 확장팩과 4개의 모험 모드가 추가됨 2018년 11월 발표 기준 전세계 이용자수 1억명 돌파
  • 10. 왜 하스스톤인가? 카드 수집 게임(CCG)이며 불완전한 정보가 주어집니다. 내 덱에서 다음에 무슨 카드가 나올지 알 수 없습니다. 상대방이 현재 손에 무슨 카드를 들고 있는지 알 수 없습니다. 상대방 덱에서 다음에 무슨 카드가 나올지 알 수 없습니다.
  • 11. 왜 하스스톤인가? 무작위 카드가 많아서 결과를 추론하기 힘듭니다.
  • 12.
  • 13. 개발 목표 강화학습을 통해 영리한 플레이를 할 수 있게 만들자. (프로게이머와 대적할 수준) 승률이 높은 덱을 만들어 보자. (1티어 덱보다 높은 승률 : >= 60%) 플레이어가 덱을 만들 때 어떤 카드가 없을 경우, 대체 카드를 추천하는 기능을 만들어 보자.
  • 14. 게임을 활용해 강화학습을 하려면…? 첫번째 방법 : 게임 회사에서 제공하는 API를 사용합니다.
  • 15. 게임을 활용해 강화학습을 하려면…? 첫번째 방법 : 게임 회사에서 제공하는 API를 사용합니다. 스타크래프트2는 있는데, 하스스톤은 없습니다. (실패)
  • 16. 게임을 활용해 강화학습을 하려면…? 첫번째 방법 : 게임 회사에서 제공하는 API를 사용합니다. 스타크래프트2는 있는데, 하스스톤은 없습니다. (실패) 두번째 방법 : 게임을 후킹(Hooking)해 알아낸 정보를 사용합니다.
  • 17.
  • 18. 게임을 활용해 강화학습을 하려면…? 첫번째 방법 : 게임 회사에서 제공하는 API를 사용합니다. 스타크래프트2는 있는데, 하스스톤은 없습니다. (실패) 두번째 방법 : 게임을 후킹(Hooking)해 알아낸 정보를 사용합니다. 서비스 중인 게임에 영향을 주는 행위는 불법입니다. (실패)
  • 19. 게임을 활용해 강화학습을 하려면…? 첫번째 방법 : 게임 회사에서 제공하는 API를 사용합니다. 스타크래프트2는 있는데, 하스스톤은 없습니다. (실패) 두번째 방법 : 게임을 후킹(Hooking)해 알아낸 정보를 사용합니다. 서비스 중인 게임에 영향을 주는 행위는 불법입니다. (실패) 세번째 방법 : 하스스톤을 직접 만들어서 사용합니다. 최후의 방법, 대안이 없습니다.
  • 22. 카드 구현 카드 게임에서 카드를 구현하지 않는다면 아무런 의미가 없습니다. 카드를 구현할 때 고려해야 할 부분 카드 데이터를 어떻게 구할 것인가 카드 데이터를 어떻게 가져올 것인가 카드 효과를 어떻게 인식할 것인가
  • 23. 카드 데이터 처리 하스스톤에는 다양한 카드가 존재하며 서로 다른 데이터를 갖습니다. 모든 카드는 마나 코스트를 갖습니다. 하수인 카드는 공격력과 체력을 갖습니다. 무기 카드는 공격력과 내구도를 갖습니다. 어떤 카드는 어빌리티나 특별한 능력을 갖습니다. 다양한 카드 데이터를 어떻게 가져올 수 있을까요?
  • 24. HearthstoneJSON (https://hearthstonejson.com/) 하스스톤 카드 데이터를 JSON 형태로 제공하는 사이트 패치가 될 때마다 최신 카드 데이터를 제공합니다. 카드의 동작을 구현하는데 필요한 데이터가 있습니다.
  • 25. HearthstoneJSON (https://hearthstonejson.com/) { "id": "EX1_116", "name": "Leeroy Jenkins", "text": "Charge. Battlecry: Summon two 1/1 Whelps for your opponent.", "attack": 6, "cardClass": "NEUTRAL", "collectible": true, "cost": 5, "health": 2, "mechanics": ["BATTLECRY", "CHARGE"], "rarity": "LEGENDARY", "set": "EXPERT1", "type": "MINION" }
  • 26. 카드 효과 처리 하스스톤에는 고유한 효과를 갖는 카드가 많습니다. 일부 하수인들은 능력을 발동하려면 조건이 필요합니다. 일부 하수인들은 필드에 낼 때 효과를 발동합니다. 일부 하수인들은 죽을 때 효과를 발동합니다. 비밀은 특정 조건에 부합하는 상황이 일어나면 저절로 발동합니다. 다양한 카드 효과를 어떻게 처리할 수 있을까요?
  • 27. 첫번째 문제 – 카드 데이터에 효과가 없습니다 { "id": "EX1_116", "name": "Leeroy Jenkins", "text": "Charge. Battlecry: Summon two 1/1 Whelps for your opponent.", "attack": 6, "cardClass": "NEUTRAL", "collectible": true, "cost": 5, "health": 2, "mechanics": ["BATTLECRY", "CHARGE"], "rarity": "LEGENDARY", "set": "EXPERT1", "type": "MINION" }
  • 28. 두번째 문제 – 보이는 게 전부가 아닙니다
  • 29. 두번째 문제 – 보이는 게 전부가 아닙니다
  • 30. 그럼 카드 효과를 어떻게 구현하나요? 첫번째 방법 : 카드를 읽어 효과를 자동으로 생성하는 방법을 찾아봅니다.
  • 31. Latent Predictor Networks for Code Generation (2016)
  • 32. 그럼 카드 효과를 어떻게 구현하나요? 첫번째 방법 : 카드를 읽어 효과를 자동으로 생성하는 방법을 찾아봅니다. 선행 연구가 있긴 한데 쉽지 않고 올바르게 생성이 되지 않는 경우도 많습니다. (실패)
  • 33. 그럼 카드 효과를 어떻게 구현하나요? 첫번째 방법 : 카드를 읽어 효과를 자동으로 생성하는 방법을 찾아봅니다. 선행 연구가 있긴 한데 쉽지 않고 올바르게 생성이 되지 않는 경우도 많습니다. (실패) 두번째 방법 : 카드마다 효과를 직접 구현합니다. 정말로 하기 힘들지만 가장 확실한 방법입니다.
  • 34. 카드 효과 구현 ArmorTask::ArmorTask(int amount) : m_amount(amount) { } TaskID ArmorTask::GetTaskID() const { return TaskID::ARMOR; } TaskStatus ArmorTask::Impl(Player& player) { player.GetHero()->GainArmor(m_amount); return TaskStatus::COMPLETE; } DrawTask::DrawTask(int amount) : m_amount(amount) { } TaskID DrawTask::GetTaskID() const { return TaskID::DRAW; } TaskStatus DrawTask::Impl(Player& player) { for (int i = 0; i < m_amount; ++i) Generic::Draw(player, nullptr); return TaskStatus::COMPLETE; }
  • 35. 하스스톤 게임 개발 이외에도 많은 작업들을 했습니다. 멀리건, 카드 뽑기 등 게임 진행 로직 구현 대상 지정, 공격, 회복 등 전투 관련 로직 구현 오라, 트리거, 인챈트 등 효과 관련 로직 구현 카드 동작을 확인하기 위한 테스트 코드 구현 …
  • 36. GameConfig gameConfig; gameConfig.player1Class = CardClass::WARLOCK; gameConfig.player2Class = CardClass::WARLOCK; gameConfig.startPlayer = PlayerType::PLAYER1; gameConfig.doShuffle = false; gameConfig.doFillDecks = false; gameConfig.skipMulligan = true; gameConfig.autoRun = true; const std::string INNKEEPER_EXPERT_WARLOCK = "AAEBAfqUAwAPMJMB3ALVA9AE9wTOBtwGkgeeB/sHsQjCCMQI9ggA"; auto deck = DeckCode::Decode(INNKEEPER_EXPERT_WARLOCK).GetCardIDs(); for (size_t j = 0; j < deck.size(); ++j) { gameConfig.player1Deck[j] = *Cards::FindCardByID(deck[j]); gameConfig.player2Deck[j] = *Cards::FindCardByID(deck[j]); } Game game(gameConfig); game.Start(); EXPECT_EQ(game.state, State::COMPLETE); EXPECT_TRUE(game.GetPlayer1()->playState == PlayState::WON || game.GetPlayer1()->playState == PlayState::LOST); EXPECT_TRUE(game.GetPlayer2()->playState == PlayState::WON || game.GetPlayer2()->playState == PlayState::LOST);
  • 37. 하스스톤 강화학습 환경 개발 지금까지 우리는 하스스톤 게임을 만들었습니다. 하지만 우리의 목표는 AI가 하스스톤 게임을 하도록 만드는 것입니다. 따라서 AI가 게임을 플레이 할 수 있게 만들어야 합니다. 현재 게임의 상황을 AI에게 전달합니다. AI가 정책에 따라 어떤 행동을 할 것인지를 결정합니다. AI가 결정한 행동에 따라 게임을 진행합니다.
  • 38. 하스스톤 = 보드 게임 하스스톤은 보드(Board) 게임입니다. 보드 게임에서는 다양한 알고리즘을 사용해 최선의 수를 구합니다. Minimax Algorithm Negamax Algorithm Branch and Bound Alpha-Beta Pruning Monte-Carlo Tree Search
  • 40. Monte-Carlo Tree Search (MCTS) 몬테카를로 트리 탐색의 4단계 선택(Selection) : 현재 게임 상태가 트리 내에 존재하는 동안 다음에 수행할 행동을 선택합니다. 이 때 활용(Exploitation)과 탐험(Exploration)의 균형을 맞춰 저장된 통계 값에 따라 선택합니다. 확장(Expansion) : 현재 게임 상태가 트리 내에 존재하지 않으면 새로운 노드로 확장합니다. 시뮬레이션(Simulation) : 게임이 끝날 때까지 다음에 수행할 행동을 임의로 선택합니다. 역전파(Backpropagation) : 게임을 실행한 노드부터 루트 노드까지 통계 값을 갱신합니다. 여기서 통계 값이란 총 게임 실행 횟수, 승리 횟수 등을 말합니다.
  • 41. Monte-Carlo Tree Search (MCTS) 몬테카를로 트리 탐색의 4단계 선택(Selection) : 현재 게임 상태가 트리 내에 존재하는 동안 다음에 수행할 행동을 선택합니다. 이 때 활용(Exploitation)과 탐험(Exploration)의 균형을 맞춰 저장된 통계 값에 따라 선택합니다. 확장(Expansion) : 현재 게임 상태가 트리 내에 존재하지 않으면 새로운 노드로 확장합니다. 시뮬레이션(Simulation) : 게임이 끝날 때까지 다음에 수행할 행동을 임의로 선택합니다. 역전파(Backpropagation) : 게임을 실행한 노드부터 루트 노드까지 통계 값을 갱신합니다. 여기서 통계 값이란 총 게임 실행 횟수, 승리 횟수 등을 말합니다.
  • 43. 강화학습의 3요소 = 상태(State), 행동(Action), 보상(Reward) 하스스톤 RL 환경에서 상태, 행동, 보상이란? 상태 = 현재 게임 정보, 즉 게임 상태 행동 = 게임에서 현재 수행 가능한 행동(카드 내기, 공격하기, 영웅 능력 사용하기, 턴 종료하기) 보상 = 게임에서 승리하면 +, 패배하면 -, 비기면 0
  • 44. 게임 상태, 이대로 괜찮은가? RosettaStone 프로젝트에서는 Game 클래스를 통해 하나의 게임을 관리합니다. 두 플레이어의 정보, 게임과 관련된 정보, 기타 필요한 변수들을 저장하고 있습니다. 따라서 Game 객체 하나의 크기는 약 1,000바이트로 상당히 큽니다. MCTS는 트리의 각 노드에 게임의 상태를 저장합니다. 하지만 Game 객체의 크기가 크다 보니 메모리 공간의 낭비가 심합니다. 뭔가 좋은 방법이 없을까요?
  • 45.
  • 46. 게임 상태, 이대로 괜찮은가? 사실 Game 객체에 있는 모든 정보가 필요하진 않습니다. 최적의 행동을 결정하는데 필요한 정보만 있으면 됩니다. 그리고 플레이어 관점에서 볼 수 있는 정보만 가지고 있어야 합니다. 따라서 이 정보를 저장하기 위한 별도의 클래스를 만들어야 합니다.
  • 47. 보드(Board) 클래스 Game : 게임과 관련된 정보를 저장하고 있는 클래스 Board : MCTS에서 행동을 결정하는데 필요한 정보를 담은 클래스 BoardRefView : 플레이어 관점에서 알고 있는 정보를 담은 클래스 ReducedBoardRefView : 해시 함수로 변환한 정보를 담은 클래스 Game Board BoardRefView ReducedBoardRefView
  • 48. 신경망 모델 구현 PyTorch (https://pytorch.org/) Python 기반의 오픈 소스 머신 러닝 라이브러리입니다. C++ API(libtorch)와 Python API를 동시 지원합니다. C++ 기반의 머신러닝 모델 설계에 용이합니다. 하스스톤의 강화학습 환경을 구성하기 위해 libtorch를 사용했습니다. 현재 CNN 기반의 모델을 사용하고 있습니다.
  • 49. constexpr static int HERO_IN_DIM = 1; constexpr static int HERO_OUT_DIM = 1; constexpr static int MINION_IN_DIM = 7; constexpr static int MINION_OUT_DIM = 3; constexpr static int MINION_COUNT = 7; constexpr static int STANDALONE_IN_DIM = 17; constexpr static int CONCAT_UNIT = 2 * HERO_OUT_DIM + 2 * MINION_COUNT * MINION_OUT_DIM + STANDALONE_IN_DIM; constexpr static int FC_UNIT = 10; torch::nn::Conv1d m_heroConv = torch::nn::Conv1d( torch::nn::Conv1dOptions(HERO_IN_DIM, HERO_OUT_DIM, 1)); torch::nn::Conv1d m_minionConv = torch::nn::Conv1d( torch::nn::Conv1dOptions(MINION_IN_DIM, MINION_OUT_DIM, 1)); torch::nn::Linear m_fc1 = torch::nn::Linear(CONCAT_UNIT, FC_UNIT); torch::nn::Linear m_fc2 = torch::nn::Linear(FC_UNIT, 1);
  • 50. CNNModel::CNNModel() { register_module("heroConv1", m_heroConv); register_module("minionConv1", m_minionConv); register_module("fc1", m_fc1); register_module("fc2", m_fc2); } torch::Tensor CNNModel::EncodeHero(torch::Tensor x) { x = x.view({ 1, HERO_IN_DIM, 2 }); // output shape : bs, 1, 2 x = m_heroConv->forward(x); // output shape : bs, 1, 2 x = torch::leaky_relu(x, .2); // output shape : bs, 1, 2 x = x.view({ x.size(0), -1 }); // output shape : bs, 1 * 2 return x; } torch::Tensor CNNModel::EncodeMinion(torch::Tensor x) { x = x.view({ 1, MINION_IN_DIM, MINION_COUNT * 2 }); // output shape : bs, 7, 14 x = m_minionConv->forward(x); // output shape : bs, 3, 14 x = torch::leaky_relu(x, .2); // output shape : bs, 3, 14 x = x.view({ x.size(0), -1 }); // output shape : bs, 3 * 14 return x; } torch::Tensor CNNModel::EncodeStandalone(torch::Tensor x) { x = x.view({ 1, -1 }); // output shape : bs, 17 return x; }
  • 51. torch::Tensor CNNModel::forward(torch::Tensor hero, torch::Tensor minion, torch::Tensor standalone) { // Input shape : (2), (7, 14), (17,) // Output shape : (1) // Encodes the information of heros auto outHero = EncodeHero(hero); // Encodes the information of minions auto outMinion = EncodeMinion(minion); // Encodes the information of 'standalone' auto outStandalone = EncodeStandalone(standalone); auto concatFeatures = torch::cat({ outHero, outMinion, outStandalone }, -1); concatFeatures = m_fc1->forward(concatFeatures); concatFeatures = torch::leaky_relu(concatFeatures, .2); concatFeatures = m_fc2->forward(concatFeatures); concatFeatures = torch::tanh(concatFeatures); return concatFeatures; }
  • 52. AlphaZero 구현 (진행중) 오랜 시간에 걸쳐 강화학습을 하기 위해 수많은 코드를 구현했습니다. 이제 정말로 강화학습을 구현할 차례입니다. 여기서는 AlphaZero를 구현합니다. 알파제로를 사용하면 하스스톤 리플레이 데이터가 없어도 자체 학습만으로 게임 플레이를 더 잘하게 만들 수 있습니다.
  • 53. Python API 지원 (진행중) 많은 사람들은 Tensorflow나 PyTorch를 사용해 강화학습 모델을 만듭니다. 비록 libtorch의 성능이 훨신 뛰어나지만 편의성 측면에서는 한계가 있습니다. 저희는 많은 사람들이 새로운 환경에서 연구하기를 원합니다. 따라서 Python API를 지원하기로 결정했습니다.
  • 54. RosettaStone (https://github.com/utilForever/RosettaStone) 하스스톤 시뮬레이터 + 강화학습 환경 제공 작성 언어 : C++17 지원 컴파일러 g++ (7.0 버전 이상) clang (5 버전 이상) Microsoft Visual C++ (2017 버전 이상)
  • 55. 프로젝트 구조 RosettaStone : 하스스톤 시뮬레이터 라이브러리 RosettaTorch : 강화학습과 관련된 코드를 구현하는 라이브러리 RosettaConsole : 하스스톤 게임을 해볼 수 있는 콘솔 프로그램 UnitTests : 카드 효과 및 동작을 테스트하는 프로그램 MCTSTests, AlphaZeroTests : MCTS 및 AlphaZero 동작을 테스트하는 프로그램
  • 56. 강화학습 환경 개발 상황 MCTS 개발 완료 libtorch 연결 완료 AlphaZero 구현중 여관주인과의 대결 시연 준비중 (올해 중으로…?)
  • 57. 앞으로의 계획 모든 카드를 구현할 예정입니다. 우선적으로 오리지널 카드와 정규전에서 사용하는 카드를 구현합니다. 이후 야생전에서 사용하는 카드를 차례대로 구현할 예정입니다. 콘솔 및 GUI 프로그램을 개선해 AI와 대전할 수 있게 만들 예정입니다. 다른 언어에서 사용할 수 있도록 API를 제공할 예정입니다. 우선적으로 Python을 생각하고 있습니다.
  • 61. 감사의 말 RosettaStone 및 다른 RL 환경 개발 프로젝트에 함께 참여하고 있는 한양대학교 소프트웨어학부 학생들 경기과학고등학교 학생들 언급하지 못한 다른 모든 팀원 분들 에게 감사의 말씀을 드립니다. 함께 사이드 프로젝트를 진행할 분들을 언제나 기다리고 있습니다. 