이 두 이미지는 비슷한가? 라고 물어본다면 비슷하다고 할 수 있을 것이다. 둘 다 나히다 그림이니까.

이 두 이미지는 얼마나 비슷한가? 라고 물어본다면 약간은 다르다고 할 수 있을 것이다. 머리색이 살짝 다르고 구도도 조금 차이가 있다.

그렇다면 AI는 이 두 이미지가 얼마나 비슷한지 측정할 수 있을까?


옛날 옛적(이라고 해봤자 2015~16년 정도이다)에만 해도 두 이미지 간의 차이를 비교할 수 없어서, 각 픽셀값의 차이를 통해 유사도를 측정할려고 했다.

근데 그게 제대로 된 유사도일리가 있나ㅋㅋㅋ

이렇게 낙서를 칠해놔도, 낙서를 칠하지 않은 부분은 원본 이미지와 픽셀값이 완전히 같으므로 매우 유사한 이미지로 취급되는 문제가 있다.


아무튼 현대로 돌아와서, Variational AutoEncoder(VAE)가 바로 이런 문제에 대한 해결방안을 제시한다.

VAE는 인코더와 디코더로 이루어져 있는데, 인코더는 이미지를 매우 작은 정규분포 공간(latent space)로 이동시키는 역할, 디코더는 그 작은 공간으로부터 이미지를 복원시키는 역할이다. 어떠한 라벨링 없이 이미지를 계속 집어넣어서 VAE를 훈련시키면, 인코더는 이미지를 정확하게 정규분포 공간에 배정시키는 법을 배우게 되고, 디코더는 정규분포 공간의 정보를 바탕으로 이미지를 잘 복원시키는 법을 배우게 된다. 수식이 들어가면 내용이 너무 길어져서 생략함.

VAE의 정말 개쩌는 점은 바로 이 '정규분포 공간'에 있다. 왜냐하면 이 정규분포 공간이 잘 형성된다면, 배우지 않은 그림이 입력되어도 정규분포 공간 안에 배치함으로써 그 의미를 파악할 수 있기 때문이다.


VAE Latent Space Visualization (taylordenouden.com)

직접 체험해보는게 꿀잼이지

0~9 손글씨를 학습한 MNIST 데이터셋을 예로 들자면, 왼쪽 그림처럼 개뼉다구같은 손글씨가 들어와도, 저 그림을 정규분포 공간에 옮기면 다른 '3' 그림들과 비슷한 위치에 들어가기 때문에, 저 글씨가 3이라는 걸 알 수 있음.


다른 예시로는, VAE가 강아지와 여자아이 이미지만 학습했다고 치면, 각각의 이미지들에 해당하는 정규분포 공간의 점 사이의 값을 구해 복원시키면, 한번도 학습해본 적 없는 에드워드 오니짱이 나온다는 것이다.

서론이 개쓸데없이 길어졌는데 암튼 Stable Diffusion에 사용하는 모든 훈련들은 모두 이미지 간의 유사도를 비교하기 위해서, 이미지를 정규분포 공간(latent space) 안에 들어가도록 변환한 후 두 점 사이의 거리를 구하는 공식을 사용한다. 두 점 사이의 거리가 가까울수록 이미지 간 유사도가 높다는 것이다. 매우 심플!

드림아티스트 글 쓰다가 내가 잘못 알고 있던게 있어서 실험하는동안 일단 잠깐 끊음