LLM) Chat Vector 논문 내용 및 실험해보기

2024. 4. 26. 03:20관심있는 주제/LLM

728x90

논문 내용 정리

 

CP : Continual Pre-training

PLM : Pre-trained Language Model

 

해당 논문은 우연히 LLAMA3에 CHAT VECTOR 논문 방식으로 튜닝한 모델이 있다고 해서 찾아보게 되었습니다.

https://huggingface.co/beomi/Llama-3-Open-Ko-8B-Instruct-preview

 

beomi/Llama-3-Open-Ko-8B-Instruct-preview · Hugging Face

Llama-3-Open-Ko-8B-Instruct-preview Update @ 2024.04.24: Release Llama-3-Open-Ko-8B model & Llama-3-Open-Ko-8B-Instruct-preview Model Details Llama-3-Open-Ko-8B-Instruct-preview Llama-3-Open-Ko-8B model is continued pretrained language model based on Llama

huggingface.co

 

해당 논문의 이름은 다음과 같습니다.

 

Chat Vector: A Simple Approach to Equip LLMs with Instruction Following and Model Alignment in New Languages

 

여기서 말하고자 하는 요지를 봤을 때는 기존의 오픈소스 대규모 언어 모델(LLMs)이 전부 영어를 중점으로 두었는데, 이를 극복하고자 새로운 접근 방식을 소개합니다.

 

주요 핵심아이디어는 아래 그림과 같이 결국 기존 모델에서 파생된 CP모델에 추가적인 벡터를 추가하면 특별한 학습 없이도  기존의 대규모 언어 모델에 대화 기능을 부여하고 명령 수행 능력과 인간의 가치에 맞추어 조정할 수 있다는 것입니다.

 

즉, 기존에 많은 사람들이 위의 그림처럼 새로운 언어에 접근할 때 CP 작업을 통해 새로운 Pretrained Model을 만들고, 여기서 자기들이 원하는 task를 수행할 수 있게 SFT 나 RLHF, DPO 방식 같은 것을 적용해서 특정 task를 잘 수행할 수 있는 모델을 만듭니다. 

 

하지만 이런 방식에서 기존의 오픈된 모델보다 데이터나 자원의 부족으로 인해 성능이 저하되는 경우가 발생하는데, 

이 논문에서는 기존에 PLM과 여기서는 Chat Model을 이용해서 Chat Vector라는 것을 얻고, 이를 통해 보다 쉽게 Chat을 할 수 있는 모델을 만들 수 있다고 주장하는 논문입니다.

 

 

(a)Without chat vector: llama2-chat /   (b) Without chat vector: llama2-chat  →  CP  →  FT / (c)  With chat vector: llama2  →  CP  →  FT  +  chat vector

 

이 논문의 해당 부분에서는 챗 벡터가 언어 모델의 다중 턴 대화 능력을 향상시키는 효과를 강조합니다. 

전통 중국어 LLaMA 모델의 두 버전을 비교합니다: 하나는 일반적인 훈련 경로를 따르는 모델(llama2-chat → CP → FT)과 다른 하나는 챗 벡터를 통합한 모델(llama2 → CP → FT + chat vector)입니다.

챗 벡터를 통합한 모델(llama2 → CP → FT + chat vector)은 "번개 볼트"와 같은 다중 턴 대화의 맥락을 기억하는 능력을 성공적으로 유지하는 것으로 나타났습니다. 이는 챗 벡터를 통합하지 않은 모델(llama2-chat → CP → FT)과 대조적이며, 후자는 "번개 볼트"를 기억하지 못해 다중 턴 대화 능력이 손실된 것을 보여줍니다.

이 결과는 챗 벡터가 다중 턴 대화 능력을 유지하고 심지어 향상시킬 수 있는 역할을 강조합니다.

 

연구 결과에 따르면, 챗 벡터는 중국어 버전의 LLaMA2 뿐만 아니라 다양한 기반 모델과 언어에 효과적으로 적용될 수 있습니다. 예를 들어, 전통 중국어를 지속적으로 사전 훈련한 Mistral 기반의 Breeze-7B 모델에 챗 벡터를 통합한 결과, 원래의 Breeze-Instruct 모델보다 우수한 성능을 보였습니다. 또한, 한국어를 포함한 다양한 언어에 대한 적용 가능성도 확인되었습니다.



그러나 챗 벡터를 추가할 때 일부 문제가 발견되었습니다. 예를 들어, 중국어 LLaMA에 챗 벡터를 추가하면 영어 응답 비율이 높아지는 경향이 있었습니다. 이를 해결하기 위해 챗 벡터에 0.5의 가중치를 곱하는 실험을 통해 영어 응답의 과도한 발생을 줄이는 데 성공했으나, 명령 따름과 독성 완화 능력이 다소 감소하였습니다. 이러한 문제는 향후 연구에서 더 깊이 탐구할 계획이라고 합니다.

 

실험

실제로 아이디어가 간단한 것 같아 간단하게 구현을 해서 진행한 결과 공유드립니다

실험은 다음과 같은 상태에서 진행해보았습니다.

 

1. PLM (upstage/SOLAR-10.7B-v1.0)

2. Chat Model (upstage/SOLAR-10.7B-Instruct-v1.0)

3. CP Model (yanolja/EEVE-Korean-10.8B-v1.0)

 

이렇게 기존 upstage/SOLAR-10.7B-v1.0 를 기반으로 학습한 yanolja/EEVE-Korean-10.8B-v1.0에 chat 기능을 추가하는 태스크를 수행해 보았습니다.

 

CP Model + Chat Vector (O)

conversation = [ 
                {'role': 'user', 'content': "안녕하세요! 너는 누구세요?"},
                {'role': 'assistant', 'content': "저는 데이터 뉴비 챗봇입니다. 무엇을 도와드릴까요? 저는 햄버거를 좋아합니다. "},
                {'role': 'user', 'content': "안녕하세요! 당신의 이름이 뭐라고요? 너가 좋아하는 것은 무엇이야? 좋아 하는 것은 뭐야?"},
                ] 
prompt = tokenizer.apply_chat_template(conversation, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(prompt, return_tensors="pt").to(base_finetuned_model.device) 
outputs = base_finetuned_model.generate(**inputs, use_cache=True, max_length=1000)
output_text = tokenizer.decode(outputs[0]) 
print(output_text)
<s> <|im_start|>system
You are a helpful assistant.<|im_end|> 
<|im_start|>user
안녕하세요! 너는 누구세요?<|im_end|> 
<|im_start|>assistant
저는 데이터 뉴비 챗봇입니다. 무엇을 도와드릴까요? 저는 햄버거를 좋아합니다. <|im_end|> 
<|im_start|>user
안녕하세요! 당신의 이름이 뭐라고요? 너가 좋아하는 것은 무엇이야? 좋아 하는 것은 뭐야?<|im_end|> 
<|im_start|>assistant
안녕하세요! 제 이름은 데이터 뉴비 챗봇입니다. 저는 햄버거를 좋아합니다. 제 역할은 여러분의 질문에 답하고, 정보를 제공하고, 여러분이 필요한 것을 돕는 것입니다. 제가 도와드릴 수 있는 다른 것이 있나요?<|im_end|>

 

CP Model + Chat Vector (X)

tokenizer = AutoTokenizer.from_pretrained(base_fintuned_model_name)
base_finetuned_model = AutoModelForCausalLM.from_pretrained(
        base_fintuned_model_name,
        # load_in_4bit=True,
        device_map="auto",
        trust_remote_code=True,
)
conversation = [ 
                {'role': 'user', 'content': "안녕하세요! 너는 누구세요?"},
                {'role': 'assistant', 'content': "저는 데이터 뉴비 챗봇입니다. 무엇을 도와드릴까요? 저는 햄버거를 좋아합니다. "},
                {'role': 'user', 'content': "안녕하세요! 당신의 이름이 뭐라고요? 너가 좋아하는 것은 무엇이야? 좋아 하는 것은 뭐야?"},
                ] 
prompt = tokenizer.apply_chat_template(conversation, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(prompt, return_tensors="pt").to(base_finetuned_model.device) 
outputs = base_finetuned_model.generate(**inputs, use_cache=True, max_length=1000)
output_text = tokenizer.decode(outputs[0]) 
print(output_text)
<s> <|im_start|>system
You are a helpful assistant.<|im_end|> 
<|im_start|>user
안녕하세요! 너는 누구세요?<|im_end|> 
<|im_start|>assistant
저는 데이터 뉴비 챗봇입니다. 무엇을 도와드릴까요? 저는 햄버거를 좋아합니다. <|im_end|> 
<|im_start|>user
안녕하세요! 당신의 이름이 뭐라고요? 너가 좋아하는 것은 무엇이야? 좋아 하는 것은 뭐야?<|im_end|> 
<|im_start|>assistant
안녕하세요! 제 이름은 데이터 뉴비입니다. 저는 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다. 햄버거를 좋아합니다.

 

2개의 결과를 보면 아주 흥미롭게도 Chat Vector를 적용한 효과가 있다는 것을 알게 되었습니다.

일반적인 질문을 한다고 했을 때는 둘 다 잘하는 것 같지만, 위에서 처럼 이상한 답변을 추가하게 되면, 

Chat Vector를 적용하지 않은 상태에서 Chat 능력을 테스트하면 성능이 안 나오지만, Chat Vector만 추가해 주면 채팅할 수 있는 LLM 모델을 만들 수 있었습니다.

 

이를 통해 보다 효율적으로 특정 TASK에 대한 모델을 만드는 것이 쉬워질 수 있을 것 같고, 보다 중요한 것은 도메인 데이터로 학습한 CP 모델의 존재가 더욱더 강조될 것 같습니다.

 

https://arxiv.org/abs/2310.04799

 

Chat Vector: A Simple Approach to Equip LLMs with Instruction Following and Model Alignment in New Languages

Recently, the development of open-source large language models (LLMs) has advanced rapidly. Nevertheless, due to data constraints, the capabilities of most open-source LLMs are primarily focused on English. To address this issue, we introduce the concept o

arxiv.org

 

 

728x90