Gemma 3의 아키텍처 변화와 비전-언어 지원, 메모리 효율 개선, 더 긴 컨텍스트, 새로운 토크나이저, 그리고 주요 성능 향상을 살펴봅니다.
2025년 4월 30일
Ju-yeong JiSr. Technical Consultant Gen AI – AI Studio
이전 "Gemma explained" 시리즈 게시물에서는 Gemma 모델 패밀리의 아키텍처를 자세히 개괄했습니다. 각 게시물 링크는 아래에서 확인할 수 있습니다.
이 글에서는 최신 모델인 Gemma 3를 살펴봅니다. 본격적으로 알아보겠습니다.
이전 버전과 비교했을 때 중요한 변화는 Gemma 3가 새롭게 비전-언어 기능을 지원한다는 점입니다. PaliGemma의 아키텍처에 익숙한 분이라면 Gemma 3에 사용된 SigLIP encoder를 알아볼 수 있겠지만, 이 구현에 맞게 조정되었습니다.
다음은 새 모델의 핵심 파라미터입니다.

이제 Gemma 3의 핵심 차이점과 개선 사항을 살펴보겠습니다.
Gemma 3의 아키텍처는 이전 모델의 요소를 계승하면서도, 아래와 같은 새로운 수정 사항을 포함합니다.
Gemma 3의 주요 향상점은 새로운 비전-언어 이해 능력입니다. 4B, 12B, 27B 모델은 맞춤형 SigLIP 비전 인코더를 사용하며, 이를 통해 시각 입력을 해석할 수 있습니다.
비전 인코더는 고정된 896x896 정사각형 이미지에서 동작합니다. 서로 다른 화면비나 고해상도 이미지를 처리하기 위해 “Pan&Scan” 알고리즘을 사용합니다. 이 방식은 이미지를 적응적으로 크롭하고, 각 크롭을 896x896으로 리사이즈한 뒤 인코딩합니다. 이 방법은 특히 세부 정보가 중요할 때 성능을 향상시키지만, 추론 시 계산 오버헤드가 증가합니다.
또한 Gemma 3는 MultiModalProjector가 생성하는 압축된 “soft tokens” 시퀀스로 이미지를 처리합니다. 이 기법은 시각 데이터를 고정된 256개의 벡터로 표현함으로써 이미지 처리에 필요한 추론 리소스를 크게 줄입니다.

계속하기 전에 이런 의문이 들 수 있습니다. “Gemma 3와 PaliGemma 2 중 언제 무엇을 사용해야 할까?”
PaliGemma 2의 강점은 이미지 분할과 객체 탐지처럼 Gemma 3에는 없는 기능에 있습니다. 반면 Gemma 3는 PaliGemma의 기술을 통합하고 확장하여, 멀티턴 채팅과 다양한 비전 작업을 직접 처리하는 강력한 제로샷 성능을 제공합니다.
최종 선택은 사용 가능한 계산 자원과 더 긴 컨텍스트나 다국어 지원 같은 고급 기능의 중요성도 함께 고려해야 합니다. 이러한 측면에서 Gemma 3는 눈에 띄는 향상을 제공합니다.
아키텍처는 긴 컨텍스트에서 증가하는 경향이 있는 KV-cache 메모리 사용량을 줄이도록 수정되었습니다.
업데이트된 모델 아키텍처는 반복되는 인터리빙 블록으로 구성되며, 각 블록은 슬라이딩 윈도우 1024를 갖는 로컬 어텐션 레이어 5개와 글로벌 어텐션 레이어 1개를 포함합니다. 이 설계는 모델이 단거리 및 장거리 의존성을 모두 포착할 수 있게 하여, 더 정확하고 문맥적으로 적절한 응답을 가능하게 합니다.
**참고:**Gemma 1은 전적으로 글로벌 어텐션에만 의존했으며, Gemma 2는 로컬 어텐션과 글로벌 어텐션 레이어를 번갈아 사용하는 하이브리드 방식을 도입했습니다. Gemma 3는 전용 로컬 어텐션 레이어 5개를 통합해, 더 정밀하고 문맥에 맞는 응답을 생성합니다.

Gemma 2와 Gemma 3 모두 post-norm 및 pre-norm에 RMSNorm을 사용하는 Grouped-Query Attention (GQA)을 활용합니다. 하지만 Gemma 3는 Gemma 2의 soft-capping 메커니즘 대신 QK-norm을 채택하여 정확도 향상과 처리 속도 개선을 동시에 달성합니다.

앞서 설명한 아키텍처 변화의 결과로, Gemma 3는 인터리브드 어텐션을 사용해 메모리 요구량을 줄이고 더 긴 컨텍스트 길이를 지원합니다. 이를 통해 문맥을 잃지 않고 더 긴 문서와 대화를 분석할 수 있습니다. 구체적으로 1B 모델은 32k 토큰, 더 큰 모델은 128k 토큰을 처리할 수 있습니다.
**참고:**128k 토큰 컨텍스트 윈도우를 사용하면 모델은 일반적인 소설 한 권 분량(약 80k 단어)에 해당하는 텍스트를 처리할 수 있습니다. 이 윈도우 크기는 대략 96k 단어, 198페이지, 이미지 500장, 또는 1 fps 기준 8분 이상의 비디오에 해당합니다.

Gemma 3는 이미지 입력에 대해서만 양방향 어텐션을 사용합니다.
일반적인 어텐션, 즉 단방향 어텐션은 읽기와 비슷합니다. 책을 읽는다고 상상해 보세요. 각 단어는 그 앞에 나온 단어들을 고려하면서 이해합니다. 이것이 언어 모델의 전형적인 어텐션 방식입니다. 순차적이며, 문맥을 구축하기 위해 뒤를 돌아봅니다.
반면 양방향 어텐션은 퍼즐을 보는 것과 비슷합니다. 이미지를 직소 퍼즐이라고 생각해 보세요. “Image Tokens”는 각각의 퍼즐 조각과 같습니다. 즉, 각 조각은 위치와 상관없이 이미지 속 다른 모든 조각을 “보고” 연결됩니다. 순서가 아니라 전체 그림을 한 번에 고려합니다. 그래서 모든 부분이 다른 모든 부분과 연결되어 더 완전한 이해를 제공합니다.
그렇다면 왜 항상 양방향을 쓰지 않을까요? 양방향 어텐션은 전체 문맥을 본다는 점에서 더 좋아 보이지만, 텍스트에는 항상 사용되지는 않습니다. 이는 전적으로 작업의 성격에 달려 있습니다.
전체 텍스트가 주어졌고 이를 깊이 이해해야 하는 작업에서는(BERT 같은 모델처럼) 양방향 어텐션이 매우 유용합니다.
다음 단어를 예측하거나 텍스트를 생성하는 작업에서는 단방향(자기회귀적) 접근이 더 자연스럽습니다. 다음에 올 것을 예측하는 일은 본질적으로 순차적이기 때문입니다. 또한 계산적으로 더 효율적인 경우가 많습니다.
핵심 차이는 모델이 시퀀스를 생성하지 않을 때 양방향 접근이 사용된다는 점입니다.
다음 시각화는 Gemma 3의 어텐션 메커니즘을 보여줍니다.
Code:
from transformers.utils.attention_visualizer import AttentionMaskVisualizer
visualizer = AttentionMaskVisualizer("google/gemma-3-4b-it")
visualizer("<start_of_turn>user\n<img>What is this?<end_of_turn>\n<start_of_turn>model\nIt's an image of a cat.<end_of_turn>")
Python
Copied
Output:

또한 이 어텐션 메커니즘이 PaliGemma의 방식과 어떻게 다른지도 볼 수 있습니다. 이 비교를 위한 배경 설명을 덧붙이면, PaliGemma는 하나 이상의 이미지와 텍스트 기반 작업 설명(프롬프트 또는 접두사)을 입력으로 받은 뒤, 자기회귀 방식으로 예측 결과를 텍스트 문자열(정답 또는 접미사)로 생성합니다.
Code:
visualizer = AttentionMaskVisualizer("google/paligemma2-3b-mix-224")
visualizer("<img> caption en", suffix="a cat standing on a beach.")
Python
Copied
Output

Gemma 3는 단일 언어 데이터와 병렬 데이터를 포함해 다국어 데이터의 비중을 늘린 재구성된 데이터 혼합 덕분에 다국어 성능이 향상되었습니다.
Gemma 3는 개선된 토크나이저도 도입합니다. 어휘 크기는 262k로 변경되었지만, 동일한 SentencePiece 토크나이저를 사용합니다. 오류를 방지하려면 Gemma 3에는 새 토크나이저를 사용해야 합니다. 이것은 Gemini와 동일한 토크나이저이며, 영어 이외 언어에 대해 더 균형 있게 설계되었습니다.
Gemma3ForConditionalGeneration(
(vision_tower): SiglipVisionModel(
(vision_model): SiglipVisionTransformer(
(embeddings): SiglipVisionEmbeddings(
(patch_embedding): Conv2d(3, 1152, kernel_size=(14, 14), stride=(14, 14), padding=valid)
(position_embedding): Embedding(4096, 1152)
)
(encoder): SiglipEncoder(
(layers): ModuleList(
(0-26): 27 x SiglipEncoderLayer(
(self_attn): SiglipSdpaAttention(
(k_proj): Linear(in_features=1152, out_features=1152, bias=True)
(v_proj): Linear(in_features=1152, out_features=1152, bias=True)
(q_proj): Linear(in_features=1152, out_features=1152, bias=True)
(out_proj): Linear(in_features=1152, out_features=1152, bias=True)
)
(layer_norm1): LayerNorm((1152,), eps=1e-06, elementwise_affine=True)
(mlp): SiglipMLP(
(activation_fn): PytorchGELUTanh()
(fc1): Linear(in_features=1152, out_features=4304, bias=True)
(fc2): Linear(in_features=4304, out_features=1152, bias=True)
)
(layer_norm2): LayerNorm((1152,), eps=1e-06, elementwise_affine=True)
)
)
)
(post_layernorm): LayerNorm((1152,), eps=1e-06, elementwise_affine=True)
)
)
(multi_modal_projector): Gemma3MultiModalProjector(
(mm_soft_emb_norm): Gemma3RMSNorm((1152,), eps=1e-06)
(avg_pool): AvgPool2d(kernel_size=4, stride=4, padding=0)
)
(language_model): Gemma3ForCausalLM(
(model): Gemma3TextModel(
(embed_tokens): Gemma3TextScaledWordEmbedding(262208, 5376, padding_idx=0)
(layers): ModuleList(
(0-61): 62 x Gemma3DecoderLayer(
(self_attn): Gemma3Attention(
(q_proj): Linear(in_features=5376, out_features=4096, bias=False)
(k_proj): Linear(in_features=5376, out_features=2048, bias=False)
(v_proj): Linear(in_features=5376, out_features=2048, bias=False)
(o_proj): Linear(in_features=4096, out_features=5376, bias=False)
(q_norm): Gemma3RMSNorm((128,), eps=1e-06)
(k_norm): Gemma3RMSNorm((128,), eps=1e-06)
)
(mlp): Gemma3MLP(
(gate_proj): Linear(in_features=5376, out_features=21504, bias=False)
(up_proj): Linear(in_features=5376, out_features=21504, bias=False)
(down_proj): Linear(in_features=21504, out_features=5376, bias=False)
(act_fn): PytorchGELUTanh()
)
(input_layernorm): Gemma3RMSNorm((5376,), eps=1e-06)
(post_attention_layernorm): Gemma3RMSNorm((5376,), eps=1e-06)
(pre_feedforward_layernorm): Gemma3RMSNorm((5376,), eps=1e-06)
(post_feedforward_layernorm): Gemma3RMSNorm((5376,), eps=1e-06)
)
)
(norm): Gemma3RMSNorm((5376,), eps=1e-06)
(rotary_emb): Gemma3RotaryEmbedding()
(rotary_emb_local): Gemma3RotaryEmbedding()
)
(lm_head): Linear(in_features=5376, out_features=262208, bias=False)
)
)
Python
Copied

**참고:**기술적으로 RoPE (Rotary Positional Embedding)는 SDPA(Scaled Dot-Product Attention) 내부에 있지만, 이 다이어그램에서는 단순화해서 표현했습니다. 정확한 아키텍처 세부 사항은 the code를 확인하세요.
Gemma3ForCausalLM(
(model): Gemma3TextModel(
(embed_tokens): Gemma3TextScaledWordEmbedding(262144, 1152, padding_idx=0)
(layers): ModuleList(
(0-25): 26 x Gemma3DecoderLayer(
(self_attn): Gemma3Attention(
(q_proj): Linear(in_features=1152, out_features=1024, bias=False)
(k_proj): Linear(in_features=1152, out_features=256, bias=False)
(v_proj): Linear(in_features=1152, out_features=256, bias=False)
(o_proj): Linear(in_features=1024, out_features=1152, bias=False)
(q_norm): Gemma3RMSNorm((256,), eps=1e-06)
(k_norm): Gemma3RMSNorm((256,), eps=1e-06)
)
(mlp): Gemma3MLP(
(gate_proj): Linear(in_features=1152, out_features=6912, bias=False)
(up_proj): Linear(in_features=1152, out_features=6912, bias=False)
(down_proj): Linear(in_features=6912, out_features=1152, bias=False)
(act_fn): PytorchGELUTanh()
)
(input_layernorm): Gemma3RMSNorm((1152,), eps=1e-06)
(post_attention_layernorm): Gemma3RMSNorm((1152,), eps=1e-06)
(pre_feedforward_layernorm): Gemma3RMSNorm((1152,), eps=1e-06)
(post_feedforward_layernorm): Gemma3RMSNorm((1152,), eps=1e-06)
)
)
(norm): Gemma3RMSNorm((1152,), eps=1e-06)
(rotary_emb): Gemma3RotaryEmbedding()
(rotary_emb_local): Gemma3RotaryEmbedding()
)
(lm_head): Linear(in_features=1152, out_features=262144, bias=False)
)
Python
Copied
이 텍스트 전용 1B 모델은 온디바이스 사용에 맞게 특별히 최적화되어 있어, 모바일과 임베디드 시스템에서도 고급 AI를 활용할 수 있게 합니다. 이는 접근성, 개인정보 보호, 성능 측면에 큰 영향을 미치며, 이제 AI 기반 애플리케이션이 네트워크 연결이 제한적이거나 없는 환경에서도 효율적으로 동작할 수 있습니다.
자세한 내용은 technical report에서 확인할 수 있지만, 여기서는 Gemma 3의 주요 발견 사항을 빠르게 요약합니다.
Gemma 3 모델은 다양한 벤치마크에서 사전학습 버전과 instruction-tuned 버전 모두 Gemma 2보다 더 뛰어난 성능을 보입니다. 단일 소비자용 GPU 또는 TPU 호스트에 적합한 모델 중 최고 수준입니다. Gemma 27B IT 모델은 2025년 4월 12일 기준 LM Arena 상위 10개 모델 중 하나로, 훨씬 더 큰 오픈 모델들을 능가하며 Gemma 2보다 현저히 높은 Elo 점수를 보여줍니다.
Gemma 3의 아키텍처 변화는 Gemma 1의 글로벌 전용 어텐션 메커니즘과 Gemma 2의 1:1 로컬/글로벌 비율과 비교했을 때, 긴 컨텍스트 추론 중 KV cache의 메모리 오버헤드를 효과적으로 줄입니다.
Gemma 3 모델은 사전학습 중 RoPE rescaling 이후 128k 컨텍스트 길이까지 일반화할 수 있습니다. 글로벌 self-attention 레이어에서는 RoPE 기본 주파수를 10k에서 1M으로 높이고, 로컬 레이어의 주파수는 10k로 유지합니다.
Gemma 3는 영어 이외 언어에 더 균형 잡힌 Gemini와 동일한 토크나이저를 사용합니다. 또한 다국어 능력을 강화하기 위해 사전학습 데이터 혼합과 사후학습 과정을 수정했습니다.
더 높은 해상도의 비전 인코더는 비전 작업에서 더 나은 성능을 이끌어냅니다. Pan & Scan 방식은 비정사각형 화면비, 고해상도 이미지, 이미지 속 텍스트 읽기가 포함된 작업에서 성능을 더욱 향상시킵니다.
이 글에서는 Gemma 3의 아키텍처를 살펴보며, 이전 버전과 구별되는 새로운 기능을 중점적으로 소개했습니다. 이러한 아키텍처 선택 덕분에 Gemma 3는 다국어 능력 향상과 이미지 상호작용을 포함한 더 넓은 범위의 작업에서 더 뛰어난 성능을 발휘하며, 동시에 일반적인 하드웨어에서도 사용할 수 있는 미래의 더 강력하고 자원 친화적인 멀티모달 언어 모델로 나아가는 기반을 마련합니다.
우리는 Gemma 3의 혁신이 연구자와 개발자가 차세대의 효율적이고 강력한 멀티모달 언어 모델을 만드는 데 힘을 실어줄 것이라고 믿습니다.
읽어주셔서 감사합니다!
Gemma explained: Gemma 3의 새로운 점
다음