디퓨전 모델을 통해 추가적인 학습 없이 zero shot classification 을 수행할 수 있는 Diffusion Classifier 라는 방법을 제안한 논문이다.
Generative Model vs Discriminative Model
우선 discriminative 모델이랑, generative 모델의 차이부터 알아야하는데,
Discriminative 모델은 직접적으로 P(y|x)를 예측한다. 즉 데이터들이 주어지면, 이걸 나누는 decision boundary를 학습한다.
반면 Generative model은 P(x|y)를 예측, 즉 데이터 분포 자체를 배운다.
그래서 이 논문의 아이디어는, 생성모델이 단순히 데이터를 생성하는것에 그치지 않고 classify 작업에도 활용될 수 있다는 것. 사실 이게 의미가 있을까 싶기도 하지만,, 그냥 classify 하는게 더 간단할텐데?
근데 디퓨전 학습 과정에서 복잡한 데이터분포를 잘 학습하기에, 정확도가 더 올라간다고 한다.
Clasification with diffusion models?
일단 베이즈에서 시작, 근데 p(ci)가 계산하기 어려우니까 이걸 uniform 하다고 가정하면, 식에서 저렇게 없애줄 수 있다.
그리고 디퓨전에서 p(x|c)는 intractable 하기에 ELBO를 사용해서 replace 해주면
이런 식이 나온다
이 식을 직관적으로 해석해보자면, 딱 맞는 class가 같이 들어가면 노이즈 prediction의 에러가 작아지겠고,
맞지 않는 class가 들어가면 에러가 커질것이다.
여기서
이부분은 다음과 같은 식으로 계산되어 들어간다
그러면 바로 method 로 넘어가보자.
복잡해보이겠지만, 결국 입력이미지에 추가된 노이즈를 가장 잘 예측하는 조건 c를 선택하는 느낌.
This is 알고리즘
Test 이미지 x랑, 조건
T번의 시도를 수행하는데,
이떄, 1~1000 timestep중에서 t랑, 정규분포에서 e가 샘플링 되어서 xt(노이즈낀이미지)가 계산되고
조건c에 대해 예측된 노이즈랑 실제 노이즈 e 차이를 계산해서 리스트에 추가된다
그리고 평균 오류가 가장 작은 c가 반환된다
근데 여기서의 문제점이 이 노이즈를 정확하게 예측하려면 아주아주 많은 sample 이 필요할테고, monte carlo방식으로 하기에도 몇천개의 샘플 그 이상이 필요할텐데,,
그래서 여기서 발견했던 아이디어가, 컨디션마다 다 다른 e 를 샘플링하지말고 e는 고정시켜놓자 가 아이디어. 실제로 실험을 했을 떄 밑에 그래프에서도 볼수 있듯이
e의 값에 따라 예측 오류 자체는 크게 변할 수 있지만, 각 프롬프트 간의 오류차이는 일정하게 유지됨으로, 더 신뢰성있는 비교가 가능함.