기계 학습(Machine Learning, 머신 러닝)은 즐겁다! Part 7

Jongdae Lim
17 min readSep 5, 2017

--

생성적 적대 신경망(Generative Adversarial Networks)을 활용해 8비트 픽셀 아트(Pixel Art) 만들기

생성 모델(Generative models)을 활용하면, 컴퓨터가 스스로 사진, 영화 또는 음악과 같은 데이터를 만들 수 있습니다.

1년보다 조금 더 전에, Alec Radford는 (Ian Goodfellow의 작업을 기반으로) 기계 학습을 이용해 생성 모델을 만드는 방법에 대한 사람들의 이전 생각을 변화시킨 논문을 발표했습니다. 이 새로운 시스템을 딥 컨볼루션 생성적 적대 신경망(Deep Convolutional Generative Adversarial Networks 또는 간단히 DCGAN)라고합니다.

DCGAN은 서로 경쟁하는 두 개의 딥 신경망을 영리하게 조합해서 진짜 사진같은 현실적 그림을 상상해 낼 수 있습니다. 다음의 모든 침실 그림들은 DCGAN이 상상해 낸 것입니다.

Alec Radford의 DCGAN 논문 에서 가져온 사진

AI 연구자들은 생성 모델에 관심이 많습니다. 왜냐하면, 이 생성 모델이 세상으로부터 원시 데이터(raw data)를 소비하고 자동적으로 이를 이해하는 인공 지능 시스템의 제작으로 나아갈 징검다리 역할을 할 것으로 보이기 때문입니다.

하지만, 지금은 생성 모델을 사용해 약간 덜 똑똑한 것을 해보겠습니다 — 8비트 비디오 게임용 배경 그림을 만들어 보겠습니다!

이 게임 레벨에서 보이는 모든 그림은 컴퓨터가 생성한 것입니다.

생성 모델의 목표

그렇다면 왜 AI 연구자들은 조금은 어색한 침실 사진을 생성하기 위해 이런 복잡한 시스템을 구축하는 걸까요?

그 이유는 당신이 어떤 것을 확실히 이해하고 있어야만, 어떤 그림을 생성할 수 있다는 생각 때문입니다.

다음 그림을 보시죠:

개, 정확히는 나의 개.

당신은 이것이 네 개의 다리와 꼬리가 있는 털이 난 것 즉, 개 사진이라는 것을 바로 알 수 있습니다. 그러나 컴퓨터에게 사진은 각 픽셀의 색상을 나타내는 숫자 그리드일 뿐입니다. 컴퓨터는 그림이 어떤 개념을 나타낸다는 것에 대한 이해가 없습니다.

그러면, 이제 수천 장의 개 사진을 컴퓨터에 보여주었고, 컴퓨터가 이제 다양한 개 품종과 다른 사진 각도로 자신만의 개 사진을 생성할 수 있게 되었다고 상상해 보십시오. 어쩌면 우리는 “비글(beagle)의 옆모습”과 같은 특정 유형의 사진을 요청할 수도 있을 것입니다.

컴퓨터가 이렇게 할 수 있고 생성된 사진들이 정확한 다리의 개수, 꼬리, 귀가 있다면, 명시적으로 말해주지 않아도 컴퓨터가 어떤 부분들로 “개”가 구성되는 지 알고 있다는 것을 증명해 줄 것입니다. 따라서 어떤 의미에서 좋은 생성 모델은 최소한 유아 수준의 기본적인 이해를 한다는 증거입니다.

그래서 연구자들은 생성 모델을 구축하는 것에 대해 매우 열광하고 있습니다. 이 것은 어떤 개념의 의미를 명시적으로 가르치지 않고, 그 개념을 이해하도록 컴퓨터를 훈련시키는 방법으로 보입니다. 사람이 정말 힘들게 미리 라벨을 붙여둔 훈련 데이터로 부터만 학습할 수 있는 현재의 시스템에서 한 걸음 크게 진보하는 것입니다.

그런데, 이 모든 연구 결과로 개 그림을 생성하는 프로그램이 만들어 진다면, 부수적으로 컴퓨터가 만든 첫 번째 Dog-A-Day(하루에 개 사진 한장) 달력이 발간되는데 몇 년이나 걸릴까요?

네, 로봇이 모든 사람들의 일을 대신할 것입니다. 결국은.

개를 이해하는 프로그램을 제작할 수 있다면, 다른 것을 이해하는 프로그램은 안될 이유가 없겠지요? 사람들이 악수하는 사진을 무한대로 생성 할 수있는 프로그램은 어떻습니까? 나는 누군가 분명히 돈을 지불할 것이라 확신합니다.

제 말은.. 확실히 AI 스타트업 아이디어치곤 끔찍하네요. 하지만 제가 들은 더 나쁜 스타트업 아이디어들도 있었습니다. 그래서…. 어쩌면?

좋습니다. 아마도 쓸데 없는 사진들을 생성하는 프로그램은 그다지 흥미롭지 않을 것입니다. 하지만 겨우 일년 사이에 생성 모델이 발전한 것을 감안해 보면, 우리가 5 년에서 10 년 사이에 어디까지 와 있을지 누가 알 수 있겠습니까. 누군가 영화 전체를 생성하는 시스템을 발명한다면 어떻게 될까요? 아니면 음악? 아니면 비디오 게임?

눈을 가늘게 뜨고 20–30년 후를 내다본다면, 엔터테인먼트의 100%가 컴퓨터에 의해 만들어 지는 세상를 이미 상상할 수 있습니다:

비디오 게임 산업은 AI을 사용한 기본 컨텐츠(raw content) 생성을 진지하게 실험하기 시작한 엔터테인먼트의 첫 번째 분야입니다. 컴퓨터 게임 엔지니어들과 기계 학습 엔지니어들은 명백하게 벤 다이어그램 상 중복이 있는 것은 사실이지만, 최근의 AAA 비디오 게임 예산이 3억 달러(대략 3천억원)가 넘는 다는 것을 감안해 볼 때 비디오 게임의 개발 자동화에 투자하는 것은 충분히 비용 대비 효과가 있습니다.

*역자주: “AAA 비디오 게임”(triple A 라 읽음)이란 대규모 예산으로 개발하고 대대적 홍보를 하는 최근의 게임을 말하며, 일반적으로 수익을 얻기 위해서는 대량의 판매가 이루어져야하는 위험성이 있다.

아직은 기계 학습 기반의 생성 모델이 초기 단계에 있고 실제 사용 범위도 아직은 매우 좁습니다. 하지만 놀아 볼만한 충분한 재미가 있습니다. 그럼 우리가 할 수 있는 것을 하나 살펴보겠습니다.

DCGAN의 동작 방식

DCGAN을 구축하기 위해서는, 두 개의 딥 신경망(deep neural networks)를 생성해야 합니다. 그런 다음 서로 싸우며 끝없이 상대방을 능가하도록 만듭니다. 그 과정에서 이 둘은 모두 강해지게 됩니다.

첫번째 딥 신경망을 위조 지폐를 감별할 수 있도록 훈련된 신입 경찰관이라고 가정해 보겠습니다. 그의 업무는 어떤 사진을 보고 그 사진에 진짜 돈이 있는지 알려주는 것입니다.

우리가 그림 속에서 객체를 찾고 있기 때문에, 이 작업은 표준 컨볼루션 신경망(Convolutional Neural Network)를 사용할 수 있습니다. 만약 ConvNets(컨볼루션 신경망)이 익숙하지 않다면, 이전 글을 읽어보시기 바랍니다. 그러나, 기본적인 아이디어는 신경망이 이미지를 가져와 이미지에서 매우 복잡한 형상을 인식하는 몇가지 단계를 통해 이를 처리 한 다음 단일 값을 출력한다는 것입니다. 이 경우에는, 특정 이미지에 진짜 돈의 사진이 있다 또는 없다.

이 첫 번째 신경망을 선택기(Discriminator)라 부릅니다.

선택기 신경망(The Discriminator Network)

이제 두 번째 신경망은 가짜 돈을 만드는 법을 막 배운 신입 위조범이라고 가정해 보겠습니다. 이 두 번째 신경망을 위해, 일반적인 ConvNet의 단계들을 뒤집어 모든 것이 반대로 돌아가도록 하겠습니다. 따라서, 사진을 가져와 값을 출력하는 대신 값 목록을 가져와 사진을 출력합니다.

이 두 번째 신경망을 생성기(Generator)라 부릅니다.

생성기 신경망(The Generator Network)

이제 우리는 가짜 돈을 찾는 경찰관(선택기, Discriminator)과 가짜 돈을 인쇄하는 위조범(생성기, Generator)가 있습니다. 이들이 싸우게 해보겠습니다!

첫 번째 라운드에서 생성기는 거의 돈 같지 않은 안타까운 위조 지폐를 만들어 낼 것입니다. 왜냐하면 돈이 어떻게 생겼는지 전혀 모르기 때문입니다:

생성기가 첫 번째 (형편 없는) 위조 지폐를 만들었습니다

그런데, 현재 식별기도 돈을 인식하는 일에 똑같이 형편 없기 때문에 별 차이가 없습니다:

식별기는 이 돈이 진짜라고 생각합니다!

이 시점에 우리가 개입해서 식별기에게 이 달러 지폐가 실제로는 가짜라고 말해줍니다. 그런 다음 진짜 달러 지폐를 보여주고 이 것이 가짜와 어떻게 다르게 보이는지 묻습니다. 식별기는 가짜 지폐와 진짜 진폐를 구분하는데 도움이 되는 새로운 세부 정보를 찾아낼 것입니다.

예를 들어, 식별기는 진짜 돈에는 사람 그림이 있고 가짜 돈에는 없다는 것을 알아챌 것입니다. 이 지식을 활용해서, 식별기는 가짜와 진짜를 구분하는 법을 배우게 됩니다. 이제 일하는 것이 조금 나아졌습니다:

식별기 수준이 올라갔습니다! 이제 아주 별로인 가짜돈을 구분할 수 있습니다.

이제 2 라운드를 시작합니다. 우리는 생성기에게 그 지폐 이미지가 가짜로 갑자기 거부되어 이제 게임의 수준을 높여야 한다고 알려줍니다. 또한 식별기가 이제 얼굴을 찾고 있어서, 식별기를 혼란시키는 가장 좋은 방법은 지폐에 얼굴을 넣는 것이라고도 알려줍니다.

생성기가 아주 조금 나아진 위조 달러를 만들었습니다.

이제 가짜 지폐가 다시 유효한 것으로 받아 들여지고 있습니다! 이제 식별기는 진짜 달러를 다시 보고 가짜를 구분해 낼 새로운 방법을 찾아야 합니다.

생성기와 식별기가 벌이는 이 시소 게임은 이 두 신경망이 모두 전문가가 될 때까지 수천 번 계속됩니다. 결국에 생성기는 거의 완벽한 위조 지폐를 만들어내고 식별기는 사소한 실수도 찾아내는 전문 형사가 되었습니다.

두 신경망이 충분히 훈련되어 인간이 만들어진 가짜 이미지에 깊은 인상을 받는 시점이 되면, 우리는 원하는 어떤 목적으로든 이 가짜 이미지를 사용할 수 있을 것입니다.

비디오 게임에 적용하기

이제 DCGAN이 어떻게 동작하는지 알게 되었으니, 이를 1980년대 스타일의 비디오 게임용 새로운 배경을 만드는데 사용할 수 있는지 알아 보겠습니다.

자 이제 실제 게임의 스크린샷을 기반으로 NES 즉, 닌텐도 엔터테인먼트 시스템(Nintendo Entertainment System) 용 가상의 비디오 게임의 스크린샷을 만들어낼 DCGAN을 제작해 보겠습니다:

이 아이디어는 상상속 비디오 게임의 그럴듯한 스크린샷을 생성 할 수 있다면, 이 그림의 일부를 카피 앤 페이스트해서 우리의 복고 스타일 비디오 게임에 사용할 수 있다는 것입니다. 생성된 비디오 게임은 존재한 적이 없기 때문에, 심지어 도용 당하지도 않을 것입니다 (아마도.. 이 후에는 많을수도).

그 당시의 비디오 게임용 화면은 매우 간단했습니다. NES에는 아주 적은 양의 메모리만 있었기 때문에(이 게임들은 지금 이 글이 뜨는데 사용하는 메모리보다도 적은 메모리를 사용했었습니다), 프로그래머들은 게임용 그림을 메모리에 맞추기 위해 다양한 트릭을 사용해야 했습니다. 제한된 공간을 최대로 활용하기 위해서, 게임의 각 화면은 몇 개의 (일반적으로 16x16 픽셀) 반복되는 그래픽 타일로 구성되는 타일 기반 그래픽(tile-based graphics)을 사용했습니다.

예를 들어, ‘젤다의 전설(The Legend of Zelda)’의 시작 화면은 단지 8개의 고유한 타일로 만들어 졌습니다.

다음은 ‘젤다의 전설” 전체 맵을 구성하는 타일들입니다:

가끔은 주변 색을 바꿔 다른 영역처럼 보이게도 만들었습니다. 간단하죠.

우리의 목표는 우리만의 게임을 위한 비슷한 타일를 만드는 것입니다. 그렇기 때문에 우리가 만들어낸 게임 스크린샷이 완벽하게 사실적인 것처럼 보이는지 신경쓸 필요가 없습니다. 그 대신에 우리는 단지 우리의 게임에서 돌, 물, 다리 등과 같은 16 x 16 타일로 사용할 수 있는 모양과 패턴을 찾을 것입니다. 이렇게 하면, 이 타일들을 사용해서 우리만의 8 비트 스타일 비디오 게임 레벨을 구축할 수 있습니다.

데이터 수집하기

우리의 시스템의 훈련시키기 위해서, 많은 데이터가 필요합니다. 다행히도 데이터를 가져올 수 있는 700개가 넘는 NES용 게임들이 있습니다

비디오 게임 박물관 웹 사이트에서 모든 NES 게임들의 스크린샷을 다운로드하기 위해 wget을 사용했습니다(그쪽 사이트를 스크랩해서 죄송해요!). 몇 분 정도 다운로드 하자, 수백개의 NES 게임 스크린샷이 10,000개 조금 넘게 생겼습니다

데이터 세트를 구성하는 10,000개의 스크린샷 중 아주 일부

현재 DCGAN은 256 픽셀 제곱 정도의 아주 작은 이미지에서만 동작합니다. 그러나 NES의 전체 화면 해상도는 겨우 256 x 224 픽셀 이었기 때문에 전혀 문제가 되지 않습니다. 일을 간단하게 하기 위해, 각 NES 스크린샷을 224 픽셀 제곱 크기로 잘라냈습니다.

DCGAN 설정 하기

Github에 직접 사용해 볼 만한 DCGAN의 오픈 소스 구현 몇 가지가 있습니다. 저는 김태훈 님의 Tensorflow 구현을 사용했습니다. DCGAN은 비지도 학습이기 때문에, 폴더에 데이터를 넣고 기본적인 파라미터를 조정하고, 교육을 시작한 후 결과가 나올때 까지 기다려야 합니다.

원본 훈련 데이터의 샘플들은 다음과 같습니다:

이제 훈련이 시작되었습니다. 처음 생성기(Generator)로 나온 출력물은 완전히 노이즈입니다. 그러나 생성기가 일을 좀더 잘하게 되면서 부터 서서히 형태를 띄게 됩니다.

몇 번의 훈련 단계를 거치자, 이미지들은 전통적인 닌텐도 게임의 악몽 버전 같아 지기 시작했습니다:

교육이 계속되자, 우리가 찾고자 했던 벽돌과 블록을 보이기 시작합니다. 생명 막대(life bar)나 일부 텍스트와 같은 화면 구성요소도 볼 수 있습니다.

그런데 복잡한 문제가 있습니다. 컴퓨터가 훈련 이미지로부터 그냥 그림을 베낀(regurgitating) 것이 아니라 새로운 그림을 창조하고 있는지 어떻게 알 수 있을까요? 위 이미지들 중 두 개의 이미지에서 Super Mario Bros. 3의 메뉴바(menu bar)와 진짜 Super Mario Bros의 헤더바(header bar) 그리고 벽돌을 명확하게 볼 수 있습니다.

훈련 데이터를 베끼는 것(Regurgitating)은 분명히 일어날 수 있는 일입니다. 대규모의 훈련 데이터 세트를 길지 않게 훈련시킴으로써, 이런 일이 발생할 확률을 줄일 수 있습니다. 그럼에도 골치아픈 문제이고 이에 대한 연구가 계속되고 있습니다.

저는 그저 미적인 것(aesthetics)을 좋아하기 때문에, 제가 보기에 진짜같이 보이는 그림이 만들어 질 때까지 모델을 조정했습니다. 그러나 유사한 그림이 훈련 데이터에 있는지 검색해서 이것이 존재하지 않는다는 것을 증명하는 것 이외에는 이 새로운 그림이 완전히 독창적인지 아닌지 증명할 길은 없습니다.

몇 시간의 훈련을 통해 생성 된 이미지에는 제가 보기에 괜찮은 16 x 16 타일들이 포함되어 있습니다. 기본적인 돌 블록, 벽돌 패턴, 물 패턴, 덤불과 몇가지 “으스스하게 보이는” 배경 분위기 타일들을 꽤 찾을 수 있었습니다.

그런 다음, NES에서 지원하는 64가지 색상만이 사용될 수 있도록 이미지를 전처리(pre-process)해야 합니다:

원래 닌텐도는 위와 같은 64색만을 표시 할 수 있었습니다. 정확히는 단지 54가지의 고유한한 색상이 있는데 그 이유는 그 중 일부가 중복되어 있기 때문입니다.

이제 Tiled Map Editor에서 이 64색 이미지를 열어 보겠습니다. 이를 이용해서 내가 원하는 미적 이미지와 일치하는 16 x 16 타일을 쉽게 잘라낼(grab) 수 있습니다.

생성된 스크린샷에서 잘라낸 타일들

그런 다음 Tiled Map Editor에서 16x16 타일들을 NES 게임 중에 하나인 ‘Castlevania’를 연상시키는 간단한 레벨 레이아웃으로 배열해 보겠습니다.

제 생각에는 꽤 괜찮아 보입니다! 이미지 편집기로 타일의 픽셀 하나도 건드리지 않았다는 것을 명심하십시오. 모든 타일들은 DCGAN 모델에서 나온 것 그대로 입니다.

그리고 ‘Castlevania’ 게임의 주인공과 적들을 넣어보면 이 레벨이 실제로 어떻게 보일지 알 수 있습니다.

전체 모습을 완성하기 위해서, 메뉴 구성요소를 넣어 게임 내에서 이 레벨이 어떻게 보이는지 확인해 보겠습니다:

정말 으스스 하군요

제 생각에 이것은 제가 기억하는 NES 게임처럼 보입니다! 이 것이 지금까지 창조된 최고의 NES 그림이라고 주장하는 것은 아니지만, 확실히 최악은 아닙니다.

별로 였던 The Cheetahmen 보다는 낫습니다.

이게 단가요?

저는 이 생성 모델에 열광하고 있습니다. 언젠가 컴퓨터가 끝없이 작품을 만들어 낸다는 이 아이디어는 제게 대단히 매력적인 것입니다. 하지만, 이에 대해 다른 사람들과 이야기 할 때면, 때로는 반응이 “이게 단가요?”입니다. 뭐 그럴 수 있습니다.

현재로써는 생성 모델에 대해 많은 과장이 실제로 있습니다. GAN은 훈련이 어렵기로 악명 높고 아주 작은 이미지를 생성한다는 제약이 있음에도 불구하고, 이미 AI의 미래라고 불리고 있습니다. 사실, 현재 가장 좋은 모델마저도 우표 크기 정도의 합성 개사진 만을 생성 할 수 있습니다.

끔찍한 동물이네요! Ian Goodfellow’s GAN Tutorial paper에서 가져온 사진

그러나 몇 년전만 해도 이와 비슷한 일 조차도 할 수 없었습니다. 그 때는 정말이지 다음과 같이 생성 된 그림에도 꽤나 흥분했었습니다.

자전거 맞습니다! 맹세코!

그리고 이 기술은 하루가 다르게 발전하고 있습니다. GAN을 사용하여 사람들의 얼굴을 노화시키는 이번 주에 발표된 이런 논문도 있습니다:

Face Aging With Conditional Generative Adversarial Networks”로 부터 가져온 이미지

이런 속도로 계속해서 발전한다면, 생성 모델이 창작을 위한 주요 도구가 되는 날도 멀지 않았습니다. 그래서 지금이 바로 이 실험을 시작해야할 아주 좋은 때입니다.

좀 더 배울수 있는 곳

생성 모델과 DCGAN에 대해 좀더 깊이있게 알고 싶다면, 다음의 추천 자료를 확인하세요.

이 글이 마음에 들었다면, 제 Machine Learning is Fun! 이메일 리스트에 가입하는 것도 좋습니다! 새롭고 멋진 소식이있을 때만 이메일을 보내 드리겠습니다. 제가 이런 종류의 추가 글을 올릴때가 언제인지 알 수 있는 가장 좋은 방법입니다.

Twitter의 @ageitgey인 저를 팔로우하거나, 직접 이메일을 보내거나 또는 linkedin에서 저를 찾을 수도 있습니다. 기계 학습으로 제가 당신이나 당신의 팀을 도울 수 있다면 언제든 연락 주십시오.

*역자주: 번역글과 관련해 의견 주시려면, 저에게 직접 이메일을 보내시거나 LinkedIn에서 저를 찾으셔도 됩니다.

--

--

Jongdae Lim

I’m a Java guy, working at Microsoft as a principal software engineering manager in CSE(Commercial Software Engineering).