순차적 설명 (Hidden Size: 768, dh=128, GQA 4:1, QK-Norm, 5:1 SWA, MLP 6x)
본 문서는 Quillaro 언어 모델의 Q2 구성 아키텍처를 순차적으로 설명합니다. 이 모델은 약 255.84백만 개의 파라미터(반올림 시 256M)를 가지며, 주요 특징으로 hidden size 768, TPU v4 MXU 연산에 최적화된 어텐션 헤드 차원($d_h$) 128, GQA (Grouped-Query Attention) 4:1 비율, QK-Norm, Gemma 3 스타일의 Local:Global 어텐션 5:1 비율, 그리고 6배의 MLP 확장 비율을 채택합니다. TPUv4 환경에서의 효율적인 학습을 목표로 하며, SWAN-GPT의 장문 맥락 처리 능력과 Llama/Gemma 등의 검증된 요소를 통합합니다.
모든 주요 차원(은닉층, MLP 중간 크기, 어휘 크기 등)은 TPU 하드웨어(특히 MXU) 연산 효율성을 위해 64, 128 또는 256의 배수로 설정되었습니다.
데이터는 Quillaro 모델 내에서 다음과 같은 단계를 거쳐 처리됩니다:
1. 토큰화: 입력 텍스트는 BPE (Byte-Pair Encoding) 토크나이저에 의해 정수형 토큰 ID 시퀀스 $(t_1, t_2, \dots, t_T)$로 변환됩니다. (배치 크기 $B$)
2. 임베딩 룩업: 각 토큰 ID $t_i$는 학습 가능한 임베딩 행렬 $W_{embed} \in \mathbb{R}^{V \times d_{model}}$를 사용하여 $d_{model}$ 차원의 벡터 $x_i$로 매핑됩니다. $X = (x_1, x_2, \dots, x_T)$.
SWA-RoPE 레이어의 경우, 이 단계 이후 또는 어텐션 메커니즘 내부에서 RoPE (회전식 위치 인코딩)가 적용되어 토큰의 상대적 위치 정보를 벡터에 주입합니다. NoPE 전역 어텐션 레이어는 명시적인 위치 인코딩을 사용하지 않습니다.
임베딩된 벡터 시퀀스 $X$는 $L=18$개의 트랜스포머 디코더 블록을 순차적으로 통과합니다. $H^{(0)} = X$로 시작하여, 각 레이어 $l$은 $H^{(l-1)}$를 입력받아 $H^{(l)}$을 출력합니다. Local:Global 어텐션 5:1 비율 전략에 따라 5개의 SWA-RoPE 지역 어텐션 레이어 후 1개의 NoPE 전역 어텐션 레이어가 배치됩니다 (총 15개 SWA-RoPE, 3개 NoPE). 마지막 17번째 레이어(0-indexed)는 Global 레이어입니다.
입력 $H^{(l-1)}$의 각 토큰 벡터에 대해 RMSNorm을 적용합니다. $w_{rms1}$은 학습 가능한 스케일 파라미터입니다.
$$ H'_{norm} = \text{RMSNorm}(H^{(l-1)}) = \frac{H^{(l-1)}}{\sqrt{\frac{1}{d_{model}}\sum_{j=1}^{d_{model}} (H^{(l-1)}_j)^2 + \epsilon}} \cdot w_{rms1} $$a. 프로젝션 (Q, K, V 생성): 정규화된 입력 $H'_{norm}$으로부터 Query, Key, Value 벡터를 생성합니다. $W_q, W_k, W_v$는 학습 가능한 가중치 행렬입니다.
$$ Q' = H'_{norm} W_q \quad (W_q \in \mathbb{R}^{d_{model} \times (N_q d_h)}) $$ $$ K' = H'_{norm} W_k \quad (W_k \in \mathbb{R}^{d_{model} \times (N_{kv} d_h)}) $$ $$ V' = H'_{norm} W_v \quad (W_v \in \mathbb{R}^{d_{model} \times (N_{kv} d_h)}) $$여기서 $N_q=8$ (쿼리 헤드 수), $N_{kv}=2$ (키/값 헤드 수), $d_h=128$ (헤드 차원)입니다.
b. QK-Norm: 프로젝션된 $Q'$와 $K'$에 각각 정규화(예: RMSNorm과 유사한 learnable scale을 가진 정규화)를 적용합니다.
$$ Q_{norm} = \text{QKNorm}_q(Q') $$ $$ K_{norm} = \text{QKNorm}_k(K') $$c. RoPE 적용 (SWA-RoPE 레이어만 해당): $Q_{norm}$과 $K_{norm}$에 회전식 위치 인코딩(RoPE)을 적용하여 위치 정보를 주입합니다. NoPE 레이어는 이 단계를 건너뜁니다.
$$ Q_{rope}, K_{rope} = \text{RoPE}(Q_{norm}, K_{norm}, \text{pos\_ids}) $$NoPE 레이어에서는 $Q_{rope} = Q_{norm}, K_{rope} = K_{norm}$ 입니다.
d. Grouped-Query Attention (GQA) 및 스케일드 닷-프로덕트 어텐션: 키와 값을 $N_q/N_{kv}$ (여기서는 $8/2=4$) 그룹만큼 반복하여 GQA를 수행합니다. 그 후 스케일드 닷-프로덕트 어텐션을 계산합니다.
$$ \text{AttentionScores} = \frac{Q_{rope} K_{rope}^T}{\sqrt{d_h}} $$ $$ \text{AttentionWeights} = \text{softmax}(\text{AttentionScores} + M) \quad (M \text{은 어텐션 마스크}) $$ $$ \text{ContextVec} = \text{AttentionWeights} V' $$SWA-RoPE 레이어에서는 마스크 $M$에 슬라이딩 윈도우(크기 1024) 제약이 추가됩니다.
e. 출력 프로젝션: 어텐션 메커니즘을 통과한 문맥 벡터 $\text{ContextVec}$를 다시 $d_{model}$ 차원으로 프로젝션합니다. $W_o$는 학습 가능한 가중치 행렬입니다.
$$ \text{AttnOut} = \text{ContextVec} W_o \quad (W_o \in \mathbb{R}^{(N_q d_h) \times d_{model}}) $$어텐션 출력 $\text{AttnOut}$과 블록 입력 $H^{(l-1)}$을 더합니다.
$$ H_{mid} = H^{(l-1)} + \text{AttnOut} $$중간 결과 $H_{mid}$에 RMSNorm을 적용합니다. $w_{rms2}$는 학습 가능한 스케일 파라미터입니다.
$$ H''_{norm} = \text{RMSNorm}(H_{mid}) = \frac{H_{mid}}{\sqrt{\frac{1}{d_{model}}\sum_{j=1}^{d_{model}} (H_{mid,j})^2 + \epsilon}} \cdot w_{rms2} $$정규화된 $H''_{norm}$을 SwiGLU 활성화 함수를 사용하는 MLP 레이어에 통과시킵니다. 중간 차원 $d_{ff} = I_{mlp} = 4608$ (hidden size의 6배)입니다. $W_{gate}, W_{up}, W_{down}$은 학습 가능한 가중치 행렬입니다.
$$ \text{MLPOut} = \text{SwiGLU}(H''_{norm}) = (\text{SiLU}(H''_{norm} W_{gate}) \odot (H''_{norm} W_{up})) W_{down} $$(SiLU는 Sigmoid Linear Unit, $\odot$는 원소별 곱셈)
MLP 출력 $\text{MLPOut}$과 첫 번째 잔차 연결 후의 결과 $H_{mid}$를 더합니다.
$$ H^{(l)} = H_{mid} + \text{MLPOut} $$1. 최종 정규화: $L=18$개의 트랜스포머 블록을 모두 통과한 시퀀스 벡터 $H^{(L)}$에 마지막으로 RMSNorm을 적용합니다. $w_{rms\_final}$은 학습 가능한 스케일 파라미터입니다.
$$ H_{final\_norm} = \text{RMSNorm}(H^{(L)}) = \frac{H^{(L)}}{\sqrt{\frac{1}{d_{model}}\sum_{j=1}^{d_{model}} (H^{(L)}_j)^2 + \epsilon}} \cdot w_{rms\_final} $$2. 출력 프로젝션 (LM Head): 정규화된 $H_{final\_norm}$을 어휘 크기($V=38,144$) 만큼의 차원을 가진 로짓(logits) 벡터로 변환합니다. 가중치 공유(Tie Word Embeddings)에 따라, 입력 토큰 임베딩 가중치 $W_{embed}$의 전치 행렬($W_{embed}^T$)을 사용합니다.
$$ \text{Logits} = H_{final\_norm} W_{embed}^T $$LM Head에는 별도의 바이어스(bias)가 사용되지 않습니다.
| 파라미터 | 값 | 설정 근거 및 참고 자료 |
|---|---|---|
| 총 파라미터 수 (검증됨) | 약 255.84M | 256M 규모 목표 (반올림 시), 가중치 공유 적용 |
| 총 레이어 수 (L) | 18 | 5:1 SWA 비율 마지막 레이어 Global Gemma 3 참고 |
| NoPE 전역 어텐션 레이어 | 3 (레이어 5, 11, 17) | 5:1 비율 (L/6) |
| SWA-RoPE 지역 어텐션 레이어 | 15 | 5:1 비율 (5L/6) |
| 은닉층 크기 (dmodel) | 768 | 256의 배수 TPU/MXU 정렬 |
| MLP 중간 크기 (intermediate_size) | 4608 | 256의 배수 dmodel의 6배 Gemma 3 참고 |
| 어텐션 헤드 수 (Nq, 쿼리) | 8 | GQA 4:1 비율 |
| 어텐션 헤드 차원 (dhead) | 128 | TPU v4 MXU (128x128) 최적화 |
| 키/값 헤드 수 (GQA, Nkv) | 2 | GQA 효율성 (비율 4:1) |
| QK-Norm 사용 | True | Gemma 3 참고 |
| 어휘 크기 (V) | 38,144 | 256의 배수 256M 파라미터 목표 근접 조정 최대 2개 언어 지원 |
| SWA 윈도우 크기 | 1024 | Gemma 3 참고 |
| 가중치 공유 (Tie Word Embeddings) | True | 파라미터 효율성 |
Quillaro Q2 모델의 총 파라미터 수는 다음과 같은 구성 요소들의 합으로 계산됩니다.
$V = 38,144, d_{model} = 768 \implies P_{embed} = 38,144 \times 768 = 29,294,592$
블록 당 2개 (input, post-attention) + 최종 RMSNorm 1개 = $(2L + 1)$ 개. 각 RMSNorm은 $d_{model}$ 크기의 스케일 가중치를 가집니다.
$$ P_{rms} = (2L + 1) \times d_{model} $$$L = 18, d_{model} = 768 \implies P_{rms} = (2 \times 18 + 1) \times 768 = 37 \times 768 = 28,416$
$d_{model}=768, N_q=8, d_h=128, N_{kv}=2 \implies $
$W_q: 768 \times (8 \times 128) = 768 \times 1024 = 786,432$
$W_k: 768 \times (2 \times 128) = 768 \times 256 = 196,608$
$W_v: 768 \times 256 = 196,608$
$W_o: (8 \times 128) \times 768 = 1024 \times 768 = 786,432$
$P_{attn\_proj\_block} = 786,432 + 196,608 + 196,608 + 786,432 = 1,966,080$
$N_q=8, d_h=128, N_{kv}=2 \implies P_{qknorm\_block} = (8 \times 128) + (2 \times 128) = 1024 + 256 = 1,280$
$d_{model}=768, I_{mlp}=4608 \implies P_{mlp\_block} = 3 \times 768 \times 4608 = 10,616,832$
$L=18 \implies P_{blocks} = 18 \times (1,966,080 + 1,280 + 10,616,832) = 18 \times 12,584,192 = 226,515,456$
입력 토큰 임베딩과 가중치 공유 (Tie Word Embeddings) 및 바이어스 없음으로 인해 추가 파라미터 없음.
$$ P_{lm\_head} = 0 $$