Programming, IT, Algorithm, Security

문제 원인

Dreambooth를 통해 특정 캐릭터같은 Subject를 학습하면 Fidelity는 만족스러울 수 있으나, Dreambooth로 학습할때에는 보통 학습 데이터셋의 양의 원래 모델을 학습했던 데이터셋보다 터무니없이 적으므로 학습한 토큰을 이용하여 그림을 출력해보면 다른 요소들을 일일히 지정해 주지 않으면 Diversity가 떨어져 거의 비슷비슷한 이미지가 나오게 된다. 하지만 드림부스로 수 천장을 학습시킨다고 무조건 좋은 것도 아니다. 왜냐하면 수 천장의 데이터셋에서 이상치가 있을 가능성이 매우 높기 때문에 자신이 원하지 않는 그림도 학습시킬 수도 있으며, 또한 수 천장의 이미지에서 여러 공통 특징 중에서 내가 원하는 공통된 특징만을 한 단어에 압축시키는 것이 매우 어려워 Fidelity가 낮아진다. 그래서 네거티브 프롬프트를 자주 사용하곤 한다.

 

해결방안

그래서 나는 위 방법의 문제를 해결하기 위해서 새로운 방법을 생각했다.

먼저 수 천장의 데이터셋으로 학습시킨 후에, 수 천장의 데이터셋에서 엄선한 작은 데이터셋을 만들어 다시 파인튜닝하는 것이다.

나는 겔부루에서 특정 태그를 포함한 그림을 3000장 정도 가져와 먼저 학습시킨 뒤, 3000장 중에서 150장을 엄선하여 다시 학습시켰고, 실험 결과 작은 데이터셋으로만 학습시킨것에 비하여 Diversity가 눈에 띄게 증가했다.

 

결론

이 방법은 기존에 모델에 많이 학습된 사람같은 캐릭터 학습 같은 내용에는 그다지 쓸모가 없다. 왜냐하면 위에서 말했듯이 자세나 구도 등을 지시하는 등 그냥 일일히 프롬프트를 조금씩 바꿔주면 그만이기 때문이다. 하지만 기존 모델에 존재하지 않는 완전히 새로운 개념을 학습하면 프롬프트를 바꿔도 다양한 이미지를 출력할 수 없다. 예를 들어,"망가진 CPU"에 대해서 학습을 했는데 여기서 CPU에 대한 디테일들이 학습되어 있지 않는 이상 다양한 CPU이 출력되지 않는 것과 같다. 완전히 새로운 개념을 학습하고 Diversity는 어느정도 가지면서 Fideliy를 유지하고 싶다면 파인튜닝을 이용하는 것이 좋을 것 같다.

이 방법은 파인튜닝을 특정주제를 학습하는 것에 적용한 방법이다. 파인튜닝을 그냥 여러번 적용한 것과 같다.

 

나중에 알았지만 https://github.com/allenai/data-efficient-finetuning 이 링크에 나오는 DEFT라는 기법과 비슷하다 먼저 특정 주제의 큰 데이터셋으로 학습하고 그 중에서는 마지막에 라벨링 되지 않은 데이터로 파인튜닝하는 방식이다. 다른 점은 사람이 직접 정하지 우리는 nearest neighbor로 학습할 이미지를 정하는게 아니라는 것 정도이다.

다음 글은 nearest neighbor 처럼 비슷한 이미지끼리 클러스터링 하여 학습하는 글이 될 듯하다

profile

Programming, IT, Algorithm, Security

@PITAS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!