成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

大模型微調:Hugging Face Transformers全流程實戰

原創 精選
人工智能
本文描述了模型微調技術,通過調整預訓練模型的參數,使其適應特定任務,從而提升模型在特定領域的表現。文中以 Yelp 數據集為例,詳細介紹了如何使用 Hugging Face Transformers 框架對 BERT 模型進行微調,實現評論星級分類任務。

作者 | 崔皓

審核 | 重樓

隨著大模型在人工智能領域的興起,如何將其應用于垂直領域成為關鍵問題。本文描述了模型微調技術,通過調整預訓練模型的參數,使其適應特定任務,從而提升模型在特定領域的表現。文中以 Yelp 數據集為例,詳細介紹了如何使用 Hugging Face Transformers 框架對 BERT 模型進行微調,實現評論星級分類任務。文檔涵蓋了微調的背景、主流手段、架構和工具,并深入講解了微調的思路和實踐步驟,包括數據預處理、模型選擇、超參數設置、訓練評估和結果驗證等。

大模型風頭正盛,微調展現威力

近年來,大型預訓練模型如GPT系列、Llama系列、通義千問在各大科技巨頭的推動下,成為了人工智能領域的明星。然而,除了這些通用模型外,越來越多的垂直領域企業也在利用這些大模型,通過模型微調,打造符合行業需求的定制化解決方案。

以一家科技公司為例,公司需要頻繁參與技術類項目的投標,每次都要根據具體項目的要求編寫詳細的技術方案。如果直接使用預訓練好的通用語言模型來生成技術方案,雖然模型在理解語言和生成文本方面表現不錯,但對于科技行業特有的技術術語、項目需求以及公司的業務特點,它的輸出質量可能并不理想。通過模型微調,公司可以使用少量歷史投標文件和行業相關的標記數據,對模型進行再訓練,使其生成的技術方案更加貼合公司的技術風格和項目要求。這樣,微調后的模型不僅能顯著提高方案生成的準確性,還能幫助公司減少手工編寫時間,提高效率和投標成功率。

關于模型微調,我們還可以舉一個例子:假設你已經學會了畫畫,能畫出非常漂亮的風景畫。現在,你想畫一只特定品種的小鳥,雖然你已經有了基礎的畫畫技巧,但為了畫好這只小鳥,你還需要學習一些額外的技巧,比如觀察它的羽毛顏色和翅膀形狀。模型微調就像是這樣一個過程:AI模型已經掌握了很多基礎技能,但要完成特定任務,還需要通過微調來“特訓”,以提高它在某個領域的表現。

從理論上看,模型微調是針對已經經過大規模數據預訓練的通用模型進行小規模的再次訓練,使其在特定任務中表現更好。這種方法不僅節省了從零開始訓練的資源和時間,還通過遷移學習的方式,充分利用了預訓練模型中的豐富知識。

在論文BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (Devlin et al., 2018)中就指出通過預訓練和微調的結合,顯著提升了模型在多項任務中的表現。在Transfer Learning for NLP: A Comprehensive Survey (Ruder, 2019) 中也提到遷移學習與微調技術的演變,以及它們在自然語言處理中的關鍵作用。這些研究表明,微調不僅能讓通用模型更好地適應具體任務,還能為各行業提供高效且專業化的解決方案。這就是為什么在現代AI領域,微調成為了一項不可或缺的技術。

主流的微調手段

既然大模型微調解決了企業在垂直領域的大模型使用問題,那么市面上有哪些微調的手段呢?微調(Fine-tuning)作為將大型預訓練模型應用于特定任務的重要手段,依賴于對模型參數的靈活調整。不同任務的需求、數據量的大小以及計算資源的限制,決定了選擇哪種微調方式。以下是幾種主流的微調策略:

  • 基于特征的調優(Feature-Base Approach):在不修改預訓練模型參數的前提下,通過提取特征向量并應用于下游任務。例如在圖像識別任務中,利用預訓練模型的輸出作為輸入特征來訓練一個簡單的分類器。
  • 輸出層更新的微調(Finetuning I):凍結模型的前幾層,僅對輸出層或最后幾層進行更新。這種方法適合在數據量有限的情況下,保持模型的高效性,并避免過擬合。
  • 全層更新的微調(Finetuning II):模型的所有層都會參與更新,適合數據量充足且任務復雜的場景。它可以讓模型更深層次地適應特定領域的特性,但計算開銷較大。
  • 參數高效微調(Parameter-Efficient Fine-tuning, PEFT):PEFT 通過適配器訓練(Adapter Training)或低秩分解等方法,只增加少量新的參數進行訓練,保持原模型參數的結構不變。這種方法能夠極大減少計算資源需求,尤其適用于資源有限或需要快速迭代的任務。
  • 蒸餾(Distillation):將大型模型(教師模型)的知識提取并應用到一個較小的模型(學生模型)中,從而實現性能與計算效率的平衡。學生模型保留了教師模型中的關鍵知識,同時大幅減少了計算資源的消耗。
  • 適配器訓練(Adapter Training):適配器是一種將少量新增參數插入到預訓練模型中的技術,能夠讓模型在不完全重訓練的情況下適應新任務,從而降低計算開銷并提高效率。
  • 提示調優(Prompt-tuning):在這種方式中,通過設計特定的提示詞來引導模型輸出所需的結果,而不需要調整模型參數。這種方法適合數據少且需要快速部署的場景。

微調的架構和工具

前面我們提到了,在不同的應用場景需要使用不同的微調手段,那么有哪些大模型微調的工具和框架可以幫助開發者快速上手微調呢?在業內, Hugging Face Transformers 和 DeepSpeed 是兩個備受矚目的工具和架構,它們的出現使得微調變得更加高效和可擴展。

1. Hugging Face Transformers

Hugging Face 的 Transformers 框架是目前自然語言處理(NLP)領域中最受歡迎的工具之一。它的優勢在于簡化了從預訓練模型加載到微調整個過程的復雜性:

  • 豐富的模型庫:Hugging Face 提供了一個龐大的模型庫,包括 BERT、GPT、T5 等預訓練模型。
  • 簡化的微調流程:借助其高層 API 和 Trainer 模塊,開發者可以輕松地在自己的數據集上微調模型。Trainer 支持自動混合精度訓練、分布式訓練和動態批量大小調整等功能。
  • 集成的社區和數據集:Hugging Face 平臺上的模型和數據集共享機制讓開發者能夠輕松訪問他人的工作成果。

2. DeepSpeed

DeepSpeed 是微軟推出的一款針對大規模深度學習模型的優化工具,它的主要優勢在于極大地提高了訓練效率,尤其適合處理像 GPT-3 這樣的超大規模模型。

  • 混合精度訓練(FP16/BF16):DeepSpeed 通過混合精度技術,在不犧牲性能的前提下顯著減少模型的內存占用,并加快計算速度。
  • 零冗余優化(ZeRO Optimizer):DeepSpeed 采用了零冗余優化策略,可以在多 GPU 環境下大幅度減少內存開銷,使得在相對有限的硬件資源下也能訓練大型模型。
  • 支持大規模并行化:DeepSpeed 提供了靈活且高效的分布式訓練方案,能夠高效擴展至成千上萬的 GPU,適用于大規模的微調任務。

參數高效的訓練:通過對訓練過程的優化,如梯度累積、張量并行等技術,DeepSpeed 可以在降低內存需求的同時提高訓練速度。

微調思路

雖然兩個調優工具都非常優秀,但由于本文篇幅有限,所以我們選取Hugging face Transformers 框架來為大家進行大模型調優的實踐。

這里通過一張圖來介紹大模型微調的思路,如下圖所示,展示了從文本預處理到模型訓練、評估、驗證和保存等全過程。對于本次微調,我們希望解決“分類問題”,讓模型理解“評論內容”與“評分星級”之間的關系,這里我們會提供大量的評論數據,每條數據會打上評分星級。在微調之后,給模型輸入任何的評論內容,它都會返回該評論對應的星級。接下來的過程將分為幾個主要步驟:

 1. 確認問題

首先,要確認本次微調要解決的問題:理解“評論內容”與“評分星級”之間的對應關系。通過微調模型,我們希望模型能夠根據評論的文本內容自動預測其星級評分(1-5星)。微調后的模型能夠在新的評論輸入時自動給出星級評定。

 2. 裝載數據集

本次微調會使用Yelp 數據集,它是一個公開的評論數據集,包含了大量用戶對商家的評價和評分,廣泛應用于自然語言處理任務。數據集的特點包括:

  • 文本多樣性:包含多種不同類型的評論,覆蓋不同語言風格、評論長度。
  • 結構化評分:每條評論都帶有一個結構化的星級評分(1到5星),適合分類問題。
  • 數據量龐大:原始數據集包含數條評論,適用于深度學習模型的訓練。

3. 分詞器處理文本

對評論文本進行分詞,將每條評論分解為詞或詞組。這里我們使用 BERT 自帶的分詞器(Tokenizer),它能夠將文本轉化為模型所需的輸入格式(如 token IDs、attention masks 等)。通過分詞,我們能夠將每個詞或詞組轉化為模型理解的向量表示,并保留文本的結構信息。

 4. 生成小數據集

為了加快實驗和測試過程,我們從原始的 Yelp 數據集中提取一個小樣本數據集。小數據集可以幫助我們快速迭代模型的訓練、調參和驗證。經過分詞器處理后,我們可以將這些小樣本輸入到模型中進行訓練和評估。

5. 選擇微調模型

我們將使用預訓練的 BERT 模型,并根據 Yelp 數據集的需求調整模型的輸出層。BERT 本身經過大規模語料庫的預訓練,具備強大的語言理解能力,通過微調,可以將其適應特定的分類任務。

6. 設置超參數

超參數包括學習率、訓練輪次、batch size 等。合理的超參數設置能夠確保模型的有效訓練,避免過擬合或欠擬合問題。在訓練過程中,我們將定期監控模型的性能,確保其學習到評論文本中的有效信息。

7. 訓練評估

在訓練階段,我們會定期對模型進行評估。這通常在每個訓練輪次結束后進行,通過驗證集上的數據來評估模型的性能。通過這樣的方式,能夠實時了解模型的學習效果,并根據評估結果適時調整,避免過擬合等問題。

8. 計算準確性計算

通過計算模型的預測準確性來衡量其表現。在每次評估時,模型會對驗證集中的數據進行預測,然后將這些預測結果與實際標簽進行比較。通過計算準確性,能夠判斷模型在該分類任務中的成功率,即模型在多大程度上能夠正確預測評論的星級。

9. 執行訓練

開始對模型進行微調訓練。

10.保存模型

在訓練和驗證完成后,將微調后的模型進行保存。保存的模型可以用于后續的預測和推理任務。通過調用保存的模型,我們可以在給定新評論的情況下快速獲得預測的星級評分。

11. 驗證結果

將設計對比實驗:讓未經過微調的模型和經過微調的模型分別對 Yelp 數據集中的評論進行星級預測,查看評分結果的差異。這樣可以展示微調后的模型是否能夠更好地理解評論文本與評分之間的關系,并給出更加準確的預測。

通過這些步驟,我們將詳細探討如何使用 Hugging Face 的工具對 BERT 模型進行微調,并結合 Yelp 數據集,逐步完成從數據預處理、模型訓練到結果驗證的整個流程。

實現微調

介紹完整個微調思路之后,我們會通過Hugging Face的Transformers 模型框架編寫微調的代碼。

由于微調模型需要算力資源,一般而言都需要多張高顯存的顯卡支持。通過上面的微調思路大家可以知道,為了演示微調過程,我們將數據集進行了縮減的操作,利用更小的數據集來完成微調。在實際應用場景如果需要微調更大的數據集就需要多張高階顯卡。如下圖所示,我們租用AutoDL上的虛擬服務器,使用3080ti顯卡進行微調,實際測試的效果還不錯,在小數據微調的情況下10-20分鐘可以完成。

接著,需要安裝必要的組件庫,如下:

!pip install transformers datasets evaluate accelerate scikit-learn

上述庫支持自然語言處理任務,尤其是涉及到模型微調、評估和數據處理的任務。下面是對每個庫的簡要解釋:

1. transformers

這個庫是由 Hugging Face 提供的,它包含了許多預訓練的自然語言處理模型,支持包括文本分類、生成、翻譯等任務。

2. datasets

該庫也是由 Hugging Face 提供的,專門用于處理和管理各種機器學習數據集。它可以加載、預處理和操作不同格式的數據集,支持直接加載許多公開數據集如 Yelp、IMDB 等。

3. evaluate

用于評估模型的性能。它提供了各種常用的評估指標(如準確率、精確率、召回率等),方便在模型訓練和驗證時計算這些指標,幫助衡量模型的表現。

4. accelerate

用于加速模型訓練的庫,支持分布式訓練和加速設備的無縫切換,比如在CPU和GPU之間轉換,或者使用多個GPU進行訓練。

5. scikit-learn

非常流行的機器學習庫,提供了各種統計學習工具、數據預處理和模型評估方法。在自然語言處理項目中,它常用于進行數據處理和分類算法的基礎操作,如分詞、向量化、模型評估等。

裝載數據集

這里我們使用了Yelp數據集,它是從 2015 年的 Yelp 數據集挑戰賽中提取的,包含大量的用戶評論,主要用于情感分類和文本分類任務。通過分析這些評論文本,可以預測用戶的情感傾向,也就是評分的星級。數據集中的評論主要以英文撰寫,每條評論包含兩個核心元素:評論的文本內容和對應的評分標簽。評論內容中涉及的文本經過特殊處理,雙引號和換行符都進行了轉義。評分標簽表示評論的星級,范圍從 1 到 5 星不等。整個數據集被隨機劃分為訓練集和測試集,每個星級類別各包含 130,000 條訓練樣本和 10,000 條測試樣本,總共包含 650,000 條訓練數據和 50,000 條測試數據。

數據集的格式大致如下:

{
    'label': 0,
    'text': 'I got \'new\' tires from them and within two weeks got a flat...'
}

接著通過如下代碼加載數據。

from datasets import load_dataset
dataset = load_dataset("yelp_review_full")
dataset["train"][100]

通過代碼可以看出,load_dataset 函數可以直接加載 yelp_review_full 數據集,它來自 Hugging Face 的 datasets 庫。這個庫內置了許多公開可用的數據集,Yelp Review Full 就是其中之一。說白了Hugging Face 數據庫包含了大量的預先注冊的數據集,并且通過統一的接口 load_dataset 來訪問,需要什么數據你告訴Hugging Face 名字就可以了,不用指明數據的文件地址。

當使用 load_dataset("yelp_review_full") 時,函數會通過數據集名稱自動從 Hugging Face 的數據集庫中找到對應的資源,并加載相應的數據集。這意味著你不需要手動下載或準備數據集,Hugging Face 已經在其平臺上托管了這個數據集,并定義了它的結構和格式。因此,load_dataset 能夠通過提供的名稱直接訪問并加載。

在加載完畢數據以后,可以通過dataset["train"][100],查看Yelp Review 數據集中提取第 100 條訓練數據,確認數據已經加載完畢。

分詞器文本處理

分詞器的工作是將我們看得懂的語言文字轉化為模型能理解的數字。無論是機器學習模型還是深度學習模型,它們都只能處理數字,而不是直接處理文本。我們需要一個方法來把文本“翻譯”成模型能夠理解的形式。分詞器正是負責這一“翻譯”工作的工具。通過將句子分解成“詞”或“字符”,然后給每個詞或字符分配一個數字(通常叫做輸入ID),模型就可以開始處理這些數字了。

如下圖所示,比如,“我喜歡蘋果”這句話,分詞器就會把“我”翻譯成1,“喜歡”翻譯成2,“蘋果”翻譯成3。而這些數字是根據詞匯表(vocabulary)中的子詞來索引的,可以理解為在模型內部有一個很大的詞匯表,詞匯表中維護每個詞對應的ID,你輸入ID模型就知道你要表達什么詞(類似身份證與人之間的關系)。這個詞匯表可以看作是模型用來理解語言的“字典”,其中包含了大量常見的詞和子詞(subwords)。每個子詞在詞匯表中都有一個對應的索引 ID,當我們輸入一段文本時,分詞器會將它切分成多個子詞,并查找每個子詞在詞匯表中的索引。

為什么需要詞匯表?因為語言的多樣性非常大,而單詞的數量是無限的。直接給每個完整的單詞一個唯一的 ID 會導致詞匯表非常龐大,這不僅會增加模型的復雜性,還容易出現很多未知的詞(也就是詞匯表中沒有的詞)。使用子詞來代替整個單詞能夠減少詞匯表的大小,同時確保即便遇到生僻詞也能通過已知的子詞來表達。例如,英文"unhappiness" 可以被拆分為 "un-" 、"happi-" 和 “ness”三個子詞,即便模型沒有見過完整的“unhappiness”這個詞,它仍然可以通過上述三個子詞來理解。

如下圖所示,簡單理解,分詞器的工作就是講輸入的文字參照詞匯表,將其轉化為子詞ID的形式,然后輸入到大模型中進行處理。

接著來看代碼:

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased")
def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)
tokenized_datasets = dataset.map(tokenize_function, batched=True)

從 Hugging Face 預訓練模型庫中加載了google-bert/bert-base-cased版本分詞器。

def tokenize_function(examples)用于處理數據集中的每一個數據點。

tokenizer(examples["text"], padding="max_length", truncation=True):這里使用分詞器將輸入的文本數據進行分詞。分詞器會將文本轉換為標記(tokens),并將其轉換為適合模型輸入的數字化形式。padding="max_length":表示對文本進行填充,使所有文本的長度相同,達到預定義的最大長度。truncation=True:如果文本長度超過最大長度,自動截斷多余部分。

tokenized_datasets = dataset.map(tokenize_function, batched=True):使用 map 函數,將定義的分詞函數應用到數據集中。通過 batched=True,它批量處理數據,加快處理速度。最終得到的是一個包含經過分詞和預處理的文本數據集,格式化后可直接輸入模型。

生成小數據集

在處理大型數據集時,訓練模型和進行驗證會耗費大量時間和計算資源。因此,我們通常會創建一個小數據集來進行快速的實驗和調試。

加入如下代碼:

small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))

tokenized_datasets["train"] 和 tokenized_datasets["test"]: 分別從已分詞的數據集中獲取訓練集和測試集。

  • shuffle(seed=42): 將數據集隨機打亂,seed=42 確保打亂的順序是可重復的,即每次執行代碼時得到相同的隨機順序。
  • select(range(1000)): 選擇前 1000 條樣本,生成一個小型的數據集,限制訓練和測試的規模為 1000 條數據,適用于快速測試。

指定微調模型

微調數據集是基于一個預訓練模型展開的,這里選擇bert-base-cased 模型,用于一個有 5 個分類標簽(1-5星的評價)的序列分類任務。

代碼如下:

from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("google-bert/bert-base-cased", num_labels=5)

AutoModelForSequenceClassification:是 Hugging Face 的 transformers 庫中提供的模型,用于文本分類任務。它基于預訓練的 Transformer 模型,并添加一個分類頭(線性層)來處理分類任務。通過這個類中的from_pretrained("google-bert/bert-base-cased")方法加載預訓練模型。

num_labels=5:定義了分類任務的標簽數為 5,表示我們要對文本進行 5 類分類任務。

設置超參數

設置超參數幫助配置模型訓練時的各種參數,比如訓練輸出的目錄、批量大小、學習率、是否使用 GPU 等。

如下代碼用于設置訓練模型時的超參數,使用 Hugging Face transformers 庫中的 TrainingArguments 類。

from transformers import TrainingArguments
training_args = TrainingArguments(output_dir="test_trainer")

為了簡化演示過程這里只配置了output_dir="test_trainer"作為模型輸出的路徑。在訓練過程中,模型的檢查點(checkpoints)、日志文件、以及最終模型都會被保存在這個目錄下。

此外,TrainingArguments 提供了許多其他參數,你可以根據具體的訓練需求來設置,比如:

  • per_device_train_batch_size:每個設備上的訓練批次大小。
  • learning_rate:設置學習率。
  • num_train_epochs:訓練的迭代次數。
  • evaluation_strategy:定義何時進行評估(例如 "steps", "epoch" 等)。
  • save_steps:在訓練過程中保存模型的頻率。
  • logging_dir:用于存放 TensorBoard 日志文件的目錄。

訓練評估與計算預測的準確性

在模型的訓練和評估過程中,特別是在分類任務中,衡量模型性能的一個關鍵指標就是準確性。訓練好的模型可以在驗證集上進行評估,查看模型在實際數據上的表現,以此來衡量其分類能力。我們會創建一個compute_metrics 函數,它用來計算預測結果和實際標簽的差異來評估模型的準確性。同時會使用evaluate 庫的 accuracy 指標得到模型在驗證集上的表現。

代碼如下:

import numpy as np
import evaluate
metric = evaluate.load("accuracy")
def compute_metrics(eval_pred):
    logits, labels = eval_pred
    predictions = np.argmax(logits, axis=-1)
    return metric.compute(predictions=predictions, references=labels)

metric = evaluate.load("accuracy")加載了 Hugging Face 庫中預定義的“準確率”評估指標。 compute_metrics(eval_pred) 函數是為訓練/驗證流程提供的評估函數,傳入的參數 eval_pred 包含了兩個部分:logits 和 labels。

logits:模型輸出的原始預測結果,通常是未經過激活函數的值(在分類任務中通常是未經 softmax 的分數)。

為什么突然跳出一個logits來了?這里需要稍微解釋一下,在深度學習的分類模型中,模型在最后一層輸出的是各個類別的分數(logits)。這些分數用來表示模型對各個類別的預測概率。在很多情況下,模型會直接輸出 logits,而不是最終的類別,因為 logits 還可以進一步處理(比如通過 softmax 轉換為概率)。

大家還記得嗎?在最開始處理文本的時候,我們需要針對輸入文本進行分詞(tokenization),接著每個詞會被映射成嵌入(embedding)。嵌入作為輸入經過模型的層層處理,最后在輸出層產生 logits,用于預測文本的分類結果。因此,分詞是處理輸入數據的第一步,而 logits 是最終的輸出分數,用來確定分類的結果。

來舉個例子說說logits方便大家理解,假設我們有一個分類任務,模型需要把一句話分成 5 個類別之一(比如情感分類:0=負面, 1=中性, 2=正面, 3=疑問, 4=驚訝)。在模型處理輸入之后,它會輸出一個包含 5 個數值的向量(logits),表示模型對每個類別的信心。

示例:

輸入句子:"I love this product!"

假設模型的輸出 logits 是:

logits = [2.5, -1.3, 5.2, 0.8, -0.5]

這個向量表示模型對每個類別的信心。這里的 5.2 是 logits 中的最大值,表示模型認為這個句子最可能屬于第 2 類(“正面”情感),盡管它對每個類別都有一定的信心值。

所以,這里的logits就是在對預測結果進行“打分”,哪個分類上分數越高,模型就會認為這個文字描述屬于哪類。

而labels表示的是實際標簽,它用于與模型的預測結果對比。

logits, labels = eval_pred:將 eval_pred 拆分為 logits 和 labels。

predictions = np.argmax(logits, axis=-1):使用 np.argmax() 函數從 logits 中找到最大值的索引,代表模型的最終預測類別。axis=-1 表示沿最后一個維度進行操作,對于每個輸入,輸出模型認為最可能的類別。

metric.compute(predictions=predictions, references=labels):計算模型預測的準確性。predictions 是模型的預測值,references 是真實標簽。這個函數返回一個包含準確性(accuracy)指標的字典。

創建Trainer對象執行微調任務

微調前的基本工作已經完成了, 接下來我們需要創建一個Trainer類,用于簡化訓練和評估過程,該類包含了模型、訓練參數、訓練和驗證數據集,以及評估指標計算方法。然后,執行trainer.train() 用于微調訓練,模型的權重會根據訓練數據逐步優化。最后,trainer.save_model() 會將訓練好的模型保存,方便后續使用。代碼如下:

trainer = Trainer(
    model=model,  # 定義的模型( BERT 分類模型)
    args=training_args,  # 訓練的參數,如學習率、批次大小、訓練周期等
    train_dataset=small_train_dataset,  # 用于訓練的小數據集
    eval_dataset=small_eval_dataset,  # 用于評估的小數據集
    compute_metrics=compute_metrics,  # 之前定義的,驗證的準確性等指標的函數
)
trainer.train() # 開始訓練模型
trainer.save_model() # 保存訓練后的模型

執行上述代碼,得到如下運行截圖:

從圖中可以看出,驗證集上的準確性(Accuracy)分別為:

  • 第一輪:57.3%(0.573000)
  • 第二輪:58.0%(0.580000)
  • 第三輪:59.4%(0.594000)

盡管第三輪的驗證損失增加了,準確率卻依然提升了一點。這可能表明模型在某些類別上的預測更準確,但整體的損失仍然較大,表明模型存在過擬合或不平衡的表現。

同時得到如下運行信息:

TrainOutput(global_step=375, training_loss=0.49261214192708336, metrics={'train_runtime': 127.2273, 'train_samples_per_second': 23.58, 'train_steps_per_second': 2.947, 'total_flos': 789354427392000.0, 'train_loss': 0.49261214192708336, 'epoch': 3.0})

從信息可以看出,模型微調訓練共進行了 3 個 Epoch,執行了 375 個訓練步數,總運行時間為 127 秒。在訓練過程中,模型每秒能夠處理約 23.58 個樣本,每秒執行 2.95 個訓練步。最終,模型的平均訓練損失為 0.49,表明模型在訓練數據上的表現較為理想。此外,訓練的總浮點運算量(FLOPs)為 789,354,427,392,000,展示了訓練過程中涉及的大量計算量。

驗證微調

前面我們通過獲取數據集針對BERT模型進行微調,執行微調命令之后完成了微調的過程,并且通過trainer.save_model()語句將微調之后的模型保存到本地。接下來,通過對比微調前后模型對評論信息的星級反饋,來查看微調之后模型的能力是否提升。

先調用測試之前的模型輸入評論內容,看模型對評論給出什么星級的評定。

如下圖所示,測試的評論是2 star(2星的星級評定)。

執行如下代碼:

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
import numpy as np
# Yelp review 示例
input_text = "My first time going to Barb's Country Junction and I really wanted to like this place, I really did...however,……."
# 加載預訓練模型和 tokenizer
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased")
model_pretrained = AutoModelForSequenceClassification.from_pretrained("google-bert/bert-base-cased", num_labels=5)
# 標記化輸入文本
inputs = tokenizer(input_text, padding=True, truncation=True, return_tensors="pt")
# 使用預訓練模型進行預測(沒有經過微調)
with torch.no_grad():
    outputs_pretrained = model_pretrained(**inputs)
# 獲取未微調模型的預測標簽
predicted_label_pretrained = np.argmax(outputs_pretrained.logits, axis=-1).item()
print(f"Prediction before fine-tuning (without knowledge of Yelp reviews): {predicted_label_pretrained}")

得到如下結果。

Prediction before fine-tuning (without knowledge of Yelp reviews): 3

很明顯,從結果上看模型預測的星級為“3”,與數據集標注的“2”存在差異。

接著利用微調之后模型進行推理,代碼如下:

model = AutoModelForSequenceClassification.from_pretrained("test_trainer")
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased")
# 輸入文本
input_text = "My first time going to Barb's Country Junction and I really wanted to like this place, I really did...however, ……"
# 標記化輸入文本
inputs = tokenizer(input_text, padding=True, truncation=True, return_tensors="pt")
# 獲取模型預測
with torch.no_grad():  # 關閉梯度計算
    outputs = model(**inputs)
# 獲取預測標簽
predicted_label = np.argmax(outputs.logits, axis=-1).item()
# 輸出結果
print(f"Predicted label: {predicted_label}")

上述代碼通過model = AutoModelForSequenceClassification.from_pretrained("test_trainer"),獲取微調之后test_trainer目錄下的模型進行推理。 執行結果如下:

Predicted label: 2

與預期的結果相同,說明微調之后的模型能夠勝任評論星級分類的工作。

總結

大模型微調技術為將預訓練模型應用于垂直領域提供了有效途徑。通過微調,我們可以利用預訓練模型的知識,并結合特定領域的任務需求,打造定制化解決方案。本文以 Yelp 數據集為例,演示了如何使用 Hugging Face Transformers 框架對 BERT 模型進行微調,實現評論星級分類任務。文檔涵蓋了微調的背景、主流手段、架構和工具,并深入講解了微調的思路和實踐步驟,包括數據預處理、模型選擇、超參數設置、訓練評估和結果驗證等。相信通過本文的學習,讀者能夠更好地理解大模型微調技術,并將其應用于實際項目中。

作者介紹

崔皓,51CTO社區編輯,資深架構師,擁有18年的軟件開發和架構經驗,10年分布式架構經驗。

責任編輯:姜華 來源: 51CTO
相關推薦

2024-06-21 08:42:54

BERTNLP自然語言處理

2024-11-15 08:24:41

2024-11-13 08:34:32

T5聊天機器人大模型

2024-05-06 12:22:00

AI訓練

2022-07-13 16:45:34

?大模型AI微軟

2025-03-26 10:57:40

PyTorchGGUF

2024-01-02 09:10:17

k開源數據

2023-08-21 10:20:03

開源模型

2023-06-09 12:56:17

AlpacaWizardLMVicuna

2023-10-08 09:00:00

LLMGitHub人工智能

2023-06-07 08:22:59

LLM微調技術

2023-12-06 15:40:17

AI

2024-08-28 08:25:25

Python預訓練模型情緒數據集

2023-11-28 13:53:00

數據模型

2024-03-18 07:48:00

大語言模型NVIDIA生成式 AI

2024-09-09 07:46:16

2025-04-10 07:59:51

2024-12-30 00:01:00

多模態大模型Python
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产日韩91久久久久久 | 伊人av在线播放 | 在线观看中文字幕视频 | 精品欧美一区二区三区精品久久 | 日日操夜夜操天天操 | av中文字幕在线观看 | 羞羞视频在线观免费观看 | 黄片毛片在线观看 | 精品亚洲一区二区 | 国产精品无码永久免费888 | 久久久免费精品 | 国产人成精品一区二区三 | 91视频大全 | 欧美日韩一区在线 | 特级毛片www| 中文字幕一级 | 99亚洲精品 | 中文字幕一区二区三区精彩视频 | 国产熟熟 | 亚洲精品一区av在线播放 | 蜜桃视频在线观看免费视频网站www | 亚洲欧美综合精品另类天天更新 | 成人福利视频网站 | 一区在线观看 | 亚洲精品视频在线播放 | 国产在视频一区二区三区吞精 | 日韩免费福利视频 | www.天堂av.com| 国产精品a一区二区三区网址 | 欧美黄在线观看 | 91精品久久久久久久久 | 亚洲有码转帖 | 日韩精品一区二区三区中文字幕 | 日日日视频 | 在线视频国产一区 | 91中文字幕在线 | 亚州一区二区三区 | 亚洲精品一区二区三区在线观看 | 日本高清中文字幕 | 日韩在线欧美 | 久久国内精品 |