경쟁을 통해 데이터를 만들어내는 모델: 생성적 적대 신경망
천천히 흐려졌다가 다시 선명해지는 마법: 디퓨전 모델
우리는 가끔 인공지능이 사진 속의 고양이를 알아보거나, 사람의 목소리를 듣고 무슨 뜻인지 이해하거나, 마치 사람이 쓴 것처럼 자연스러운 문장을 만드는 모습을 보면서 깜짝 놀라곤 합니다.
인공지능이 사람처럼 이런 일들을 해낼 수 있다는 건 정말 신기한 일이죠. 그런데 인공지능이 이런 능력을 가지려면 먼저 컴퓨터가 아주 많은 숫자로 이루어진 복잡한 데이터를 보고, 그 안에서 의미 있는 규칙을 스스로 발견할 수 있어야 합니다.
조금 더 쉽게 말하자면, 컴퓨터가 복잡한 숫자 속에서 뭔가 의미 있는 공통점을 찾아내야 하는 거죠.
예를 들어 우리가 스마트폰으로 찍은 사진 한 장은 사실 엄청나게 많은 숫자들로 이루어져 있습니다. 가까이 확대해서 보면 작은 점들, 즉 픽셀(pixel)이라는 것으로 사진이 구성되어 있는데, 한 장의 사진은 수천 개, 수만 개의 픽셀들로 이루어진 데이터라고 할 수 있습니다. 소리나 글자도 마찬가지입니다. 사람의 목소리나 글씨도 컴퓨터가 볼 때는 단지 숫자의 나열로 보일 뿐이죠. 이렇게 우리가 흔히 보는 데이터는 실제로는 엄청 복잡하게 얽힌 수많은 숫자로 표현됩니다.
하지만 놀랍게도, 이렇게 복잡해 보이는 데이터들도 사실은 간단한 규칙으로 묶일 수 있을 때가 많습니다. 예를 들어 우리가 고양이를 볼 때, 털의 색깔이나 자세, 표정은 사진마다 다 다를 수 있지만, 모두가 공통적으로 ‘고양이’라는 특성을 가지고 있죠. 컴퓨터가 보기에 이 수많은 고양이 사진들이 사실 하나의 세계 안에 모여 있다고 상상해보면 어떨까요? 쉽게 말해, 수백, 수천 장의 다양한 고양이 사진들이 모두 ‘고양이 세계’라는 하나의 작은 공간에 모여 있는 것처럼 생각할 수 있는 겁니다.
이렇게 데이터를 아주 넓고 복잡한 공간에 흩어져 있는 것이 아니라, 더 작고 단순한 공간 위에 깔끔하게 모여 있는 것이라고 생각하는 것이 바로 ’매니폴드(manifold)’라는 개념입니다. 원래 매니폴드는 수학에서는 ‘곡면’ 또는 ‘어떤 일정한 모양을 가진 공간’을 뜻하는 어려운 용어인데, 인공지능에서는 조금 더 쉽게 생각할 수 있습니다. 복잡해 보이는 데이터가 사실은 간단한 구조나 규칙을 따라 모여 있다는 생각에서 출발한 것입니다. 그리고 이렇게 숨겨진 구조를 컴퓨터가 스스로 배우는 것을 ‘매니폴드 학습(manifold learning)’이라고 부릅니다.
이제 일상적인 예를 들어 조금 더 쉽게 설명해볼까요? 여러분이 수천 가지 모양의 풍선을 가지고 있다고 상상해 보세요. 크기도 다르고 색깔도 다르며 모양도 제각각인 풍선들이 있습니다. 이 풍선들은 얼핏 보면 너무 다양해서 복잡해 보이지만, 결국 모두 ‘풍선’이라는 한 가지 특성을 공유하고 있습니다. 그래서 우리는 다양한 풍선을 ‘풍선 세계’라는 한 공간에 모을 수 있습니다. 이것이 매니폴드를 이해하는 쉬운 방법입니다.
이렇게 매니폴드를 이해하면 좋은 점이 있습니다. 데이터가 사실은 간단한 규칙으로 모여있다는 걸 알면, 데이터를 더 쉽게 다룰 수 있고, 심지어 새로운 데이터도 만들어 낼 수 있게 됩니다. 예를 들어 우리가 ‘고양이 세계’라는 매니폴드를 완벽히 이해했다면, 아직 한 번도 본 적 없는 새로운 고양이 사진을 만들어낼 수도 있는 것이죠. 마치 고양이 세계의 법칙을 배우고 나면, 자유롭게 그 세계 안에서 새롭고 다양한 고양이를 창조할 수 있게 되는 것과 같습니다.
이번 장에서는 바로 이런 ‘매니폴드’라는 개념을 바탕으로 인공지능이 어떻게 데이터를 배우고, 새롭게 만들어 내는지 살펴볼 것입니다. 구체적으로 어떤 방법들이 있을까요?
먼저 가장 기본적인 방법으로 ’오토인코더(autoencoder)’라는 것이 있습니다. 오토인코더는 데이터의 가장 중요한 특징만 골라내서 기억한 다음, 다시 원본 데이터를 최대한 비슷하게 복원하는 기술입니다. 마치 긴 영화를 핵심 장면만 골라 압축했다가 다시 풀어내는 것과 비슷합니다.
조금 더 나아간 방법으로 ’변분 오토인코더(variational autoencoder)’라는 것도 있습니다. 이름이 어려워 보이지만, 이 방법은 데이터를 단순히 압축하고 복원하는 데 그치지 않고, 그 데이터가 나타날 확률을 함께 배워서 완전히 새로운 데이터를 자연스럽게 생성할 수 있게 해줍니다. 말하자면, 단순히 영화의 핵심 장면을 기억하는 것이 아니라, 비슷한 분위기의 새로운 영화 장면까지 만들어내는 것이죠.
그리고 매우 흥미로운 ’생성적 적대 신경망(GAN, Generative Adversarial Network)’이라는 것도 등장합니다. GAN은 두 개의 인공지능이 서로 경쟁하면서 학습하는 방식인데요. 한쪽은 진짜 같은 가짜 데이터를 만들고, 다른 쪽은 그 데이터를 보고 진짜인지 가짜인지 구별합니다. 이 둘이 계속 경쟁하면서 놀라운 성능으로 진짜와 거의 구분할 수 없는 데이터를 만들어냅니다. 마치 위조지폐범과 경찰이 서로 경쟁하며 더 정교해지는 것과 비슷한 방식입니다.
마지막으로, 최근 가장 주목받고 있는 ‘디퓨전 모델(diffusion model)’이라는 방법도 소개하겠습니다. 디퓨전 모델은 데이터에 노이즈(noise, 잡음)를 조금씩 섞으면서 데이터의 특징을 점차 흐릿하게 만듭니다. 그리고 다시 이 흐릿한 데이터를 원래의 깔끔한 데이터로 복원하는 방법을 배우는 방식으로 작동합니다. 이렇게 하면 매우 자연스러운 새로운 데이터를 만들어낼 수 있습니다. 예를 들면, 안개 속에서 조금씩 모습을 드러내는 그림을 떠올리면 이해하기 쉽습니다.
이번 장에서는 바로 이런 매니폴드라는 개념을 중심으로, 데이터를 이해하고 새로운 데이터를 만들어내는 여러 가지 인공지능 기술의 원리를 천천히 살펴보겠습니다. 그 과정에서 우리가 던지는 질문은 단 하나입니다.
“데이터 안에는 어떤 질서가 숨어 있을까요?”
이 질문을 마음속에 담고 다음 내용들을 천천히 따라가 보면 좋겠습니다.
오토인코더: 복잡한 데이터 안의 핵심만 뽑아내기
오토인코더(자동 부호화 신경망, Autoencoder)는 복잡한 데이터 속에서 가장 중요한 특징만을 뽑아내고, 이를 바탕으로 원래의 데이터를 다시 만들어내는 방법을 배우는 인공지능 기술입니다. 조금 더 쉽게 설명하자면, 오토인코더는 마치 책 한 권 전체를 몇 줄의 요약으로 줄이고, 다시 그 짧은 요약만 가지고 원래의 내용을 최대한 자세히 복원해내는 연습을 반복하는 것과 비슷합니다. 책의 내용을 전부 기억하기는 어렵지만, 잘 만들어진 요약을 가지고 있으면 대충 어떤 이야기였는지 다시 떠올릴 수 있는 것과 같습니다.
오토인코더는 크게 두 부분으로 이루어져 있습니다. 첫 번째 부분은 ’인코더(encoder)’로, 복잡한 데이터를 받아서 그 안에서 가장 중요하고 핵심적인 정보만 남기고 아주 간단하게 압축합니다. 이렇게 압축된 데이터를 작은 숫자 묶음으로 표현하게 되는데, 이것을 ‘벡터(vector)’라고 부릅니다. 이 벡터는 마치 긴 이야기를 한두 문장으로 간단하게 줄인 요약본과 같은 것입니다.
두 번째 부분은 이렇게 압축된 벡터를 다시 원래의 데이터로 복원해내는 역할을 하는 ‘디코더(decoder)’입니다. 디코더는 인코더가 만든 간단한 요약을 보고 원본 데이터와 최대한 비슷하게 데이터를 다시 만들어 내려고 합니다. 처음에는 잘 못 만들 수도 있지만, 데이터의 원본과 복원된 결과를 계속 비교하면서 차이를 점점 줄여 나갑니다. 이런 과정을 수없이 반복하면서 오토인코더는 데이터의 가장 중요한 구조와 특징을 자연스럽게 배우게 됩니다.
그런데 여기서 오토인코더가 배우는 정보는 단지 원본 데이터를 그대로 외우는 것이 아닙니다. 오토인코더가 진짜 배우는 것은 데이터를 관통하는 중요한 규칙과 본질적인 특징입니다. 예를 들어 수백 장의 고양이 사진이 있다고 생각해 봅시다. 고양이의 자세나 색깔, 크기는 사진마다 다르지만, 모두 공통된 특징을 갖고 있겠죠. 바로 이 공통된 특징이 오토인코더가 찾으려고 하는 ‘핵심 구조’입니다. 다시 말해 오토인코더는 복잡한 데이터 속에 숨어 있는 ‘고양이란 무엇인가?’라는 질문에 대한 답을 찾는 연습을 하고 있는 것입니다.
또 오토인코더가 배우는 방식은 특별한 정답을 주지 않아도 혼자서 학습할 수 있는 방법입니다. 이렇게 정답 없이 데이터만 주어졌을 때, 그 속에서 스스로 의미 있는 특징이나 규칙을 발견하는 방식을 우리는 ‘비지도 학습(Unsupervised Learning)’이라고 부릅니다.
1장에서 우리는 비지도 학습의 예로 ’k-평균(k-means)’이라는 방법을 배운 적이 있습니다. k-평균은 여러 데이터를 비슷한 것끼리 묶어서 그룹을 만드는 기술이었습니다. 예를 들어, 많은 사람들을 성격이나 취향에 따라 비슷한 집단으로 구분하는 것처럼 말입니다. 오토인코더 역시 정답을 주지 않고 데이터만으로 학습하는 비슷한 원리를 사용합니다. 다만 k-평균이 데이터들을 비슷한 그룹으로 나누는 데 초점을 맞추었다면, 오토인코더는 데이터 각각의 중요한 핵심을 뽑아내어 압축하고 다시 복원하는 데 초점을 맞추고 있습니다.
실제 우리 일상에서 오토인코더는 꽤 다양하게 쓰이고 있습니다. 예를 들어서 사진이나 음성 데이터처럼 정보가 너무 많아 다루기 어려운 데이터의 양을 간단하게 줄이는 데 사용되기도 합니다. 또한 사진이 흐릿하거나 손상되었을 때 원래의 깨끗한 사진으로 복원하거나, 주변 소음이 많은 음성 데이터를 깨끗한 소리로 바꾸는 데도 활용할 수 있습니다. 특히 잡음이 있는 데이터를 원래대로 돌려놓는 데 쓰이는 오토인코더를 ‘디노이징 오토인코더(Denoising Autoencoder)’라고 부릅니다.
다른 예시도 생각해 볼까요? 여러분이 예전에 찍어 둔 사진의 화질이 너무 낮아서 흐릿하게 보인다면, 오토인코더를 활용한 기술이 이를 깨끗하고 선명한 고화질 이미지로 만들어 줄 수 있습니다. 또 데이터 중 일부가 지워졌거나 손상된 경우, 빈칸을 적절한 값으로 자연스럽게 채워 넣는 역할도 오토인코더가 할 수 있습니다. 더 나아가 정상적인 데이터와 조금이라도 다른 이상한 데이터가 들어왔을 때 이를 빠르게 알아내는 이상 탐지(Anomaly Detection)에도 오토인코더가 큰 역할을 하고 있습니다. 실제로 산업 현장에서는 제품 중 불량품을 골라내거나, 금융 거래에서 평소와 다른 이상한 거래를 찾아내는 데 활용되고 있죠.
이처럼 오토인코더는 단순히 데이터를 작게 압축하고 다시 복원하는 기술만이 아니라, 데이터가 놓인 숨겨진 공간, 즉 우리가 앞서 배웠던 ’매니폴드(manifold)’를 스스로 이해하고 그리는 구조입니다. 다시 풍선 예시를 떠올려 볼까요? 크기와 모양, 색깔이 모두 다른 수많은 풍선이 있지만 결국 풍선이라는 공통점을 가지고 있는 것처럼, 오토인코더는 다양한 데이터가 가지고 있는 본질적인 공통점을 찾아서 기억하는 것입니다.
그리고 앞으로 배울 다른 다양한 인공지능 기술들도 바로 이 오토인코더의 기본 원리에서 출발합니다. 지금보다 더 정교한 방식으로 매니폴드를 이해하고, 그 위에서 완전히 새로운 데이터를 만들어내기 위한 다양한 시도들이 이어지고 있습니다.
데이터를 새로 만들어내기 위한 확장: 변분 오토인코더
앞에서 설명한 오토인코더는 데이터를 잘 요약하고 다시 복원하는 데 아주 뛰어난 방법입니다. 하지만 이 방식에도 한 가지 아쉬운 점이 있습니다. 바로 오토인코더가 만들어내는 데이터의 요약본(잠재 표현, latent representation)이 너무 딱 정해져 있다는 것입니다. 조금 쉽게 말해 보겠습니다. 만약 여러분이 고양이 사진 한 장을 오토인코더로 압축하면, 이 압축된 결과는 고정된 하나의 벡터로 표현됩니다. 그런데 여러분이 “새로운 고양이 사진을 만들어 보고 싶다”고 생각한다면 어떻게 해야 할까요? 기존 오토인코더는 새로운 데이터를 만들어낼 때 어떤 벡터를 선택해야 하는지, 어디에서부터 시작해야 하는지 잘 알려주지 않습니다. 요약본이 너무 딱 정해져 있기 때문이죠.
바로 이 문제를 해결하기 위해 등장한 모델이 변분 오토인코더(Variational Autoencoder, VAE)입니다. 이름이 다소 어려워 보이지만 차근차근 쉽게 풀어보겠습니다. 변분 오토인코더는 겉으로 보기에는 앞에서 배운 오토인코더와 거의 비슷한 구조를 가지고 있습니다. 하지만 아주 중요한 차이가 있습니다. 변분 오토인코더는 데이터를 압축한 잠재 공간(latent space)을 훨씬 더 자유롭고 유연하게 사용한다는 것입니다.
그렇다면 이 ‘잠재 공간’이란 무엇일까요? 잠재 공간은 데이터를 압축해서 표현한 벡터들이 모여 있는 일종의 가상 공간입니다. 오토인코더는 데이터를 이 공간 안에 한 점으로 정확히 찍어서 표현합니다. 반면 변분 오토인코더는 데이터를 한 점으로 찍는 대신, 그 데이터가 이 공간에서 어떤 범위 안에 있을 가능성이 높다고 표현합니다. 쉽게 말하면 이렇게 생각해 보세요. 여러분이 친구에게 정확한 주소를 알려주지 않고 “우리 집은 지하철역 근처, 대략 이 주변이야”라고 말하는 것과 비슷합니다. 변분 오토인코더도 마찬가지로 “이런 종류의 고양이는 이 주변 어딘가에 있을 거야” 하는 식으로 데이터를 표현합니다.
이렇게 데이터를 특정한 하나의 점이 아니라 일정한 범위(확률 분포, probability distribution)로 표현하면 무엇이 좋을까요? 이 범위 안에서 새로운 데이터를 마음대로 골라내서 만들어낼 수 있다는 장점이 생깁니다. 다시 말해, 변분 오토인코더는 단순히 본 데이터를 그대로 복원하는 능력뿐만 아니라, 본 적 없는 새로운 데이터를 만들어내는 능력까지 갖추게 되는 것이죠.
변분 오토인코더는 학습할 때 두 가지 목표를 함께 만족시키려고 노력합니다. 첫 번째 목표는 일반 오토인코더와 같습니다. 입력 데이터를 최대한 정확히 복원하는 것입니다. 두 번째 목표는 잠재 공간에 표현된 데이터의 분포가 미리 정해놓은 형태에 가깝게 유지되는 것입니다. 일반적으로 평균이 0이고, 분산이 1인 정규 분포(normal distribution)를 사용합니다. 이런 방식으로 학습이 끝나면 잠재 공간 어디에서든 마음대로 벡터를 선택해도, 자연스러운 새 데이터를 만들어낼 수 있게 됩니다.
이 내용을 조금 더 쉽게 이해하기 위해 현실적인 예시를 하나 들어보겠습니다. 변분 오토인코더가 그림을 그리는 미술 학원 학생이라고 상상해봅시다. 처음에는 이미 그려진 그림을 보고 따라 그리는 연습을 합니다. (이것이 데이터를 정확하게 복원하는 단계입니다.) 하지만 어느 정도 실력이 늘어나면 “고양이”라는 주제만 주어져도 자신만의 스타일로 새로운 그림을 그려낼 수 있게 되죠. 이 단계가 바로 변분 오토인코더의 방식입니다. 단순히 본 그림을 똑같이 따라 그리는 것을 넘어, 배우고 익힌 규칙과 특징을 활용하여 본 적 없는 완전히 새로운 그림을 그려낼 수 있는 것입니다.
변분 오토인코더는 인공지능 기술에서 매우 중요한 전환점입니다. 그 이유는, 기존의 오토인코더가 ‘데이터를 잘 기억하고 다시 복원하는 기술’이었다면, 변분 오토인코더는 ‘배운 정보를 이용해 새로운 데이터를 만들어내는 기술’이라는 더 큰 가능성을 열어주기 때문입니다. 앞으로 살펴볼 다른 생성 모델(generative model)들 역시 바로 이 변분 오토인코더의 아이디어에서 출발합니다.
이제부터 인공지능은 단지 있는 데이터를 흉내 내는 수준에서 벗어나, 스스로 데이터를 새롭게 창조하는 능력을 갖추게 된 것입니다.
경쟁을 통해 데이터를 만들어내는 모델: 생성적 적대 신경망
지금까지 우리는 오토인코더나 변분 오토인코더처럼 데이터를 압축하고 복원하면서 구조를 배우는 방식의 모델을 살펴봤습니다. 이번에는 이들과는 조금 다른 방식의 인공지능 모델을 만나보려고 합니다. 이번 모델은 데이터를 압축하거나 복원하는 게 아니라, 처음부터 아예 새로운 데이터를 만들어내는 데 집중합니다. 그것도 두 개의 인공지능이 서로 경쟁하면서 학습한다는 독특한 아이디어를 사용합니다. 이 재미있는 방법으로 데이터를 만드는 모델이 바로 ‘생성적 적대 신경망(Generative Adversarial Network, GAN)’입니다.
생성적 적대 신경망(GAN)은 두 개의 인공지능 신경망이 서로 경쟁하는 구조를 가지고 있습니다. 한쪽은 ‘생성자(generator)’라는 신경망이고, 다른 한쪽은 ‘판별자(discriminator)’라는 신경망입니다. 생성자의 역할은 주어진 무작위 값에서 출발해서 마치 진짜처럼 보이는 가짜 데이터를 만들어내는 것입니다. 판별자는 이 데이터를 받아서, 진짜인지 아니면 생성자가 만든 가짜인지 구별해내는 일을 합니다.
두 신경망은 처음에는 실력이 좋지 않아서 쉽게 서로를 속이거나 알아냅니다. 처음에 생성자가 만든 데이터는 진짜 데이터와는 많이 다르기 때문에 판별자가 금방 알아차릴 수 있죠. 하지만 생성자는 판별자를 속이기 위해 끊임없이 노력합니다. 더 진짜 같은 데이터를 만들어내기 위해 스스로를 계속 발전시키는 겁니다. 마찬가지로 판별자도 생성자가 만들어낸 데이터를 더욱 정확하게 구별하기 위해 계속 연습합니다. 이렇게 두 인공지능은 서로 경쟁하면서 함께 성장합니다.
GAN의 학습 방식을 이해하기 쉽게 다른 예를 들어 설명해 볼까요? 유명한 화가의 그림을 감정하는 전문가와, 그 화가의 그림을 정교하게 따라 그리는 가짜 화가가 있다고 생각해 보겠습니다. 가짜 화가는 처음에는 어설픈 그림을 그려서 금방 들키고 맙니다. 하지만 계속 연습하면서 점점 더 진짜 화가의 그림과 비슷한 작품을 만들어내게 되죠. 이에 맞서 그림 감정 전문가 역시 진짜와 가짜를 구별하기 위해 더욱 날카로운 눈썰미를 키워갑니다. 서로가 서로를 이기기 위해 점점 더 발전하면서 결국 가짜 화가는 진품과 거의 구별할 수 없을 정도로 뛰어난 그림을 만들어낼 수 있게 됩니다.
GAN도 바로 이와 같은 방식으로 데이터를 생성합니다. 생성자는 가짜 화가처럼 점점 더 진짜 같은 데이터를 만들고, 판별자는 그림 감정 전문가처럼 데이터를 정확하게 구별하는 능력을 키워가는 것이죠. 이렇게 경쟁하면서 함께 발전하는 과정 덕분에 GAN은 결국 매우 자연스럽고 정교한 데이터를 생성할 수 있게 되는 것입니다.
이런 독특한 경쟁 방식을 통해 GAN은 굉장히 현실적이고 자연스러운 데이터를 만들어낼 수 있게 됩니다. 실제로 GAN은 사람 얼굴 사진을 마치 진짜 사람처럼 만들어 내기도 하고, 마치 진짜 화가가 그린 듯한 아름다운 그림이나 상상 속의 풍경까지 만들어 낼 수 있습니다. 심지어 만들어낸 결과가 너무 진짜 같아서, 우리가 보기에는 진짜인지 가짜인지 구별하기 어려울 때도 많습니다. 최근 화제가 된 ‘딥페이크(deepfake)’라는 기술도 바로 GAN을 이용한 대표적인 사례입니다. 딥페이크는 마치 유명인의 얼굴이나 목소리를 진짜처럼 만들어낸 영상으로, 실제 사람이 한 적 없는 말을 하거나 행동하는 모습을 만들어 내는 기술입니다.
하지만 GAN에도 완벽하지 않은 점들이 있습니다. 대표적인 문제는 두 신경망의 경쟁이 균형 있게 진행되지 않으면 학습이 잘 안 될 수도 있다는 점입니다. 만약 생성자가 너무 빨리 발전하거나, 판별자가 너무 뛰어나서 생성자가 만든 데이터를 무조건 가짜라고만 판단하게 되면, 두 신경망 모두 제대로 성장하기 어려워집니다. 또 다른 문제로는 GAN이 비슷한 데이터만 반복적으로 만들어내서 결과의 다양성이 부족해지는 현상도 종종 일어납니다.
그럼에도 불구하고 GAN은 매우 중요한 의미를 가지고 있습니다. GAN이 중요한 이유는, 인공지능이 단순히 주어진 데이터를 모방하는 수준을 넘어서 마치 사람처럼 완전히 새로운 데이터를 창조할 수 있는 가능성을 보여주었기 때문입니다. GAN의 등장으로 인공지능은 ‘창의성’을 가질 수 있다는 가능성을 보여준 것이죠. 이 덕분에 GAN은 데이터 생성 모델의 발전에 큰 영향을 주었고, 이후 등장한 다양한 생성 모델들도 GAN의 기본 아이디어를 참고하거나 더 발전시킨 형태로 계속해서 등장하고 있습니다.
이렇게 GAN은 인공지능이 단순히 데이터를 배우고 따라 하는 것을 넘어서, 스스로 창의적인 결과물을 만들어낼 수 있다는 가능성을 처음으로 널리 알린 모델이라고 할 수 있습니다.
GAN은 무엇을 배우는 걸까?: 진짜와 가짜의 거리를 측정하는 방법들
지금까지 우리가 배운 생성적 적대 신경망(Generative Adversarial Network, GAN)은 데이터를 만들어내는 ’생성자(generator)’와 진짜와 가짜를 구별하는 ’판별자(discriminator)’가 서로 경쟁하는 구조였습니다. GAN에서 가장 중요한 목표는 결국 “생성자가 만든 가짜 데이터를 얼마나 진짜와 비슷하게 만들 수 있을까?“라는 질문입니다. 여기서 자연스럽게 다음과 같은 궁금증이 생깁니다.
“진짜 데이터와 가짜 데이터가 얼마나 비슷한지를 어떻게 측정할 수 있을까요?”
이 질문은 GAN이 구체적으로 어떤 목표를 세우고 어떻게 학습할지를 결정하는 데 매우 중요합니다. 두 데이터 집합이 서로 얼마나 비슷하거나 다른지를 수학적으로 표현할 때 쓰는 말이 바로 ‘분포 간 거리’입니다. 조금 쉽게 이야기하면, 두 데이터가 서로 얼마나 떨어져 있는지, 혹은 얼마나 닮아 있는지를 숫자로 정확히 표현하는 방법이라고 할 수 있죠.
가장 먼저 사용된 방법 중 하나가 쿨백-라이블러 발산(Kullback-Leibler Divergence, KLD)이라는 방식입니다. 이름은 어렵지만, 사실 쉽게 설명하면 두 데이터의 차이를 ‘정보의 차이’로 계산하는 방식입니다. 마치 두 가지 소설책이 있을 때, 내용이 서로 얼마나 다른지를 분석해서 표현하는 것과 비슷합니다. 변분 오토인코더(VAE)에서도 데이터를 다룰 때 이 방식을 많이 사용하고 있습니다. 그런데 쿨백-라이블러 발산에는 큰 단점이 있습니다. 두 데이터 집합이 서로 너무 다르면 차이가 무한대에 가깝게 커지거나 계산이 잘 되지 않는 문제들이 생길 수 있습니다.
이러한 단점을 보완하기 위해 GAN에서는 젠슨-섀넌 발산(Jensen-Shannon Divergence, JS 발산)이라는 조금 더 안정적인 방법을 사용했습니다. JS 발산은 두 데이터 분포 사이의 차이를 조금 더 부드럽게 측정하는 방법입니다. 하지만 JS 발산도 완벽하지는 않았습니다. 특히 GAN이 학습을 처음 시작할 때 판별자가 너무 쉽게 진짜와 가짜를 구별해 버리면, 생성자가 어디를 어떻게 개선해야 할지 힌트를 받지 못하고 학습이 어려워지는 문제가 생깁니다. 이렇게 생성자가 학습할 방향을 잃어버리는 현상을 ‘기울기 소실(gradient vanishing)’이라고 부릅니다. 즉, 생성자가 더 이상 어떻게 데이터를 개선해야 할지 힌트를 찾지 못하게 되는 것입니다.
이 문제를 해결하기 위해 새롭게 등장한 개념이 바로 ’바서스타인 거리(Wasserstein Distance)’입니다. 바서스타인 거리는 이름이 다소 어렵지만, 쉽게 설명하면 두 개의 흙더미를 옮기는 문제에 비유할 수 있습니다. 예를 들어서, 운동장에서 한쪽에 모여 있는 흙을 다른 쪽으로 옮기려고 한다고 생각해봅시다. 흙을 얼마나 멀리, 얼마나 많이 옮겨야 하는지에 따라 그만큼 더 힘들어지고, 그 힘든 정도가 바로 두 분포 사이의 거리가 됩니다. 즉 바서스타인 거리는 데이터 집합을 ‘흙더미’처럼 생각하고, 얼마나 많은 데이터를 얼마나 멀리 움직여야 서로 같아질 수 있는지를 측정하는 방식입니다.
바서스타인 거리를 사용하면 데이터가 서로 완전히 겹치지 않더라도 늘 안정적으로 계산할 수 있고, 생성자는 항상 적절한 힌트를 받아 학습을 잘 진행할 수 있게 됩니다. 이 아이디어를 바탕으로 만든 GAN을 ‘바서스타인 GAN(Wasserstein GAN)’이라고 부르며, 기존의 GAN에 비해 학습이 훨씬 더 안정적이고 자연스러운 데이터를 만들어낼 수 있다고 알려져 있습니다.
결국 GAN이 진짜 배우고 있는 것은 단순히 “그럴듯한 이미지나 데이터를 만들어내는 방법”이 아닙니다. GAN은 진짜 데이터와 가짜 데이터가 서로 얼마나 비슷한지를 꾸준히 측정하고, 그 거리를 점점 더 줄여나가는 과정을 배우고 있는 것입니다. 어떤 방식을 이용해서 두 데이터의 거리를 측정하느냐에 따라 GAN의 성능이 크게 달라질 수 있습니다. 그래서 GAN을 더 효과적으로 활용하고 잘 이해하기 위해서는 이런 이론적인 부분도 아주 중요한 역할을 하게 됩니다.
구조를 바꾸면서 확률을 계산하는 모델: 정규화 흐름
앞에서 살펴본 변분 오토인코더(VAE)나 생성적 적대 신경망(GAN)은 실제로 존재할 법한 새로운 데이터를 아주 잘 만들어내는 모델이었습니다. 하지만 이 두 모델에도 공통된 아쉬움이 있습니다. 바로 어떤 데이터를 만들어냈을 때, 그 데이터가 얼마나 자연스럽고 현실적인지, 즉 얼마나 ‘있을 법한지’를 숫자로 정확하게 표현하기 어렵다는 점입니다. 간단히 말해서, 진짜와 비슷한 데이터를 잘 흉내 내기는 하지만, 그것이 실제 데이터 속에서 얼마나 타당한지를 객관적으로 측정하는 데는 한계가 있다는 것입니다.
바로 이 점을 해결하기 위해 등장한 모델이 ‘정규화 흐름 모델(Normalizing Flow)’입니다. 정규화 흐름 모델은 생성한 데이터의 확률을 숫자로 정확히 계산할 수 있다는 것이 특징입니다. 이 모델의 기본 아이디어는 의외로 간단합니다. 처음에는 우리가 잘 알고 있고 다루기 쉬운 간단한 확률 분포에서 출발해서, 여러 단계에 걸쳐 점점 더 복잡한 분포로 변형시켜 가는 방식입니다. 예를 들어 평균이 0이고 분산이 1인 가장 기본적인 정규분포(normal distribution)에서 출발하여, 복잡한 데이터를 표현할 수 있도록 조금씩 모양을 바꾸는 것입니다. 이때 가장 중요한 점은, 이런 변형 과정이 수학적으로 정확히 계산 가능해야 하고, 언제든지 거꾸로 되돌릴 수 있어야 한다는 것입니다.
이 과정을 쉬운 예로 바꿔보겠습니다. 처음에 여러분이 부드럽고 단순한 점토 덩어리를 가지고 있다고 생각해 봅시다. 이 점토는 간단한 공 모양이라서 우리가 정확히 알고 있는 간단한 분포와 같습니다. 이제 이 점토 덩어리를 천천히 조금씩 눌러서 점점 복잡하고 정교한 조각상을 만든다고 상상해 보세요. 정규화 흐름 모델은 이렇게 점토를 조금씩 바꾸는 과정에서 “어디를 얼마나 눌렀고, 어떻게 모양을 바꿨는지”를 정확하게 기록하는 방식입니다. 그렇게 하면 나중에 필요할 때 이 작업을 정확히 거꾸로 되돌릴 수 있습니다. 이 덕분에 아주 복잡한 데이터를 만들면서도, 그 데이터의 확률을 정확하게 계산할 수 있게 되는 것입니다.
정규화 흐름 모델의 가장 큰 장점은 바로 이 점입니다. 데이터 생성과 동시에, 그 데이터가 실제 데이터와 얼마나 비슷한지를 정확하게 확률로 계산할 수 있습니다. 예를 들어 어떤 이미지를 보았을 때 “이 이미지가 진짜 이미지로 얼마나 자연스러운가?“라는 질문에 숫자로 답할 수 있습니다. 이렇게 하면 이상한 데이터를 찾아내서 걸러내거나, 더 좋은 데이터를 선택하는 데 아주 유용하게 활용될 수 있습니다.
하지만 이런 방식에도 어려움이 존재합니다. 복잡한 데이터를 간단한 분포에서 한 번에 바꾸려면, 매우 정교하고 복잡한 변형 과정이 필요합니다. 이 과정은 마치 점토를 단순한 공에서 매우 복잡한 조각상으로 바꾸는 것처럼, 한 번에 모든 것을 해결하려면 계산이 매우 까다로워지고 어렵습니다.
바로 여기서 중요한 아이디어 하나가 등장합니다. 누군가 이런 질문을 던진 것이죠.
“꼭 한 번에 모든 걸 바꿔야 할까?”
이 간단한 질문에서 새로운 아이디어인 ’디퓨전 모델(diffusion model)’이 등장하게 되었습니다. 정규화 흐름 모델이 간단한 형태에서 복잡한 형태로 한 번에 크게 변형시키는 방식이었다면, 디퓨전 모델은 이 과정을 한 번에 하지 않고 아주 천천히, 조금씩 여러 단계로 나누어서 변형합니다. 예를 들면, 점토 덩어리를 한 번에 복잡한 모양으로 만들려고 애쓰는 대신, 아주 미세하고 섬세한 동작으로 점차 조각상을 완성하는 방식입니다.
이렇게 천천히 여러 단계로 나누어 변형하면 계산이 더 쉬워지고 안정적으로 진행될 수 있게 됩니다. 즉, 디퓨전 모델은 정규화 흐름 모델의 장점을 유지하면서도 더욱 섬세하고 안정적인 방식으로 데이터를 다룰 수 있는 것입니다.
이렇게 보면 정규화 흐름 모델은 생성한 데이터의 확률까지 정확하게 계산할 수 있는 모델로 가는 중요한 첫걸음이었고, 디퓨전 모델은 이 아이디어를 더욱 발전시켜 더 세밀하고 정밀하게 데이터를 만들어내는 방향으로 나아간 모델이라고 할 수 있습니다.
이제부터 우리가 살펴볼 디퓨전 모델은 최근 가장 주목받고 있는 방식 중 하나로, 인공지능이 데이터를 만들어내는 과정에서 아주 중요한 역할을 하고 있습니다.
천천히 흐려졌다가 다시 선명해지는 마법: 디퓨전 모델
앞에서 배운 정규화 흐름 모델(Normalizing Flow)은 간단한 데이터 분포를 한 번에 복잡한 분포로 바꾸려고 했습니다. 하지만 실제 우리가 다루는 데이터는 그렇게 간단하지 않습니다. 사람의 얼굴이나 자연의 풍경, 글씨 같은 데이터들은 아주 작은 차이만으로도 완전히 달라질 수 있습니다. 이런 데이터를 한 번에 복잡한 모양으로 바꾸려면 굉장히 어렵고 불안정해질 수밖에 없습니다.
이러한 어려움을 해결하기 위해 나타난 방법이 바로 디퓨전 모델(Diffusion Model)입니다. 디퓨전 모델은 지금까지 배운 방법과는 완전히 반대 방향으로 생각합니다. 복잡한 데이터를 처음부터 완벽히 만들어 내려고 하지 않고, 깨끗하고 선명한 데이터를 아주 조금씩 흐릿하게 만드는 것에서 출발합니다. 이런 식으로 데이터를 천천히 무질서하게 변형시키는 과정을 ’확산(diffusion)’이라고 부릅니다.
이 과정을 상상하기 쉽게 예를 하나 들어볼까요? 여러분이 선명한 사진을 갖고 있다고 해봅시다. 이 사진 위에 아주 작은 먼지나 노이즈(noise)를 조금씩 뿌리기 시작합니다. 처음에는 거의 변화가 없어 보이지만, 이 과정을 계속 반복하면 결국 원래의 이미지는 거의 알아볼 수 없을 만큼 흐릿한 노이즈 덩어리가 되고 맙니다. 디퓨전 모델은 바로 이런 방식으로 깨끗한 데이터를 천천히 흐리게 만듭니다.
그럼 이렇게 흐릿해진 데이터를 어떻게 사용할까요? 디퓨전 모델은 바로 이 과정을 다시 거꾸로 되돌리는 방법을 배웁니다. 흐릿하고 무질서한 상태에서 다시 원래의 깨끗하고 선명한 상태로 돌아가는 연습을 계속 반복하면서, 데이터가 가진 원래 형태를 어떻게 복원하는지 익히게 되는 것이죠. 이렇게 조금씩 단계적으로 데이터를 만들어 가는 모습은 마치 연필 스케치를 하고 조금씩 지우고, 색을 더해 그림을 완성해 나가는 과정과도 매우 비슷합니다.
디퓨전 모델은 다음과 같은 순서로 학습합니다. 먼저 깨끗한 원본 이미지를 준비하고, 거기에 아주 미세한 노이즈를 반복적으로 추가해 점점 흐리게 만듭니다. 그리고 이 흐릿한 이미지를 원본 이미지로 돌리는 과정을 학습합니다. 이런 연습을 수없이 반복하면, 나중에는 아무런 의미도 없는 무작위 노이즈에서 출발해도 점점 깨끗한 이미지로 복원할 수 있게 됩니다.
이 방식은 데이터를 만드는 데 매우 안정적이고 효과적입니다. 앞서 소개한 생성적 적대 신경망(GAN)은 한 번에 완성된 이미지를 만들어내려다 보니 학습이 자주 불안정해지고 결과도 예측하기 어려웠습니다. 하지만 디퓨전 모델은 아주 작은 변화를 수백 번 반복하기 때문에 훨씬 정교하고 자연스러운 결과를 얻을 수 있습니다. 덕분에 사람 얼굴의 미세한 표정이나 섬세한 풍경, 다양한 그림 스타일을 만들어내는 데에도 아주 뛰어난 성능을 보여줍니다.
최근에 여러분이 자주 접하게 되는 인공지능 이미지 생성 프로그램들, 예를 들어 ‘스테이블 디퓨전(Stable Diffusion)’, ‘달리-2(DALL·E-2)’, ‘미드저니(Midjourney)’ 등도 모두 이 디퓨전 모델의 방식으로 작동합니다. 이런 프로그램들은 단순히 그림을 그려주는 데 그치지 않고, 여러분이 글로 설명한 내용을 실제 그림으로 바꿔주거나 사진을 예술 작품처럼 변형시키기도 합니다. 예를 들면 “우주에서 아이스크림을 먹고 있는 강아지” 같은 상상 속의 장면도 그림으로 만들어낼 수 있는 것이죠.
게다가 디퓨전 모델은 이제 이미지뿐 아니라 비디오와 같은 움직이는 데이터까지 만들 수 있도록 발전하고 있습니다. 지금까지는 이미지를 하나씩 따로 만드는 방식이었다면, 이제는 시간의 흐름에 따라 자연스럽게 이어지는 영상도 만들 수 있도록 연구가 활발히 진행 중입니다. 앞으로는 영상 속에서 인물들이 움직이고, 사건이 전개되는 모습을 디퓨전 모델로 자연스럽게 만들어낼 수 있게 될 것입니다.
디퓨전 모델은 다른 생성 모델과는 조금 다른 독특한 매력을 가진 방법입니다. 데이터를 만드는 과정이 단계적이고 안정적이며, 무엇보다도 생성한 데이터가 얼마나 현실적인지 확률적으로 정확히 평가할 수 있다는 장점이 있습니다. 바로 이런 이유로 최근 가장 많은 관심을 받고 있고, 앞으로의 발전 가능성도 무척 높습니다.
만약 누군가가 여러분에게 디퓨전 모델이 뭐냐고 묻는다면 이렇게 말해줄 수 있습니다.
“디퓨전 모델은 깨끗한 이미지를 조금씩 흐리게 만들어 완전히 흐릿하게 바꾸고, 다시 깨끗하게 만드는 방법을 배우는 거예요. 이 과정을 충분히 배우고 나면 나중에는 아무 의미도 없는 노이즈에서 진짜 같은 사진을 천천히 되살릴 수 있죠. 한 번에 만드는 게 아니라 아주 조금씩 수백 번에 걸쳐 만들기 때문에, 결과물도 훨씬 더 정교하고 자연스럽답니다.”
데이터 안에 숨겨진 구조를 배우는 여정
7장에서는 복잡한 데이터를 간단한 구조로 표현하고, 그 구조를 바탕으로 새로운 데이터를 만들어내기 위한 다양한 인공지능의 시도들을 차례대로 살펴보았습니다. 이 여정은 오토인코더(Autoencoder)라는 모델에서 시작되었습니다. 오토인코더는 마치 긴 이야기를 몇 문장으로 요약하고, 그 요약만을 보고 다시 전체 내용을 기억해내는 것과 비슷한 방법을 사용했습니다. 이 과정에서 오토인코더는 데이터 속에 숨겨져 있는 공통적인 특징, 즉 우리가 매니폴드(manifold)라고 부르는 저차원 공간의 구조를 배우려 했습니다.
오토인코더가 이 매니폴드를 처음으로 그려보려는 모델이었다면, 변분 오토인코더(Variational Autoencoder, VAE)는 이 아이디어를 조금 더 발전시켰습니다. 변분 오토인코더는 데이터를 단순히 한 점으로 표현하지 않고, 그 주변에 비슷한 데이터가 어디쯤 있을지를 확률적으로 예측하는 방법을 도입했습니다. 덕분에 단순히 데이터를 복원하는 것에 그치지 않고, 아직 한 번도 본 적 없는 새로운 데이터까지도 자연스럽게 만들어낼 수 있게 되었습니다.
생성적 적대 신경망(Generative Adversarial Network, GAN)은 여기에서 경쟁이라는 아주 독특한 아이디어를 활용했습니다. 두 개의 인공지능 모델이 서로 경쟁하면서 더 진짜 같은 데이터를 만들어내려고 노력하는 과정이었죠. 이 방법은 굉장히 현실적인 데이터를 만들어낼 수 있었지만, 동시에 학습이 불안정하거나, 데이터가 다양하지 않고 비슷한 결과만 반복적으로 나오는 어려움도 함께 가지고 있었습니다.
이러한 문제를 극복하고자 등장한 것이 정규화 흐름 모델(Normalizing Flow)이었습니다. 정규화 흐름 모델은 처음부터 데이터의 확률을 정확히 계산할 수 있도록 고안되었습니다. 처음엔 간단한 분포로 시작해 조금씩 형태를 바꾸면서 복잡한 데이터 분포를 만들어냈고, 이 과정을 정확히 기록해서 나중에 확률을 정확히 계산할 수 있도록 했습니다. 그러나 이 방식은 한 번에 복잡한 변형을 시도했기 때문에 계산이 매우 어렵고 복잡해지는 단점이 있었습니다.
바로 이 한계를 다시 보완한 것이 최근 크게 주목받고 있는 디퓨전 모델(Diffusion Model)입니다. 디퓨전 모델은 정규화 흐름 모델과 달리 한 번에 모든 것을 바꾸지 않고, 아주 천천히 여러 단계에 걸쳐 데이터를 흐릿하게 했다가 다시 깨끗하게 만드는 방법을 사용합니다. 마치 연필로 스케치를 하고 지우고 다시 그리면서 점점 완성된 그림을 만드는 것처럼 말입니다. 이런 방식 덕분에 디퓨전 모델은 매우 안정적이고 정교하게 데이터를 만들어낼 수 있었고, 실제로도 최근의 다양한 이미지 생성 기술에서 핵심적인 역할을 하고 있습니다.
이렇게 살펴본 다양한 인공지능 모델들은 모두 조금씩 다른 방법으로 데이터를 이해하고, 그 안의 구조를 찾아내고, 그것을 바탕으로 새롭게 상상하는 과정을 거쳐왔습니다. 어떤 모델은 데이터가 가진 확률을 직접 계산해서 정확성을 높이려고 했고, 어떤 모델은 빠르고 현실적인 결과물을 만들려고 했으며, 또 어떤 모델은 창의적이고 다양한 데이터를 만들어내는 데에 집중했습니다. 이렇게 각 모델들은 서로 다른 강점과 한계를 가지고 있지만, 모든 모델들이 가진 공통적인 목표는 하나입니다.
그 목표는 바로 복잡하게 얽혀 있는 데이터 속에서 가장 중요한 본질을 발견하고, 그 본질을 바탕으로 새로운 것을 만들어내는 능력을 키우는 것입니다.
앞으로 인공지능은 우리가 지금 생각하는 것보다 훨씬 더 다양한 데이터들을 다루게 될 것입니다. 지금은 주로 사진이나 영상, 글과 소리를 만들어내는 정도이지만, 미래에는 사람의 감정, 상황, 말로 표현하기 어려운 분위기 같은 더 복잡한 정보도 자유롭게 이해하고 만들어낼 수 있게 될 것입니다. 이런 미래를 생각하면, 이 장에서 배운 다양한 생성 모델들은 앞으로 인공지능이 더 창의적으로 발전할 수 있도록 도와주는 중요한 출발점이라고 할 수 있습니다.
어쩌면 여러분이 앞으로 만날 인공지능 기술의 대부분은 이렇게 데이터를 조금씩 이해하고, 표현하고, 새로운 것을 상상하는 기술에서 출발할지도 모릅니다. 이처럼 인공지능이 데이터 안의 숨겨진 구조를 찾고 표현하는 방법을 배우는 것은, 앞으로 우리와 함께할 더욱 창의적이고 놀라운 미래를 준비하는 첫 걸음입니다.
[저작권자ⓒ META-X. 무단전재-재배포 금지]