요약
- Llama 2를 기반으로 한 코드용 LLM 시리즈인 Code Llama를 제안
- Llama 2 70B 모델을 이용해 코딩 문제를 생성하고, Code Llama - Python 7B를 사용해 유닛 테스트와 솔루션을 생성하여 Self Instruct 데이터셋 생성
- Llama 2에서 사용된 로터리 포지션 임베딩(RoPE)의 회전 주파수(θ)를 조정하는 것이 긴 시퀀스를 안정적으로 학습시키는 데 중요함을 확인하였고, 파인 튜닝을 위해 회전 주파수를 10,000에서 1,000,000으로 증가
0. ABSTRACT
- Code Llama는 코드 작성에 특화된 Llama 2 기반의 대형 언어 모델 시리즈로, 공개된 모델 중 최고 성능을 제공하며 코드 완성 능력, 큰 입력 컨텍스트 지원, 프로그래밍 작업에 대한 제로샷 명령어 수행 능력 갖춤
- 기본 모델(Code Llama), 파이썬 특화 모델(Code Llama - Python), 명령어 수행 특화 모델(Code Llama - Instruct) 등으로 나뉘며, 각각 70억, 130억, 340억, 700억 개의 파라미터를 갖춘 버전을 제공
- 이 모델들은 16,000개의 토큰으로 구성된 시퀀스를 학습, 최대 100,000개 토큰의 입력에서 개성된 성능
- 성능
- HumanEval과 MBPP에서 최고 수준의 성능, 최대 67%와 65%의 점수 기록
- 특히, Code Llama - Python 7B 모델은 Llama 2 70B 모델을 능가
1. INTRODUCTION
본 논문은 코드 생성과 코드 완성을 위한 Code Llama라는 Llama 2 기반 LLM 시리즈를 소개한다.
Code Llama는 Llama 2 모델을 점진적으로 특화시키고 성능을 향상시키기 위해 여러 단계의 학습과 파인 튜닝 과정을 거친다.
- Code-training from foundation models
- Code Llama는 일반 텍스트와 코드 데이터로 사전 학습된 Llama 2 모델을 기반으로 하며, 코드 전용 데이터로만 학습된 다른 모델들보다 더 나은 성능을 보인다.
- Infilling
- Code Llama는 자동 회귀 방식의 학습뿐만 아니라, 텍스트 내 누락된 부분을 채우는 인필링 기능을 지원한다. 이를 통해 소스 코드 에디터에서 실시간 코드 완성이나 주석 생성과 같은 작업 수행할 수 있다.
- Long input contexts
- Code Llama는 Llama 2가 지원하는 최대 4,096 토큰의 컨텍스트 길이를 100,000토큰으로 확장하여 더 큰 규모의 코드베이스에서 작업 수행할 수 있다.
- Instruction fine-tuning
- 사용자에게 더 유용하기 만들기 위해, Code Llama - Instuct 모델은 사용자 지침에 맞춰 추가적으로 파인 튜닝되었다. 이 모델은 안정성, 진실성, 편향성 측면에서 성능 개선되었다.
2. Code Llama: Specializing Llama 2 for code
2.1 The Code Llama models family
- Code Llama
- Code Llama 모델은 코드 생성에 특화된 기본 모델로, 7B, 13B, 34B, 70B 파라미터 크기의 네 가지 모델이 있다. 7, 13, 70B 모델은 코드 파일 중간에 코드 완성을 할 수 있도록 인필링 목표로 학습되지만, 34B 모델은 인필링 없이 학습한다. 모든 Code Llama 모델은 Llama 2 모델 가중치로 초기화되었으며, 5,000억 개의 토큰(70B 모델은 1조 개의 토큰)으로 학습되었다. 이들은 모두 긴 컨텍스트를 처리할 수 있도록 파인 튜닝되었다.
- Code Llama - Python
- 파이썬 코드 생성을 위해 특화된 모델로, 7, 13, 34, 70B 파라미터 크기로 제공된다. Llama 2 모델 기반이며, Code Llama 데이터셋에서 5000억 개의 토큰으로 학습된 후, 추가적으로 1000억 개의 파이썬 데이터셋을 사용해 더 세밀하게 학습되었다. 7, 13, 34B 모델은 인필링 없이 학습된 후 긴 컨텍스트 처리 능력 갖추도록 파인 튜닝되었다.
- Code Llama - Instruct
- 7, 13, 34B 크기로 제공되며, Code Llama를 기반으로 약 50억 개의 추가 토큰으로 인간 지시를 더 잘 따를 수 있도록 파인 튜닝되었다.
- Code Llama 70B
- 이 모델은 7, 13, 34B 모델 이후 학습된 모델로, 1조 개의 토큰으로 학습되었고, 인필링 기능 지원한다. 70B 모델은 LCFT로 학습된 유일한 모델이며, Code Llama - Instuction 70B는 Code Llama - Python 70B에서 학습되었다. Code Llama - Python 70B는 MultiPL-E의 다양한 언어에서 평균적으로 Code Llama 70B보다 더 나은 성능을 보인다.
2.2 Dataset
- 7B, 13B, 34B 모델은 5000억 개의 토큰으로, Code Llama 70B 모델은 1조 개의 토큰으로 학습되었다.
- 데이터셋 구성
- Code Llama는 주로 공개된 코드로 이루어진 중복 제거된 데이터셋을 사용하여 학습
- 학습 데이터의 8%는 코드와 관련된 자연어 데이터셋에서 추출
- 이 데이터셋은 코드와 관련된 토론, 질문, 답변에 포함된 코드 스니펫 등을 포함
- 자연어 이해 능력 유지
- 일부 배치에서는 자연어 데이터셋에서 샘플을 추출해 학습헤 사용
- 데이터는 바이트 쌍 인코딩(BPE)으로 토크나이즈
- 결과
- 초기 실험에서, 자연어 데이터셋에서 샘플링된 배치를 추가하면 모델의 MBPP 성능 향상
MBPP (Mostly Basic Programming Problems) ?
프로그래밍 문제의 데이터셋으로, 주로 간단한 프로그래밍 문제 해결을 목표로 한다. 이 데이터셋은 모델의 코드 생성 능력을 평가하기 위해 사용한다.
BPE (Byte Pair Encoding) ?
BPE는 텍스트를 처리할 때 사용하는 토크나이제이션 기술 중 하나로, 단어를 자주 나타나는 바이트 쌍으로 분해하여 압축하는 방식으로 동작한다. 예를 들어, ‘lower’, ‘lowest’,’slow’와 같은 단어들을 ‘low’, ‘er’, ‘est’, ‘s’ 와 같은 토큰으로 분해될 수 있다. 다양한 단어를 공통된 부분으로 쪼개어 모델이 효율적으로 처리할 수 있도록 한다.
** BPE는 새로운 단어가 등장해도 모델이 유연하게 처리할 수 있도록 돕는 역할을 한다. **
2.3 Infilling
Infilling?
코드 인필링은 주어진 코드의 주변 컨텍스트를 기반으로 누락된 부분을 예측하는 작업으로, 주로 코드 IDE에서의 코드 완성, 타입 추론, 코드 내 문성 생성에 활용된다.
[학습 방법]
- 인필링 모델 학습: 인필링 모델은 casual masking 기법을 사용하여 학습된다. 이 과정에서는 학습 시퀀스의 일부를 끝으로 이동시킨 후, 이 재배열된 시퀀스를 자동 회귀 방식으로 예측한다.
- 문서 분할: 학습 문서는 문자 단위로 분할되어 접두사, 중간 부분, 접미사로 나뉜다. 분할 위치는 문서 길이를 기반으로 무작위로 결정되며, 이러한 변환은 문서의 90%에 적용된다.
- 포맷: 절반의 분할은 PSM(접두사-접미사-중간부분) 형식으로, 나머지 절반은 SPM(접미사-접두사-중간부분) 형식으로 포맷된다.
- 특수 토큰 사용: Llama 2의 토크나이저를 확장하여 접두사, 중간 부분, 접미사의 시작과 인필링 구간의 끝을 나타내는 네 개의 특수 토큰을 추가
- 토크나이징 방식: 자동 회귀 학습과 인필링 학습 간의 분포 차이를 줄이기 위해, 중간 부분과 접미사를 인코딩할 때 SentencePiece 토크나이저가 암묵적으로 추가하는 공백 제거
[예시]
def add_numbers(a, b):
result = a + b
return result
- 문서 분할
- 접두사: def add_numbers(a, b):
- 중간 부분: result = a + b
- 접미사: return result
- PSM 형식: def add_numbers(a, b): return result result = a + b
- 특수 토큰 추가: [PREFIX_START] def add_numbers(a, b): [SUFFIX_START] return result [MIDDLE_START] result = a + b [INFILL_END]
[인필링의 장점]
- 코드 자동 완성: 개발자가 IDE에서 코드 작성 시, 커서 위치에 따라 다음에 나올 코드를 예측해주는 기능 제공
- 타입 추론: 함수나 변수의 타입 추론하여 자동 추가
- 문서화 생성: 함수의 설명이나 주석 자동 생성
2.4 Long context fine-tuning
- 트랜스포머 기반 언어 모델에서 긴 시퀀스를 효과적으로 처리하는 것은 중요한 연구 과제
- 주요 도전 과제는 훈련 시에 보지 못한 긴 시퀀스에 대한 추론과 어텐션 메커니즘의 복잡도
- Code Llama에서는 긴 컨텍스트 파인 튜닝(LCFT) 단계를 도입하여, 시퀀스 길이를 기존 Llama 2에서 사용된 4,096 토큰에서 16,384토큰으로 확장했다. 이 과정에서 훈련 비용을 크게 증가시키지 않으면서도 긴 시퀀스를 처리할 수 있는 능력 확보했다.
- 로터리 포지션 임베딩(RoPE) 조정
- 로터리 포지션 임베딩에서 사용되는 회전 주파수(\theta)를 조정하여, 더 긴 시퀀스를 처리할 수 있도록 했다. 기존에는 base period를 10,000으로 설정했으나, 이를 1,000,000으로 증가시켜 긴 시퀀스에도 안정적인 성능을 발휘하도록 했다. 이를 통해 짧은 거리의 어텐션 편향을 줄이고, 최대 100,000 토큰에 이르는 매우 긴 시퀀스에서도 안정적인 성능을 보였다.

로터리 포지션 임베딩이란?
트랜스포머 모델에서 위치 정보를 인코딩하는 방법 중 하나로, 트랜스포머 모델은 위치에 관계없이 입력 데이터를 처리하기 때문에, 입력 시퀀스의 각 토큰의 위치 정보를 모델에 전달해야 한다. RoPE는 이러한 위치 정보를 쿼리, 키 벡터에 회전 변환을 통해 추가하는 방식으로 작동한다.
회전 주파수란?
RoPE에서 사용되는 회전 주파수(θ)는 위치 정보의 회전 변환을 정의하는 데 사용된다. 이 회전 변환은 수학적으로 회전 행렬로 표현되며, 특정 위치에서의 벡터를 회전시킨다.
θ는 위치 정보가 벡터에 어떻게 적용되는지를 결정하는 중요한 매개변수로, θ가 커지면 위치 정보가 더 천천히 변하며, 작아지면 더 빠르게 변하게 만든다.
회전 주파수 조정이 긴 시퀀스에 안정적인 이유?
트랜스포머 모델에서 attention mechanism은 모든 위치의 토큰 간 상호작용을 계산하기 때문에, 시퀀스가 길어질수록 위치 정보의 정확한 인코딩이 중요하다. 일반적으로 회전 주파수는 10,000으로 설정되어, 짧은 시퀀스에서는 잘 작동하지만 긴 시퀀스에서는 위치가 제대로 반영되지 않는다. 따라서 이를 1,000,000으로 늘리면, 위치 정보가 더 길게 유지되며, 더 긴 시퀀스에서도 위치 정보가 왜곡되지 않고 안정적으로 반영된다.
2.5 Instruction fine-tuning
Code Llama - Instruct 모델은 Code Llama를 기반으로 질문에 적절한 답변을 할 수 있도록 추가로 훈련되었다. 주로 세 가지 종류의 데이터로 훈련되었다.
- 주요 데이터: Code Llama는 5,000억 개의 토큰, Code Llama - Python은 추가로 1,000억 개의 토큰으로 학습되었다. 코드 데이터 85%, 코드 관련 자연어 데이터 8%, 일반 자연어 데이터 7%로 구성
- 독점 데이터: Llama 2의 RLHF V5는 인간 피드백을 통해 수집된 데이터셋으로, Helpfulness과 Safety 관련 데이터를 포함하여 모델이 지시를 잘 따르고 안전하게 작동하도록 학습되었다.
- Self-Instruct: Llama 2 70B 모델을 사용해 약 52,000개의 프로그래밍 질문을 생성하고, Code Llama 7B를 이용해 유닛 테스트와 파이썬 솔루션을 생성했고, 테스트를 통과한 솔루션만을 데이터셋에 추가
2.6 Training details
- 파라미터 설정은 논문 참고

pass@k란?
모델이 N번의 시도로 생성한 코드 중에서 적어도 하나의 코드가 테스트 케이스를 통과할 확률을 의미하며, 모델이 생성한 코드의 정확성과 신뢰성을 측정하는 데 사용된다.
'논문 리뷰 > LLM 논문 리뷰' 카테고리의 다른 글
[논문리뷰] Judging LLM-as-a-Judgewith MT-Bench and Chatbot Arena (INTRO) (4) | 2024.10.16 |
---|
댓글