본문 바로가기

DM ML AD

자기강화와 GAN: 부족한 정답세트를 극복하는 방법

데이터 마이닝이나 머신러닝, 인공지능 AI 등에 관한 심도깊은 얘기는 다루지 않는다. 내가 그런 심도깊은 일을 하고 있지 않기 때문이기도 하거니와 그런 내용은 학교에서 정식으로 배우거나 많은 연구 논문을 읽으면서 터득해야할 영역이다. 개인적인 요청이 있다면 그걸 위해서 가이드해줄 수는 있지만 이 티스토리에서 그걸 해결해줄 수는 없다. 하지만 2017년에는 공부 좀 하기로 마음을 먹었으니 필요하면 특별한 주제에 맞춰서 또는 머신러닝 알고리즘의 전반적인 것에 대해서 종종 다루려 한다. 계획이 그렇다는 것이지 몇 번을 다룰지는...

최근이라 적고 작년 2016년에 가장 큰 이슈가 됐던 강화학습과 GAN (Generative Adversarial Networks)에 대한 소개 또는 개념적 이해를 돕기 위해서 글을 적는다. 남들이 이해하도록 돕는다기보다는 스스로 정리하고 넘어가고 싶었다.

알파고 AlphaGo가 이세돌 9단을 4대1로 꺾은 이후로 가장 떠오른 단어 또는 개념은 강화학습 Reinforcement learning이다. 물론 알파고가 딥러닝 Deep learning에 기반한 인공지능 AI Artificial Intelligence지만, 딥러닝이나 AI라는 단어는 그전부터 언론에도 많이 등장했었다. 단지 알파고 충격 전에는 이런 용어에 대한 소비 니즈가 없었기 때문에 일반인들은 무시했을 뿐이다. 다른 것보다 강화학습이 더욱더 부각됐다는 의미다.

그런데 강화학습이라는 게 전혀 새로운 개념이 아니다. 사실 기계학습 Machine learning이라 부르는 대부분의 알고리즘 (또는 학습법)은 강화학습에 기반을 두고 있다. 강화학습은 어떤 액션에 대한 반응에 따라서 그 액션의 정당성을 얻느냐 못 얻느냐가 판별하고, 정당성을 얻은 액션은 향후에도 계속 하도록 장려받도록 훈련받는 것이다. 애완견에서 '앉어'라고 말한 후에 개가 실제로 앉으면 '간식'을 준다. 처음에 개는 앉어 명령어와 간식 사이의 연관성을 모른다. '앉어' 명령어에 우연히 앉아서 간식을 얻었다면, 그리고 반복적으로 '앉어' 후에 간식을 계속 받아먹는다면 개는 '앉어'와 '간식' 사이의 인과성을 발견한다. '앉어' 명령어에 앉으면 간식을 얻는다를 학습한 것이다. '앉어'는 액션이고 '간식'은 리워드다. 역으로 어떤 액션을 피하게 하는 페널티도 비슷한 메커니즘이다.

기계학습에서는 이런 과정을 데이터로 한다. 특히 지도학습 Supervised learning이 그렇다. Y = f(X)에서 f() 함수 (또는 모델)을 유추할 때, 주어진 X에 대해서 정답 Y를 뱉어내면 f() 함수를 제대로 유추한 것이고 그렇지 못하면 해당 유추를 무시하면 된다. 정답 Y가 있는 많은 학습데이터 training data을 가지고 적절한 f() 함수의 형태나 파라메터를 얻어내는 과정이 보상과 벌로 애완견의 액션을 인지시키는 훈련 과정과 같고 이것이 강화학습이다. 기계학습이란 것이 학습데이터를 잘 설명하는 모델을 만드는 (또는 기계를 학습하는) 것이고, 즉 학습된 기계는 학습데이터에 따라 움직인다. 그래서 학습데이터로 기계를 학습시킨다는 모든 알고리즘이 강화학습이라고 볼 수가 있다. 특히 딥러닝의 기초가 되는 인공신경망 Artificial Neural Networks의 학습과정을 강화학습이라고 말하지만, 다른 기계학습을 강화학습이 아니라고 말하는 것은 좀 이상하다.
** 강화학습에 관해 더 자세한 것은 다음의 텍스트북을 참고하기 바란다. https://webdocs.cs.ualberta.ca/~sutton/book/bookdraft2016sep.pdf

강화학습이라는 것이 기계학습에서 일반적인 것이라면 왜 알파고 이후에 강화학습이 주목을 받은 것일까? 단순히 기계를 학습하는 방법보다는 기계를 학습시키는 정답세트를 얻는 전략적인 과정에서 비롯했다고 본다. 그래서 그냥 강화학습이라고 말하기보다는 자기강화 Self-reinforcement라는 용어를 쓰는 게 맞지 않나?라는 생각을 한다. 기계학습이 결정적으로 실패할 때는 적당히 많은 정답세트가 없을 때다. 아무리 이론적으로 뛰어난 알고리즘이더라도 그걸 학습시킬 데이터가 없다면 기계학습은 실패한다. 기계학습의 승패는 정답세트를 얻느냐의 여부에 달려있다. 알파고가 수십년동안 수집한 대국기보를 가지고 학습했다지만, 그것만으로 인간을 이길 전략을 완벽히 마스터하는 것은 사실상 불가능하다. 현재까지 학습한 것을 바탕으로 사람과 직접 대국하면서 전략을 시험해보고 전략을 수정할 수도 있겠지만, 그럴려면 시간도 많이 걸리고 탑랭크 바둑기사들이 불완전한 기계를 상대해줄 가능성도 낮다. 이 부분에서 딥마인드 DeepMind는 자기강화라는 훌륭한 전략을 사용했다.

알파고 이전에 딥마인드는 오래된 아타리 Atari라는 게임을 학습시키면서 (자기)강화전략을 선택했다. 랜덤이든 어떤 규칙에 따른 것이든 아타리게임의 커서cursor를 이리저리 수없이 많이 옮기면서 점수를 얻는 법을 터득해 나갔다. 즉, 커서를 적당히 옮겨서 떨어지는 볼을 되받아쳤더니 그 볼이 위로 올라가서 벽돌을 부수면서 점수를 얻고, 커서가 볼을 되받아치지 못했을 때는 게임이 끝나버린다. 이런 무수한 임의의 움직임을 통해서 볼을 위로 보내면 점수를 얻고 떨어뜨리면 점수를 얻지 못한다는 것을 학습하고, 커서를 유효하게 움직이는 방법을 터득한 것이다. 수많은 시행착오 끝에 사람보다 더 뛰어난 점수를 얻게 된 것이다. 게임의 최종 점수, 즉 목적 함수가 있었기에 가능한 방법이다. 같은 전략을 바둑에도 적용시켰다. 단 바둑에서는 고득점이 아니라 고승률을 얻도록 목적함수를 설정했다.

기본적으로 사람들의 기보를 통해서 합습한 알파고와 그것의 클론을 만들어서 둘 사이에 대국을 펼친다. 완벽한 계산에 따라서 움직일 수 없으니 적당히 임의의 움직임도 가지는 전략을 갖는다. 그 둘의 대국에서 승리한 쪽의 전략은 받아들이고 패한 전략은 약화시킨다. 그렇게 한번더 승리한 전략을 가진 새로운 알파고가 만들어진다. 새로운 알파고는 이전 버전과 다시 대국을 펼친다. 새 버전의 알파고도 여러 전략으로 자신과 싸워서 이기는 전략을 취하고 지는 전략은 버린다. 이런 과정을 수만번, 수십만번 반복하면서 이기는 또는 빈틈없는 전략을 찾아가는 과정이 (자기)강화학습과정이다. 사람과 직접 대국하지 않고 (정답세트 데이터가 없이) 바둑에서 이기는 전략을 찾아간 것이다. 알파고에서 자기강화의 개념을 빼버리고 단순히 강화학습이라고 설명하면 안된다는 걸 말하고 싶었다.
** 알파고의 강화학습은 알파고 논문을 보면... http://airesearch.com/wp-content/uploads/2016/01/deepmind-mastering-go.pdf

여담. (일반적인) 강화학습에서 초기값와 임의성은 전역최적화 Global optimization 때문에 매우 중요하다.

2016년도 초반에는 자기강화학습이 유명해졌다면 후반에는 GAN이라는 게 주목받았다. 2016년 12월에 열린 NIPS 학회에서 GAN이 튜토리얼로 소개됐는데, 앞서 설명한 알파고의 자기강화전략과는 또 다른 재미있는 전략으로 정답세트 없이 (또는 적은 정답세트로) 기계를 효과적으로 학습시키는 전략을 소개했다. GAN은 Generative Adversarial Networks의 약어인데, 각각이 중요한 의미를 가진다. 먼저 Network는 그냥 신경망이나 아니면 일반 모델정도로 이해해도 충분한 것 같다.

기계학습에서 Generative라는 용어가 등장하면 Discriminative라는 용어도 함께 등장한다. 이 두 용어의 개념을 여러 번 찾아보고 이해하려 했지만 논문을 읽을 때는 '아 이런 개념이었구나'라고 하다가 또 금새 '두개의 차이가 뭐지?'라고 하곤 했다. 모든 기계학습은 generative거나 discriminative다. 그냥 사전을 찾아보면 '생성적인'과 '식별하는'정도의 뜻을 가졌는데, 이것만으로 무슨 개념인지 이해하기 어렵다. 앞서 설명했듯이 기계학습은 주어진 데이터를 바탕으로 학습한다. Discriminative는 주어진 그 데이터의 현상만을 가지고 판별하는 것이라면, generative는 그 데이터 이면에 현재 이런 현상을 만든 이유 (또는 모델, 함수)가 있다고 가정하고 그 이유를 찾는 것이다. 설명이 좀 거시기하다. 예를 들어, 주어진 데이터만으로 'X > 5이면 Y = 1이고 X <= 5이면 Y = 0이다' 식으로 규칙 (바운더리)를 찾아내면 discriminative 방식이다. 하지만 generative는 X가 어떤 함수 -- 보통은 분포 distribution -- g(z)에 따라서 생성됐다고 가정하고 g(z)의 모형과 파라메터를 찾는 것이다. 클러스터링에서 가장 기본이 되는 k-means 알고리즘은 discriminative이고, 보통 gaussian 분포로 가정해서 EM expectation maximization 알고리즘으로 그 분포의 파라메터를 찾아가는 알고리즘은 generative다.
** GAN의 generative의 의미가 일반적으로 기계학습에서 사용하는 generative인지 여부는 좀 헷갈린다. (좀더 공부한 후에...)

마지막으로 adversarial이 GAN의 핵심이다. Adversarial은 반대의 또는 대립관계가 있는 등으로 해석할 수 있다. 알파고의 강화학습은 똑같은 목적을 가진 알파고와 알파고 클론 간의 경쟁을 통해서 더 나은 전략을 찾아가는 과정인데, GAN은 서로 다른 목적을 가진 기계끼리 경쟁하면서 더 나은 전략을 찾아가는 과정이다. 대표적으로 위조범G과 위작감별사D다. 예를 들어, 피카소의 그림은 매우 비싸게 팔린다. 만약 명화위조범이 피카소의 화풍으로 왁벽히 똑같은 그림을 그려서 그걸 피카소가 직접 그린 그림이라고 판매를 한다면 어떻게 될까? 반대편에서는 구입하기 전에 그 그림이 진품인지 위작이지를 알고 싶어할 것이다. 그래서 GAN은 위작을 만드는 generator G와 위작을 판별하는 discriminator D를 별도로 학습시켜서, G는 D를 속이도록 D는 G의 속임수를 찾아내도록 만드는 것이다. 자기강하학습에서는 자기 자신과 싸우면서 더 좋은 전략을 찾아가지만, GAN에서는 자신과 경쟁 관계가 있는 상대방과 경쟁하면서 전략을 향상시키는 것이다. 게임이론에서 말하는 내쉬평형을 찾는 일이라서 어렵다고 한다. 그리고 아직은 초기라서 연구하고 해결해야할 것들이 많고, 새로운 아이디어가 쏟아져나오고 있다고 한다.
** GAN에 대한 더 자세한 설명은 NIPS 2016 Tutorial 논문 참조: https://arxiv.org/abs/1701.00160

기계학습의 승패는 양질의 정답세트를 얻느냐 못 얻느냐에 달려있다. 하지만 양질의 정답세트를 얻는 것이 때로는 불가능하고 가능하더라도 리소스가 많이 들어간다. 그래서 제한된 학습데이터로 더 좋은 알고리즘을 만드는 것이 많은 연구자들의 목표였다. 아니면 비지도학습 unsupervised learning처럼 애초에 정답세트가 없이 제한된 범위 내에서 문제를 해결하려고 노력중이다. 중간에 semi-supervised learning이 존재해서 적은 양의 정답세트로 나름 괜찮게 작동하도록 학습시키는 방법도 있다. 하지만 결국 더 많은 정답세트를 이길 수는 없다. 그런 측면에서 알파고가 채택한 자기 자신과 싸우면서 더 좋은 전략을 찾아가는 방식이나 GAN이 채택한 경쟁 관계의 상반된 모델을 만들어서 전략을 수정해가는 방식이 참 흥미롭다.

강화학습이나 GAN까지는 아니더라도 부족한 정답세트를 극복하기 위한 다른 여러 방법들이 있다. Semi-supervised 중에 하나인 active learning (다른 의미로 사용되는 경우도 있음)도 일종의 앙상블 방법인데, 두개의 다른 learner가 서로 다른 결과를 예측하면 어느 예측이 맞는지 사람에게 확인받아서 모호한 케이스에 대해서 정답세트를 추가하는 방식이다. 위에서 설명한 것보다는 좀더 아날로그적인 방식이지만 액티브러닝을 소개받았을 때도 참 재미있다고 생각했었다. 일반적으로 두개의 classifier가 같은 답을 내놓으면 그게 정답이겠거니라고 생각하겠지만, 역으로 둘다 틀린 답변을 내놓았을 가능성도 있다. 그래서 둘이 다른 판정을 내린 사안에 대해서만 다시 슈퍼바이저 (인간)이 투입돼서 정답 여부를 가늠하는 겁니다. (처음 적을 때 이 문단은 없었지만, 함께 언급해도 괜찮을 것 같아서 추가함)

당장 내가 하고 있는 업무에서 자기강화방식이나 GAN방식을 사용할 수 있을지? 또는 어떻게 사용할 수 있을지는 아직 잘 모르겠다. 내가 앞으로 머신러닝 분야에서 더 깊은 연구를 하거나 새로운 알고리즘을 개발할 가능성은 낮지만, 다른 차원의 문제에서 이런 비슷한 전략으로 문제를 해결하는 실마리를 얻을 수 있지 않을까?라는 생각에서 좀 길게 글을 적었다.

===


반응형