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_pathself.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_storeself.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/