레플리
글 수 220

인공지능 만든 이야기나 올릴까 합니다.

조회 수 384 추천 수 1 2017.08.02 07:11:22


 

독학하는 고등학생입니다만,

최근 학교에서 자바수행평가로 내준 과제를 인공지능프로그램을 만들어서 제출했습니다.

만드는 과정은 정말 흥미로웠고,많은 것을 느꼈습니다.

한번 올려보고자 합니다.

 

 

 

개요/

 

제목은 <사망회귀해서 갈수록 총알을 잘 피하는 인공지능>이었던것 같습니다.

쉽게 생각하자면 탄막피하기게임,동방을 하는 인공지능을 생각하시면 됩니다.

 

하늘에서 총알이 매턴 랜덤한 위치에서 생성되고 매턴 아래로 내려옵니다.

 

케릭터는 제자리에 있는것을 포함한,인접한 9방향중 한 칸으로 매턴 이동을 합니다.

 

총알과 케릭터가 같은 위치에 존재하게 되면 게임오버됩니다.

 

케릭터는 시행착오를 거치며 갈수록 생존 최소턴과 최대턴이 올라가게 됩니다.

 

---

 

만든 방법/

 

기본루틴은,

환경이동->케릭터에 정보(상태)입력->케릭터 이동->사망/생존 결과학습(repute).

의 반복입니다.

 

여기서 학습을 하는 방식이 솔직히 프로그램의 전부입니다.

 

매턴 상태를 케릭터에 전달하는데,

전체 맵은 (100*200)정도 되었습니다만.

저는 학습을 빠르게 하기 위해서

케릭터 인접 9칸만을 학습의 대상으로 삼아,매턴 배열로만들어 케릭터클래스에 전달했습니다.

 

 

배열을 전달받은 케릭터는 이전에 그 상태를 받았는지 그렇지 않았는지를

기억저장소를 조회해 확인하고.

해당  상태에 대한 기억을 인자로 하는 행동함수를 실행시킵니다.

 

이때 기억은

9칸짜리 int배열인 '상태'와

행동의 갯수만큼의  칸을 가진 int배열인 '행동'으로 구성됩니다.

행동함수의 역할은 int배열내부의 수치들에 대해 확률 연산을 수행하여

이번턴 케릭터가 할 행동을 의미하는 하나의 int를 리턴하는 것입니다.

 

 

그 확률연산이란 놈은

 

만약 int배열 [1,1]이 대상이라면,

50%: 50%로 0또는 1을 리턴하고.

 

int배열[1,2,2]가 대상이라면,

20%,40%,40% 로 0,1,2를 리턴하는

 

함수를 의미합니다.

 

그렇게 행동을 리턴한 뒤

케릭터가 죽으면 그 행동에 -1.

살면 +1 합니다.

 

 

 

위 과정을 임의의 횟수만큼 반복합니다.

아래는 느낀점입니다.

//

 

<시그모이드함수 이야기>

 

케릭터는 대략 2000~3000번의 죽음을 겪고 나면 전문가처럼 게임을 하게 되었습니다.

매우 효율적으로 행동하였으며,더이상 학습시키는건 별 의미가 없었다는 의미입니다.

 

그런데

통계프로그램을 만들어 평균치를 내보니,

100~500 까지는 평균 생존 턴수가 20~30턴에 불과하였으며

상승량도 미비하였습니다.

 

그러나 이후로 500~1500 턴까지는 평균 생존 턴수 상승량이 갈수록 가파르게 상승하고

1500~2500무렵에선 다시 점차 줄어들더군요.

이후로 10000번까지 통계를 내보았지만.

전체적으로 큰 변화는 없었습니다.

 

여기서 몹시 인상적이었던 점이.

위와같이 학습량에 따른

효율성 변화의 정도가

통상학습곡선이라고 알려져있던 시그모이드함수모양을 그렸다는 겁니다.

 

위 프로그램은 지극히 단순합니다만.

그걸 알아차리고 난 뒤에는 '혹시 모든 학습이라는 과정 자체가 위와 같은

공간탐색 알고리즘의 일종인건 아닌가..?'싶더군요.

꽤나 인상적이지 않습니까?

 

 

<위와같은 자료구조로 게임인공지능개발>

 

그리고 두번째로 느낀점이.

 

통계가 확실한것인지를 시험해보고도 싶고

프로그램이 굴러가는 모습을 보는게 그냥 재밌어서 몇 번 돌려보다 알게된 것인데요.

 

전문가 수준의 케릭터들이라 하더라도 행동패턴이 여러개가 나오더라는 것입니다.

 

어떤 케릭터의 경우,

총알이 날아올때 되도록이면 제자리를 고수합니다.

어떤 케릭터의 경우,

적극적으로 앞으로 나가고.

어떤 케릭터는 후진하다가 인접한 벽을 따라 이동하더군요.

 

그리고,

위와 같은 인공지능은 학습하는 과정이 오래걸릴뿐(수천번의 죽음이 필요하죠),

학습의 결과물인 int열을 저장한뒤 상황에 적용하여 행동시키는 데에는

시간복잡도도 공간복잡도도 거의 차지하지 않습니다.

고작 수백~수천개의 int에 불과하고.

적용하는 과정도 int몇개에 대해 확률연산을 한 번 실행하는게 전부이니 말입니다.

 

그래서 말인데.

 

게임 인공지능을 개발할때 위와같은 시뮬레이션으로 케릭터의 인공지능을 미리

수십개 만들어놓고 파일로 제공하여

게임프로그램이 그때 그때 조합하여 사용하게 하면 굉장하지 않겠습니까?

 

지금까지 존재해왔던 게임 인공지능들은,(제가알기로는)

동적으로 보인다 할 지라도

단순히 경우의 수를 다양하게 지정하여 치밀하게 프로그래밍했을뿐

사람이 손으로 일일히 만들어준 내용을 실행하고 있었을 뿐이었습니다.

 

최근 발매된 젤다의 전설이었나, 말의 인공지능을 제작하는데 5년을 들였다는군요.

이 얼마나 낭비입니까?

결국 똑같은 상황에서는 똑같이 행동할 것 아니에요.

유지보수는 또 어떻게 할까요?

코드를 다 읽어봐야 할 수 있겠죠?

 

그러나.

 

인공지능을 제작할때 사용하는 평가함수로

<상태-행동>집합(생성된 인공지능)의 평균적인 가치를 평가하고.

비슷한 가치를 가진 집합들을 한데 묶어

그정도 수준의 지능을 가진 케릭터의 인공지능으로 사용하면 됩니다.

 

끊임없이 업데이트가 가능합니다.

또한, 어느정도 더한 다양성을 가지길 원한다면

유전자 알고리듬에서 유전자에 변이를 일으키듯이

<상태-행동>집합 내부 int에 임의의 증감/감산을 주면 됩니다.

 

물론 가치에 영향을 줄 것입니다.

아마 가치에 극심한 영향을 주는 경우도 소수 존재할 것입니다.

그래도 상관없습니다.

그게 바로 케릭터의 개성이 되는 겁니다.

 

어쩌면 게임내 인공지능 개발을 자동화 할 수 있지 않을까요?

 

 

 

<시그모이드 함수를 그림을 안다면, 학습이 다 됐는지도 알겠네?>

-

우리가 학습이 시그모이드함수를 그린다는점을 알게 되었다면,

역으로 현재까지의 학습과정의 기울기를 통해

학습과정의 어느지점에 위치해 있는지또한 추론할 수 있을 것입니다.

게임의 복잡성,잠재적인 게임의 재미의 정도를

'전문가에 이르기까지 몇 번의 죽음이 필요했느냐'로

수치화해서 나타낼 수 있지 않을까요?

마스터하기 어려운 게임일수록 보다 재미있고 오래 플래이하게되는 게임일 것입니다.

출시전 해당 게임의 복잡성을 미리 측정할 수 있게된다면 대단히 유용할 것입니다.

-

 

<강화학습의 단점>

 

위 프로그램은 오버워치를 하는 프로그램이라 생각한다면,

낙사하지 않게 되기 위해선 모든 낙사지점에서 한 번씩 죽어봐야 합니다.

그리고 새로운 맵에서 게임을 한다면 처음부터 다시 학습을 시작해야 되겠지요.

그러나 사람은 그런식으로 배우지 않습니다.

 

특징을 보고,새로운 상황에 특징을 적용할 줄 압니다.

어떤 정보가 중요하고 그렇지 않은지를 알기에

새로운 상황이 닥쳤을때 중요하지 않은 정보는 무시하고.

중요한 정보는 '경계를 넘어'적용시키는 것입니다.

 

그것이 제 프로그램에 부족한 점이었습니다.

 

그런데 전문가분들의 현 프로그램도 마찬가지인것 같더군요.

퐁을 플래이하는 강화학습 알고리즘에 대한 글을 읽어 본 적이 있었는데,

화면 전체의 상태를 입력값으로 받고 현재점수에 관계지어 분석한다는 내용을 보고 충격을 받았습니다.

640*480짜리 int를 분석(상태)의 대상으로 삼는다는 말이지요.

'중요한 정보인 공의 위치와 판의 위치만 분석대상으로

삼으면 되는거 아니야?'라는 생각이 들었습니다만,

아무래도 현 수준의 인공지능기술은 중요한 인자를 구분해내는 능력이 없는 모양이더군요.

사실인가요?

혹시 중요한 인자와 중요하지 않은 인자를 스스로 점차 구분해내고

탐색대상공간을 축소시키는 능력을 가진 강화학습 알고리즘이 존재한다면,

알고싶습니다.

 

 

 

 

..논문을 쓸 때는 느낀점을 한가지만 써야겠죠?

 

여러분이 위 생각들에대해 어떤 생각을 하셨을지 궁금합니다.

뎃글,이해가 안되는 점에 대한 지적,환영이에요.

 

또 무언가 개발하고, 느낀점이 있다면 다시 글 올리겠습니다.

 

 

프로그램파일은,

숙제할 당시에 exe만드는 법을 몰라서(지금도 몰라요)

ppt에 자바프로젝트 폴더를 통쨰로 첨부했는데

여기 올리려 보니까 용량이 너무 크더군요.

다시 압축을 풀어보니 이번엔 코드가 깨져서 나왔습니다.. 원래 그러나요?

그래서 올리진 못했으니 부디 마음의 눈으로 작동을 지켜봐주시길 부탁드립니다.

 

엮인글 :

깊은바다

2017.08.05 23:44:47
*.68.247.188

재미있는 글 잘 읽었습니다~

아직 고등학생이신데도 내공이 상당하시네요 ㅎㅎ

 

다만 게임에 학습을 이용하는게 생각보다 쉽지가 않습니다.

대표적인 게임이 블랙 앤 화이트가 있는데 결정트리 방법을 사용했다고 하더군요.

 

하지만 아직까지도 많은 게임들에서는 미리 설계된 방식으로 AI를 개발합니다.

그 이유가 복잡한 행동을 수행하는데 학습을 적용하기가 어렵기도 하고

또 학습하는 인공지능이 꼭 게임에 재미를 주는 것이 아니기도 하기 때문입니다.

 

퐁을 학습하는 딥러닝은 전체 화면의 픽셀 정보를 입력으로 받는데

여기서 공이나 바의 위치 등을 스스로 인식하도록 학습이 됩니다.

 

예전에는 사람이 직접 프로그램 속 오브젝트의 정보를 뽑아내고 

이것을 학습 알고리즘으로 돌렸던 것에 비해면 대단한 발전이라고 할 수 있습니다.

 

관심이 있으시면 DQN(Deep Q-Network)에 대해서 찾아보셔도 좋을 것 같습니다.

알파고를 만든 딥마이드에서 개발한 방식인데 딥러닝에 강화학습을 적용한 것입니다.

 

List of Articles
제목 글쓴이 날짜sort 조회 수
카톡 대화를 학습하는 AI 아바타 챗봇 - 레플리 file 깊은바다 2024-01-17 306
챗봇, 그리고 신 직업.. 어찌 생각하시나요. [4] lopez7 2018-09-05 347
초보자가 공부할만한 강화학습(DQN) 책 없을까요? [1] 딥린이 2018-08-31 531
인셉션 모델(버전 1)의 학습이 진행되고 있습니다. file [1] 딥린이 2018-08-26 183
긴글) 방학 동안 얕게나마 딥러닝 공부했던 후기 file [2] 딥린이 2018-08-24 691
질문) 텐서플로우로 구글의 인셉션 모델을 만들고 있습니다. [2] 딥린이 2018-08-17 399
여기는 처음인데 질문이 있습니다 [2] jianjian 2018-08-16 554
안녕하세요 [1] jyk12 2018-08-14 93
안녕하세요 [1] 이근섭 2018-08-08 112
질문이 있습니다. [2] 주례소년 2018-08-05 153
가입인사겸 질문입니다! [1] 핵초보개발자 2018-08-02 119
아트랙티브 전시기획자입니다 인공지능 개발자 분들에게 질문이 있어 글 남깁니다 [1] 전시기획 2018-08-01 160
'C++로 배우는 딥러닝' 책 읽어보신 분 계신가요? [2] NeuroWhAI 2018-07-31 748
[질문] 가우시안 커널을 텐서플로우로 구현할 때 궁금한게 있습니다. [5] 딥린이 2018-07-21 262
안녕하세요! [2] 주례소년 2018-07-20 65
머신러닝 해외 취업 준비 깊은바다 2018-07-20 390