kimyongtae.com
홈 / 강의 / AI 이미지·애니메이션 생성, 원리부터 / 0단계. 최소 기초

0-1. 확률분포와 가우시안

이미지 생성은 "그럴듯한 이미지들의 분포에서 표본 하나를 뽑는 일"이다. 이 한 문장을 이해하면 이번 수업은 끝이다.

왜 확률부터 시작하나

컴퓨터에게 이미지 한 장은 숫자 묶음이다. 1024×1024 컬러 이미지면 숫자가 약 314만 개다.

숫자 두 개는 평면 위의 점 하나를 정한다. 같은 식으로 숫자 314만 개는 314만 차원 공간의 점 하나를 정한다. 즉 이미지 한 장은 아주 큰 공간 속의 점 하나다.

그 공간에서 아무 점이나 찍어 보자. 거의 전부 지지직거리는 잡음 화면이 나온다. 그림다운 그림은 공간의 극히 좁은 영역에만 몰려 있다. 이 "어디에 얼마나 몰려 있는가"를 데이터 분포라 하고 p(x)라고 쓴다.

생성은 이 분포에서 새 점을 하나 뽑는 일이다. 이것을 샘플링이라 한다. 문제는 p(x)를 식으로 쓸 수 없다는 것이다. 그래서 요즘 이미지·영상 생성 모델은 모두 같은 우회로를 쓴다.

뽑기 쉬운 분포(가우시안)에서 점을 하나 뽑는다. 그 점을 데이터 분포 쪽으로 옮기는 방법을 신경망에게 가르친다.

가우시안 N(μ, σ²)

가우시안은 종 모양 분포다. 키나 시험 점수를 떠올리면 된다. 가운데에 많이 몰리고 양쪽으로 갈수록 드물다. 숫자 두 개로 완전히 정해진다.

σ²은 분산이라고 부른다. 평균 0, 표준편차 1인 N(0, 1)이 표준 가우시안이다. 여기서 뽑은 값은 보통 ε(엡실론)이라고 쓴다. 이미지 생성에서 말하는 "노이즈"가 바로 이것이다. 픽셀마다 따로 뽑은 ε이다.

앞으로 계속 쓰는 세 가지 성질

1. 이동과 확대

ε ~ N(0, 1) 이면 μ + σ·ε ~ N(μ, σ²)

표준 노이즈에 σ를 곱하고 μ를 더하면 원하는 가우시안이 된다. 표준 노이즈 하나만 뽑을 수 있으면 어떤 가우시안이든 만들 수 있다는 뜻이다.

무작위성은 전부 ε에 몰아넣고 나머지는 평범한 계산으로 둔다. 이 방법을 재매개변수화라고 한다. 신경망 학습을 가능하게 하는 핵심 기법이다.

2. 더하면 분산이 더해진다

N(0, a²) + N(0, b²) = N(0, a² + b²) (서로 독립일 때)

더해지는 것은 표준편차가 아니라 분산이다. 헷갈리기 쉬우니 꼭 기억하자.

이 성질 덕분에 작은 노이즈를 1000번 나눠 넣은 결과와 큰 노이즈를 한 번에 넣은 결과가 같은 분포가 된다. 그래서 학습할 때 중간 과정을 건너뛰고 원하는 노이즈 단계를 곧바로 만들 수 있다.

3. 원본과 노이즈 섞기

x_t = (1 − t)·x₀ + t·ε

x₀는 원본, t는 노이즈 비율이다. t = 0이면 원본 그대로다. t = 1이면 순수 노이즈다.

원본 x₀가 정해져 있으면 x_t는 가우시안이다. 평균은 (1 − t)·x₀, 표준편차는 t다. 성질 1을 그대로 쓴 것이다.

이 식은 Flux, Wan 같은 최신 모델이 쓰는 형태다. 초기 확산 모델(DDPM)은 계수만 다르고 구조는 같다. 둘의 차이는 1단계에서 비교한다.

직접 해 보기

쉽게 보려고 1차원 세계를 가정한다. 가로축의 점 하나가 "이미지 한 장"이다. 세 봉우리는 그림다운 그림이 몰린 곳이다. 슬라이더로 노이즈 비율을 올려 보자.

0.00
원본 비중 (1 − t)
1.00
노이즈 비중 (t)
0.00
점들의 표준편차
-
점 4000개의 분포 (막대) 이론상 분포 (실선) 표준 가우시안 N(0, 1) (점선)
t = 0에서는 -2, 0.5, 2.2 근처의 세 봉우리. t = 1에서는 평균 0, 표준편차 1의 종 모양.

관찰할 것

데이터에서 노이즈로 가는 방향은 식 하나로 끝난다. 학습이 필요 없다. 노이즈에서 데이터로 점을 되돌리는 방법이 신경망이 배우는 대상이다. 그것이 바로 생성이다.

확인 문제

풀이를 보기 전에 먼저 답을 적어 보자.

  1. 서로 독립인 N(0, 3²)와 N(0, 4²)에서 하나씩 뽑아 더했다. 그 합의 표준편차는?
  2. N(0, 1)만 뽑아 주는 함수 randn()이 있다. N(10, 2²) 표본을 만드는 식은?
  3. x₀ = 2인 점에 t = 0.5로 노이즈를 섞었다. x_t는 어떤 분포를 따르나?

풀이

  1. 5다. 분산이 더해지므로 9 + 16 = 25이고, 표준편차는 그 제곱근이다. 3 + 4 = 7이 아니다.
  2. 10 + 2 * randn()이다. 성질 1 그대로다.
  3. N(1, 0.5²)이다. 평균은 (1 − 0.5)×2 = 1, 표준편차는 t = 0.5다.

질문과 답변

이 수업을 듣고 나온 질문과 그 답이다.

질문키나 시험이 뭔가요?

용어가 아니야. 사람의 키, 그리고 시험 점수를 예로 든 거야.

성인 남성 1000명의 키를 재면 173cm 근처가 가장 많아. 160cm나 186cm는 드물고, 150cm나 196cm는 거의 없어. 시험도 같아. 평균이 70점이면 70점 근처에 학생이 가장 많고, 30점이나 100점은 드물어.

이렇게 가운데에 가장 많이 몰리고, 멀어질수록 급격히 드물어지는 모양을 그래프로 그리면 종 모양이 돼. 그게 가우시안이야.

질문σ는 뭐라고 읽나요? 그리고 68%가 μ±σ 안에, 약 95%가 μ±2σ 안에 들어온다고 했는데, 68과 95는 무슨 뜬금없는 수치인가요?

σ는 시그마라고 읽어. μ는 뮤야.

68과 95는 내가 정한 숫자가 아니야. 종 모양 곡선 자체가 가진 성질이야. 곡선 아래의 넓이가 곧 "값이 그 구간에 들어올 비율"인데, 넓이를 계산하면 항상 같은 값이 나와.

구간그 안에 들어오는 비율
μ ± 1σ68.3%
μ ± 2σ95.4%
μ ± 3σ99.7%

μ와 σ가 얼마든 이 비율은 똑같아. 키(μ = 173cm, σ = 6cm)면 167~179cm 안에 68%가 있어. 시험 점수(μ = 70점, σ = 10점)면 60~80점 안에 68%가 있어.

그래서 σ는 가우시안의 자처럼 써. "평균에서 σ 몇 칸 떨어졌나"만 알면 그 값이 흔한지 드문지 바로 알 수 있어. 숫자를 외울 필요는 없어. "σ 한두 칸 안에 거의 다 들어온다"는 감각만 있으면 돼.

질문통계적으로 그렇다는 건가요? 아니면 어떤 식으로든 증명된 게 있는 건가요?

증명된 값이야. 조사해 보니 그렇더라는 경험칙이 아니야. 가우시안은 곡선의 식이 정해져 있어.

f(x) = 1 / (σ√(2π)) · exp( −(x − μ)² / (2σ²) )

이 곡선 아래에서 μ−σ부터 μ+σ까지의 넓이를 적분하면 0.6827…이 나와. 식에서 계산으로 나오는 값이라 소수점 아래 몇 자리든 구할 수 있어.

두 가지는 구분하자. "가우시안이면 68%가 ±σ 안에 든다"는 수학적 사실이야. "사람의 키가 가우시안을 따른다"는 관측이야. 실제 키는 가우시안에 가까울 뿐이야.

이미지 생성에서는 이 구분이 필요 없어. 노이즈는 관측한 값이 아니라 우리가 가우시안 식대로 직접 만들어 내는 값이거든. 그래서 68%, 95%가 정확히 성립해.

질문그러면 이 세상 만물은 평균치를 내면 대체로 가우시안 분포에 들어맞는 건가요?

"평균을 내면"이라는 조건이 붙으면 대체로 맞아. 만물 자체가 가우시안인 건 아니야.

주사위를 봐. 한 개를 던지면 1~6이 똑같은 확률로 나와. 종 모양이 아니라 평평해. 그런데 30개를 던져서 평균을 내면 3.5 근처에 몰린 종 모양이 돼. 독립적인 값을 여러 개 더하거나 평균 내면 가우시안에 가까워져. 이게 중심극한정리야. 이것도 증명된 사실이야.

키가 종 모양인 이유도 같아. 유전자 수백 개와 영양 같은 작은 요인이 조금씩 더해진 결과거든. 이 조건이 깨지면 다른 모양이 돼.

대상모양이유
키, 측정 오차가우시안에 가까움작은 요인이 많이 더해짐
소득, 재산오른쪽으로 긴 꼬리요인이 더해지지 않고 곱해짐
도시 인구, 지진 규모극단적으로 긴 꼬리소수가 압도적으로 큼
버스 기다리는 시간0에서 가장 높고 계속 감소종 모양이 아예 아님

이미지의 데이터 분포도 가우시안이 아니야. 여기저기 몰린 복잡한 모양이야. 가우시안을 쓰는 이유는 이미지가 가우시안이어서가 아니야. 출발점으로 쓰기 좋아서야. 뽑기 쉽고, 식으로 다루기 쉬워.

질문가우시안이 엄청 좋은 거네요. 간단하게 분포를 표현할 수 있으니까요. 요는 13cm에 표준편차 2cm면 68%가 그 안에 있다는 거네요. 15cm보다 길거나 11cm보다 짧으면 꽤 크거나 작다고 말할 수 있는 건가요?

맞아. 평균 13cm, 표준편차 2cm면 68%가 11~15cm 안에 있어. "꽤 크다"의 정도만 숫자로 보정하자.

구간평균에서그 바깥 비율(한쪽)어느 정도인가
15cm 이상 / 11cm 이하1σ16%. 6명 중 1명눈에 띄게 큰 편, 작은 편
17cm 이상 / 9cm 이하2σ2.3%. 약 40명 중 1명드묾
19cm 이상 / 7cm 이하3σ0.13%. 약 740명 중 1명거의 없음

68%가 안쪽이니까 바깥은 32%야. 위아래로 반씩 나누면 16%씩이야. 그래서 15cm 초과는 상위 16%야. 큰 편이긴 한데 드물다고 하기는 어려워. 드물다고 말할 수 있는 선은 2σ인 17cm부터야.

표준편차는 부호 없이 그냥 2cm라고 해. ±는 구간을 만들 때(13 ± 2) 붙여.

네 말대로 그게 가우시안의 장점이야. 숫자 두 개(μ, σ)만 알면 분포 전체를 알 수 있어.

질문노이즈가 섞인다는 의미가 뭔가요? 점점 가우시안 분포 쪽으로 이동해 오기만 하는데요. 각 점에 랜덤값을 더하는 게 노이즈가 아닌가요?

각 점에 랜덤값을 더하는 게 노이즈 맞아. 이동으로만 보이는 건, 랜덤값을 한 번만 뽑아서 고정해 두고 슬라이더로는 섞는 양만 바꾸기 때문이야.

식을 둘로 쪼개 봐. (1 − t)·x₀는 원본을 줄이는 부분이야. t·ε은 랜덤값을 더하는 부분이야. ε은 점마다 따로 뽑은 값이야. 같은 자리(x₀ = 2)에서 출발한 두 점이 서로 다른 ε을 받았다고 해 보자.

t = 0t = 0.5t = 1
점 A (ε = −0.7)20.65−0.7
점 B (ε = 1.3)21.651.3

출발은 같은데 도착지가 달라. 이 차이가 노이즈야. 각 점은 자기 원본에서 자기 랜덤값을 향해 직선으로 움직여. t는 그 길을 얼마나 갔는지야.

t = 1이면 점의 위치가 곧 ε이야. ε은 표준 가우시안에서 뽑았으니까 전체로 보면 가우시안 모양이 돼. 점 하나를 보면 자기 랜덤 목적지로 가는 거고, 전체를 보면 분포가 가우시안으로 바뀌는 거야. 같은 현상이야.

위 데모에서 [노이즈 다시 뽑기]를 t = 0.5쯤에서 눌러 봐. 점들이 한꺼번에 다른 자리로 튀어. ε을 새로 뽑았기 때문이야. t = 0에서는 눌러도 아무 변화가 없어. 노이즈 비중이 0이니까.

질문랜덤 목적지가 가우시안이 된다는 게 인위적이지 않나요? 예를 들면 −1~−3 범위 점들에 랜덤을 섞으면 더 넓은 범위로 퍼져야 할 텐데, 왜 −3보다 작아지는 점은 하나도 없나요?

인위적인 게 맞아. 노이즈를 섞는 과정은 자연 현상이 아니라 사람이 설계한 절차야. 도착지를 우리가 정확히 아는 분포로 만들어 두려고 일부러 그렇게 짰어. 그래야 나중에 거기서 출발해서 거꾸로 올 수 있거든.

−3보다 작아지는 점이 없는 이유는, 퍼지는 동시에 가운데로 끌려오기 때문이야. 네가 생각한 건 x₀ + 랜덤이야. 그렇게 하면 네 말대로 −5까지도 퍼져. 그런데 식은 랜덤을 더하면서 원본 위치에 (1 − t)를 곱해서 0 쪽으로 당겨. 왼쪽 봉우리(중심 −2)를 따라가 보자.

t무리의 중심퍼진 정도(σ)무리가 닿는 범위
0−2.00.30−2.9 ~ −1.1
0.3−1.40.37−2.5 ~ −0.3
0.5−1.00.52−2.6 ~ 0.6
0.7−0.60.71−2.7 ~ 1.5
101.00−3.0 ~ 3.0

무리는 분명히 넓어져. σ가 0.3에서 1로 커지니까. 다만 중심이 −2에서 0으로 옮겨 오기 때문에 왼쪽 끝은 −3 근처에 머물러.

x₀ + 랜덤 방식도 실제로 쓰여. 그 장면을 카메라로 찍으면서 화면이 넘치지 않게 계속 줌아웃한다고 생각해 봐. 퍼지는 노이즈는 화면에서 일정한 크기로 보이고, 원본 무리는 점점 작아지면서 가운데로 모여. (1 − t)·x₀ + t·ε은 그 줌아웃을 식 안에 넣은 거야.

줌아웃을 넣는 이유는 신경망 때문이야. 신경망은 입력 숫자의 크기가 일정할 때 잘 배워. 그래서 노이즈가 얼마나 섞였든 값이 대략 −3~3 안에 있도록 맞춰.

질문이제 알겠습니다. t값이 커질수록 원본 비중이 줄어들고 랜덤 비중이 커진다는 걸 표현한 식이네요. 비중이 없으면 랜덤을 더하더라도 랜덤에 범위가 있으니 사실 진짜 랜덤이 아니게 되고요. ε이 표준 가우시안에서 뽑은 임의의 값, 즉 랜덤인 건가요?

둘 다 맞아. t가 커질수록 원본 비중 (1 − t)가 줄고 랜덤 비중 t가 커져. 두 비중을 더하면 항상 1이야.

비중이 필요한 이유도 네 말대로야. 원본을 그대로 둔 채 랜덤을 더하기만 하면 원본의 흔적이 남아. −2 근처에서 출발한 점은 여전히 −2 근처에 있을 가능성이 높으니까. 원본 비중을 0까지 줄여야 원본과 완전히 무관한 순수 랜덤이 돼.

ε은 표준 가우시안 N(0, 1)에서 뽑은 랜덤값이 맞아. 점마다, 이미지에서는 픽셀마다 따로 하나씩 뽑아.

하나만 덧붙일게. 여기서 랜덤은 "아무 값이나 똑같은 확률로 나온다"는 뜻이 아니야. 종 모양을 따르는 랜덤이야. 0 근처 값이 가장 자주 나오고, −3~3을 벗어나는 값은 거의 안 나와. 주사위처럼 모든 값이 같은 확률인 랜덤과는 다른 종류야.

질문그렇죠. 가우시안 함수의 x값이 랜덤이고, ε은 해당 x 지점의 함수값인 거죠?

그건 반대야. ε은 함수값(높이)이 아니라 가로축 값(x)이야.

키 그래프로 생각해 봐. 가로축이 키, 세로축이 그 키인 사람 수야. 사람을 한 명 무작위로 뽑으면 나오는 건 그 사람의 키야. 173cm가 자주 뽑히는 이유는 그 자리의 막대가 높아서야. "사람 수"가 뽑혀 나오는 게 아니야.

숫자로도 확인돼. 표준 가우시안의 함수값은 항상 0과 0.4 사이의 양수야. 그런데 ε은 −0.7도 되고 1.3도 돼.

뽑는 과정은 다트로 떠올리면 쉬워. 종 모양 곡선 아래에 다트를 아무 데나 고르게 던져. 다트가 꽂힌 곳의 가로 위치를 읽어. 그게 ε이야. 곡선이 높은 가운데는 면적이 넓어서 다트가 많이 꽂혀. 곡선이 낮은 양 끝은 거의 안 꽂혀.

질문y값이 나올 확률이 되는 x값이 ε인 건가요?

맞아. ε은 x값이고, y는 그 x가 나올 가능성의 크기야.

ε (x값)y (높이)의미
00.40가장 자주 나옴
10.240 근처보다 덜 나옴
20.0540 근처의 약 1/7
30.0040 근처의 약 1/90

정확히 말하면 y는 확률 그 자체가 아니라 확률밀도야. y끼리 비교하면 어느 값이 더 자주 나오는지 알 수 있어. 실제 확률은 구간의 넓이로 구해. "ε이 −1과 1 사이일 확률 = 그 구간의 넓이 = 68%"처럼. 앞에서 본 68%, 95%가 전부 이 넓이였어.

질문그러면 랜덤한 ε 값을 구해 주는 함수들도 컴퓨터 언어의 수학 라이브러리에 준비돼 있겠네요?

거의 모든 언어에 있어.

언어함수비고
PyTorchtorch.randn(크기)이미지 생성 모델이 실제로 쓰는 함수
NumPyrng.standard_normal(크기)
Free Pascal, DelphiRandG(평균, 표준편차)Math 유닛
C++std::normal_distribution
JavaScript내장 없음직접 몇 줄로 만듦

randn은 random normal의 줄임말이야. 가우시안 분포를 정규분포(normal distribution)라고도 부르거든.

컴퓨터가 기본으로 만드는 랜덤은 0과 1 사이에서 고르게 나오는 값이야. 그 값 두 개 u, v를 식에 넣어서 가우시안 값으로 바꿔. 박스-뮬러 변환이라는 방법이야. 위 데모도 이 식으로 ε을 만들어.

ε = √(−2·ln u) · cos(2π·v)

컴퓨터의 랜덤은 시드라는 시작 숫자에서 계산으로 만들어 내는 수열이야. 시드가 같으면 나오는 ε도 매번 똑같아. 이미지 생성 도구의 시드가 바로 이거야. 생성은 노이즈에서 출발하는데, 시드가 그 노이즈를 정해. 그래서 시드와 설정이 같으면 같은 그림이 나오고, 시드만 바꾸면 다른 그림이 나와.

← 수업 목록 0-2 조건부 확률, 기대값, KL 발산 →