2017년 8월 19일 토요일

[GAN] GAN과 확률분포 - 평범한게 좋아!

 GAN 관련 논문을 보면 '데이터의 확률분포'를 근사(approximate)한다는 말이 나오는데, 선뜻 이해가 되질 않습니다. 사람의 얼굴을 예로 든다면 '사람 얼굴의 확률분포'는 도대체 무슨 의미일까요? 이제부터 GAN의 관점에서 데이터의 확률분포란 무엇인지 살펴보겠습니다. 
확률분포
  GAN에서의 확률분포를 이해하려면, '확률분포'라는 말의 의미를 먼저 이해해야 합니다. 이제 확률분포라는 개념부터 차근차근 짚고 넘어가도록 하겠습니다.
 우리가 흔히 생각하는 확률은 어떤 일이 일어날 가능성을 말합니다. 확률분포란 어떤 확률변수 X와 X에 대응하는 확률의 쌍이라고 생각할 수 있습니다. 가장 쉬운 예로 주사위를 던지는 일을 생각해봅시다. 여기서의 확률 변수 X는 주사위를 던져서 나오는 수이고, 가능한 수는 1, 2, 3, 4, 5, 6 입니다. 그리고 각 수마다 해당 수가 나올 확률이 존재합니다. 모두가 알다시피 그 확률은 1/6 로 동일합니다. 이를 좌표계의 형태로 나타내면 아래 그림과 같습니다.
 즉, 확률변수 X가 가질 수 있는 값마다 대응하는 확률이 존재합니다. 이처럼 확률변수 X가 셀수 있는 값일때, X의 확률 분포 P(X)를 '이산확률분포'라고 합니다. 주사위 눈금의 수는 말그대로 "1, 2, 3, 4, 5, 6"이라고 셀 수 있고, 각각에 대한 확률도 명확히 말할 수 있습니다. 1/6 이라고 말이죠.
 반면에 확률변수 X가 셀수 없는 값이라면 어떨까요? 서울의 연평균 강수량을 예로 들어 봅시다. 강수량이라는 확률변수는 0이상의 실수(real number)로 정의할 수 있습니다. 즉, 셀수 없다는 말입니다. 0과 1 사이의 모든 숫자를 하나씩 셀 수 있을까요? 0.1 간격으로 나누어 세면 되지 않을까요? 하지만 똑같은 문제가 발생합니다. 0과 0.1 사이에도 무한히 많은 실수가 존재하기 때문입니다.
 강수량이라는 확률변수 X를 셀 수 없을 뿐 아니라, 확률변수 각각에 대한 확률도 명확히 정의하기 어렵습니다. 어떤 해의 강수량이 정확히 125.4533242 일 확률은 얼마일까요? 그저 '0에 가깝다'고 대답할 수 밖에 없습니다. 이처럼 확률변수 X가 셀 수 없는 연속적인 값일 경우의 확률분포를 특별히 '확률밀도함수'라고 합니다. 특정 확률변수 X에 대한 확률을 명확히 정의하기 어렵기 때문에 '밀도'라는 개념을 채용하는 것입니다.
 말이 길어졌지만 요점을 정리하면 이렇습니다. 확률분포란 임의의 확률변수 X와 그에 해당하는 확률의 쌍을 말하는 것으로 P(X)라고 표기할 수 있습니다. 즉, 수학적으로는 특정 변수 x 에 대응하는 확률 p(x) 를 나타내므로 함수의 형태로 생각할 수 있으며, 시각적으로 상상해보자면 위의 그림과 같은 좌표계 상의 그래프로 표현할 수 있습니다.
사람 얼굴의 확률분포
 이제 GAN에서 말하는 데이터의 확률분포를 살펴볼 차례입니다. 여기서는 데이터가 '사람 얼굴 사진'이라고 가정하겠습니다. 그렇다면 사람 얼굴의 확률분포란 무엇일까요? 사람의 얼굴을 어떻게 확률변수라는 수치로 표현할 수 있을까요? 또 그에 대한 확률은 어떻게 정의할까요?
 앞에서 CNN을 이용한 이미지 분류를 설명할 때, 이미지를 특징 공간 상의 한 점으로 나타낼 수 있다고 했습니다. 그리고 그 특징 공간의 각 좌표축(기저 벡터)는 어떤 특징을 나타내는 것입니다. 사람의 얼굴을 예로 들자면 얼굴 크기, 눈, 코, 입의 상대적 크기, 이마 넓이, 미간의 폭, 쌍커풀의 정도 등을 특징으로 선택할 수 있겠죠.
 이렇게 생각하면 사람의 얼굴도 변수로 수치화할 수 있습니다. 설명을 간단히 하기 위해 얼굴 크기와 미간의 폭이라는 두 가지 특징만을 고려하겠습니다. 여기서 얼굴 크기를 S, 미간의 폭을 W라고 하면 어떤 사람의 얼굴 F는 S 와 W 의 순서쌍 F(S, W) 로 표기할 수 있습니다. 맙소사! 사람 얼굴을 숫자로 바꾸는데 성공했습니다.
 이제 사람 얼굴을 확률변수로 수치화하는데 성공했으니 그에 대한 확률도 정의할 수 있습니다. 그 확률이란 바로 비슷한 얼굴이 존재할 확률을 말합니다. 세상에 나와 얼굴이 정확히 똑같은 사람이 존재할 확률은 0에 가까우므로, 여기서도 밀도의 개념을 빌려와야 합니다. 즉, 사람 얼굴의 확률밀도는 (S, W) 좌표계 상에서 특정 좌표 근처에 얼마나 많은 얼굴이 존재하냐는 것입니다. 결국 '평범한 얼굴'일수록 그 근처의 확률 밀도는 커질 것입니다. 이를 그림으로 나타내면 아래와 같습니다.
GAN과 확률분포
 이제 GAN의 판별자 네트워크 입장에서 확률분포를 생각해 보겠습니다. 판별자의 역할은 주어진 얼굴 f=(s, w)가 학습 데이터세트에 포함된 진짜 얼굴인지, 생성자가 만들어낸 가짜 얼굴인지를 가려내는 것입니다. 결국 판단의 근거는 주어진 얼굴이 얼마나 그럴싸하냐는 것 입니다. 다른말로 하자면 주어진 얼굴과 비슷한 얼굴이 얼마냐 존재하냐는 것이죠. 결국 판별자는 주어진 얼굴이 아래 그림에서 진한 색으로 표시한 영역에 가까울 수록 진짜일 확률이 높다고 판단합니다. 
 그렇다면 생성자는 판별자를 속이기 위해 어떻게 해야 할까요? 판별자가 비밀로하는 확률분포를 알아내야 합니다. 한 마디로 입력으로 주어지는 랜덤 노이즈의 확률 분포를 사람 얼굴의 확률분포로 변환하는 함수를 학습해야 합니다.
 학습 초기에는 생성자가 만들어낸 얼굴이 판별자가 진짜라고 판단하는 영역에서 멀리 떨어져 있습니다. 하지만 수없이 많은 학습을 반복하면서, 생성자가 만들어내는 얼굴의 확률분포는 판별자가 알고있는 진짜 얼굴의 확률분포와 비숫해집니다. 학습이 완료된 시점에서는 생성자가 만들어낸 얼굴의 확률분포와 판별자가 알고있는 얼굴의 확률분포가 일치하게 되고, 판별자로서는 도저히 진짜와 가짜를 구분할 수 없게됩니다. 결국 앞에서 설명한대로 판별자가 정답을 맞힐 확률은 0.5가 됩니다.
 이제 GAN이 확률분포를 근사한다는 말의 의미를 이해할 수 있게 됐습니다. 그렇다면 GAN은 패턴을 흉내낼 수 있는 완벽한 도구일까요? 다음 포스트에서는 GAN이 앞으로 해결해야할 과제들을 살펴보겠습니다.

댓글 1개:

  1. 저도 처음 GAN의 개념을 접할 때 이산확률분포와 확률밀도함수의 차이의 개념이 없어서, 특정 이미지를 나타내는 벡터는 하나인데 어떻게 다른 확률로 나타낼 수 있지? 라고 생각했습니다. 덕분에 기초부터 개념을 잡고 이해할 수 있게 되었습니다. 감사합니다!

    답글삭제

[GAN] GAN이 풀어야 할 과제들

 지금까지 GAN의 원리를 살펴봤습니다. 작동 원리를 알고나니 GAN으로 무엇이든 만들어낼 수 있을 것 같은 생각이 듭니다. 하지만 세상에 완벽한 것은 없는 법. GAN에도 아직 해결해야 할 문제점들이 있습니다. 이제부터 그 문제점들을 살펴보겠습니다...