“解析 Gemma”系列的前几篇文章详细概述了 Gemma 模型系列的架构。您可以在下方找到每篇帖子的链接:
在本文中,我们将深入探讨最新发布的模型:Gemma 3。让我们开始吧。
与之前版本相比,Gemma 3 的一项重大变化是新增了对视觉语言能力的支持。熟悉 PaliGemma 架构的人可能会注意到,Gemma 3 中使用了 SigLIP 编码器,不过它已经针对这一特定实现进行了定制调整。
以下是这款新模型的核心参数。
让我们来一起探索 Gemma 3 的关键特色与改进之处。
虽然 Gemma 3 的架构继承了其前代模型的部分特性,但它也包含了一些新的改进,具体描述如下。
Gemma 3 的一项重大提升是新增了视觉语言理解能力。4B、12B 和 27B 模型采用自定义的 SigLIP 视觉编码器,使模型能够解读视觉输入。
视觉编码器以固定的 896x896 正方形图像为操作对象。为了处理不同宽高比或高分辨率的图像,编码器采用了“Pan&Scan”算法。该算法以自适应的方式裁剪图像,将每个裁剪部分调整为 896x896 的尺寸,然后对其进行编码。尽管这种方法提升了性能,尤其是在需要详细信息的情况下表现更佳,但它也会导致推理过程中计算开销的增加。
此外,Gemma 3 将图像视为由 MultiModalProjector 生成的紧凑“软令牌”序列。这种技术通过使用固定数量的 256 个矢量来表示视觉数据,显著减少了图像处理所需的推理资源。
在进一步讨论之前,您可能会想:“我应该在什么情况下使用 Gemma 3,而不是 PaliGemma 2?”
PaliGemma 2 的优势在于 Gemma 3 所不具备的功能,例如图像分割和目标检测。然而,Gemma 3 集成并扩展了 PaliGemma 的技术,提供多轮对话能力以及强大的零样本性能,可直接处理各种视觉任务。
您的最终决定还应考虑可用的计算资源,以及对长上下文或多语言支持等高级功能的需求,而这些方面正是 Gemma 3 的显著改进之处。
架构经过修改,以减少 KV 缓存的内存用量,因为长上下文往往会增加内存消耗。
更新后的模型架构由重复的交织模块组成,每个模块包含 5 层局部注意力(采用 1024 的滑动窗口)和 1 层全局注意力。这种设计使模型能够同时捕捉短程和远程依赖关系,从而生成更准确且与上下文更相关的响应。
注意: Gemma 1 完全依赖全局注意力机制,而 Gemma 2 则通过在局部注意力和全局注意力层之间交替引入了一种混合方法。Gemma 3 进一步整合了 5 层专用的局部注意力层,从而生成更加精确且符合上下文的响应。
Gemma 2 和 Gemma 3 都采用了分组查询注意力 (GQA),并结合了 RMSNorm 的后规一化和前规一化。然而,Gemma 3 通过引入 QK 规一化取代了 Gemma 2 的软上限机制,从而在提升准确性的同时实现了更快的处理速度。
由于上述架构改进,Gemma 3 利用交织注意力机制降低了内存需求,从而支持扩展的上下文长度。这使得模型能够分析更长的文档和对话内容,而不会丢失上下文信息。具体而言,1B 模型可处理 32k 个令牌,而更大规模的模型则能支持高达 128k 个令牌。
注意: 128k 令牌的上下文窗口使模型能够处理相当于一部普通长篇小说的文本量(约 80,000 个单词)。该窗口大小大约相当于 96,000 个单词、198 页文字、500 张图像,或者以每秒 1 帧的速度处理超过 8 分钟的视频内容。
Gemma 3 仅在处理图像输入时使用双向注意力机制。
普通注意力机制(也称为单向注意力)就像阅读。想象一下阅读一本书,您会根据前面的词语来理解每个词的含义。这就是语言模型中典型注意力机制的工作方式:它按顺序进行,并通过回顾先前的内容来构建上下文。
另一方面,双向注意力机制更像是观察一幅拼图。不妨将图像想象成一副拼图,而“图像令牌”就像是单独的拼图碎片。这意味着每块碎片都会“关注”并与图像中的所有其他碎片建立联系,而不受其位置的限制。这种机制能够同时从整体上把握全貌,而不仅仅依赖顺序处理。鉴于每个部分都与其他所有部分相关联,这种机制能够带来更全面的理解。
那么,为什么不在所有场景都使用双向注意力机制呢?虽然双向注意力能够全面把握上下文的能力听起来更优越,但它并不总是适用于文本处理。这完全取决于具体任务:
关键区别在于,双向注意力方法适用于模型无需生成序列的场景。
以下可视化图展示了 Gemma 3 中的注意力机制。
代码:
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>")
输出:
您还可以从中看出,这种注意力机制与 PaliGemma 的机制有何不同。为了更好地理解这一对比,PaliGemma 的工作方式是接收一张或多张图像以及基于文本的任务描述(即提示或前缀),然后以自回归的方式生成预测结果,输出为一段文本字符串(即答案或后缀)。
代码:
visualizer = AttentionMaskVisualizer("google/paligemma2-3b-mix-224")
visualizer("<img> caption en", suffix="a cat standing on a beach.")
输出
由于对数据组合进行了调整,并增加了多语言数据(包括单语和双语平行数据)的数量,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)
)
)
注意: 严格来说,RoPE(旋转位置嵌入)是嵌套在 SDPA(缩放点积注意力)内部的,但我们在图中对其进行了简化。 如需精确的架构细节, 请参阅详细代码。
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)
)
这款仅支持文本的 1B 模型专为设备端使用进行了优化,使得先进的 AI 技术能够轻松应用于移动设备和嵌入式系统。这一进步极大地提升了无障碍性、隐私保护和性能表现,因为即使在网络连接受限或无网络的情况下,AI 驱动的应用依然能够高效运行。
我们在技术报告中提供了深入的详细信息,同时,关于 Gemma 3 的主要研究结果简要总结如下:
我们深入探讨了 Gemma 3 的架构,重点介绍了其区别于先前版本的新功能。这些架构设计使 Gemma 3 能够在更广泛的任务中表现出更优的性能,包括增强的多语言能力与图像互动功能,同时也为未来更强大且资源效率更高的多模态语言模型铺平了道路,使其更适合标准硬件环境。
我们相信,Gemma 3 的创新将助力研究人员和开发者打造新一代高效且强大的多模态语言模型。
感谢您的阅读!