DARE: 두 도메인 지식을 효율적으로 결합하는 방법
Drops And REscales
현재 벤치마크 상위권 모델들은 대부분 여러 모델을 합쳐서 만든 모델입니다. 위 그림에서 1등인 모델을 자세히 보면 다음과 같은 모델을 DARE 방법으로 병합해서 만들었다고 나와있습니다.
- nbeerbower/llama-3-stella-8B
- Hastagaras/llama-3–8b-okay
- nbeerbower/llama-3-gutenberg-8B
- openchat/openchat-3.6–8b-20240522
- Kukedlc/NeuralLLaMa-3–8b-DT-v0.1
- cstr/llama3–8b-spaetzle-v20
- mlabonne/ChimeraLlama-3–8B-v3
- flammenai/Mahou-1.1-llama3–8B
- KingNish/KingNish-Llama3–8b
이전부터 모델의 파라미터를 병합하려는 시도는 많이 있었지만 가장 큰 혁명을 가져온 기술은 DARE가 아닐까 생각합니다.
Introduction
huggingface에 보면 수많은 오픈 소스 모델이 생겨나고 있는 것을 확인할 수 있습니다. 그렇지만 대부분은 pre-trained된 모델을 각각의 데이터셋으로 fine-tuning 한 모델입니다.
용도가 딱 있다기보단 대부분은 연구 목적이나, 벤치마크 점수 올리기 용도로 학습을 돌리는 것 같습니다. 모델을 학습하기 위해서는 막대한 자원과 데이터셋이 필요합니다.
최근엔 LoRA와 양자화 기법들이 좋아져서, 적은 리소스로도 튜닝을 할 수 있지만 그래도 컴퓨팅 자원은 많이 필요합니다.
그래서 모델을 병합하려는 연구가 많이 이루어지고 있고, 많은 리더보드에서 상위권을 유지하고 있습니다.
여러가지 방법들을 간단히 살펴보면 다음과 같습니다. 링크
SLERP
SLERP는 모델 병합에서 기존 가중치 평균의 한계를 해결합니다. 이는 고차원 공간에서 각 상위 모델의 고유한 특성과 곡률을 유지하는 방식으로 모델을 혼합하여 보다 미묘한 접근 방식을 제공합니다.
TIES
전통적인 모델 병합 방법은 특히 다른 모델의 매개변수 간 간섭을 처리할 때 심각한 문제에 직면합니다. 이러한 간섭으로 인해 여러 모델을 병합할 때 성능이 크게 저하됩니다. 따라서 TIES는 이 문제를 효과적으로 해결하고 병합 모델의 전반적인 성능을 향상시킵니다.
DARE
Drops And REscales 방법으로 기존의 방법보다 압도적인 성능을 보여줍니다.
DARE 병합 방법에 대해 자세히 설명하겠습니다.
Methodology
핵심은 (튜닝된 파라미터 — 기존 파라미터 = delta 파라미터) 라고 할 수 있습니다.
여기서 Bernoulli 분포는 p에따라 랜덤으로 0또는 1로 만든다는 뜻입니다.
따라서 델타 파라미터를 랜덤하게 p% 만큼 0으로 만듭니다. 그리고 제거된 델타 파라미터를 (1-p)로 나눕니다.
DARE의 강력함을 알기 위해서는 다음 수식을 이해해야 됩니다.
위 가정이 있을 때 i차원의 임베딩 벡터(h)의 기대값은 다음과 같이 구할 수 있습니다.
(1-p) → p의 확률로 파라미터를 0으로 만든다는 뜻, p*0은 delta parameter가 0이 되는 상황(계산 x)
따라서 1/(1-p)를 곱해주면 PRE + 델타 = SFT 파라미터가 됩니다. 많은 파라미터를 지우더라도 수식적으로 근사화를 시킬 수 있는 것입니다. 그림으로 보면 다음과 같이 진행됩니다.
실제 코드를 보면 다음과 같이 구성돼 있습니다. 링크
def bernoulli(tensor: torch.Tensor, density: float, rescale: bool) -> torch.Tensor:
if density >= 1:
return tensor
if (tensor.device.type != "cpu") or tensor.dtype == torch.bfloat16:
work_dtype = tensor.dtype
else:
# torch.bernoulli not implemented for float16 on CPU, upcast to float32
work_dtype = torch.float32
mask = torch.bernoulli(
torch.full_like(input=tensor, fill_value=density, dtype=work_dtype)
)
res = tensor.to(work_dtype) * mask
if rescale:
res /= density
return res.to(tensor.dtype)
여기서는 (1-p)가 아닌 p로 계산하기 때문에 density% 만큼 파라미터를 남기는 것입니다.
이 과정은 딥러닝 네트워크 중간 중간 해주는 dropout과 유사합니다. DARE는 훈련 없이 델타 매개 변수 중복성을 줄이는 것을 목표로 하며, 이는 델타 매개 변수를 영구적으로 제거하고 추론을 위해 다른 매개 변수만 다시 유지합니다.
하지만 드롭아웃은 훈련 중에 출력의 일부를 일시적으로 제거하지만 추론을 위해 모든 출력을 보존하는 모델이 과도하게 맞는 것을 방지하는 데 사용됩니다.
모델 병합 과정을 전체 그림으로 보면 다음과 같습니다.
Experiments
몇가지 실험을 통해 DARE의 강력함을 볼 수 있습니다.
90%정도 drop해도 성능이 유지되는 것을 보면 인코더, 디코더 모델 둘다 SFT의 대부분의 델타 파라미터의 중복이 심하다는 것을 알 수 있습니다. 또한 모델이 클 수록 더 많은 drop rate에도 성능이 유지됩니다.
CoLA는 문법적으로 맞는 문장인지 판단하는 작업이고, MRPC는 두 문장이 의미적으로 같은 문장인지 판단하는 작업입니다.
점수를 보면 DARE를 사용해서 병합한 모델이 웬만하면 점수가 좋아지는데 특정 작업에서는 더 점수가 안좋아지기도 합니다.(기존 문제와 같이 한계점이 존재한다.)
이 논문을 쓴 저자는 당시 SOTA 모델 두개를 DARE로 합쳐서 리더보드 1등을 찍었습니다. 이 과정에서 CPU밖에 사용하지 않았습니다.
또한 위 수식에서 보았던 1/(1-p)로 곱해줘서 resacle하는 과정이 있었는데 이 과정이 빠지게 되면 성능이 급격하게 안좋아지는 것을 확인할 수 있습니다.
Magnitude- based Pruning (MP)과의 결합을 시도했지만 성능이 더 안좋았습니다.
MP는 파라미터의 크기(magnitude)를 기준으로 중요하지 않은 파라미터를 선택적으로 제거하는 방법입니다. 주로 절대값이 작은 파라미터를 제거합니다.(resacle 수식을 적용했을 때 더 안좋아졌다고 하는데 수학적인 접근이 필요할 것 같습니다.)
Delta parameters의 절대값이 큰 경우, DARE가 효과적으로 작동하지 않습니다.
CodeLlama-13b-Python을 기반으로 한 WizardCoder-Python-13B 모델에서 10%의 delta parameters를 제거했을 때, 성능이 급격하게 안좋아졌다. (델타 파라미터 하나 하나가 너무 중요함)
이는 파라미터 값의 변화가 크기 때문에 DARE가 delta parameters를 무작위로 제거하고 재조정(rescale)하는 과정에서 성능 저하를 초래하기 때문입니다. delta parameters의 절대값이 작은 경우(예: 0.005 이하), DARE가 잘 작동할 수 있다고 합니다.
Conclusion
DARE는 SFT delta parameters의 중복성을 줄이고, 모델 병합 성능을 향상시키는 데 효과적인 접근법임을 입증했습니다. 이를 통해 연구자들은 다양한 작업에 특화된 모델을 단일 모델로 통합할 수 있으며, 이는 모델 관리와 효율성을 크게 향상시킵니다. 그러나, LLMs의 잠재적인 유해 정보 생성 문제를 해결하기 위해 지속적인 규제와 주의가 필요합니다.