Meta Llama 2
Llama 2 was pretrained on publicly available online data sources. The fine-tuned model, Llama Chat, leverages publicly available instruction datasets and over 1 million human annotations.
llama.meta.com
Llama : 가장 강력한 오픈 소스 대형 모델이었으나, 오픈 소스 계약으로 인해 상업적 용도로 무료로 사용할 수 없었음
-> 무료 상용 버전으로 출시된 Llama 2
연구용과 상업용으로 사용 가능한 foundation model(LLALA2) & fine-tuned chat 모델(LLAMA2-Chat) 두 가지 버전으로 공개
LLAMA 2 (Foundation Model)
- LLAMA1의 업데이트 버전
- pretraining corpus(훈련 데이터) 40% 증가 (1.4T tokens → 2T tokens)
- Context Length 2배 증가 (2K → 4K)
- Grouped-query attention 채택
- Variants: 7B, 13B, 70B (*34B 버전도 개발되었지만, red 팀의 시간 부족으로 인해 릴리즈를 연기 중)
LLAMA 2-CHAT (Fined-tuned chat Model)
- 대화형 use-cases에 최적화된 fine-tuned 버전
- Variants: 7B, 13B, 70B
LLAMA2 & LLAMA2-Chat의 학습 방법
LLAMA2를 공개 데이터셋으로 self-supervised learning한 후 생성
-> LLAMA2를 SFT(Supervised Fine-Tuning)하여 LLAMA2-Chat을 생성
-> LLAMA2-Chat은 RLHF(Reinforcement Learning from Human Feedback)으로 반복적으로 튜닝
LLAMA1과 LLAMA2의 차이
Llama2는 Llama1에 대해 sequence 길이를 더 늘리고 pre-training, fine-tuning, safety 측면에서의 차이만 있기 때문에 위의 내용을 보면 크게 다른 점이 보이지 않음
그 외의 차이로는 Llama2가 GQA (Group Query Attention)을 채택하고 있음
GQA
Llama2에 적용된 추론 속도 향상 기술
- MHA(Multi-Head Attention)과 MQA(Multi-Query Attention)의 장점을 결합한 기술
- LLM 학습에는 오랜 시간과 많은 자원이 투입되므로 모델을 다 만들어놨는데 GQA를 적용해 다시 학습시키는 것은 큰 부담이 되는데, GQA는 이미 학습된 모델에도 적용할 수 있음
- Multi-head Attention은 H(어텐션 헤드 개수)개의 QKV(Query, Key, Value)를 가짐
- 8개의 각 헤드에 대해서 Q 에 대한 각 key 값 value 를 구해주고 각각 inner product 곱하고 곱하고 즉, 일대일로 대응 했었음
- 각각의 KV 텐서를 로드하기 위해서는 많은 메모리가 필요
- Multi-query Attention은 H개의 Q(Query)와 1개의 KV(Key, Value)를 가짐
- 모든 헤드들의 개수에 대해서 하나만 수행하는 것
- 모든 Q(Query)는 KV(Key, Value)를 공유함
- Multi-query Attention으로 메모리를 절약할 수 있음
- Grouped-query attention
- 하나의 key로 계산, 하나의 value로 계산하여 컴퓨팅 타임을 줄이는 대안
- Grouped query attetion 그림에서 보면 멀티 헤드 어텐션 부분에서 2개의 key가 아닌 하나의 key 사용
- 각 Qeury에 대해서 Value도 마찬가지로 두 개 중 하나만 계산
=> GQA : MHA와 MQA의 중간. H개 있던 KV 헤드를 1개로 줄이는 대신 적절한 G개의 그룹으로 줄이는 것
- GQA는 Multi-query Attention 만큼 빠르며 성능은 Multi-head Attention과 비슷함
Structure
normal transformer block의 pre-normalization variant를 사용함
많은 transformer 구조가 layer normalization을 채택해 사용하고 있지만, LLAMA는 RMS Norm(Root Mean Square Layer Normalization)으로 layer normalization을 대체해 사용함
연산이 단순화된 기법이기 때문에 layer normalization에 비해 10~50% 향상된 효율성을 달성함
RMS Normalization
RMS Normalization은 배치 정규화(γ,β)와 같은 학습 가능한 파라미터가 없음
Batch Normalization은 매우 크거나 매우 작은 숫자를 다룰 때 수치불안정으로 인해 어려움을 겪을 수 있음
-> RMS Normalization은 루트 씌우고 n으로 나눠주고 실제 입력 값에 나눠주기 때문에 안정적임
모델에 비선형성을 제공해 데이터에서 더 복잡한 패턴 포착할 수 있음
- Batch Normalization
- 배치당 평균과 분산 이용해 데이터의 분포를 정규화하는 과정
- 학습 파라미터 (γ,β)를 조정함으로써 데이터가 목표 평균(target mean) 및 표준 편차(standard deviation)을 갖도록 보장
- 학습 파라미터를 사용해 배치들이 중심인 전체 평균으로 끌어올 수 있도록 함
RoPE : Rotary Positional Embeddings
: LLAMA2와 같은 transformer model에서 위치 정보를 인코딩하는 방법.
모델이 입력 시퀀스의 위치 정보를 더 잘 학습할 수 있도록 돕는 방법
rotary matrix와 rotation matrix 개념이 사용됨
- 기존의 위치 임베딩이 입력 토큰에 정적 임베딩을 더하는 것과 달리 RoPE는 임베딩에 회전 행렬을 적용하여 위치를 동적으로 인코딩함
- 위치 정보를 포함하도록 두 차원 각각에 대해 일정 각도만큼 회전시킴
-> 토큰의 상대적 위치를 더 잘 포착할 수 있게 하여, 학습 중에 본 시퀀스보다 더 긴 시퀀스에서도 모델의 일반화 능력을 향상시킴
Rotation Matrix
: orthogonal 개념을 이용한 것
-> Attention Layer 에서 Query와 Key의 Inner product를 수행할 때, rotation matrix를 곱하여 위치 정보(postional information) 반영함
Rotary Matrix
: 입력 임베딩 벡터에 위치 정보를 통합함
임베딩 벡터의 실수와 허수 부분을 각각 회전시키며, 이 과정에서 벡터의 위치 정보가 보존되고 반영됨
여기서는 실수와 허수 두개를 표시해주어 Rotaion Matrix 상에서 대각선으로 표시해준 것
- Query 와 Key 에 대해서만 Rotary Positional Embedding을 적용하는 것임
RoPE 적용 예시
- 로터리 포지션 임베딩은sinusoid 를 이용하여 구한 절대 포지션 값 값을 입력
GQA
위에서 설명함
SwiGLU - Activation function
LLAMA는 SwiGLU라는 activation function을 사용하며 3개의 행렬 곱을 사용함
-> 일반적으로 사용되는 ReLU에 비해 계산 비용은 더 많이 들지만, 사용 중인 계산량이 일정하게 유지되는 상황에서도 다른 activation 함수에 비해 성능이 향상되는 장점이 존재함
SwiGLU = Swish(=SiLU) + GLU : 2개의 activation functions를 섞어 만든 함수
- (-)값을 잃어버리는 ReLU의 단점을 해결함
1) Swish Function
sigmoid에 입력값을 한 번 더 곱해주는 모양
Swish function의 특징
1) Unbounded above where
sigmoid & tanh는 각각 (0, 1), (-1, 1) 범위이지만 ReLU의 범위는 [0, ∞)
-> 이 점이 gradient vanish를 막아줌 (ReLU의 전성기를 가져온 큰 요인)
이러한 장점을 Swish가 이어받음
-> 모든 양수값을 허용함으로써 정보를 살려감
2) Bounded below where
위의 특성은 너무 큰 음수값은 으로 내보내서 일종의 강한 규제(regularize 효과)를 거는 효과를 유도함
하지만 ReLU에서는 음수값에 대해서는 무조건 을 내보내므로 dying ReLU에 직면한다는 단점이 존재
-> 파생형으로 Leaky ReLU나 PReLU 등장
< 0 구간에서 값의 상한이 존재하며, 0으로 수렴함
-> Swish는 어느 정도 작은 음수값에 대해서 허용한다는 의미 (3의 non monotonicity와도 이어짐)
3) Non monotonicity
약간의 음수를 허용하고 있고 양수 부분이 직선 그래프가 x = ReLU와 비슷하게 생겼지만 표현력이 좋다는 의미
gradient가 작은 음수로 전해지더라도 온전히 이전 layer로 전할 수 있어서 학습이 잘 됨
4) Smooth figure
ReLU는 작은 변화에도 민감하게 반응해 학습이 어려워질 수 있는데, Swish처럼 경계가 흐릿하면 ReLU와는 반대로 작은 변화에는 작게, 큰 변화에는 크게 반응해 optimizer가 제대로 minima를 찾아가게 함
5) Computationally expensive
sigmoid로 인해 계산 오래 걸림
6) Self-gated
입력의 정보량을 조절하는 기능
- LSTM에서 나온 아이디어로써, 와 σ(βx)를 분리해 생각할 수 있음
σ(βx)는 항상 (0, 1) 범위의 값을 가지는데, 그 값을 결국 입력 자기자신 가 결정하기 때문에 self-gating이라고 부름
-> 이 또한 generalization을 돕고 overfitting을 막아줌
2) GLU function : GatedLinearUnits
swish와 마찬가지로 σ(xW+b)와 (xV+c)를 나누어 생각하면 (xV+c)가 σ(xW+b)의 Element-wise filter라고 이해할 수 있
3) SwiGLU
위의 두 가지를 결합한 형태
Architecture
- LLAMA2는 decoder-based model
-> 한 번에 하나의 토큰만 생성함 - 현재 레이어의 output은 다음 레이어의 input token이 됨 (Autoregressive)
I am a student -> student라는 output을 예측한다고 하면 아래와 같음
Pre-training
Llama1과 같이 공개된 데이터셋만으로 pre-training을 진행함
-> 충분한 컴퓨팅 소스를 갖고 있는 사람들이 pre-trained process를 공개적으로 복제할 수 있도록 하기 위함임
대신, Llama2는 공개된 데이터셋들을 그대로 이용하지 않고, 고품질이면서 사실로 판단된 소스들만 의도적으로 sampling하여 혼합된 데이터셋을 만들어 사용함
-> 여러 데이터셋의 고품질 내용만 혼합하여 pre-training dataset을 이전보다 40% 늘리고, 이로 인해 이전에 비해 보유한 지식의 기반이 더 향상됨
Supervised Fine-tuning
독점 모델(GPT-4)과 같이 광범위한 대화의 양과 인간 피드백에 의한 격차를 줄이기 위해 그와 유사한 방식으로 대규모 dataset을 사용해 fine-tuning된 Llama2-Chat을 생성함
= 가능한 완전 오픈소스를 제공하기 위한 노력의 일환
SFT의 두 단계를 수행함
STEP 1) 더 많은 양의 공개 데이터에 대해서 학습
STEP 2) 훨씬 더 높은 품질로 선별된 소규모 데이터에 대해서 학습
또한 LLAMA2-Chat은 위와 같이 alignment된 training 구조로 할루시네이션을 줄이고 unsafe question을 피하고자 함
이때 유용성과 안정성을 위해 SFT와 RLHF를 모두 사용함
SFT와 LoRA로 LLAMA2를 fine-tuning 시키는 과정은 아래와 같음
- LoRA를 이용해 LLAMA2를 finetuning하는 과정 설명하고 있음
- LoRA : pretrained model의 가중치를 frozen하고, 각 transformer blocks에 trainalble한 layer를 주입
How to fine-tune LLaMA 2 using SFT, LORA (accubits.com)
How to fine-tune LLaMA 2 using SFT, LORA
Here, we'll learn how to fine-tune LLaMA2 using two exceptional techniques: SFT (Supervised Fine-Tuning for full parameter) and LORA.
blog.accubits.com
RLHF
SFT는 많은 LLM에서 채택되고 있는만큼 성능은 확실하나 alignment의 목표를 정확히 포착해 선별하고 관리함에 있어서는 부족할 수 있음
-> 직접 인간이 이에 대해 피드백하고 품질 향상에 이용하는 것이 제시됨. 인간이 피드백함으로 그 선호도 점수에 따라 LLM을 최적화하는 것
Full model
하늘색 block : TransformerBlock으로 구성. attention_norm으로 시작해서 feed_forward로 block 마무리됨
Input Tokens
llama2의 dictionary는 약 32000개 정도
모델의 차원은 d_model = 4096
헤드를 32개까지 사용할 수 있음 -> 굉장한 다양성 부여됨
d_k = 4096/32 = 128
모델의 차원과 마찬가지로 input size는 최대 4096개까지 가질 수 있음(Llama1은 2048개)
1) Embedding
단어 tokenization
2) RMS Norm - 첫번째 정규화
RMS Norm을 거쳐 Input token size와 d_model의 곱으로 이루어진 Output이 나옴
3) Rotary Position Embedding
Rotation matrix R(θ)는 d_model * d_model
- d_model은 모델의 embedding 차원
- rotation matrix는 임베딩 벡터의 각 차원을 회전시키는 역할
Rotation Matrix를 쿼리의 Weight Matrix에 곱해주고 (W_q) 그 다음에 Key의 Weight Matrix에 곱해줌(W_K)
-> 각 토큰 위치에 대해 회전 행렬을 적용해 위치 정보를 통합
위치 정보가 포함된 임베딩 벡터는 W_q, W_k와 곱해져서 Postional Encoded Weight Matrix of Query 와 Position Encoded Weight Matrix of Key가 만들어짐
4) Masked Self-Attention
하늘색 부분 각 R과 W는 곱해서 Positional Encoded Weight Matrix of Query와 Position Encoded Weight Matrix of Key를 구함
-> 여기에 인풋 x_m, x_n을 곱해줌
Grouped Multi-Query Attention 과정
attention을 구해야 하는데, 이 때 위에서 구한 grouped multi-query attention을 사용함
- 여러 헤드를 하나의 그룹으로 묶어 공통의 키(Key)와 값(Value) 행렬을 사용하여 계산 효율성을 높임
Step 1) 쿼리 행렬 계산: 각 헤드별로 개별 쿼리(Query) 행렬을 계산
- Head_1과 Head_2를 하나의 그룹으로 봤을 때, 거기에 곱해주는 뒤의 Key matrix 는 하나임
Step 2) 키 행렬 공유: 같은 그룹의 헤드들은 동일한 키(Key) 행렬을 사용하여 계산함
Step 3) 어텐션 스코어 계산: 쿼리와 공유된 키 행렬을 곱하고, 스케일 다운 후 소프트맥스를 적용하여 어텐션 스코어를 구함
Step 4) 값 행렬 공유: 같은 그룹의 헤드들은 동일한 값(Value) 행렬을 사용하여 계산된 어텐션 스코어를 곱함
- 첫 번째 Head_1 에서 Value Matrix 계산 후 마찬가지로 Head_2 에서도 동일한 값 Value Matrix 값을 사용하여 attention score에 곱함
Step 5) 결과 합산: 각 헤드의 결과를 합산하여 최종 어텐션 출력을 만듦
- 각 헤드마다 attention value matrix가 출력됨
5) Concatenated Heads Matrix
attention layer를 통해 계산된 각 헤드의 attention value matrix를 concat
concatenated matrix에 weight matrix를 한번 더 곱함
- weight matrix 크기 : d_model * d_model
- 헤드들이 다 합해진 것이기에 사이즈가 d_k가 아닌 d_model임
- output은 (input token size) * (d_model)
6) RMS Normalization - 두 번째
위에서 output으로 나온 output of grouped query attention과 초반의 embedding layer의 output을 더한 후 두 번째 RMS Norm으로 들어감
7) SwiGLU FeedForward
F1 : 컴퓨팅 타임을 줄여주기 위해 가중치 행렬 을 사용하여 입력 차원을 늘림
- d_ffnn : 사용자가 결정할 하이퍼 파라미터
- 모델이 입력의 상황 정보를 이해하고 의미 있는 토큰 표현을 생성할 수 있도록 도움
F2 : F1 아웃풋에 SwiGLU를 적용.
- SwiGLU의 non linear 특성이 반영되면서 차원은 이전과 똑같음
F3 : 가중치 행렬 를 사용하여 입력의 차원을 원래 모양으로 줄
8) RMS Norm - 세 번째
앞의 RMS Norm의 결과값과 FFNN(SwiGLU)의 결과 값을더해 정규화함
9) Linearization
linear layer를 통해 input (앞의 결과)의 차원을 vocab set의 사이즈만큼 키움
- weight matrix에서 차원을 vocab size로 맞춰주고 곱함
10) SoftMax (Classification Probability)
최종적으로 softmax를 적용하면 각 vocab마다의 어떤 확률이 나옴
Llama 2: Open Foundation and Fine-Tuned Chat Models (velog.io)
Llama 2: Open Foundation and Fine-Tuned Chat Models
마지막 주차 논문 리뷰
velog.io
라마2에 적용된 추론 속도 향상 기술인 GQA(Grouped Query Attention)에 대해 (sk.com)
라마2에 적용된 추론 속도 향상 기술인 GQA(Grouped Query Attention)에 대해
devocean.sk.com
[ Llama 2 ] analyze model and review code. (velog.io)
[ Llama 2 ] analyze model and review code.
Llama 2 : analyze model and review code.
velog.io