關於 LLM 我只是略懂:Gemma 筆記


Gemma 基本資料

Gemma 是一系列輕量級、先進的開放大語言模型,建立於與創造 Gemini 模型相同的研究和技術之上。由『Google DeepMind』和Google 其他團隊開發,Gemma 靈感來自 Gemini,名字反映了拉丁文 gemma 的意思,即「寶石」。除了模型權重外,Google 也發布了工具來支持開發者創新、促進合作,並指導如何負責任的使用 Gemma 模型。

Google 發布了兩種規模的模型權重:Gemma 2B 和 Gemma 7B,每種尺寸都提供了:

  • 原始的、預訓練的檢查點
  • 為對話、指令遵循、有用性和安全性微調的檢查點

基礎建設上據稱奠基在 Gemini 之上,也就是說它也是 MoE(混合式專家模型)架構(?)並使用了『6兆』的文字 token 上去對 Gemma 模型進行了預訓練。

Google 提供了一套工具集,用於在所有主要框架上進行推理和『監督式微調』(SFT),包括 JAX、PyTorch 和透過原生 Keras 3.0 的『TensorFlow』。

現成的『Colab』和『Kaggle』 notebooks,以及與流行工具如 Hugging Face、MaxText、NVIDIA NeMo 和 TensorRT-LLM 的整合,讓開始使用 Gemma 變得簡單。

預訓練和指令微調的 Gemma 模型可以在地端的 Notebook 與 Cloud 上運行,並且可以輕鬆部署在 GCP 的 Vertex AI 和 Google Kubernetes Engine(GKE)上。

在硬體整合上,Gemma 在多個人工智慧硬體平台上都進行了特殊的優化,包括『NVIDIA GPU』和『Google Cloud TPU』。

Google 直接與 NVIDIA合作為『NVIDIA GPU』優化了 Gemma,從數據中心到雲端再到本地 RTX AI PC。除此之外也針對了 Google Cloud 進行深度的優化,透過 Vertex AI 提供了完整的『MLOps』工具集,具有多種調整選項和一鍵部署功能,使用內建的推理優化。進階自訂選項可通過完全管理的 Vertex AI 工具或自我管理的 GKE 獲得,包括部署到來自任一平台的高 CP 值基礎建設,涵蓋 GPU、TPU 和 CPU。

最重要的是『Gemma 的使用條款允許所有組織無論大小,都能負責任地進行商業使用和分發』

Model Infrastructure

模型架構的每個組件都經過精心設計,目的是提升 Gemma 模型的性能和效率。以下是對這些組件極其詳細的解釋,以及它們如何共同作用以優化模型的說明:

  • Transformer Decoder:基於 Vaswani 等人在 2017 年提出的 Transformer 模型,Transformer Decoder 是一種基於自注意力機制的架構,允許模型在處理序列數據時,捕捉到長距離依賴關係。這種架構通過將輸入序列的每個元素與序列中的其他所有元素進行比較,來計算每個元素的注意力得分,從而允許模型動態地聚焦於輸入序列中最相關的部分。
  • Multi-Query Attention:由 Shazeer 在 2019 年提出,這是一種改良的注意力機制,允許每個「頭」在多頭注意力機制中獨立查詢不同的信息。7B 模型使用傳統的多頭注意力,而 2B 模型則使用 Multi-Query Attention,其中每個「頭」可以專注於輸入的不同部分,這種設計基於效能改進的剝離研究。
  • RoPE (Rotary Positional Embedding):由 Su 等人在 2021 年提出,RoPE 是一種位置嵌入技術,與傳統的絕對位置嵌入不同,RoPE 通過旋轉的方式來表示位置信息,這使得模型能夠更好地捕捉到序列中元素的相對位置關係,並且能夠在模型的各層之間共享嵌入,進一步減少模型大小。
  • GeGLU Activation Function:由 Shazeer 在 2020 年提出,GeGLU 是一種『激勵函數』,比標準的 ReLU 激勵函數具有更好的性能。它結合了 GELU(Gaussian Error Linear Unit)和 GLU(Gated Linear Unit),通過引入 Gating Mechanism 來提高模型的非線性處理能力,進而提升模型的學習能力和通用性。
  • Normalizer Location:在每個 Transformer 子層的輸入和輸出都進行標準化,這是一種偏離標準做法的設計。通常,模型要麼對輸入進行標準化,要麼對輸出進行標準化,但 Gemma 選擇對兩者都進行標準化,以提升訓練的穩定性和效率。使用的標準化層是 RMSNorm(Root Mean Square Normalization),由 Zhang 和 Sennrich 在 2019 年提出,這種方法通過計算輸入的均方根值來進行標準化,有助於避免訓練過程中的梯度消失或爆炸問題。

Gating Mechanism

門控機制(Gating Mechanism)在深度學習領域中,特別是在處理序列數據與自然語言處理(Natural Language Processing, NLP)任務上,扮演著關鍵的角色。這種機制透過設置「門」(Gates)來控制資訊的流動,決定哪些資訊是重要的、應該被保留,以及哪些資訊是次要的、可以被遺忘。這讓模型能夠更有效地學習長距離的依賴關係,是提升序列模型性能的重要技術之一。

門控機制的典型應用包括長短期記憶網絡(Long Short-Term Memory, LSTM)和門控遞歸單元(Gated Recurrent Unit, GRU)。這兩種架構都透過引入 Gating Mechanism 來解決傳統遞歸神經網絡(Recurrent Neural Network, RNN)在學習過程中可能遇到的梯度消失或梯度爆炸問題。

  • LSTM:它有三個門,分別是 Forget Gate、Input Gate 和 Output Gate。這些門協同工作,幫助模型記住和遺忘資訊,從而有效地捕捉長期依賴關係。
  • GRU:相對於 LSTM 來說,GRU 結構更為簡單,它將 LSTM 中的遺忘門和輸入門結合為一個單一的 Update Gate,並且增加了 Reset Gate。這讓 GRU 在某些情況下計算效率更高,同時仍然保持了良好的性能。

Gating Mechanism 使模型能夠在每個時間步驟中做出決策,以最有效地更新其內部狀態,這對於處理時間序列數據,如語音識別、語言模型和其他循序漸進的任務來說尤其重要。

梯度消失(Vanishing Gradient)

梯度消失(Vanishing Gradient)是在訓練深度學習模型,特別是遞歸神經網絡(Recurrent Neural Networks, RNNs)和深層前饋神經網絡(Deep Feedforward Neural Networks)時常見的問題。當模型的梯度變得非常小,以至於在反向傳播過程中幾乎不更新權重時,就會發生梯度消失。這會導致學習過程停滯,因為模型無法有效地從訓練數據中學習並調整其參數。

梯度消失通常發生在訓練過程中較深層的模型,尤其是當使用像是 Sigmoid 或 Tanh 這類激勵函數(Activation Functions)時。這些激勵函數在輸出接近其飽和區(即輸出接近最大或最小值時)的導數會變得非常小。因此,當這些小導數在反向傳播過程中被連乘時,會導致靠近輸入層的層接收到的梯度非常小,這使得這些層的權重難以更新,從而導致梯度消失問題。

為了緩解梯度消失問題,學術界和工業界提出了多種方法,包括:

  • 使用 ReLU(Rectified Linear Unit)或其變體作為激勵函數,因為 ReLU 在正值區域的導數恆為一,有助於緩解梯度消失問題。
  • 採用門控機制(Gating Mechanisms)的模型架構,如長短期記憶網絡(Long Short-Term Memory, LSTM)和門控遞歸單元(Gated Recurrent Unit, GRU),這些模型設計有助於保持長期的梯度流。
  • 使用批量標準化(Batch Normalization)技術,在每層的輸入進行標準化處理,有助於保持梯度在適當的範圍內。
  • 透過殘差連接(Residual Connections)或跳躍連接(Skip Connections),如在深度殘差網絡(Deep Residual Networks, ResNets)中使用,可以幫助梯度直接流向更深的層。

梯度爆炸(Exploding Gradient)

梯度爆炸(Exploding Gradient)是訓練深度學習模型時遇到的另一個問題,尤其是在遞歸神經網絡(Recurrent Neural Networks, RNNs)中較為常見。這個問題發生時,模型的梯度在反向傳播過程中迅速增長,可能會變得非常大,以至於導致模型權重的更新過大,進而導致模型無法收斂,表現為權重值變得非常不穩定,最終可能導致數值計算上的溢出。

梯度爆炸通常發生於深層網絡中,當梯度的值在經過多個層的反向傳播時累積乘以大於 1 的權重,這些乘積可以迅速增長,導致梯度非常大。這種情況下,即使是微小的變化也可能導致極大的權重更新,從而使模型表現不穩定或難以訓練。

為了緩解梯度爆炸問題,可以採取以下幾種策略:

  • 梯度裁剪(Gradient Clipping):這是一種直接的解決方法,通過設置一個閾值來限制梯度的最大值,如果計算出的梯度超過這個閾值,就將其縮放回閾值範圍內。這樣可以防止在梯度更新時出現過大的步伐。
  • 使用較小的學習率(Learning Rate):選擇一個較小的學習率可以在一定程度上減緩梯度爆炸的問題,因為它減少了每一步更新權重的幅度。
  • 權重正則化(Weight Regularization):通過對權重大小進行懲罰,鼓勵模型學習到較小的權重值,這有助於防止梯度在反向傳播過程中的迅速增長。
  • 改進模型架構:選擇或設計更加穩定的模型架構,如使用長短期記憶網絡(LSTM)或門控遞歸單元(GRU)代替傳統的RNN架構,這些架構通過引入門控機制來更好地控制信息的流動,從而有助於緩解梯度爆炸問題。

訓練基礎設施

Google 使用 TPUv5e 來訓練 Gemma 模型;TPUv5e 部署在包含 256 顆晶片的 pods 中,配置成 16 x 16 晶片的 2D torus。對於 7B 模型,Google 跨 16 個 pods 進行訓練,總共使用了 4096 顆 TPUv5e。Google 在 2 個 pods 上預訓練 2B 模型,總共使用了 512 顆 TPUv5e。在一個 pod 內, 其對 7B 模型使用 16 路徑模型分片(model sharding)和 16 路徑數據複製(data replication)。

對於 2B 模型,Google 簡單地使用 256 路徑數據複製。優化器狀態進一步使用類似於 ZeRO-3 的技術進行分片。在 pod 之外,其還通過數據中心網絡進行 data-replica reduce,使用的是 Pathways 方法。

如同在 Gemini 中,Google 利用 Jax 和 Pathways 的「單一控制器」程式開發典範來簡化開發過程,通過啟用單一 Python process 來協調整個訓練運行;Google 還利用 GSPMD partitioner 來進行訓練步驟的計算,以及 MegaScale XLA 編譯器。

預訓練

在訓練數據上,Gemma 2B 和 7B 分別在 2 兆(T)和 6 兆(T)tokens 的基礎上完成預訓練,內容主要是英文的網頁文件、數學和程式碼數據。與 Gemini 不同,Gemma 不是多模態,也沒有被訓練來在多語言任務上達到最先進的性能。

Google 使用了 Gemini 的 SentencePiece 分詞器(tokenizer)的一個子集來保持相容性,它分割數字、不移除額外的空白,並且對未知的 tokens 依賴於 byte-level 編碼,詞彙大小是 256k tokens。

『詞彙大小是 256k tokens』指的是在訓練 Gemma 模型時使用的分詞器(tokenizer)擁有一個包含 256,000 個唯一 tokens 的詞彙表。在深度學習和 NLP 中,詞彙表是模型用來理解和生成文本的基礎。每一個 token 代表一個詞彙單位,可以是一個字、一個詞,或者是文本中的其他符號。

使用 256k tokens 的詞彙表意味著模型在處理文本時能夠辨識和使用多達 256,000 種不同的詞彙單位。這種大規模的詞彙表能夠幫助模型更好地理解和處理復雜的文本數據,包括網頁文件、數學表達式和程式碼等。擁有足夠大的詞彙表是提升模型在語言理解和生成任務上性能的關鍵因素之一,因為它提供了更豐富的語言資訊給模型學習。

預訓練的過濾

Google 透過在預訓練階段對所有數據進行了過濾,極大化的去降低不想要或不安全語句被推論出的風險,並過濾掉資料集中的 PII 和其他敏感數據。這包括使用啟發式方法(heuristics)和基於模型的分類器來移除有害或低品質內容。此外,Google 從預訓練數據混合中過濾掉所有 evaluation set,進行針對性的污染分析以檢查對 evaluation set 洩露的風險,並通過最小化敏感輸出的擴散來減少背誦的風險。

最終數據混合是通過對 2B 和 7B 模型進行一系列剝離分析來確定的。類似於 Gemini 採用的方法論,Google 階段性地訓練以改變訓練過程中的語料混合,以增加訓練末期相關、高品質數據的權重。

Evaluation set

在深度學習和 NLP 領域中,「評估資料集」(evaluation set)是用來評估機器學習模型性能的一組數據。這些數據集是在模型的訓練階段之外獨立選取的,目的是在模型開發過程中提供一個公正的測試環境,以評估模型對未見過數據的通用化能力。

在一個典型的機器學習項目中,數據通常被分為三個主要部分:training set、validation set 和 evaluation set。training set 用於模型的學習和參數調整;validation set 用於在訓練過程中校正與調節超參數和避免過擬合,以及選擇最佳的模型版本;evaluation set 則用於在整個開發過程結束後,對模型的最終性能進行評估。

使用 evaluation set 的目的是為了確保評估過程的客觀性和準確性。因為模型在訓練過程中沒有接觸過評估集中的數據,所以這些數據可以視為模型在實際應用中可能遇到的「新」數據。通過評估模型在評估集上的表現,開發者可以對模型的通用化能力和實際應用場景有一個更清晰的認識。

Evaluation set leakage

評估集洩露(evaluation set leakage)是指在機器學習模型的訓練過程中,不慎將用於評估模型性能的數據(評估集)的資訊間接或直接地透露給了模型。這種情況下,模型可能會「學會」評估集上的特定樣本,而不是從訓練數據中學習到通用化的規律,導致模型對評估集表現異常良好,但對於真實世界中的未見過數據的通用化能力卻可能較差。

評估集洩露可以通過多種方式發生,例如:

  • 在模型訓練階段不慎使用了評估集中的數據。
  • 在特徵工程或數據預處理階段,使用了包含評估集信息的統計量或模型。
  • 在選擇模型或調節超參數時,過度依賴評估集的反饋,導致模型過度優化以適應評估集的特點。

『評估集洩露的後果是模型性能的過度樂觀估計』,這可能會導致在模型部署到實際應用時表現不如預期。因此,避免評估集洩露是機器學習項目中保證模型評估準確性和可靠性的重要考慮。採取嚴格的數據管理和實驗設計措施,確保訓練、驗證和評估數據集的嚴格分離,是預防評估集洩露的關鍵策略。

剝離分析(Ablation Study)

Ablation Study 用於評估模型中各個組件或特徵對模型整體性能的影響。透過逐一『移除』或『剝離』模型的某個部分或功能,然後觀察這種改變對模型表現(如準確率、損失等)的影響,研究者可以判斷哪些組件是對模型性能貢獻最大的,哪些可能是多餘的或甚至降低模型表現的。

剝離分析不僅限於移除模型的某些層或組件,它也可以用於評估不同的數據預處理方法、特徵選擇技術、訓練策略等對模型性能的影響。這種方法有助於模型的簡化和優化,因為它可以顯示出哪些部分對提升模型的效能是必要的,而哪些部分則可以被簡化或完全去除而不會對性能產生太大影響。

剝離分析的一個關鍵優點是它提供了一種直接和系統的方式來理解複雜模型的內部運作機制和決策過程。透過這種分析,研究者可以更好地調整模型架構,選擇最適合特定任務的模型配置,從而在保持或甚至提升模型性能的同時,減少計算資源的消耗。

如何部署 Gemma 2B/7B

程式碼撰寫中…

如何 RAG Gemma 2B/7B

程式碼撰寫中…

如何 fine-tuning Gemma 2B/7B

程式碼撰寫中…

Leave a Comment

Your email address will not be published. Required fields are marked *