조금 유행이 지난 연구이긴 하지만 마침 DPO를 깊게 공부하기도 했고, DPO를 사용해서 personalize한 데이터 생성을 위한 방법을 제시한 Direct Consistency Optimization,줄여서 DCO 페이퍼 아이디어가 되게 재밌어서, 재구현해보고 이것저것 추가 실험들을 진행해보았다.
DPO라는게, 원래 LLM에서 많이 연구되었던 걸로, 인간이 선호하는 데이터셋을 내뱉게 finetuning시켜줄 수 있게 만들어진 loss function이다. RLHF에서 reward model을 implicit하게 식에 잘 합쳐서 (global한 optimal solution을 잘 찾아서 식이 착착 정리되는데 이건 DPO 논문 리뷰에 자세히 나와있다) 한번에 finetuning 시킬 수 있게한 식이 DPO loss function이다.
직관적으로 A랑 B중에 A를 잘 내뱉고, B를 아웃풋하지 않도록 아주 섬세하게 조정하는 loss function이라고 생각하면 쉽다.
그래서 이걸 어떻게 적용하냐면, DCO 논문에서는 L dco라고, personalization에 맞춘 새로운 loss function, (DPO 식에서 뒷부분을 뗴버린 식이긴 하지만) 을 제시한다. LoRA finetuning 방법이 사용되었다. 논문 따라서 그대로 재구현해봤는데
seohyun8825/Reimplementaion-of-DCO: this is unofficial reimplementation of DCO
GitHub - seohyun8825/Reimplementaion-of-DCO: this is unofficial reimplementation of DCO
this is unofficial reimplementation of DCO. Contribute to seohyun8825/Reimplementaion-of-DCO development by creating an account on GitHub.
github.com
코드는 여기 정리되어있다.
실험은 해피로! DCO loss가 그냥 일반적인 MSE로 하는거랑 크게 차이가 있을까해서 두가지 다 해봤는데, 확실히 차이가 있었다.
근데 사실 DCO loss를 읽으면서 계속 들었던 의문점이, DCO loss function이 DPO loss function에서 뒷부분을 아예 뗴버리고 앞부분만으로 optim ize를 시키는데, 이게 과연 맞는접근일까? 생각이 들었다. 왜냐하면 DPO loss식에서 가장 중요한 아이디어가, loosing에 비해 winning이 더 잘나와야한다는 아이디어인데, DCO loss대로 라면 loosing term을 아예 제외시켜버린다. 그럼 이게 DPO loss라고 할수 있을지..
실제로 여러 프롬프트로 실험한 결과 다음과 같은 한계가 있었다
Epoch을 엄청 돌리면 loss가 계속 줄긴 한다. 근데 결과는 점점 이상해진다.
어떻게 이상해지냐면, 해피 자체는 잘 반영하지만, 프롬프트를 너무 안따른다.
특히 stabel diffusion이라면 화려한 색감에 다양성에 high quality generation을 생각할텐데, 내 데이터셋 5개로 finetuning을 시키면, 색감과 전체적인 퀄리티가 내 데이터셋을 따라간다.
색감, 배경, 뿐만아니라 강아지의 자세도 원래 내 데이터셋에 있는 강아지의 자세를 따라간다.
이게 왜 그런거 같냐면, DCO loss에서는 무작정 내 데이터셋이 output 되도록 finetuning이 되기에 그런것 같다. 그러면 원래 DPO loss처럼 loosing이랑 winning의 term을 명확하게 설정을하면 더 좋아지지 않을까?
그래서 했던 실험이 winning으로는 내 personalize 데이터를, loosing으로는 맨처음 stable diffusion에서 나온 데이터의 아웃풋으로 설정해두고 DPO 식을 사용했다.
근데 무작정 원래 초기의 stable diffusion의 아웃풋을 loosing으로 두고, 내 personalize 데이터를 winning으로 두니까, 초기의 아웃풋은 생성하지 않고, 내 personalize 데이터를 생성하도록 training이 되어서, 아까 나타났던 문제가 더 심해졌다.
아예 배경이랑 포즈가 내 personalize 데이터를 그대로 따라간다.
여기서 loosing이랑 winning을 뭘로 두면 제일 좋을지 고민해보았다. 왜냐하면 personalize 데이터가 해피를 잘 생성한다는 측면에서는 확실히 winning이 맞는데, 프롬프트를 잘 따르냐? 라는 기준에서는 loosing 데이터가 될수 있기 때문이다.