Programming, IT, Algorithm, Security

먼저, 이 글을 읽기 전에 Dreambooth에 대한 글을 읽는것을 추천함.

 

드림부스에서 모델이 Context를 이해하는 원리

이전 글에서 설명했듯이 dreambooth는 몇장의 이미지로 학습한 subject를 새로운 context에 맞게 이미지를 생성할 수 있었다. 쉽게 말하면, superwoman girl을 학습시켰을때 superwoman이 학습 데이터셋에 없는 여러 자세를 취하게 하거나 다른 장소에 있는 이미지를 생성할 수 있는것을 말한다.

 

이게 가능한 이유는 무엇일까? 바로, 이미 모델에 girl 이라는 상위 개념이 학습되어있고 모델이 superwoman이 girl에서 어떤 다른 특징을 가지는지 학습했기 때문이다. 그래서 girl이라는 상위 개념이 표현할 수 있는 여러 context를 표현할 수 있게 된것이다.

 

나는 바로 이 점을 이용하여 기존 모델에 없는 개념을 파인튜닝하고, 드림부스처럼 새로운 context를 기존 모델의 지식을 이용하여 새로운 이미지를 생성하는 방법을 알아냈다.

 

텍스트 캡션의 중요성

그런데 위에서 설명한 내용에서 중요한 부분이 빠져있다. 위 설명에서 superwoman girl이라는 텍스트와 함께 superwoman에 대한 여러 이미지를 학습시켰을 때, superwoman이 girl의 한 종류라는 것을 모델이 이해했다고 했다. 그런데 어떻게 이것이 가능한걸까?

당연히 아무 정보 없이 단순히 캐릭터 명(어떤 토큰)이 들어가면 girl이 캐릭터의 상위 개념이라는것을 이해할 수가 없다. 이게 가능한 이유는 기존 모델이 이런 패턴에 대하여 학습되어 있기 때문이다.  girl에 해당하는 캐릭터의 이미지가 주어지고, 텍스트 조건으로 캐릭터 명과 girl이 같이 들어올 경우에는 이미지가 girl에 속하는 superwoman이라는 것을 Text Encoder와 U-net이 기존의 수 많은 이미지와 캡션 데이터셋을 학습하면서 알게된 것이다.

따라서 우리는 이것을 모델에서 이해시키려면 어떤것이 상위 개념이고 하위 개념인지를 알 수 있게 해줘야 드림부스처럼 새로운 context에 맞게 생성할 수 있게 된다. 하지만 우리는 적은 이미지수로 학습하고 짧은 캡션으로만 학습해야 한다는 것이 문제이다.

방법

내가 생각한 방법은 학습할 때의 토큰에 규칙성을 넣는 것이다. 예를 들어 설명해 보겠다. 스마트폰을 사용하고 있는 그림을 학습한다고 가정하면 보통 "using a smartphone"을 토큰으로 파인튜닝을 할 것이다. 그런데 이렇게 학습하면 "using a smartphone S22 ultra로 프롬프트를 입력하면 모델은 'S22 ultra' 에 대한 지식이 있어도 S22 ultra를 사용한다는 것을 제대로 표현하지 못한다.

 

그래서 나는 "using a smartphone S22ultra", "using a smartphone Zflip3","using a smartphone iphone14max" 이렇게 마지막 단어에 스마트폰의 기종이 오도록 하여 학습하는 방법으로 사진을 분류하여 학습시키는 방법을 시도했다. 이러면 기존에 학습되어있는 스마트폰의 지식을 기반으로 "using a smartphone S3","using a smartphone iphone3GS" 등의 새로운 context에 대한 이미지를 출력할 수 있게 된다.

결론

이 방법을 통해 기존에 학습되어 있지 않았던 완전히 새로운 개념도 Context에 맞게 출력할 수 있게 되었고 모델을 드림부스처럼 적은 이미지수와 짧은 캡션으로도 context를 이해시켜 학습 할 수 있게 되었다.

 

profile

Programming, IT, Algorithm, Security

@PITAS

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