Generative Modeling by Estimating Gradients of the Data Distribution

Generative Modeling by Estimating Gradients of the Data Distribution 양송 블로그 리뷰
김호진's avatar
Jul 24, 2024
Generative Modeling by Estimating Gradients of the Data Distribution
읽은 이유
flow-matching method를 이해해야겠다는 생각을 했다.
도저히 바로 이해할 엄두가 안나서, 앞서 이해해야하는 것들을 정리해보고 차례차례 언젠간 이해할 수 있게 나아가기
AE - VAE - GAN - Score-based - SDE - Diffusion - Flow-based model(normalizing flow) - consistency model → Flow matching model
저기 있는 것들만 봐도 될까?
우선 Score-based matching method
 
요약
probability density가 아니라 score(PDF의 gradient)를 모델링해서 sampling이 가능하도록하자라는 개념에서 출발한 뒤, 랜덤 initial sample을 잡고 gradient를 따라 흐르도록 해서 원본 data 분포에 해당하는 값으로 만들어내자라는 개념이었다.
근데 initial sample은 순수 노이즈 그 자체일 확률이 높은데 학습 데이터 만으로는 노이즈의 score를 예측하지 않기 때문에 조금씩 noise를 더해서 더 넓은 범위의 gradient도 계산하도록 하겠다는 접근이었는데, 결국 DDPM과 같은 영상이 나왔다. 다른 방식의 접근이었지만 결국 같은 원리로 최적화되는, 매우 신기한 경험(DDPM보다 본 논문이 먼저 작성되었다.)
처음에 Diffusion을 공부할 때, t-1에서 t로 가기위해 더해지는 noise를 예측한다는 접근과 식 전개가 직관적으로 이해하기 매우 어려웠다. 근데 여기선 이런식의 gradient의 개념으로 이해하니 훨씬 이해가 쉬웠다. 근본적으로 generation model을 이해하는데 매우 큰 도움이 되는 포스트였다.
 
시각적으로만 비슷한지 실제 mechanism도 같은지는 포스트 아래 두번째 topic의 SDE에서 설명할 것 같은데 이걸 봐야 알 수 있다.
 
score-based paper를 보는게 더 자세하긴 하겠지만, 더 좋은 직관으로 적힌 양송블로그를 보았다. SDE는 나중에
 
해당 포스트에서는 score function을 a large number of noise-perturbed data distribution 위에서 학습해서, 새로운 generative modeling을 제시한다.(score-based modeling)
이것자체도 중요하긴한데, 그것과 별개로라도 포스트 안에 전체적인 generative modeling을 이해하는데 도움이 되는 기초적인 설명들이 많아서 각 문장들안에 사소하게 담긴 직관들까지 이해하고자 했다. + 그 뒤의 SDE까지
본문 내용이 아닌 사족이 많습니다. 회색으로 표시
 
시작
현재(2021.05 기준)의 생성 모델은 크게 2가지로 나뉜다.
  1. likelihood-based 모델
    1. maximum likelihood를 통해서 실제의 probability density function을 직접적으로 모델링한다. ex) AR, normalizing flow, energy-based model(이건 모르겠다), VAE
      1. 학습 데이터를 통해 실제 데이터 분포 자체를 근사하고자 하는 의도를 가지고 새로운 분포를 학습시키려고 한다는 뜻(MLE를 통해).
  1. Implicit generative model : GAN
    1. 확률 분포를 implicit하게 배운다. 분포를 직접 모델링하는 어려움을 피한다. GAN의 학습과정 어디에도 likelihood를 사용하지 않는다.
      실제 확률 분포에 근사하도록 새로운 분포를 가정하거나, loss를 의도적으로 주지 않는다. 대신 모델이 내부적으로 그 분포에 대한 정보를 가지고 sampling 할 수 있도록 학습된다.
      확률 분포에 대한 추정이 학습과정에서 드러나지 않기 때문에 알지 못한다.
      이후 모델들에서 수학적인 접근으로 전개를 통해 정보의 손실없이 이론적으로 점점 좋은 모델링을 제시하지만.. 결국 전개에 inductive bias가 들어가는 만큼 사실 딥러닝의 근본에 가장 가깝고, 잘할 수 있는 방식은 GAN과 같이 모델이 알아서 배우도록 하는거 아닌가라는 생각이 있다. 지금은 여러가지 제약으로 인해 GAN이 문제가 많지만
       
      notion image
 
두 방법 모두 큰 제약이 있다.
  1. likelihood-based model은 모델 아키텍처에 강한 제약이 있다.
    1. likelihood 계산을 위해 normalizing constant(정규화 상수)를 trackable하게 가지고 있어야 하기 때문에. + maximum likelihood를 위해 어쨌든 대체재인 objective를 사용해야 한다.
    2. NF의 가장 큰 장점은 확률분포를 tractable하게 추정하므로 확률분포에 대한 log-likelihood를 직접 최적화할 수 있다는 점.
    3. 하지만 tractabe을 보장하기 위해서 invertible해야한다.
  1. GAN은 불안정하고 mode collapse의 위험이 있다.
 
본 포스트에서는 이런 제약사항들을 우회하여 확률 분포를 표현하는 방법을 소개한다.
핵심 아이디어는 log probability density function의 gradient를 모델링하는 것이다. LPDF = 값을 넣었을 때 그 값의 확률을 출력으로 뱉는 함수 = 이 함수를 score function이라고 한다. 그럼 그 score function의 data poinst에서의 gradient는 어디로 가야 확률이 증가하는지(ex. 정규분포의 mean)를 알려준다.
이걸 score-based model이라고 하고, 이건 tractable한 정규화 상수를 가질 필요 없고 score matching을 통해서 직접적으로 학습된다. 뒤에서 자세히 설명한다.
 
notion image
더군다나 score function은 normalizing flow 모델과도 연결되어 있다.
 
이 맥락에서, score라는 단어가 의미하는건?
💡
Score
어떤 Probability density가 있다고 했을 때 이 위의 한 data의 확률의 log값에 대한 gradient.
이게 왜 중요한데?
 
우리가 알지 못하는, underlying data distribution p(x)에서 독립적으로 얻어진 N개의 데이터 x = {x1, x2, …, xn}가 있다.
생성 모델의 목적은 어떤 모델(distribution)을 data distribution에 적합시켜서, 그 distribution에서 sampling한 것이 새로운 데이터(= 생성)가 되도록 하는 것이다.
likelihood-base에서 generative model의 학습과 생성이라는건 어떤 분포를 가정한 뒤 학습 데이터를 통해서 이 분포(모델)가 실제 data distribution에 근사하도록 하는 것이라는 개념을 인지해야한다. 생성은 그냥 그 분포 위에서 sampling하는 것! 쉽게 설명하는 영상
그러기 위해서 먼저 확률 분포를 나타내는 방법을 알아야 한다.
likelihood-based model에서는 직접 probability density function(PDF)을 모델링한다 (근사된 버전으로 얻어내고자 한다).
notion image
Z는 확률 함수를 적분 또는 합산 했을 때 1이 되도록 해주는 정규화 상수이고 에 따라서 결정된다. 확률 분포라는 조건을 위해 꼭 필요한 값이다!
여기서 f는 보통 unnormalized 확률 모델(확률을 나타내긴 하지만 nomalize 조건 없이 존재하는 값이기 때문에), 혹은 energy-based 모델이라 부른다.
 
우리는 데이터의 log-likelihood를 최대화하는 방식(MLE)으로 를 학습할 수 있다. theta가 있으니 실제 데이터 분포가 아니라, 모델링하는 분포
notion image
하지만, 이 식에서 p는 normalized pdf여야 한다. 그래서 를 모델링하기 위해서는, 도 같이 모델링되어야 한다.
근데 여기서, Z는 intracktable하기 때문에 이게 식에 들어가면 MLE가 어려워진다. 그래서 MLE를 적용하기 위해 Z를 tractable하게 만들거나 근사하려면, 모델 아키텍처를 제한해야한다.
이후의 방법이 제시되어야만하는 이유이기 때문에 중요하다. 가장 직관적으로는 학습 데이터를 통해서 어떤 데이터가 얼마나 가능성 있는지를 예측하는건 그래도 어느정도 할 수 있다고 치자(). 여기서
notion image
Z는 이렇게 정의된다. 그럼 가능한 모든 데이터에 대한 저 값을 계산해야 정확히 알아낼 수 있다는건데, dimension이 매우 크거나 연속적인 경우에는 모든 데이터를 고려하는게 불가능하고, 계산또한 복잡한 적분이기 때문에 정확한 Z를 계산하는건 어렵거나 불가능하다.
 
하지만 우리의 목적 자체를 density function 대신에 score funtion을 모델링하는걸로 바꾸면 intractable normalizing constants의 어려움을 피해갈 수 있다.
 
  • Score function of 분포 p(x)
  • Score-based model : score function이 되도록 근사하는 모델
    •  
      이건 전개하면
      notion image
      이렇게 가 미분하는 x와 무관하게 계산되기 때문에 0이 되어 사라져서, 직접 모델링하는 score-based model은 그럼 정규화 상수에 대한 걱정 없이 모델링할 수 있다!
      이게 결국 가장 중요한 전개식이다.
      notion image
      왼쪽처럼 PDF를 모델링하려면 아래 합이 1이 되어야한다는 조건이 붙는데 오른쪽의 score function은 그런 조건이 없다.
 
likelihood-based model 처럼, score-based model을 두 분포(정답과 parameterized 모델)간 Fisher divergence 최소화를 통해서 학습할 수 있다.
Fisher divergence는 확률 분포에 대한 두 분포에 log를 취한 후 gradient를 계산한 기댓값을 의미한다. 그 확률 분포의 data point에서의 모든 gradient가 같으면 두 분포는 같다고 볼 수 있겠자?
notion image
근데 정답()을 몰라서 여전히 직접 계산해서 최적화할 수가 없다.
 
다행히 score matching이라고 불리는 방법이 있다. 위의 식을 전개하고, 부분 적분을 사용해서 좀 더 쉬운 형태로 바꾼다.
전개식을 가져왔는데 대신 를 사용해서 헷갈릴 수 있음
notion image
기댓값을 적분식으로 바꿔서 전개했는데 3번째 줄의 첫번째 항은 theta와 무관한 상수값으로 처리해서 생략한다.
세번째 항에 부분적분을 적용하면 이렇게 된다.
notion image
 
 
스코어 매칭식. 전개 결과는 여기 뒤에 상수가 붙는데 생략
스코어 매칭식. 전개 결과는 여기 뒤에 상수가 붙는데 생략
이렇게 바꾸면 우리가 추정하는 score function만 사용해서 p(x)를 계산식에서 제거할 수 있다. 이 score matching objective를 최소화함으로써 score-based model을 학습할 수 있다.
 
스코어 매칭을 쓰면 s(x)의 구조에 대해서 추가적인 가정과 제약이 필요하지 않는다. input과 output의 dimension이 같은 vector-valued function이기만 하면 된다.
 

Langevin dynamics

생각해보자! 위에서 우리가 얻은 score function 는 실제 Probability density 값이 아니라, 각 위치에서의 gradient다. 다시말해 각 위치에서의 score function 값들을 그리게되면 벡터장 vector field를 나타낸다.
 
결국 데이터를 얻기 위해서는 단순 sampling 이외의 방식이 필요하다는 뜻인데 여기서는 랑주뱅 다이나믹스를 사용한다.
오직 score function만 사용해서 실제 데이터 분포 p(x)에서 sampling하는 것과 같은 결과를 얻는 것이 목적.
 
아주 직관적인 방법이다. 아무 데이터나 랜덤하게 찍은 다음 이 데이터에서의 분포의 gradient값에 따라 데이터를 조금씩 K번 움직인다.
notion image
그럼 gradient descent하는 것과 같이(반대로 올라가지만) 점점 확률 분포 상에서 확률이 높은 지역으로 랜덤한 위치에서 얻은 데이터가 이동한다. 이 0에 가깝고 K가 무한에 가까워질수록 정확함.
 
2차원 데이터분포를 예시로 잡고, 데이터가 움직이는 영상을 시각화하면 아래와 같다. 여기서 화살표가 score를 의미
 
notion image
 

pifalls

위에서 얘기한 score-based model은 현실적으로 limit이 있다.
랜덤한 data를 sampling하여 랑주뱅을 시작하는데, 학습 데이터가 위치하지 않은 곳에서의 score는 학습 과정에서 최적화되지 않기 때문에 알 수 없어서 처음의 iteration을 제대로 할 수가 없다는 것.
notion image
notion image
데이터가 빽빽한 지역에서만 잘하게 된다. 2차원이어서 이정도지 실제로 높은 차원의 데이터들에서는 이 sparse함이 훨씬 심하다. 따라서 initial sample은 low density에 있을 확률이 매우 높다!
 
→ 해결책
Score-based generative modeling with multiple noise perturbations (NCSN)
각 데이터들을 noise로 perturb하고 이 노이지 데이터 포인트들로 score-based model을 학습한다.(데이터에 랜덤한 노이즈를 더해서, 학습 데이터가 더 넓은 범위에 위치하도록 하는 것.)
notion image
더 큰 노이즈를 적용한 뒤 학습하면 더 많은 low density region을 커버할 수 있다. 근데 분포의 모양 자체를 많이 바꿔버릴 수도 있다.
그럼 필요한 질문 : 노이즈를 얼마나 넣을지 어떻게 정해?
 
이걸 위해서 노이즈를 한번에 multiple scale로 사용한다. 항상 데이터에 가우시안 노이즈를 균등하게 준다고 가정하자. 이에 따라 data의 표준편차는 점점 증가하게 된다.
 
우선 data distribution p(x)에 가우시안 노이즈(𝑁(0,𝜎𝑖2𝐼), 𝑖=1,2,⋯,𝐿)를 더해서 noise-pertubed distribution을 얻는다.
notion image
학습을 위해서 에서 샘플링한 결과가 필요한데 이건 우선 x ~ p(x)로 샘플링(학습 데이터셋에서 아무 데이터 하나 선택한다는 뜻)한 다음 , z ~ N(0,I)로 쉽게 얻을 수 있다.
 
그 다음, 우리는 각 노이즈가 추가된 분포로부터 score function을 측정할 수 있다. by training a Noise Conditional Score-Based Model (NCSN) with score matching.
 
~ for all i = 1, 2, …, L.
notion image
 
notion image
최종 loss는 각 scale noise의 weighted sum이다.
 
우리의 noise-conditional score-based model 를 학습한 이후에, 우리는 랑주뱅 다이나믹스 for i = L, L-1, …, 1을 순차적으로 실행해서 샘플링을 할 수 있다.
이걸 annealed Langevin dynamics라고 부른다. nosie scale 가 시간에 따라 순차적으로 감소한다.
 
그럼 뭐냐? 완전 심한 노이즈 → 덜 노이즈 → 더 덜 노이즈 → 원본(여기서 떠오르는 것은?)
 
기존의 랑주뱅을 적용한다고 생각해보자
처음 랜덤하게 샘플링한 데이터는 완전한 노이즈일 확률이 높다.(가우시안 분포에서 샘플링했다면 Gaussian noise) 여기서 likelihood가 높은 데이터로 어떻게 가는데? 알지못한다. 그러니까 심한 노이즈 단계(L)까지 마중가서 데리고오자는 개념(annealed 랑주뱅)!
 
 
위의 영상과 강아지 이미지를 보면 딱봐도 Diffusion process가 떠오른다.
probability density가 아니라 score(PDF의 gradient)를 모델링해서 sampling이 가능하도록하자라는 개념에서 출발한 뒤, 랜덤 initial sample을 잡고 gradient를 따라 흐르도록 해서 원본 data 분포에 해당하는 값으로 만들어내자라는 개념이었다.
근데 initial sample은 순수 노이즈 그 자체일 확률이 높은데 학습 데이터 만으로는 노이즈의 score를 예측하지 않기 때문에 조금씩 noise를 더해서 더 넓은 범위의 gradient도 계산하도록 하겠다는 접근이었는데, 결국 DDPM과 같은 영상이 나왔다. 다른 방식의 접근이었지만 결국 같은 원리로 최적화되는, 매우 신기한 경험(DDPM보다 본 논문이 먼저 작성되었다.)
처음에 Diffusion을 공부할 때, t-1에서 t로 가기위해 더해지는 noise를 예측한다는 접근과 식 전개가 직관적으로 이해하기 쉽진 않았다.
근데 여기선 이런식의 gradient의 개념으로 이해하니 훨씬 이해가 쉬웠다. 근본적으로 generation model을 이해하는데 매우 큰 도움이 되는 포스트였다.
 
시각적으로만 비슷한지 실제 mechanism도 같은지는 포스트 아래 두번째 topic의 SDE에서 설명할 것 같은데 이걸 봐야 알 수 있다.
 
 
 
 
 
 
 
 
 
 
Share article
Subscribe to our newsletter
RSSPowered by inblog