이번 블로그 포스트는 논문 리뷰는 아니고, Meta에서 운영하는 블로그 글의 리뷰입니다.
LLaMa를 개발한 Meta가 어떻게 Open Source Large Language Models (LLMs)를 활용할 수 있을지,
Part1: Methods for adapting large language models,
Part2: To fine-tune or not to fine-tune,
Part3: How to fine-tune: Focus on effective datasts
로 나눠 설명하고 있는데, 이 내용을 좀 간추려보려 해요.
논문에 비해서 훨씬 읽기 쉬운 글이니, 처음 LLM 모델을 접할 때 읽으면 좋을 것 같습니다!
먼저 각 part에 대해 요약해서 말하자면, part1에서는 LLM 모델의 활용을 개괄적으로 설명하고 있습니다. LLM 모델 개발을 위한 어떤 학습 기법들이 존재하는지, 나의 상황에 따라 어떤 학습 기법을 선택하는게 좋을지 말이에요. 다음 part2에서는 나의 상황에 따라 fine-tuning을 하기로 결정했다면, 그 중에서 어떤 방식이 보다 효과적일지 설명하고 있습니다. 마지막으로 part3에서는 fine-tuning을 한다고 했을 때, 데이터셋 구성은 어떻게 하는게 좋을지에 대해 다루고 있어요.
사실, part1과 part2는 이전 블로그 포스트에서 논문 리뷰를 통해 여러번 언급했던 내용들입니다.
따라서, 이번 포스팅에서는 학습 기법에 대해서는 가볍게! part3. 데이터 부분을 중점적으로 다뤄보도록 할게요.
Open source인 LLM을 우리 입맛에 맞게 학습하는 기법에는 Pre-training, Continued pre-training, Fine-tuning, Retrieval augmented generation (RAG), In-context learning (ICL)등이 있습니다. 이제 많이 익숙한 단어들이죠? 여기서 Continued pre-training은 어떤 관점에서는 Fine-tuning의 한 방식으로 생각할 수도 있을 것 같아요. 하지만, meta의 포스트에서 이를 구분한 이유는 continued pre-training의 경우 causual language modeling (clm) 방식으로 학습해서 self-supervised learning이지만, fine-tuning은 label값이 있는 (즉, 우리가 정답이라고 생각하는 값이 있는) supervised learning으로 한정하고 있기 때문이에요.
part 1,2의 핵심은 아래 그림에 나와있습니다.
바로 우리 상황에 맞는 학습 기법 선택 과정!
meta의 글에서는 가성비! 내가 들인 노력과 돈에 비해 최선의 결과물 도출!을 우선하고 있기 때문에
일반적으로 우리가 모델을 학습한다고 마음 먹었을 때와 조금 다른 방식으로 의사결정하는 과정을 보여주는 것 같아요.
굉장히 비즈니스적인 마인드라고 생각을 했습니다.
1) LLM에 prompt만 살짝 변경해서 물어봤을 때, 우리가 원하는 대답이 나오는가?
→ Yes! (그럼 그냥 이거 쓰자)
→ No! (2번 질문으로)
2) Prompt engineering을 통해 prompt를 대폭 수정하면, 우리가 원하는 대답이 나오는가?
→ Yes! (그럼 prompt만 바꿔서 이거 쓰자)
→ No! (3번 질문으로)
3) ICL 방식으로 prompt에 예시를 조금 넣어보자, 그러면 우리가 원하는 대답이 나오는가?
→ Yes! (그럼 예시를 던져주고, 이거 그대로 쓰자)
→ No! (4번 질문으로)
4) 그냥은 힘들것 같으니 관련 데이터를 조금 수집해보자.
4-1) 우리 모델이 RAG에 더 적합한가?
4-2) 우리 모델이 Fine-tuning에 더 적합한가?
4-1)과 4-2)에 답하기 위해서는 part2를 참고하면 됩니다.
조금 더 디테일한 설명은 보고 싶은 분들을 위해 아래 접은글로 설명할게요!
앞선 논문 리뷰에서 거듭 domain training 그래서 rag야? fine-tuning이야? 에 대해 많이 다뤄봤는데, 이번엔 meta의 의견입니다.
meta (적어도 해당 블로그 포스트) 는 새로운 지식을 학습시키는데 fine-tuning은 적합하지 않다고 합니다. 그래서, hallucination에 취약한 상황이라면 RAG 사용을 권장하죠. 대신 내가 원하는 답변 스타일, 어조와 같은 것들이 있다면 fine-tuning이 효율적일 것이라고 합니다. 물론 시간과 돈 모두 여유가 있다면 두 가지 학습을 모두 시켰을 때, 가장 좋을 수 있다고도 해요.
(결국, 내 상황에 맞게 해라~~ 아무도 정답을 알려주지 못하는 문제인가 봅니다.)
각 학습을 진행했을 때, 우리가 원하는 대답이 나오는가?
→ Yes! (드디어..! 그럼 이제 학습한 모델 쓰자)
→ No! (5번 질문으로)
5) pre-training이나 continued pre-training을 시킬만한 데이터를 가지고 있는가?
→ Yes! (처음부터 나만의 모델을 구워보자)
→ No! (다시 4번 과정으로.. 조금만 더 데이터를 모아보자)
마치 할 수 있는 한 최~~~~대한 일을 안 하고 싶은 저와 같은 의사결정 과정입니다.
그만큼 LLM 모델을 만드는데는 많은 데이터, 컴퓨팅 자원 등등이 필요하다는 얘기겠죠?
아니면 meta가 open source 언어 모델을 만든 장본인들인만큼 본인들이 만든 모델 그냥 잘 써라는 느낌이기도 합니다.
그렇다면 이번 포스팅의 핵심!
나는 어떻게 데이터를 구축하면 좋을까?
1) Quality vs Quantity
데이터의 양이냐? 질이냐?
- 최근 트렌드는 양보다는 질입니다. 이전 LIMA 논문 리뷰에서도 언급했다시피 적은 양의 high quality 데이터셋이 많은 양의 데이터보다 성능을 높이는데 훨씬 좋다고 합니다. OpenAI의 fine-tuning 문서에 따르면 50~100개의 데이터만으로도 성능 향상을 볼 수 있다고 해요. (이건 좀 과장이 있지 않나 싶어요.)
- 조금 더 어려운 task는 더 많은 양의 데이터가 필요하다. 예를 들어, 요약과 같은 task는 분류 문제에 비해 더 많은 양의 데이터가 필요하다는 얘기입니다.
2) Data diversity
- 중복된 데이터를 제거하여 성능 높이기. pre-training과 fine-tuning 모두에 해당하는 얘기입니다.
- 모델의 input 데이터를 paraphrasing하여 다양하게 변형시키기. 비슷한 결의 얘기라할지라도 다양한 표현 방식을 학습시키면 성능이 더 오른다는 얘기입니다.
- 비주류 언어를 학습 시킬 때 (예시로는 hindi, odia), FLAN, Alpaca, Dolly 처럼 비주류 언어 외 다양한 데이터셋을 학습 시켰을 때 성능이 더 오른다고 합니다.
- input은 다양하되 답변 (output)의 형식은 일반화하기. 답변은 비슷한 결로 해야 모델이 그 톤을 학습하는 것 같습니다.
+ 추가로
- 데이터셋을 구성할 때, 긍/부정의 비율 맞추기. 예를 들어, QA 데이터셋 내에 '해당 질문에는 답변할 수 없습니다.'와 같은 답변이 너무 많이 포함되어 있다면, 모델이 과도하게 답변을 거부할 가능성이 있습니다.
모델을 학습하기 위해 자신의 데이터셋을 구축하는 과정을 겪게 되는데,
어찌보면 당연해보이고 간단한 얘기일 수 있지만, 기본만 잘 지켜도 모델의 성능 향상에 도움이 되는 것 같아요.
특히, 모델의 input은 다양하게, output 형식은 비슷하게!
이 부분이 저는 가장 도움이 되는 것 같아요.
LLM? 이제 돈으로 사겠어.
얼마면 돼, 얼마면 되겠어?!?
얼마 안되더라도 저는 못사기 때문에 열심히 데이터를 모아보도록 할게요....