0.引言
Gemma 2以前代产品为基础,提供增强的性能和效率,以及一系列创新功能,使其在研究和实际应用中都具有特别的吸引力。Gemma 2 的与众不同之处在于,它能够提供与更大的专有模型相当的性能,但其软件包专为更广泛的可访问性和在更适中的硬件设置上使用而设计。
随着深入研究 Gemma 2 的技术规格和架构,越来越被其设计的精妙之处所折服。该模型采用了多种先进技术,包括新颖的注意力机制和创新的训练稳定性方法,这些都为其卓越的性能做出了贡献。
在本综合指南中,将深入探索 Gemma 2,研究其架构、主要功能和实际应用。无论您是经验丰富的 AI 从业者还是该领域的热情新手,本文旨在提供有关 Gemma 2 的工作原理以及如何在自己的项目中利用其功能的宝贵见解。
1. Gemma 2 是什么?
Gemma 2 是 Google 最新的开源大型语言模型,设计精巧但功能强大。它基于用于创建 Google Gemini 模型的相同研究和技术构建,以更易于访问的软件包提供最先进的性能。Gemma 2 有两种尺寸:
Gemma 2 9B:一个 90 亿参数模型
Gemma 2 27B:一个更大的 270 亿参数模型
每种尺寸都有两种款式:
基本模型:在大量文本数据上进行预训练
指令调整(IT)模型:经过微调,可在特定任务上获得更好的性能
访问 Google AI Studio 中的模型:Google AI Studio – Gemma 2
在这里阅读论文: Gemma 2 Technical Report
2.主要功能和改进
Gemma 2 与其前代产品相比引入了几项重大改进:
2.1.增加训练数据
这些模型已经接受了更多数据的训练:
Gemma 2 27B:经过 13 万亿个 token 的训练
Gemma 2 9B:经过 8 万亿个 token 的训练
这个扩展的数据集主要由网络数据(主要是英文)、代码和数学组成,有助于提高模型的性能和多功能性。
2.2.滑动窗口注意力
Gemma 2 实现了一种新颖的注意力机制方法:
每隔一层使用一个滑动窗口注意力机制,局部上下文为 4096 个 token,
交替层对整个 8192 个 token 上下文采用完全二次全局注意力机制
这种混合方法旨在平衡效率和捕获输入中的长程依赖关系的能力。
2.3. 软封顶
为了提高训练稳定性和性能,Gemma 2 引入了软上限机制:
def soft_cap(x, cap):
return cap * torch.tanh(x / cap)
# Applied to attention logits
attention_logits = soft_cap(attention_logits, cap=50.0)
# Applied to final layer logits
final_logits = soft_cap(final_logits, cap=30.0)
这种技术可以在没有硬截断的情况下防止 logits 过大,从而在稳定训练过程的同时保留更多信息。
- Gemma 2 9B:90 亿参数模型
- Gemma 2 27B:更大的 270 亿参数模型
每种尺寸都有两种款式:
- 基础模型:在大量文本数据上进行预训练
- 指令调整(IT)模型:经过微调,可在特定任务上获得更好的性能
2.4. 知识蒸馏
对于 9B 模型,Gemma 2 采用知识提炼技术:
- 预训练:9B 模型在初始训练期间从更大的教师模型中学习
- 训练后:9B 和 27B 模型均使用在线策略蒸馏来改善其性能
这个过程有助于较小的模型更有效地捕捉较大模型的功能。
2.5. 模型合并
Gemma 2 采用一种名为 Warp 的新型模型合并技术,该技术分三个阶段组合多个模型:
- 强化学习微调期间的指数移动平均线 (EMA)
- 经过多个策略微调后的球面线性插值(SLERP)
- 线性插值初始化(LITI)作为最后一步
这种方法旨在创建更为强大和更强大的最终模型。
3.性能基准
Gemma 2 在各种基准测试中都表现出了令人印象深刻的性能:
Gemma 2 采用重新设计的架构,旨在实现卓越的性能和推理效率
6.Gemma 2 入门
要在项目中开始使用 Gemma 2,有以下几种选择:
6.1. 谷歌人工智能工作室
可以通过谷歌人工智能工作室访问Gemma 2,谷歌人工智能工作室.
6.2. Hugging Face
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
# Load the model and tokenizer
model_name = "google/gemma-2-27b-it" # or "google/gemma-2-9b-it" for the smaller version
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# Prepare input
prompt = "Explain the concept of quantum entanglement in simple terms."
inputs = tokenizer(prompt, return_tensors="pt")
# Generate text
outputs = model.generate(**inputs, max_length=200)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)
6.3.TensorFlow/Keras
对于 TensorFlow 用户,可通过 Keras 使用 Gemma 2:
import tensorflow as tf
from keras_nlp.models import GemmaCausalLM
# Load the model
model = GemmaCausalLM.from_preset("gemma_2b_en")
# Generate text
prompt = "Explain the concept of quantum entanglement in simple terms."
output = model.generate(prompt, max_length=200)
print(output)
7.高级用法:使用 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
# Usage
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 = """Use the following pieces of context to answer the question at the end.
If you don't know the answer, just say that you don't know, don't try to make up an answer.
{context}
Question: {question}
Answer: """
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})
# Usage
rag_system = RAGSystem(vector_store)
response = rag_system.query("What is the capital of France?")
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
# Load model and tokenizer
model_name = "google/gemma-2-9b-it"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# Prepare dataset
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)
# Set up training arguments
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",
)
# Initialize Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["test"],
)
# Start fine-tuning
trainer.train()
# Save the fine-tuned model
model.save_pretrained("./fine_tuned_gemma2")
tokenizer.save_pretrained("./fine_tuned_gemma2")
根据具体要求和计算资源调整训练参数。
道德考量和限制
虽然 Gemma 2 提供了令人印象深刻的功能,但必须意识到它的局限性和道德考虑:
- 偏见:与所有语言模型一样,Gemma 2 可能反映出其训练数据中存在的偏见。始终批判性地评估其输出。
- 事实准确性:尽管 Gemma 2 性能强大,但有时也会生成不正确或不一致的信息。请从可靠的来源验证重要事实。
- 上下文长度:Gemma 2 的上下文长度为 8192 个标记。对于较长的文档或对话,您可能需要实施策略来有效地管理上下文。
- 计算资源:特别是对于 27B 模型,可能需要大量计算资源才能进行有效推理和微调。
- 负责任的使用: Adhere to Google’s Responsible AI practices and ensure your use of Gemma 2 aligns with ethical AI principles.
8.结论
Gemma 2 的高级功能(例如滑动窗口注意、软上限和新颖的模型合并技术)使其成为广泛自然语言处理任务的强大工具。
通过在您的项目中利用 Gemma 2,无论是通过简单的推理、复杂的 RAG 系统还是针对特定领域的微调模型,您都可以利用 SOTA AI 的强大功能,同时保持对数据和流程的控制。
原文地址:https://www.unite.ai/complete-guide-on-gemma-2-googles-new-open-large-language-model/