Connect with us

人工智能

完整指南:Gemma 2 – Google 的新开源大型语言模型

mm

Gemma 2 在其前身的基础上进行了改进,提供了增强的性能和效率,以及一系列创新功能,使其在研究和实用应用中都非常有吸引力。Gemma 2 的突出之处在于它能够提供与更大型的专有模型相当的性能,但包装在一个设计为更广泛的可访问性和在更谦逊的硬件设置上使用的包中。

当我深入研究 Gemma 2 的技术规格和架构时,我越来越被其设计的巧妙所震撼。该模型结合了几种先进的技术,包括新颖的注意力机制和创新性的训练稳定性方法,这些都有助于其卓越的能力。

Google Open Source LLM Gemma

Google Open Source LLM Gemma

在这份综合指南中,我们将深入探讨 Gemma 2,检查其架构、关键功能和实用应用。无论您是经验丰富的 AI 实践者还是该领域的热情新人,本文旨在为您提供宝贵的见解,了解 Gemma 2 的工作原理以及如何在您自己的项目中利用其力量。

什么是 Gemma 2?

Gemma 2 是 Google 的最新开源大型语言模型,设计为轻量级但功能强大。它建立在创建 Google Gemini 模型的相同研究和技术之上,提供了最先进的性能,但包装在一个更易于访问的包中。Gemma 2 有两种尺寸:
Gemma 2 9B:一个 9 亿参数模型
Gemma 2 27B:一个更大的 27 亿参数模型
每种尺寸都有两种变体:
基础模型:预训练在大量文本数据上
指令调优(IT)模型:微调以提高在特定任务上的性能
访问 Google AI Studio 中的模型Google AI Studio – Gemma 2
阅读技术报告Gemma 2 技术报告

关键功能和改进

Gemma 2 引入了几个重要的进步:

1. 增加训练数据

模型已在更多数据上进行训练:
Gemma 2 27B:训练在 13 万亿令牌上
Gemma 2 9B:训练在 8 万亿令牌上
这些扩大的数据集主要由网页数据(大多为英语)、代码和数学组成,有助于模型的性能和多功能性。

2. 滑动窗口注意力

Gemma 2 实现了一种新颖的注意力机制:
每隔一层使用 4096 个令牌的局部上下文的滑动窗口注意力
交替层使用整个 8192 个令牌上下文的全二次注意力
这种混合方法旨在平衡效率与捕获输入中长距离依赖的能力。

3. 软上限

为了提高训练稳定性和性能,Gemma 2 引入了一种软上限机制:

def soft_cap(x, cap):
return cap * torch.tanh(x / cap)
# 应用于注意力 logits
attention_logits = soft_cap(attention_logits, cap=50.0)
# 应用于最终层 logits
final_logits = soft_cap(final_logits, cap=30.0)

这种技术防止 logits 过度增长而不进行硬截断,保持更多信息同时稳定训练过程。

  1. Gemma 2 9B:一个 9 亿参数模型
  2. Gemma 2 27B:一个更大的 27 亿参数模型

每种尺寸都有两种变体:

  • 基础模型:预训练在大量文本数据上
  • 指令调优(IT)模型:微调以提高在特定任务上的性能

4. 知识蒸馏

对于 9B 模型,Gemma 2 采用知识蒸馏技术:

  • 预训练:9B 模型在初始训练期间从更大的教师模型中学习
  • 后训练:9B 和 27B 模型都使用按策略蒸馏来改进其性能

这个过程有助于较小的模型更好地捕捉较大模型的能力。

5. 模型合并

Gemma 2 利用了一种名为 Warp 的新颖模型合并技术,将多个模型合并在三个阶段:

  1. 强化学习微调期间的指数移动平均(EMA)
  2. 在微调多个策略后使用球面线性插值(SLERP)
  3. 最后一步使用线性插值到初始化(LITI)

这种方法旨在创建一个更强大、更具能力的最终模型。

性能基准

Gemma 2 在各种基准测试中展示了令人印象深刻的性能:

Gemma 2 on a redesigned architecture, engineered for both exceptional performance and inference efficiency

Gemma 2 on a redesigned architecture, engineered for both exceptional performance and inference efficiency

 

开始使用 Gemma 2

要开始在您的项目中使用 Gemma 2,您有几个选项:

1. Google AI Studio

对于快速实验而不需要硬件要求,您可以通过 Google AI Studio 访问 Gemma 2。

2. Hugging Face Transformers

Gemma 2 与流行的 Hugging Face Transformers 库集成。以下是如何使用它:

<div class="relative flex flex-col rounded-lg">
<div class="text-text-300 absolute pl-3 pt-2.5 text-xs">
from transformers import AutoTokenizer, AutoModelForCausalLM
# 加载模型和分词器
model_name = "google/gemma-2-27b-it" # 或 "google/gemma-2-9b-it" 用于较小的版本
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 准备输入
prompt = "用简单的术语解释量子纠缠的概念。"
inputs = tokenizer(prompt, return_tensors="pt")
# 生成文本
outputs = model.generate(**inputs, max_length=200)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)

3. TensorFlow/Keras

对于 TensorFlow 用户,Gemma 2 可通过 Keras 使用:

import tensorflow as tf
from keras_nlp.models import GemmaCausalLM
# 加载模型
model = GemmaCausalLM.from_preset("gemma_2b_en")
# 生成文本
prompt = "用简单的术语解释量子纠缠的概念。"
output = model.generate(prompt, max_length=200)
print(output)

高级用法:使用 Gemma 2 构建本地 RAG 系统

Gemma 2 的一个强大应用是构建检索增强生成(RAG)系统。让我们使用 Gemma 2 和 Nomic 嵌入创建一个简单的、完全本地的 RAG 系统。

步骤 1:设置环境

首先,确保您安装了必要的库:

pip install langchain ollama nomic chromadb

步骤 2:索引文档

创建一个索引器来处理您的文档:

import os
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import DirectoryLoader
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
class Indexer:
def __init__(self, directory_path):
self.directory_path = directory_path
self.text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
self.embeddings = HuggingFaceEmbeddings(model_name="nomic-ai/nomic-embed-text-v1")
def load_and_split_documents(self):
loader = DirectoryLoader(self.directory_path, glob="**/*.txt")
documents = loader.load()
return self.text_splitter.split_documents(documents)
def create_vector_store(self, documents):
return Chroma.from_documents(documents, self.embeddings, persist_directory="./chroma_db")
def index(self):
documents = self.load_and_split_documents()
vector_store = self.create_vector_store(documents)
vector_store.persist()
return vector_store
# 使用
indexer = Indexer("path/to/your/documents")
vector_store = indexer.index()

步骤 3:设置 RAG 系统

现在,让我们使用 Gemma 2 创建 RAG 系统:

from langchain.llms import Ollama
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
class RAGSystem:
def __init__(self, vector_store):
self.vector_store = vector_store
self.llm = Ollama(model="gemma2:9b")
self.retriever = self.vector_store.as_retriever(search_kwargs={"k": 3})
self.template = """使用以下上下文来回答末尾的问题。
如果您不知道答案,请说明,而不是尝试编造一个答案。
{context}
问题:{question}
答案:"""
self.qa_prompt = PromptTemplate(
template=self.template, input_variables=["context", "question"]
)
self.qa_chain = RetrievalQA.from_chain_type(
llm=self.llm,
chain_type="stuff",
retriever=self.retriever,
return_source_documents=True,
chain_type_kwargs={"prompt": self.qa_prompt}
)
def query(self, question):
return self.qa_chain({"query": question})
# 使用
rag_system = RAGSystem(vector_store)
response = rag_system.query("法国的首都是什么?")
print(response["result"])

这个 RAG 系统使用 Gemma 2 通过 Ollama 作为语言模型,并使用 Nomic 嵌入进行文档检索。它允许您根据索引文档提问,并提供来自相关来源的上下文答案。

微调 Gemma 2

对于特定任务或领域,您可能需要微调 Gemma 2。以下是一个使用 Hugging Face Transformers 库的基本示例:

from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer
from datasets import load_dataset
# 加载模型和分词器
model_name = "google/gemma-2-9b-it"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 准备数据集
dataset = load_dataset("your_dataset")
def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)
tokenized_datasets = dataset.map(tokenize_function, batched=True)
# 设置训练参数
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=4,
per_device_eval_batch_size=4,
warmup_steps=500,
weight_decay=0.01,
logging_dir="./logs",
)
# 初始化 Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["test"],
)
# 开始微调
trainer.train()
# 保存微调后的模型
model.save_pretrained("./fine_tuned_gemma2")
tokenizer.save_pretrained("./fine_tuned_gemma2")

请记得根据您的具体要求和计算资源调整训练参数。

伦理考虑和局限性

虽然 Gemma 2 提供了令人印象深刻的能力,但了解其局限性和伦理考虑至关重要:

  • 偏见:与所有语言模型一样,Gemma 2 可能会反映其训练数据中的偏见。始终批判性地评估其输出。
  • 事实准确性:虽然具有很高的能力,但 Gemma 2 有时会生成不正确或不一致的信息。请从可靠的来源验证重要事实。
  • 上下文长度:Gemma 2 的上下文长度为 8192 个令牌。对于更长的文档或对话,您可能需要实施策略来有效地管理上下文。
  • 计算资源:尤其是对于 27B 模型,可能需要大量计算资源来实现高效的推理和微调。
  • 负责任的使用:遵循 Google 的负责任 AI 实践,并确保您对 Gemma 2 的使用符合道德 AI 原则。

结论

Gemma 2 的先进功能,如滑动窗口注意力、软上限和新颖的模型合并技术,使其成为自然语言处理任务的强大工具。
通过在您的项目中利用 Gemma 2,无论是通过简单的推理、复杂的 RAG 系统还是针对特定领域的微调模型,您都可以利用最先进的 AI,同时保持对数据和流程的控制。

我过去五年一直沉浸在令人着迷的机器学习和深度学习世界中。我的热情和专业知识使我能够为超过50个不同的软件工程项目做出贡献,特别注重人工智能/机器学习。我的持续好奇心也使我对自然语言处理产生了兴趣,这是一个我渴望进一步探索的领域。