스터디에서 DeepSeek를 발표하겠다는 선언을 해버렸다! 미뤄두고 미뤄두던 딥시크를 자투리시간에 공부할 수 있게되어 좋다 ,, 😄 V3부터 포스팅하고 R1으로 가겠다! (계속 업데이트 할 예정)
DeepSeek-R1 / DeepSeek-V3는 뭘까?
DeepSeek-R1 (DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning) 은 오픈소스로 공개된 reasoning 모델이지만 최근 OpenAI의 o1 performance를 능가했으며, DeepSeek-V3-Base를 추가로 학습해 만들어진 모델이다. Reasoning capability 향상을 위해 RL-based 방법을 이용했으며 (LLM + RL) PPO 대신 GRPO를 이용했다.
그렇다면 DeepSeek-V3의 경우에는, 매우 적은 컴퓨팅 자원으로 성공적으로 pre-training을 한 LLM이라고 생각하면 된다. Efficient하게 train한 모델이며, MoE (Mixture-of-Expert) 구조를 채택하였다. 그러므로 포스팅에서는 V3 부터 소개하겠다.
🐳 DeepSeek-V3
H800 x 2048대를 사용해 56일만에 학습을 완료한 671B (37B-Active) 모델이다. (아마 MoE를 사용해서 activate parameter 개수가 차이나는게 아닐까 싶다) 주요 component는 아래와 같다.
1. Multi-head Latent Attention
1.1. KV Cache
Auto-regressive LLM serving 연산에서는 보통 중복연산을 피하기 위해 KV Cache를 사용한다. 아래는 attention 구조를 나타낸 것인데, 사실 auto-regressive 구조에서는 과거의 key, value는 변하기 않기 때문에 이들을 캐싱해놓는 것이다.
어찌보면 Transformer에서 각 토큰은 입력 임베딩 → 선형 변환 → Key, Value 계산되므로, 특정 time step에서 key, value는 입력 토큰에 의해서만 결정된다. 그런데 auto-regressive 구조에서는 입력이 누적되면서 모델이 점진적으로 확장된 시퀀스를 보고 다음 토큰을 예측하는 방식이므로, 입력이 누적되고 key/value도 누적되는 것이다. (미래 토큰은 Causal Masking 적용)
1.2. Grouped-Quary Attention
하지만 답변이 길어지면 KV Cache도 커지기 때문에, 이를 방지하기 위한 여러 분야들이 있다. (e.g., KV Cache Compression)
그 중, Grouped-Quary-Attention (GQA)의 경우에는 하나의 토큰에 대한 cache를 KV 상관없이 통합하고 low-rank 공간에 latent하게 가지고 있다가, 사용할 때마다 upprojection 하여 사용하는 방법이다.
수식으로 나타내면 아래와 같다. c라는 latent spce의 벡터를 가져오게 되지만, 결국 attention 연산시에는 key/value를 만들어 줘야한다는건 동일하다고 할 수 있다. 그래서 사실 효율성이 전혀 개선되지는 않는 형태라고 볼 수 있다.
1.3. Multi-head Latent Attention
따라서 이 upprojection 과정을 방지한 구조가 Multi-head Latent Attention이다. 따라서 cache up projection 대신, 해당 upprojection matrix를 W_q^(s)에 흡수해 하나의 cache로 MHA (Multi-Head Attention)를 근사하는 형태이다. 따라서 기존 MHA는 하나의 토큰당 head 만큼의 key/value를 저장하는 것이 아니라, 하나의 토큰당 하나의 캐시벡터 c만 저장하면 되는 구조가 된다.
하지만 문제는 positional encoding이다. Rotary Positional Embedding의 경우 (RoPE) 아래와 같은 R matrix를 quey와 key에 곱하는 것으로 positional encoding을 진행한다. 이는 토큰 임베딩에 회전 행렬(rotation matrix)를 적용하여, 위치 정보를 내재적으로 포함하도록 설계된 것이다.
➡️ c.f. Rotary Positional Embedding (RoPE)
이걸 벡터의 모든 차원에 대해 적용하면, 입력 벡터의 모든 요소가 위치 p에 따라 회전하게 되어, 이렇게 하면 위치 정보가 벡터에 추가되지 않고, 벡터 자체에 내재적으로 포함되게 된다.
즉, RoPE는 단순한 위치 벡터를 더하는 방식이 아니라, Query와 Key를 각각 회전 행렬로 변환하여 위치 정보를 포함하게 만든다.
p과 q가 토큰의 index라고 할 때, 회전행렬 R을 같은 위치 p인 Query, Key에 적용하면 아래와 같이 원래 Q, K 내적이 유지된다. (R_p들의 내적이 사라짐)
하지만 다른 위치 p, q 에서 적용하면 Query와 Key의 내적 값이 두 토큰 간의 상대적 위치 (p−q)에 따라 변형되게 된다.
하지만 위 Multi-latent 과정으로는 positional embedding을 적용하기가 어려웠다. 수식을 전개해서 합치려고하면 positional embedding matrix가 position에 dependent 해지기 때문이다.
따라서 이를 해결하기 위해 positional encoding용 dimension (d_r) 을 추가로 두고, position 정보를 담을 수 있는 vector를 하나 더 만들어서 이걸로 position에 대한 정보를 인코딩함. 이 PE vector는 하나의 attn block당 하나만 저장되고, 전 head에 걸쳐 동일하게 적용된다. (그렇게 inefficient 하지 않다)
결론적으로, Multi-head Latent Attention의 경우
- Cache vector: 하나의 attn block 당 하나만 저장됨. (Multi-head 속성은 W_q에 흡수)
- PE vector: 역시 하나의 attn block당 하나만 저장됨. (Multi-head 속성 X)
2. DeepSeek MoE (Mixture-of-Expert)
MoE 구조는 워낙 유명해서 많이 들어봤겠지만, N_s개의 FFN은 shared expert로 사용하고, 나머지 N_r 개의 FFN 중 유동적으로 topk개를 골라 activate해 사용하는 구조이다.
3. Multi-Token Prediction Objective
V3가 pretraining에 사용한 특이한 loss이며, LLM이 nth next token에 대한 정보도 잘 담을 수 있도록 도입한 auxiliary한 loss이다. next-next token을 예측하기위한 장치라고 할 수 있겠다. 맨 왼쪽이 next-token prediction 구조이고, 이를 next next token 예측을 위해 concat 하여 사용한다.
다음에는 R1에 대해 포스팅하겠다!
'NLP' 카테고리의 다른 글
[Daily] Self-Correct Reasoning / Verification of LLM (0) | 2025.03.21 |
---|---|
[TIL] RAG (Retrieval-Augmented Generation) 훑어보기 (2) | 2025.01.12 |
[TIL] In-context Learning with Long-context LLMs (0) | 2024.09.13 |
[TIL] LLM as reward models/evaluators (#RLHF, #Self-improvement) (0) | 2024.08.30 |
[NLP] LORA : Low-Rank Adaptation of Large Language Models 논문 리뷰 (0) | 2023.04.04 |