본문 바로가기
TechStudy/LLM

[펌글] 인스트럭트 튜닝 모델에서 데이터 뽑기

출처: https://arca.live/b/alpaca/109841866?p=1

 

인스트럭트 튜닝된 모델에서 데이타셋을 쏙 뽑아내는 방법 등장 - Ai 언어모델 로컬 채널

Magpie: Alignment Data Synthesis from Scratch by Prompting Aligned LLMs with Nothinghttps://arxiv.org/abs/2406.08464일단 간

arca.live

 

 

Magpie: Alignment Data Synthesis from Scratch by Prompting Aligned LLMs with Nothing

https://arxiv.org/abs/2406.08464

 

일단 간증 글부터 보겠습니다

 

뭐라고? Llama-3-Instruct 에서 데이타셋을 추출해낸 다음에 그 데이타셋으로 Llama-3-Base 를 파인튜닝했는데 그게 Llama-3-Instruct 보다 성능이 더 좋다고!?!?

 

믿을 수가 없어서 직접 실행해봤는데 잘 됩니다 (이번에 저 선생님 llm 바닥부터 만들기 책 쓰고 있는 중인데, 데이타셋 파인튜닝 만드는 부분을 magpie 로 급 변경중)

 

 

인스트럭트 파인튜닝이 완료된 모델에서 파인튜닝용 데이타셋만 뽑아낼 수 있다면 어떨까요? 벌써 여러가지 활용처가 떠오릅니다. 일단은 언어모델에 추가적인 정보를 주입하기 위해서 파인튜닝할 때에는 그냥 무작정 새 정보만 넣으면 망각증상때문에 망가지기가 쉬워서 '원래의' 데이타셋 중 랜덤한 일부와 새롭게 튜닝시킬 데이타를 적절히 혼합해서 튜닝하는게 확실한 방법중 하나인데, 문제는 원래의 데이타셋이라는 것이 대중들에겐 '접근불가'의 영역이라는 점입니다. 그런데 magpie 같은 방법을 통해서 데이타셋을 추출해내면, 그 데이타셋을 새로운 파인튜닝 데이타에 잘 섞어서 새로운 모델을 만들기 용이할 것입니다. 

 

또한 대개의 모델들은 안전장치라는 명목으로 민감한 주제, (모델을 제작한 회사의) 안전에 영향을 줄 수 있는 문제에 대해 답을 거절하도록 '정렬' 되어 있는데, 이러한 정렬작업은 대부분 파인튜닝 단계, 혹은 추가 강화학습 단계에서 실행됩니다. 하지만 저러한 '안전 정렬' 을 제거하고 싶은 사람들도 많이 있는데, abliteration 같은 방법이 대표적입니다. 다만 모델의 내부를 건드려서 행동양식을 바꾸려 하는 것이다보니 완전히 안정적인 방법이라고 장담할 수는 없는데요, magpie 같은 식으로 데이타셋 자체를 뽑아내고 나면 그 데이타셋들을 간단히 문자열 검색 같은 식, 혹은 엠베딩을 추출해서 의미 검색 같은 방식으로 (예: tapestry 같은 단어가 나오는 데이터 쌍을 뽑아내기) 원하지 않는 부분을 치워버릴 수 있을 것입니다. 어쨌든 데이터셋 원본을 갖고 있다는 것은 언어모델을 다루는 입장에서 아주 든든한 토대를 확보했다라고 할 수 있습니다.

 

그럼 magpie 의 방법을 살펴볼 차례인데, 사실 그 방법이 좀 허무하다싶을 정도로 간단합니다

 

 

llama-3-instruct 같은 대화형 모델을 파인튜닝할 때에는 아무렇게나 텍스트들을 집어넣지 않고 일정한 템플릿에 맞춰서 넣게됩니다. 

맨 처음 부분은 대화의 주체가 '누구' 인지를 특별토큰 <|start_header_id|>user<|end_header_id|> 를 이용해서 넣고 그 다음에 바로 붙여서 그 대화의 주체가 한 말을 써넣게 되어있습니다.

 

예를 들어서 llama-3-instruct 로 채팅을 하면서 'What materials should I use to build a nest?' 라는 말을 유저가 입력한다면, 언어모델 웹ui 는 유저의 문장을 

 

<|start_header_id|>user<|end_header_id|>What materials should I use to build a nest?<|start_header_id|>assistant<|end_header_id|>

 

라는 템플릿에 맞춰서 모델에 입력하게 됩니다. 

 

참고로 저 템플릿의 형태는 언어모델마다 다르기 때문에 정확히 적어줘야 제대로 된 추론을 할 수 있는데, ollama 같은 서버의 경우에는 Modelfile 이라는 별도의 파일에 저 템플릿 문자열을 등록해주기 때문에 유저 입장에서는 그냥 모델 이름만 입력하면 자동으로 템플릿이 적용되어 작동합니다.

 

그런데 magpie 의 저자들은 간단한 테스트를 해봅니다. 만약 저 템플릿의 형태를 지키지 않고 앞쪽의 일부분만 넣으면 어떻게 동작할까요? 예를 들면

 

<|start_header_id|>user<|end_header_id|>

 

까지만 넣고 다음 토큰들을 생성하라고 LLama-3-Instruct 모델에 지시하는 것입니다.

 

언어모델은 '유저차례' 스페셜 토큰 다음에 유저의 질문, 그 다음에 '어시스턴트 차례' 스페셜 토큰 다음에 답변이 나오는 식으로 묶어서 파인튜닝된 것이고, 그에 따라 확률분포가 학습된 것입니다. 최종적으로 유저가 모델을 사용할때는 auto regressive 하게 그 확률분포를 쭉 따라 뽑는 것 뿐이죠.

 

<|start_header_id|>user<|end_header_id|>

까지만 넣고 다음 추론을 시키면... 언어모델은 자기가 학습한 확률분포, 즉 유저 입장에서의 질문들의 확률분포 내에서 토큰들을 뽑아냅니다. 그 토큰들을 모아보면.. 라마3 인스트럭트 모델을 파인튜닝할 때 입력한 '유저 입장에서의 질문들' 에 매우 유사한 문장들이 나옵니다!

 

그리고 더 황당한 것은 그렇게 뽑은 데이터로 라마3 기본모델을 파인튜닝했는데, 무려 공식 라마3인스트럭트 모델보다 성능이 더 잘나옵니다!

 

만약 이 시점에서 '저런식으로만 뽑는데도 데이타셋이 골고루 추출될까요? temperature 나 top-p 같은 파라메터는 어떻게 세팅해야 하나요?' 라는 의문이 드는 분이면 언어모델의 작동에 대해 상당한 식견을 갖추신 분입니다. 안그래도 논문에서는 그 점에 대해 여러가지 비교(ablation study)를 실시했습니다. 

 

먼저 데이타셋이 얼마나 다양하고 고르게 추출되었는지 확인해보겠습니다

위의 그래프는 magpie 로 추출된 데이타셋의 문장들에서 엠베딩을 추출한 후 (인코더 모델을 사용) t-SNE 방법을 이용해 엠베딩벡터의 차원을 2차원으로 줄여서 표시한 것입니다. 다른 파인튜닝용 데이터셋 (Alpaca, Ultrachat 등) 과 비교해도 magpie 의 영역이 압도적으로 넓게 표시됩니다. 이정도 고퀄리티의 인스트럭트 파인튜닝용 데이터셋은 그동안 오픈소스로 존재하지 않았었습니다!

 

참고로 저 데이터셋은 맥파이 에어, 맥파이 프로 (... 울트라도 나중에 만들려나?) 라는 이름으로 허깅페이스에 공개되어 있습니다. 

 

단순히 언어모델에 프롬프트 템플릿의 일부만 잘라넣고 추론을 돌려서 뽑은거라면 temperature 나 top-p 같은 파라메터는 어떻게 설정하면 좋을지에 관련된 정보는 논문의 부록에 포함되어 있습니다 (전 상당히 중요한 정보라고 생각하는데 왜 부록에 넣었는진 모르겠습니다)

 

보다시피 퀄리티, 난이도, 최소 거리 같은 기준으로 볼때 top-p 와 temperature 의 조합을 어떻게 설정하냐에 따라서 장단점이 있습니다. 대화의 퀄리티를 높이는 데에는 top-p 를 약간 낮추고 temperature 도 낮추는데에 좋지만, 이렇게 하면 까다로운 난이도의 대화를 만들어내는 확률이 줄어듭니다. 난이도 부분에서 좋은 점수를 받으려면 top-p 와 temperature 를 높여줘야 합니다

결국 논문에서 magpie 를 만들 때에는 조합별도 다 만들어서 섞는 방법을 선택합니다. 어차피 데이터셋은 클수록 좋으니까 다양한 파라메터로 만들어놓고, 나중에 선별작업을 잘 거치면 됩니다. 단순히 llama-3-instruct 8B 모델의 추론만 돌리면 되는 것이기 때문에 저사양 gpu 를 많이 돌리는 것으로 데이터셋을 뽑아낼 수 있습니다.

보다시피 temperature 는 1.0 에서 1.25 사이로 골고루, top-p 는 1.0 에서 0.990 사이 골고루 선택해서 조합별로 30만개정도씩 뽑아내서 합칩니다

 

질문을 뽑아내고 나면 그 질문에 답하는 것은 어렵지 않습니다. 아까 뽑은 토큰들의 뒤에 말할 차례를 '어시스턴트' 로 두는 스페셜 토큰을 추가하고 뽑으면 됩니다. 여기까지는 1턴의 대화입니다 (유저-어시스턴트). 2턴의 대화를 만들 때에는 간단한 컨텍스트 프롬프트를 더 추가합니다

 

 

다만, 저 프롬프트는 분야별로 특화가 필요합니다. 예를 들어서 RP 대화를 할때의 멀티턴 프롬프트와, 수학 문제풀이용 멀티턴 프롬프트는 다릅니다.

 

프롬프트의 차등적용을 하려면 추출해낸 데이타셋을 분야별로 분류해줄 필요가 있습니다. 또한 데이타셋 대화쌍의 퀄리티나 난이도 같은 부분에 있어서도 분류기를 돌려줄 필요가 있습니다. 이러한 분류기는 별도의 모델을 이용하지 않고 다시 llama-3-instruct 에 적당한 프롬프트 템플릿을 적용해서 돌려주면 됩니다. 정말 라마 한마리 털뽑고 가죽 벗기고 고기 발라내고 사골까지 알차게 우려먹는다는 느낌이 듭니다.

 

 

참고로 저런식으로 라마3에서 뽑아낸 데이터셋을 qwen2 베이스에 파인튜닝을 돌리기도 하는 식으로 알차게 활용합니다. 역시 qwen2 보다 성능이 좋습니다.... 단순히 라마3 에서 추출한 데이타를 라마3 에 파인튜닝해서 좋은게 아니라 그냥 범용적으로 고품질의 데이타셋인게 맞나봅니다.

 

여러가지로 신기한 일이 아닐 수 없습니다. llama3 의 파인튜닝에는 상당히 방대한 토큰의 데이타가 입력된 것으로 알려져 있습니다. 그에 비해 4백만개라는 훨씬 적은 데이타를 가지고 파인튜닝이 가능하다는 것은 신기합니다.

 

제 개인적인 생각으로는 메타에서 원 llama3 의 파인튜닝용 데이타를 만들때 llama2 를 썼고, magpie 는 llama3 를 쓴 것이 차이의 이유가 아닐까 하는 생각이 듭니다. 분량이 적더라도 llama3 에서 추출된 데이터는 llama2 를 이용해 합성한 데이터보다 next generation 입니다.

 

또한 다른 사람의 의견중에는 데이타셋을 만든 후에 선별 작업을 한번 거친 것때문에 효과가 좋았을 수 있다라는 점도 있습니다. 역시 선별 모델도 llama3 이기 때문에 그 효과가 반영되었을 수 있습니다.

 

마지막으로 허깅페이스 관련 페이지

https://huggingface.co/Magpie-Align

 

728x90
반응형