AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019Kenneth Ceyer
올바른 코드 작성을 고민하는 연구자들을 위하여 - 클린코드는 여러분의 코드를 복잡한 패턴으로 구현하여 시간을 잡아먹는, 겉만 화려한 장식이 아닙니다. 모델을 구현하고, 또 그것을 테스트 할 때 이것이 정말 올바른 코드인지 궁금하셨나요? 이 세션에서는 연구 모델을 작성할 때 발견할 수 있는, 빈번한 코드 악취(Code smell)들과, 그것들을 어떻게 없앨 수 있을지에 대해서 알아봅니다. 코드에 영혼을 불어넣고, 그 어떤 코드라도 부끄럽지 않게 구현할 수 있는 연구자들이 되어봅시다!
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기Chris Ohk
강화학습에 관심을 갖게 되어 어떤 게임에 적용해볼까 고민하다가 평소 즐기던 '하스스톤'이라는 게임에 관심을 갖게 되어 2017년 말부터 하스스톤 강화 학습을 위한 API를 만들기 시작했습니다. 이 발표를 통해 평소 하스스톤과 같은 카드 게임 개발이나 게임에 강화학습을 적용하기 위한 환경을 구축하는데 관심을 갖고 있던 프로그래머들에게 조금이나마 도움이 되었으면 합니다.
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019Kenneth Ceyer
올바른 코드 작성을 고민하는 연구자들을 위하여 - 클린코드는 여러분의 코드를 복잡한 패턴으로 구현하여 시간을 잡아먹는, 겉만 화려한 장식이 아닙니다. 모델을 구현하고, 또 그것을 테스트 할 때 이것이 정말 올바른 코드인지 궁금하셨나요? 이 세션에서는 연구 모델을 작성할 때 발견할 수 있는, 빈번한 코드 악취(Code smell)들과, 그것들을 어떻게 없앨 수 있을지에 대해서 알아봅니다. 코드에 영혼을 불어넣고, 그 어떤 코드라도 부끄럽지 않게 구현할 수 있는 연구자들이 되어봅시다!
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기Chris Ohk
강화학습에 관심을 갖게 되어 어떤 게임에 적용해볼까 고민하다가 평소 즐기던 '하스스톤'이라는 게임에 관심을 갖게 되어 2017년 말부터 하스스톤 강화 학습을 위한 API를 만들기 시작했습니다. 이 발표를 통해 평소 하스스톤과 같은 카드 게임 개발이나 게임에 강화학습을 적용하기 위한 환경을 구축하는데 관심을 갖고 있던 프로그래머들에게 조금이나마 도움이 되었으면 합니다.
2. 데이터 분석 대회에서 높은 점수 받기
정파
데이터를 보면 아인슈타인, 폰
노이만 급으로 머리 속에 통찰이
박히면서 바로 수리통계적 분석을
마치고 모델을 학습 및 답 제출 후
scoreboard는 보지 않고 1등
도메인에 대한 심도 깊은 통찰력
수 많은 머신 러닝 모델에 대한 수학적 이해
다양한 모델을 구현하는 뛰어난 프로그래밍 능력
최소 다이아
최소 박사
최소 초등정보영재
3. 데이터 분석 대회에서 높은 점수 받기
사파
좋게 말하면 Heuristic
직설적으로 NOGADA
Try-Error-Feedback
4. 저는 물론 노가다 했습니다
좋은 노가다를 위한 TIP
1. 나올만한 곳을 판다 == 데이터 설계
2. 다양한 곳에서 시도한다 == 모델의 다양성
3. 좋은 연장을 사용한다 == 좋은 Framework와 모델
(*3은 elice의 짧은 대회 기간 및 멘탈을 위해 매우 중요한 요소입니다.)
5. 나올만한 곳을 판다 == 데이터 설계
{
"matchDuration": 1716, // 초 단위, 얼마나 게임이 오래 지속되었는가를 의미
"teams": [ // 2개의 Dictionary
{
"firstDragon": true, // 이 팀이 용(몬스터)를 먼저 죽였는가
"dragonKills": 2, // 이 팀이 용을 몇번 죽였는가
"winner": false, // 이 팀이 대전에서 승리했는가
"firstBaron": false, // 이 팀이 바론(몬스터)를 먼저 죽였는가
"baronKills": 0, // 이 팀이 바론을 몇번 죽였는가
"firstBlood": false, // 첫 킬이 이 팀에서 나왔는가
"teamId": 100 // 팀 ID
},
...
],
"participants": [ // 10개의 Dictionary
{
"championId": 412, // 챔피언 (캐릭터) ID
"summonerId": 21983, // 플레이하는 게이머의 ID
"teamId": 100, // 팀 ID (teams의 teamId와 매치됨)
"stats": { // 이번 대전에서의 통계를 의미
"kills": 2, // 이 게이머가 다른 게이머를 몇번 죽였는가
"deaths": 8, // 이 게이머가 몇번 죽었는가
"assists": 11, // 다른 게이머를 죽이는데 몇번 도움을 주었는가
"goldEarned": 7314, // 총 획득한 골드 (게임 내 화폐)
"totalDamageDealt": 27629, // 몬스터 + 게이머에게 가한 총 데미지
"totalDamageDealtToChampions": 9507, // 게이머에게만 가한 총 데미지
"totalDamageTaken": 20419, // 받은 총 피해
"minionsKilled": 37, // 죽인 미니언(몬스터) 수
"totalHeal": 1014, // 총 치유량
"totalTimeCrowdControlDealt": 241, // 다른 플레이어에게 Crowd Control (CC) 를 사용한 총 시간
"wardsPlaced": 5 // Ward(시야를 넓혀주는 아이템) 을 맵에 장착한 횟수
"items": [ // 아이템 정보
3401,
2049,
1031,
3270,
0,
2043,
{
"teams": [ // 2개의 팀이 있습니다.
{
"teamId": 200 // 팀 ID
},
...
],
"participants": [ // 10명의 게이머 정보
{
"championId": 421, // 챔피언 (플레이 캐릭터) ID
"summonerId": 22082, // 게이머 ID
"teamId": 100 // 팀 ID
},
...
]
}
6. 다양한 곳에서 시도한다 == 모델의 다양성
And Hyperparameter Tuning
8. Experiment. Iter 0
{
"teams": [ // 2개의 팀이 있습니다.
{
"teamId": 200 // 팀 ID
},
...
],
"participants": [ // 10명의 게이머 정보
{
"championId": 421, // 챔피언 (플레이 캐릭터) ID
"summonerId": 22082, // 게이머 ID
"teamId": 100 // 팀 ID
},
...
]
}
Test에서 받을 수 있는 정보는
챔피언 ID, 게이머 ID, 팀
<생각의 흐름>
게임할 때 우디르를 밴하진 않고…
제일 중요한 건 챔피언이겠지?
1 0 0 1 0…
챔피언 수
0 0 1 1 0…
챔피언 수
+
Team 100 Team 200
Sparse Matrix
9. Experiment. Iter 0
1 0 0 1 0…
챔피언 수
0 0 1 1 0…
챔피언 수
+
Team 100 Team 200
<- Data Input
<- Model
<- Output0 || 1
Logistic Regression, Decision Tree, Neural Network,
Gradient Boost, SVC, KNN…
이거 파라미터도 튜닝하고, 여러 모델도
돌려보고, 앙상블도 많이 해야하고…
10. Experiment. Iter 0
1 0 0 1 0…
챔피언 수
0 0 1 1 0…
챔피언 수
+
Team 100 Team 200
<- Data Input
<- Model
<- Output0 || 1
얘가 다해줌 ㄱㅇㄷ
11. Experiment. Iter 0 result
롤은 그래도 컨트롤 겜인데 챔피언만 보면 65 정도겠지?
그것도 마스터1 인데;; 원챔 장인도 있을거고…
아무리 OP챔 해도 정도가 있겠지…
라이엇이 놀고만 있을리가…
12. Experiment. Iter 0 result
85??? 롤은 OP조합 겜이였습니다…
도벽이즈하세요
만족 후 그만하려고 했으나….
14. Experiment. Iter 1
{
"teams": [ // 2개의 팀이 있습니다.
{
"teamId": 200 // 팀 ID
},
...
],
"participants": [ // 10명의 게이머 정보
{
"championId": 421, // 챔피언 (플레이 캐릭터) ID
"summonerId": 22082, // 게이머 ID
"teamId": 100 // 팀 ID
},
...
]
}
챔피언 정보, 팀 정보는 줬으니
남은건 게이머의 정보
op.gg보면 같은 팀으로 게임한 소환사들 (최근 20 게임)이
있던데 괜히 넣어둔건 아니겠지
1 0 0 1 0…
챔피언 수
0 0 1 1 0…
챔피언 수
+
Team 100
Team 200
Sparse Matrix
<생각의 흐름>
+ 3 0 2 1 0 3 2 1 0 0
Team 100
같이 플레이해서
이겼으면 + 1 졌으면 -1 * alpha ( < 1 )
최종 남은 값
15. Experiment. Iter 1
3 0 2 1playerA B,C,D,E
3 -1 1 0playerB A,C,D,E
자기 팀 내의 소환사 조합만 고려
…. X 10
부록 : 버스 의심 혹은 천생의 연분
부록 : 고의 트롤링 의심
1 0 0 1 0…
챔피언 수
0 0 1 1 0…
챔피언 수
+
Team 100
+