본문 바로가기

논문 리뷰

DeepSeek-V3 Technical Report 리뷰

출처: DeepSeek-V3 Technical Report

Architecture

Figure 2 ❘ Illustration of the basic architecture of DeepSeek-V3

"The basic architecture of DeepSeek-V3 is still within the Transformer framework." (DeepSeek-AI, 2025, p. 6)

즉, 기존의 Transformer 뼈대(Framework)는 그대로 유지하였고, 내부의 핵심 부품(모듈)들만 교체 및 고도화한 구조이다.

Multi-Head Latent Attention

MLA 구조 일러스트 (논문 수식 포함)

핵심 차원 및 레이블 의미 정리

  • h_t(input hidden state): 현재 토큰의 입력 벡터 (차원: d_model_7168)
  • c_t^{KV} (latent KV): Key와 Value를 통째로 압축한 저차원 벡터 (차원: d_c=512 << d_model x n_h)
  • c_t^Q (latent Q): Query도 동일하게 압축한 저차원 벡터 (차원: d'_c=1536)
  • K_{t,i}^C, V_{t,i}^C (compressed K,V): 압축 풀린 각 헤드(i)의 컨텍스트 성분 벡터 (차원: d_h=128)
  • q_{t,i}^R, k_{t,i}^R (RoPE Q,K) 회전 위치 임베딩을 적용하기 위해 따로 뽑아낸 위치 정보 전용 벡터 (차원: d_h^R:=64)
  • [q_{t,i}^C;q_{t,i}^R], [k_{t,i}^C;k_{t,i}^R]: context vector와 rotate vector를 concatenate 하여 최종 어텐션 연산용 쿼리와 키 도출 (최종 차원: d_h + d_h^R)

QnA

Q. h_t가 의미하는 바?

A. 현재 레이어의 입력 히든 스테이트.

     기존 트랜스포머, MHA 구조에 비교하면 h_t가 곧장 개별 Q,K,V로 나눠지는데,

     MLA에서의 h_t는 메모리를 아끼기 위해 잠재 벡터라는 중간 압축 파일로 변환하여 사용한다.

     즉, 이전 레이어의 출력이나 임베딩 층을 거쳐 올라온 현재 토큰(t)의 다차원 벡터 표현으로 Q,K,V로 쪼개지기 이전 상태이다.

 

Q. 추론(생성) 시 캐시에 latent KV와 key 위치 값만 저장한다. 왜 latent Q는 저장하지 않는가?

A. Query는 캐싱할 필요가 없기 때문.

     LLM의 자동 생성(Autoregressive) 추론 과정에서 K,V는 과거에 생성된 모든 토큰들의 정보를 기억하고 있어야 하므로 메모리(KV Cache)에 계속 누적 저장해야 하지만

     Query는 현재 막 생성하려는 단 한 개의 토큰에 대한 값만 있으면 된다.

     따라서, 현재 시점(t)의 h_t로 즉석에서 생성해 쓰고 버리는 일회성 데이터이므로 캐시에 저장할 이유가 없다.

 

Q. latent KV와 latent Q의 압축 차원이 다른 이유?

A. 압축을 하는 목적과 도달하려는 목표가 다르기 때문.

     Latent KV는 추론할 때 GPU의 KV 캐시 메모리 소모량을 줄이는 것이 최우선 목표이므로,

                          메모리를 극도로 아끼기 위해 아주 작은 차원으로 강하게 압축

     Latent Q는 학습할 때 Backpropagation을 위해 보존해야 하는 활성화 메모리를 아끼는 것이 목표이므로,

                          모델의 표현력을 해치지 않는 선에서 KV와는 독립적인 최적의 차원으로 별도 설정한 것

 

Q. latent KV, Q의 효과는?

A.

     Latent KV는 기존 MHA 대비 KV 캐시 메모리 점유율을 크게 감소시킨다.

                          이로 인해, 한 번에 처리할 수 있는 배치 크기가 거대해지고, 긴 문맥을 다룰 때 메모리 부족(OOM) 문제가 완화됨.

     Latent Q는 학습 시 활성화 메모리를 줄여주어 더 큰 배치로 안정적인 훈련이 가능해진다.

 

Q. 왜 context와 rotate를 따로 구하는가?

A. RoPE의 동적 특성과 행렬 압축 연산이 수학적으로 서로 호환되지 않기 때문이다

    이유 1: 개념적 원인 - 위치 정보의 동적 특성

        RoPE는 토큰 간의 '상대적 거리'를 반영하기 위해, 각 토큰의 위치에 따라 서로 다른 회전각을 적용하는 위치 인코딩 방식이다

         매 스텝 새로운 토큰이 생성될 때마다 해당 토큰의 위치에 맞춰 동적으로 회전각을 계산한다.

        즉, 모든 토큰에 일괄 적용할 수 있는 하나의 고정된 가중치 행렬이 아니라,

         토큰 위치마다 다른 회전 변환이 적용되므로, context와 동일한 방식으로 압축하여 다루기 어렵다.

     이유 2: 수학적 원인 - MLA의 저랭크 재구성 최적화 유지

         MLA는 캐시 메모리를 극대화하여 아끼기 위해,

                     키 투영 가중치 행렬(W^{UK})을 쿼리 쪽에 미리 흡수시켜 내적하는 수학적 연산 최적화 공식을 사용한다.

         만약 압축된 키 벡터에 RoPE를 함께 포함시켜 버리면, 토큰 위치마다 서로 다른 회전 변환이 중간에 개입하게 된다.

           위치 변환 행렬과 가중치 행렬의 순서가 뒤섞여 이 최적화 수식이 성립하지 않고 깨지게 된다.

            즉, MLA가 사용하는 저랭크 재구성 및 행렬 결합 최적화를 적용하기 어려워진다.

       따라서, 가중치 결합 최적화를 적용할 수 있는 위치 정보가 없는 순수 Context와 위치 정보만 가진 Rotate를 분리하여

                    각각 구한 뒤, 어텐션 점수를 계산하기 직전에 concat하는 방식을 사용

 

Q. multi-head attention에 들어가는 값?

A. 각 헤드(i)별로 완벽하게 복원 및 결합이 완료된 최종 Query, Key, Value 벡터

     Query [q_{t,i}^C;q_{t,i}^R]   /   Key [k_{j,i}^C;k_{j,i}^R   /  Value v_{j,i}^C

     (t는 현재 시점, j는 과거부터 현재까지 누적된 모든 토큰의 시점, i는 헤드 번호)

 

Q. 기존 MHA 메모리 폭발 문제를 해결하기 위해 사용했던 KV Cache 방식 (MQA, GQA)들과 MLA의 차이는?

(MQA: KV 헤드를 무조건 딱 1개만 남김 / GQA: KV 헤드를 8개 정도로 묶어서 줄임)

A. 기존 방식 (MQA, GQA)는 KV 헤드의 개수 자체를 강제로 깎아내어 물리적인 데이터양을 줄이는 방식으로

       메모리 문제는 해결했지만, 문맥을 다각도로 분석하는 멀티헤드 고유의 역량 떨어져 일정 수준의 성능-메모리 trade-off 존재

     해당 논문의 MLA는 헤드의 개수를 절대 건드리지 않는다.

       어텐션 연산을 할 때는 원래 MHA 수준의 풍부한 멀티헤드를 그대로 유지하되, GPU 메모리(KV Cache)에 저장할 때만 잠재 공간으로 압축했다가 연산 직전에 실시간으로 복원하는 방식을 사용

 

Multi-Head Attention 및 Output 계산 (식 10, 11)

10, 11번 식

헤드별 문맥 벡터 계산 (식 10)

  • q_{t,i}^T k_{j,i} (최종 쿼리와 키의 내적) : 토큰 간의 유사도 (Attention Score)를 구한다
  • \sqrt{d_h + d_h^R} (스케일링 분모) : 기존 트랜스포머와 달리, MLA는 위치 정보 차원이 따로 존재해 전체 차원이 커졌다
  • v_{j,i}^C (value 벡터 결합 및 문맥  벡터 o_t,i 생성) : Softmax를 사용한다
  • 결과물: i번째 헤드의 최종 문맥 정보가 담긴 벡터 o_{t,i} (차원: d_h)가 생성된다

최종 출력 Hidden State 계산 (식 11)

  • [o_{t,1}...;o_{t,n_h}] (헤드 결합) : 모든 헤드에서 독립적으로 계산되어 나온 문맥 벡터들을 다시 concatenate
  • W^o (Output Projection - 최종 출력) : 하나로 합쳐진 전체 헤드의 결합 벡터에 출력 투영 행렬을 곱해준다
  • 결과물: 최종 출력 벡터 u_t (차원: d_model)

DeepSeekMoE & Auxiliary-Loss-Free Load Balancing

MoE 구조 일러스트 (논문 수식 포함)

핵심 차원 및 레이블 의미 정리

  • u_t (input hidden state): FFN 층으로 들어오는 현재 토큰(t)의 입력 벡터 (차원: d_model)
  • e_i (centroid vector / expert embeddings) : i번째 라우팅 전문가가 가진 고유한 대표/중심 벡터. (차원: d_model)
  • s_{i,t}: (affinity score): 라우터 연산을 통해 계산된 i번째 전문가와 현재 토큰 간의 유사도/친밀도 점수
  • b_i (bias) : auxiliary-loss-free 전략에 따라, 로드 밸런싱을 위해 동적으로 조절되는 전문가별 편향 값
  • g_{i,t} (gating value) : Top-K_r 연산을 거쳐 최종 살아남은 전문가에게 부여되는 게이팅 값 (선택받지 못한 전문가는 0)
  • FFN_t^(s) (shared expert): 초록색 박스들의 물리적 연산 블록. 공통 지식을 처리 (차원: d_model)
  • FFN_t^(r) (routed expert): 파란색 박스들의 물리적 연산 블록. 각 분야의 세분화된 전문 지식을 처리 (차원: d_model)
  • h'_t (output hidden state) : 공통 전문가와 라우팅 전문가의 출력을 모두 더해 만들어진 최종 출력 벡터 (차원: d_model)

QnA

Q. 기존 MoE와의 차이점

A. Fine-grained Experts

        기존 MoE는 거대한 전문가들을 사용하였다. (Ex. 전체 전문가 후보가 8명)

        DeepSeek는 이를 여러 개의 초소형 전문가로 잘게 쪼개어 사용하였다.

          (전체 라우팅 전문가 후보: 256명, 활성화되는 라우팅 전문가: Top-8 / 공통 전문가: 1명, 라우팅 전문가 1개 크기와 동일)  

     Shared Experts

        또한, 모든 토큰이 무조건 거쳐 가는 Shared Experts를 별도로 두어, 언어의 공통 기초 지식은 얘네가 처리하도록 만들었다.

 

Q. centroid vector?

A. centroid vector는 각 router expert를 대표하는 학습 가능한 벡터이다.

     backpropagation을 통해 다른 파라미터들과 똑같이 자동으로 업데이트되며 최적화되는 값이다.

     (학습이 진행되면서 해당 expert가 담당하는 토큰 분포의 중심 방향을 나타내도록 최적화된다.)

  • 개념적 맥락 :과거에 해당 전문가로 많이 전달(Route)되었던 토큰 임베딩들의 평균적인 '중심점' 역할을 하도록 라우터 가중치가 학습되는 원리이다

Q. DeepSeek-V2에서는 affinity 점수를 구할 때 softmax를 사용했는데, 왜 V3는 sigmoid 사용했나?

A. auxiliary-loss-free 전략을 수학적으로 호환시키기 위함이다

     softmax는 모든 전문가의 점수를 다 더해서 1로 만드는 '상대 평가' 방식으로,

        특정 expert의 bias 조정이 다른 expert의 점수에도 영향을 준다.

     sigmoid는 각 전문가를 개별적으로 0~1 사이로 평가하는 '절대 평가' 방식이다.

        개별 점수에 bias를 더해도 다른 전문가에게 간섭을 주지 않으므로, bias 기반 로드 밸런싱과 더 잘 호환된다.

     정리하면,

         하나를 강하게 선택하는 경향이 있는 softmax 대신 여러 expert를 동시에 선택하기 쉬우며 bias 기반 로드 밸런싱과 궁합이 좋은 sifmoid를 사용하여

          load balance 개선, expert 활용 증가 효과를 기대하고자 하였다

 

Q. 논문의 14번, 16번 식은 둘다 g'을 구하는 식이다. 실제 논문의 저자들이 채택한 식은 16인가?

A. 네.

 

Q. 14번 식은 기존 MoE에서 사용된 방식인가요?

A. 네. 또한, V2에서는 16번 식 대신 해당 식을 사용하였다.

 

Q. 해당 논문에서 V3는 V2의 DeepSeekMoE 구조를 채택하였고 auxiliary-loss-free 16번 공식을 처음 사용했다.

     그렇다면 V2에서는 기존 MoE랑 뭐가 달랐나?

A. DeepSeekMoE 아키텍처(shared expert + fine-grained experts) 자체는 이미 V2에서 완성되었다.

    다만, V2에서는 특정 전문가에게 토큰이 몰리는 unbalanced 현상을 방지하기 위해, auxiliary loss 함수를 사용하였고

     V3에서는 auxiliary loss를 삭제하고 bias 조절 트릭(auxiliary-loss-free load balancing)을 사용했다.

 

Q. g'은 affinity score + bias 값을 기준으로 TopK 나열한 affinity score 인가?

A. 네.

     bias는 expert 선택에만 사용되고 expert 출력 가중치 g값에는 사용되지 않는다.

 

Q. bias는 어떤 기준으로 학습 중에 변하는가?

A. 매 학습 스텝(혹은 일정 주기)마다 각 전문가에게 할당된 토큰의 개수를 모니터링한다.

     해당 전문가가 일을 많이 했으면 bias를 깎고, 놀고 있으면 bias를 높여서 선택되도록 한다.

     (bias는 gradient로 학습되는 파라미터가 아니라, expert load를 기준으로 규칙적으로 업데이트된다.)

 

Q. gating value를 구할 때 g'을 그대로 사용하지 않고 정규화 과정을 거치는 이유

A. 전문가들의 출력합산이 급격하게 튀거나 왜곡되는 것을 막기 위함이다

     affinity score 들은 sigmoid를 통해 독립적으로 계산되었기 때문에,

      상위 8개를 뽑아서 그냥 더하면 그 합이 1.5가 될 수도 있고 0.4가 될 수도 있다.

      만약 이 값을 그대로 전문가 출력에 곱해버리면 출력 스케일 편차가 커질 수 있다.

          (즉, 확률 분포처럼 전문가들의 기여도 총합을 1로 맞춰주는 과정이 필요)

      따라서, 살아남은 상위 K_r 개의 점수 총합이 무조건 1이 되도록 나눠서 정규화를 해준다.

 

Q. 각 FFN 연산은 값들을 하나의 벡터로 만들어주는 과정인가?

A. 네.

     FFN은 입력으로 받은 d_model 차원의 벡터를 비선형 변환한 뒤, 다시 동일한 d_model 차원의 벡터로 출력하는 과정이다

     따라서 각 Expert FFN은 자신만의 방식으로 입력 토큰을 해석하여 하나의 문맥 표현 벡터를 생성한다.

 

Q. 최종 출력값인 h'_t에 대해 12번 식을 보면 u_t 또한 더해주는데 그림을 보면 u_t가 연결되어 있지 않다. 해당 u_t는 어디에서 온 값인지?

A. MLA의 출력값이 u_t는 두 경로에서 사용된다.

     한 경로는 현재 다루고 있는 MoE 전문가 영역의 입력으로 들어오고,

     다른 경로는 MoE 블록 전체를 크게 감싸며 밑바닥에서부터 꼭대기 합산 기호로 연결되는 우회라인으로 전달된다.

     즉, 전문가들을 거치지 않은 원본 u_t를 그대로 보존해 두었다가

           식 12에서 h'_t를 계산할 때 Residual Add(잔차 연결)로 더해준다.

 

Q. 12번 식의 세 번째 항은 FFN 앞에 g_{i,t}를 곱해주는데 왜 이런 연산이 일어나는가?

A. 각 분야 전문가들의 '발언권(비중)'을 다르게 조절하기 위해서이다.

     즉, 라우터가 계산해 낸 gating value대로 전문가들의 지식을 황금비율로 섞기 위해 점수를 곱해주는 것.

     gating value를 적용하는 과정이 마지막 연산에서 일어나는 것이다.

      (어떤 전문가를 선택할지는 Top-K 라우팅 단계에서 결정되었고, 여기서는 선택된 전문가들의 기여도를 조절하는 것)

Multi-Token Prediction

Figure 3 ❘ Illustration of our Multi-Token Prediction (MTP) implementation

핵심 차원 및 레이블 의미 정리

  • D: 메인 모델의 예측을 제외하고 MTP 모듈을 통해 예측할 추가 토큰의 깊이를 의미
  • h_i^{k-1}: 이전 단계의 트래스포머가 출력한 히든 스테이트. 즉, k-1번째 depth에서의 i번째 토큰 표현 (차원: d_model)
  • Emb(t_{i+k}): 입력 시퀀스 내의 i+k번째 토큰(t_{i+k})의 임베딩 벡터. 학습 시에는 ground truth token 사용 (차원: d_model)
  • M_k: Linear Projection Matrix. 두 개의 d_model 벡터를 concat한 2d_model 차원 입력을 다시 d_model 차원으로 투영.
  • h'_i^k: linear projection의 산출물이다. k번째 depth의 transformer block 입력으로 사용된다. (차원: d_model)
  • TRM_k (transformer block): MTP 모듈 고유의 독립적인 1개짜리 트랜스포머 블록으로 현재 depth의 출력 표현 h_i^k 생성
  • P_{i+k+1}^k: k번째 추가 예측 토큰에 대한 확률 분포

QnA

Q. input token이 t1~3이고 마지막 모듈의 target token이 t6~8일 때, D는?

A. 추가 예측 토큰이 t5~8 이므로 D는 4이고 main model을 제외한 MTP module의 개수도 4이다.

 

Q. 왜 MTP module의 입력에 현재 토큰이 아닌 다음 토큰 t_{i+1}이 들어가는가?

A. MTP의 목적은 단순히 다음 토큰을 예측하는 것이 아니라, 더 먼 미래 토큰을 예측하는 능력을 학습하는 것이다.

     메인 모델은 이미 현재 토큰을 이용하여 다음 토큰 t_{i+1}을 예측하고 있으며,

     MTP 모듈은 ground truth 토큰 t_{i+1}의 정보를 추가로 활용하여 그 다음 토큰인 t_{i+2}를 예측한다.

     즉, 현재 토큰으로부터 한 단계 더 나아간 미래 예측 신호를 제공하기 위함이다.

 

Q. 왜 미래 토큰 Emb(t_{i+k})를 입력으로 주는 Cheating이 아닌가?

A. MTP는 학습 단계에서만 사용되는 보조 목적 함수이기 때문에 치팅이 아니라 정당한 지도학습이다.

     학습 시에는 Ground Truth Token을 활용하여 미래 토큰 예측 능력을 강화한다.

     추론 시에는 MTP 모듈을 제거하므로 미래 정보를 사용할 수 없다.

      (추론 시에는 MTP 모듈을 직접 제거하고 메인 모델이 독립적으로 정상적으로 작동할 수 있다.)

 

Q. RMSNorm은 어떤 과정인가?

A. 입력 벡터의 크기를 정규화하여 학습을 안정화하는 과정이다.

     LayerNorm과 유사하지만 평균을 빼지 않고 RMS(root mean square) 값만 이용하여 정규화한다.

     이를 통해, 벡터의 방향(의미) 정보는 유지하면서 크기만 적절한 범위로 조정함.

 

Q. h_i^{k-1}와 Emb(t_{i+k}) 중 누가 더 중요한 정보인가?

A. 둘다 필요하며 역할이 다르다. (논문에서는 어느 쪽이 더 중요하다고 언급하지 않음)

     h_i^{k-1}는 메인 모델 및 이전 MTP 모듈들이 축적해 온 문맥 정보를 담고 있다.

     반면 Emb(t_{i+k})는 미래 토큰 자체의 정보를 제공한다.

     따라서 하나는 지금까지의 문맥, 다른 하나는 새롭게 알려주는 미래 정보 역할을 하며

      둘을 결합하여 다음 미래 토큰을 예측한다.

 

Q. 이전 depth의 표현과 새로 들어온 토큰 두가지 정보를 concat하는데 어떻게 Linear Projection의 산출물은 d_model의 차원을 갖는가?

A. 두 벡터는 각각 d_model 차원을 가지므로 concat 이후에는 2d_model 차원이 된다.

     이후 Projection Matrix M_k (d x 2d 행렬) 를 곱하여 다시 d_model 차원으로 압축하는 과정을 거친다.

21번 식

 

Q. 왜 concat 후 다시 Linear Projection을 하는가?

A. 이전 depth 정보와 새로 들어온 토큰 정보를 하나의 벡터로 융합하고

     위 질문처럼 concat 이후 2d_model이 된 차원을 Transformer Block의 입력 차원인 d_model로 다시 맞춰주기 위해 사용한다.

   (메인 모델이 빌드업해 온 누적 문맥 정보와 새로 들어온 단일 토큰 정보를 단순히 더하기만 하면

    두 정보가 하나의 벡터에 섞여 각 정보의 역할을 구분하기 어려워진다.

    따라서 concat을 통해 두 정보를 모두 보존한 상태로 결합한 뒤, linear projection 행렬을 통과시켜

    두 정보의 관계성을 학습하고, transformer block이 사용할 수 있는 하나의 d_model 차원 벡터로 압축 변환하는 것이다.)

 

Q. main model의 transformer block과 MTP module의 transformer block의 차이? (+ 개수가 다른 이유)

A. main model의 transformer block은 실제 추론에 사용되는 언어 모델의 본체로

       전체 문맥을 깊이 있게 이해하기 위해 여러 transformer layer로 구성된다. 

    반면, MTP module의 transformer block은 미래 토큰 신호만 추가로 제공하는 보조 모듈이고,

       모델이 너무 무거워지는 것을 막기 위해 각 depth마다 딱 1개의 transformer block만 사용한다.

    이는 MTP의 목적이 별도의 언어 모델을 만드는 것이 아니라 미래 토큰 예측 신호를 추가로 제공하는 것이기 때문이다.

 

Q. 왜 각 depth마다 Transformer block을 새로 두는가?

A. 각 depth마다 예측해야 하는 미래 토큰과의 '거리(time-step gap)'가 서로 다르기 때문이다.

     따라서 서로 다른 거리의 미래 토큰을 예측을 학습할 수 있도록 독립적인 가중치 파라미터를 갖는다.

 

Q. Embedding Layer과 Ouput Head를 공유하는 것의 의미와 효과?

A. 메인 모델과 MTP 모듈이 동일한 토큰 표현 공간과 동일한 단어 예측 기준을 사용하도록 만들기 위함이다.

        그래야 MTP 모듈이 뱉어내는 보조 학습 신호가 메인 모델의 뇌(가중치)를 올바른 방향으로 교정할 수 있다.

    또한 별도의 embedding layer와 output head를 만들지 않아 파라미터 수를 줄일 수 있다.

 

Q. input token과 target token을 보면 여러 토큰이 들어가게 되는데 이를 배열로 생각해서 파라미터 i를 이해하면 되는가?

A. 네. 

     i는 입력 시퀀스 내 토큰의 위치(index)를 의미한다.

 

Q. 위의 질문이 맞다면 메인 모델 및 각 모듈은 총 4번의 연산을 진행하는가?

A. 네.

    예를 들어 입력이 t1,t2,t3,t4라면 main model과 각 MTP module은 시퀀스 내 모든 위치에 대해 병렬로 연산을 수행한다.

    따라서 하나의 토큰만 처리하는 것이 아니라 시퀀스 전체 길이만큼 동시에 계산한다고 이해하면 된다.

    (여기서 4번 연산의 토큰 개수가 4개라는 의미이지, 모델을 4번 순차 실행한다는 의미는 아니다.)

 

Q. T는 입력 시퀀스의 길이라고 하는데

     임베딩 레이어를 공유하고 있어서 모델이 알고 있는 총 토큰(과거,현재,미래 포함)의 개수로 이해하면 되는가?

A. 아니요.

     T는 현재 입력으로 주어진 시퀀스의 길이만 의미한다.

     embedding layer 공유 여부와는 관계가 없으며, 모델이 학습한 전체 vocabulary 크기와도 다른 개념이다.

     예를 들어, 모델이 아는 단어 종류가 10만 개(Vocab)이더라도,

                    지금 학습하라고 던져준 한 줄의 문장이 4개 단어로 되어 있다면T=4가 된다.

      DeepSeek V3의 아키텍처에서 예시를 들면 module1에 t2, t3, t4, t5가 input token으로 들어오고 있으므로 T=4

 

Q. OutputHead의 출력값이 확률분포이면 다음에 생성할 토큰 후보들에 대한 확률 분포가 나오는 것인지?

      아니면, 다음에 생성할 토큰 하나만 예측을 하는데 모델이 그 값을 도출한 예측 확률을 알려주는 것인지?

A. 전자가 맞다.

    output head는 vocabulary에 존재하는 모든 토큰에 대한 확률 분포를 출력한다.

    그 중 가장 높은 확률의 토큰이 예측 결과가 되며, cross entropy loss 계산에도 이 전체 확률 분포가 사용된다.

 

Q. complete causal chain의 의미와 효과?

A. 이전 depth의 출력 표현을 다음 depth의 입력 계산에 반영하여 예측 과정의 인과 관계를 유지하는 것을 의미한다.

     이를 통해 t+3을 예측할 때 t+2 예측 과정에서 얻은 정보를 활용할 수 있으며,

                    미래 토큰 간의 연관성을 더 잘 학습할 수 있다.

 

Q. Gloeckle과의 차이

A. 둘 다 토큰 예측 간의 인과 관계를 유지하며

     autoregressive 제약을 만족하여 미래 토큰 정보를 볼 수 없다는 공통점이 있다.

     다만, 미래 예측 토큰들 간의 인과적 연결 유무에서 차이가 있다.

      complete causal chain은 이전 depth에서 생성된 표현이 다음 depth의 입력 계산에 직접 사용되어

                                                       모든 예측 단계가 순차적으로 연결되어 있는 구조를 의미한다.

     반면 Gloeckle 등의 병렬 방식에서는 각 미래 토큰 예측이 main model 출력에서 독립적으로 분기되므로,

                                                             미래 토큰들 사이의 정보 전달이 일어나지 않는다.

 

Q. outputhead에 넣기 전, 1:T-k까지 슬라이싱을 진행하는데 이는 모델이 현재 시점에서 예측할 수 있도록 인풋을 제한하는 것인가?

A. 네.

     k번째 depth에서는 k칸 뒤의 미래 토큰을 예측해야 하므로, 입력 시퀀스 뒤쪽 일부 위치는 정답 토큰이 존재하지 않게 된다.

     따라서 1:T-k까지만 사용하여 예측 가능한 위치만 남기고 나머지는 제거한다.

      (즉, 예측해야 할 정답 시점이 존재하는 안전한 범위까지만 남겨야 output head가 인덱스 오류 없이 해당 위치의 미래 토큰을 채점하고 예측할 수 있기 때문이다.)

 

Q. 추가적으로 MTP모듈을 speculative decoding에 재활용하여 generation latency를 개선할 수 있다고 하는데 이건 무슨 의미?

A. 추측성 디코딩 speculative decoding 기술을 추가 비용 없이 구현했다는 의미이다.

     원래 MTP 모듈은 학습 시 미래 토큰 예측을 위한 보조 목적 함수로 사용된다.

     하지만 추론 시에는 이 모듈들을 활용하여 여러 개의 미래 토큰을 미리 추측 생성한 뒤,

        메인 모델이 이를 한 번에 검증하도록 만들어 생성 속도를 높일 수 있다.

        즉, 학습을 위해 만든 MTP 모듈을 추론 단계에서도 재활용하여 generation latency를 줄일 수 있다는 의미

 

Q. MTP 모듈의 입력은 ground truth인가? 그렇다면 추론 시에는 어떻게 되는건지?

A. 네.

     MTP 모듈에 들어가는 Emb(t_{i+k})는 학습 데이터에 존재하는 ground truth token의 임베딩이다.

     이는 teacher forcing과 유사한 방식으로 미래 토큰 예측 능력을 학습시키기 위함이다.

     반면, 추론 시에는 ground truth 미래 토큰을 알 수 없으므로 MTP 모듈 없이도 메인 모델이 독립적으로 동작할 수 있다.  

     따라서 추론은 메인 모델만 이용하여 일반적으로 autoregressive 방식으로 수행된다.

       (이는 baseline 구조이고 위의 질문처럼 추측성 디코딩 가속을 위해 그대로 남겨서 재활용할 수도 있다.)

 

Q. 그림에서 input token, target token 모두 ground truth인가?

A. 네.

     Figure 3에 표시된 input token과 target token은 모두 학습 데이터에 존재하는 ground truth token이다.

     즉, figure 3은 실제 생성 과정이 아니라 학습 과정을 설명하는 그림으로 이해해야 한다.

 

Q. Main Model도 Ground Truth를 입력받고, MTP도 Ground Truth를 입력받는데 둘의 차이는 무엇인가?

A. Main Model은 현재 토큰을 기반으로 다음 토큰(Next Token)을 예측하는 것이 목적이다.

    반면 MTP는 Ground Truth 미래 토큰을 추가 입력으로 활용하여 그보다 더 먼 미래 토큰을 예측하는 것이 목적이다.

    즉, Main Model은 Next Token Prediction을 수행하고,

    MTP는 Multi-Token Prediction을 수행하여 더 풍부한 학습 신호를 제공한다.

 

Q. MTP를 speculative decoding을 위해 남겨놓은 경우, 어떤 과정을 거치는지?

A. 일반적인 생성에서는 메인 모델이 토큰을 하나 생성할 때마다 다시 호출되어 다음 토큰을 예측한다.

     반면 speculative decoding에서는 MTP 모듈이 여러 개의 미래 토큰을 먼저 추측 생성한다.

      이후 메인 모델은 해당 토큰들을 하나씩 생성하는 대신 한 번에 검증한다.

      즉, MTP 모듈은 미래 토큰 초안 생성기 (draft generator), 메인 모델은 검증기 (verifier) 역할을 수행하여

      비싼 메인 모델의 호출 횟수를 줄여 generation latency를 감소시킨다.

      (예시)

         현재 입력 : t1

          메인 모델 → t2 생성

           MTP1 → t3 추측
           MTP2 → t4 추측
           MTP3 → t5 추측
              ↓

           메인 모델이 t2,t3,t4,t5를 한 번에 검증

 

Transformer Block 및 Output 계산 (식 22, 23)

22번 식
23번 식

Transformer block 계산 (식 22)

  • h'_i{k} (transformer block 입력) : linear projection을 통해 이전 depth의 문맥 정보와 미래 토큰 정보를 융합한 벡터
  • TRM_k (transformer block) : self-attention과 ffn 을 수행하여 입력 정보를 문맥적으로 가공
  • 결과물: h_i^k , 현재 depth에서 생성된 최종 출력 표현

Output Head 계산 (식 23)

  • h_i^k (transformer block 출력) : 현재 depth에서 생성된 최종 표현 벡터
  • OutHead(·) : 출력 표현을 vocabulary 크기의 logit 벡터로 변환
  • Softmax : 각 토큰이 정답일 확률 계산
  • 결과물: P_{i+k+1}^1, k번째 depth가 예측한 미래 토큰의 확률 분포 (단일 값이 아니라 vocabulary 전체에 대한 확률 분포)

MTP Loss 계산 (식 24, 25)

24번 식
25번 식

Depth별 Cross Entropy Loss 계산 (식 24)

  • P_{2+k:T+1}^k : k번째 depth가 예측한 확률 분포
  • t_{2+k:T+1} : 실제 정답(ground truth) 토큰
  • CrossEntropy(·) : 예측 확률 분포와 정답 토큰을 비교하여 오차 계산
  • -log P_i^k[t_i] : 정답 토큰에 부여한 확률이 높을수록 loss 감소, 낮을수록 loss 증가
  • 결과물: L_{MTP}^k , k번째 depth의 미래 토큰 예측 성능을 나타냄

최종 MTP Loss 계산 (식 25)

  • \{Sigma}_{k=1}^D L_{MTP}^k : 모든 depth에서 계산된 MTP Loss 합산
  • 1/D : depth 수로 나누어 평균 계산
  • \{lambda} : 연구자가 설정하는 가중치 계수로, MTP Loss의 영향력(가중치)을 조절한다 (논문에서는 0.3 사용)
  • 결과물 : L_{MTP} , 모든 미래 토큰 예측 성능을 반영한 최종 MTP 학습 목적 함수 (Multi-Token Prediction Loss)