이전의 결말대로, 이동방향에 대한 뱀 머리, 몸통을 따로 레이블을 매칭 시켜서 답을 보려 했다.
그런데, 이게 잘 안되었다.
뱀이 계속해서 도는 것도 못하고 오른쪽 벽으로 박으면서 학습이 안되고 있었다.
그래서 다른 방법을 고민해 보았다.
입력 크기를 줄이는 것이다. 난이도가 엄청 쉬워지겠지만, 이왕 잘 안되는 거 쉬운 것부터 해보고 싶다.
입력은 8개로, 뱀 머리를 기준으로 먹이가 있는 위치를 입력으로 전달해줬다. (위 사진의 빨간색 테두리로 강조한 것)
모델의 형태는 아래와 같이 구성했다. (중간은 relu, 마지막은 sigmoid, 학습은 Adam)
모델이 먹이를 먹으면 1점을 보상으로 주고, 벽에 박거나 자신의 꼬리에 박으면 -100점을 보상했다.
대략 500 epoch만큼 학습시켰더니 어느 정도 되는 것 같았다.
그럼에도 문제는 있었다.
먹이를 많이 먹지는 못했지만 먹이를 따라가는 모습을 보이다가 어느 수치를 넘어서면 이상한 곳으로 가다 빙글빙글 돌게 되었다.
아마 자신의 진행방향이 어디인지 모르기 때문에 그런 것 같았다
왜냐하면, 저번 포스팅에서 말한 것처럼 왼쪽에 먹이가 있는 상황에서 오른쪽으로 진행하고 있을 때 왼쪽 키를 눌러도 가지 못하고 그냥 벽에 박아버린다.
벽에 박아버린 모델은 "아! 왼쪽에 먹이가 있을 때, 왼쪽으로 가면 벽에 박는구나, 다른 방향으로 가야겠다."라고 생각할 것이기 때문이다.
그래서 모델의 입력에 머리의 방향인 4개도 추가하기로 했다.
그래서 입력은 총 12개가 된다.
다른 것은 변한 게 없다. 입력만 12로 늘렸다.
이렇게 했더니 먹이를 꽤 먹고 있었다.
100 epoch정도 되었을 때, 최고 점수 9점을 찍고 그 이후로는 9점을 넘지 못했다.
아마 벽에 몇 번 부딪힌 뒤에, 아예 먹는 것보다 벽에 안 박는 구조로 진화한 것 같았다.
계속 위아래, 양옆으로 왔다 갔다를 반복했다.
그래서 설마 보상이 -100점인 것이 너무한 걸까?라는 의문이 들었다.
보상을 -10점으로 낮춰보았다.
이번에는 점수를 epoch단위로 기록해 그래프를 만들어 보았다.
14점이 최대인 것 같지만 아무튼 성과는 있었다.
위 동영상은 이렇게 학습을 완료한 모델의 모습이다.(녹화를 잘 할 줄 몰라서 화질이 별로다..)
위 방식의 문제는 다른 먹이를 먹으러 턴을 돌 때 자신의 몸이나 벽에 부딪히는 것이다.
다음에는 CNN을 응용해서 문제를 해결해 보겠다.
'프로그래밍 > 머신러닝' 카테고리의 다른 글
[정규화] Batch Normalization (0) | 2020.09.08 |
---|---|
[컨볼루션] ShuffleNet (0) | 2020.09.06 |
[컨볼루션] Group convolution (0) | 2020.09.06 |
[컨볼루션] Mobilenet (0) | 2020.09.06 |
[컴퓨터 비전] SRCNN, Image Super-Resolution Using Deep Convolutional Networks (0) | 2020.09.05 |