大語言模型(LLMs)在通用領域表現出色,但在特定領域的應用往往需要進一步的微調。領域適應技術正是為瞭解決這個問題而生的,它可以讓預訓練的 LLM 更好地理解特定領域的專業術語和知識。在金融領域,例如投資公司 Proxima,可以利用內部資料對 LLM 進行微調,使其適應金融市場的特定語言和規則。具體來說,可以採用 LoRA 等引數高效微調(PEFT)方法,並結合遮蔽技術來最佳化模型的訓練效果。透過領域適應,LLM 可以更好地理解金融趨勢、分析市場資料、回答客戶查詢,並生成符合公司內部標準的報告。此外,文章還介紹瞭如何使用因果語言建模(CLM)進行持續訓練,並以 BLOOM 模型為例,展示瞭如何在金融領域進行遷移學習的具體步驟和程式碼實作。
微調生成模型以適應特定任務
在 StyleSprint 案例中,公司可以整合來自其 FAQ 頁面、社交媒體和客戶服務記錄的問答對來進行微調。為了此練習,我們將建立一個簡單的資料集,其結構如下所示:
demo_data = [{
"question": "Stylesprint 最新的街頭時尚趨勢是什麼?",
"answer": "Stylesprint 的最新街頭時尚系列包括連帽衫和圖形 T 恤,所有這些都受到最新嘻哈時尚趨勢的啟發。"
# ...
}]
然而,為了將我們的資料集與問答流程整合,我們首先需要了解 Trainer 類別。Hugging Face transformers 函式庫中的 Trainer 類別期望訓練和評估資料集採用特定的格式,通常是 PyTorch Dataset 物件,而非簡單的字典列表。此外,資料集中的每個條目都需要被標記化並結構化為必要的欄位,例如 input_ids、attention_mask,以及針對問答任務的 start_positions 和 end_positions。
資料集必要欄位詳解
input_ids:這是一個整數序列,代表輸入句子在模型中的表示。每個單詞或子詞在句子中被轉換為一個唯一的整數或 ID。這個過程被稱為標記化。單詞或標記在語言模型的詞彙表中查詢,並使用相應的整數在模型中表示。例如,像「我愛巴黎」這樣的句子可能會被轉換為類別似[101, 354, 2459]的東西。attention_mask:注意力遮罩是一系列二元值,其中 1 表示真實標記,0 表示填充標記。換句話說,在出現 1 的地方,模型將理解那些地方需要注意,而出現 0 的地方將被模型忽略。這在處理不同長度的句子和處理批次句子時至關重要。start_positions和end_positions:這些是針對問答任務的。它們代表了在上下文的標記化形式中,答案的起始和結束標記的索引。例如,在上下文「巴黎是法國的首都」中,如果問題是「法國的首都是什麼?」且給出的答案是「巴黎」,那麼在標記化後,start_position和end_position將對應於「巴黎」在上下文中的索引。
建立自訂資料集類別
from torch.utils.data import Dataset
class StylesprintDataset(Dataset):
def __init__(self, tokenizer, data):
tokenizer.pad_token = tokenizer.eos_token
self.tokenizer = tokenizer
self.data = data
訓練模型
準備好訓練集並組態好我們的流程以應用 AdaLoRA 方法後,我們就可以進入訓練步驟。對於這個專案,我們將組態訓練以僅執行幾個 epoch,但在 StyleSprint 案例中,需要更強壯的訓練過程:
from transformers import Trainer, TrainingArguments
# 將模擬資料集分割為訓練集和評估集(50/50)
train_data = StylesprintDataset(tokenizer, demo_data[:len(demo_data)//2])
eval_data = StylesprintDataset(tokenizer, demo_data[len(demo_data)//2:])
# 訓練引數
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=10,
per_device_train_batch_size=16,
per_device_eval_batch_size=64,
warmup_steps=500,
weight_decay=0.01,
logging_dir="./logs",
logging_steps=10,
)
# 初始化 Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_data,
eval_dataset=eval_data
)
# 開始訓練
trainer.train()
#### 內容解密:
- 在上述程式碼中,我們首先從
transformers函式庫匯入了Trainer和TrainingArguments。然後,我們將資料集分割為訓練集和評估集,並定義了訓練引數。 TrainingArguments物件用於組態訓練過程,包括輸出目錄、訓練 epoch 數量、批次大小、預熱步驟、權重衰減等。- 初始化
Trainer物件時,我們傳入了模型、訓練引數、訓練資料集和評估資料集。 - 最後,我們呼叫
trainer.train()方法開始訓練模型。
理解訓練輸出
對於我們的簡單實驗,我們不期望一個高效能的模型;然而,我們可以學習如何解讀訓練輸出,它描述了模型在評估樣本上的表現。Trainer 類別將輸出一個包含損失指標的訓練摘要。
訓練損失
訓練損失是衡量模型表現的一個指標;損失越低,表示表現越好。在許多深度學習模型中,尤其是在處理語言理解等複雜任務時,通常一開始會有相對較高的損失。預期這個值會隨著訓練的進行而減少。
在訓練的早期階段,高損失並不是一個令人擔憂的原因,因為它通常會隨著模型的繼續學習而減少。然而,如果損失仍然很高,這表明可能需要額外的訓練。如果損失在長時間訓練後仍然很高,則可能需要調整學習率和其他超引數,因為不合適的學習率會影響模型的學習效果。此外,應評估訓練資料的品質和數量,因為資料不足會阻礙訓練。例如,由於我們只使用了幾個範例進行實驗,因此預期會有相對較高的損失。
使用微調後的模型進行推斷
下一步是使用我們新微調的模型進行推斷或預測。我們還應該保護我們的訓練模型引數,以便我們可以在不重新訓練的情況下重複使用它:
import torch
# 儲存引數
model.save_pretrained("./stylesprint_qa_model")
def ask_question(model, question, context):
# 將問題和上下文標記化
inputs = tokenizer.encode_plus(question, context, add_special_tokens=True, return_tensors="pt")
# 取得模型預測
with torch.no_grad():
outputs = model(**inputs)
# 取得開始和結束位置
answer_start_scores = outputs.start_logits
answer_end_scores = outputs.end_logits
# 找到具有最高 `start` 和 `end` 分數的標記
answer_start = torch.argmax(answer_start_scores)
answer_end = torch.argmax(answer_end_scores) + 1
# 將標記轉換為答案字串
answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(inputs["input_ids"][0][answer_start:answer_end]))
#### 內容解密:
- 在上述程式碼中,我們首先匯入了
torch,然後儲存了模型的引數。 ask_question函式用於向模型提問。它首先將問題和上下文標記化,然後取得模型的預測。- 我們使用
torch.no_grad()上下文管理器來停用梯度計算,因為我們不需要在推斷過程中計算梯度。 - 然後,我們取得開始和結束位置的分數,並找到具有最高分數的標記。
- 最後,我們將標記轉換為答案字串並傳回。
瞭解大語言模型的領域適應
在前一章中,我們探討了引數高效微調(PEFT)如何增強大語言模型(LLMs)以執行特定任務,如問答系統。在本章中,我們將介紹領域適應,一種與任務特定微調不同的微調方法。領域適應使模型能夠理解特定行業或領域的獨特語言,彌補了LLMs在理解專業語言方面的不足。
為了說明這一點,我們將介紹Proxima Investment Group,一家假設的純數字投資公司,旨在使用內部資料使其LLM適應特定的金融語言。我們將展示如何修改LLM以處理Proxima環境中典型的特定術語和細微差別,從而提高模型在金融領域的相關性和有效性。
領域適應的實踐步驟
Proxima可能會採取以下實踐步驟:
- 選擇相關的內部資料集進行訓練:挑選與金融領域相關的內部資料集,以訓練模型理解金融術語和概念。
- 應用PEFT方法:使用低秩適應(LoRA)等PEFT方法,有效地調整模型以適應金融領域的語言特點。
- 使用遮蔽技術:採用遮蔽技術來最佳化模型的理解能力,確保模型能夠準確捕捉金融文字的細微差別。
程式碼範例:使用LoRA進行領域適應
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import get_peft_model, LoraConfig
# 載入預訓練模型和tokenizer
model = AutoModelForCausalLM.from_pretrained("your_model_name")
tokenizer = AutoTokenizer.from_pretrained("your_model_name")
# 設定LoRA組態
peft_config = LoraConfig(
task_type="CAUSAL_LM",
inference_mode=False,
r=8,
lora_alpha=32,
lora_dropout=0.1,
)
# 取得PEFT模型
peft_model = get_peft_model(model, peft_config)
# #### 內容解密:
# - `task_type="CAUSAL_LM"` 指定了模型的任務型別為因果語言建模。
# - `inference_mode=False` 表示模型處於訓練模式。
# - `r=8` 設定了LoRA的秩,用於控制模型的複雜度。
# - `lora_alpha=32` 和 `lora_dropout=0.1` 分別控制了LoRA的縮放因子和dropout率。
# 進行領域適應訓練
# 這裡省略了具體的訓練程式碼,需要根據實際資料和訓練目標進行調整
評估領域適應的成功
Proxima可以透過評估模型在以下任務中的表現來衡量領域適應的成功:
- 分析金融趨勢
- 回應客戶查詢
- 生成符合Proxima內部標準和市場定位的報告
評估指標:語義相似度
from sentence_transformers import SentenceTransformer, util
# 載入預訓練的句子轉換器模型
eval_model = SentenceTransformer('all-MiniLM-L6-v2')
# 定義計算語義相似度的函式
def calculate_semantic_similarity(model, response, gold_standard):
response_embedding = model.encode(response, convert_to_tensor=True)
gold_standard_embedding = model.encode(gold_standard, convert_to_tensor=True)
return util.pytorch_cos_sim(response_embedding, gold_standard_embedding).item()
# #### 內容解密:
# - 使用預訓練的句子轉換器模型來計算文字之間的語義相似度。
# - `calculate_semantic_similarity`函式接受模型、回應文字和金標準文字,傳回它們之間的語義相似度得分。
# 評估模型的語義相似度
# 這裡省略了具體的評估程式碼,需要根據實際資料和評估目標進行調整
領域適應技術於大語言模型中的重要性與實踐
揭開領域適應的神秘面紗:瞭解其歷史與重要性
在生成式大語言模型(LLMs)的背景下,領域適應技術專門針對像BLOOM這樣已經在大規模通用資料集(如新聞文章和維基百科條目)上進行預訓練的模型進行微調,以增強其對特定領域文字的理解能力,這些領域包括生物醫學、法律和金融等。由於LLMs儘管經過大量預訓練,但可能無法自然而然地捕捉到這些領域特有的複雜細節和專業術語,因此這型別的微調至關重要。
領域適應涉及一個有意識的過程,即將模型的學習模式重新調整到目標領域中普遍存在的語言特徵、術語和上下文細微差別。
領域適應是在遷移學習的範疇內進行的。在這個更廣泛的正規化中,模型從一個任務中獲得的學習成果被重新利用,以提高其在相關但不同的任務上的效能。這種方法利用了模型預先學習到的特徵,以提高其在後續任務上的效率和準確性,明顯減少了對大量特定領域資料和計算資源的依賴。具體來說,我們首先使用在廣泛資料集上訓練好的模型作為起點,然後使其適應專業領域,從而提高其準確性、相關性和適用性,以滿足更有針對性的使用案例。
在實踐中,可以採用多種方法來使模型適應特定領域,包括以下幾種:
- 持續預訓練:模型在特定領域的語料函式庫上進行額外的預訓練,使其引數能夠逐步適應目標領域的語言特徵,正如Gururangan等人2020年的研究所示。
- 中間任務訓練:在這裡,模型在中間任務上進行訓練,利用特定領域的資料,在為下游應用進行微調之前。這一步驟有助於更穩健地適應該領域(Pruksachatkun等人,2020年)。
- 資料增強:利用諸如反向翻譯(Xie等人,2019年)和標記替換(Anaby-Tavor等人,2020年)等技術,從有限的實際資料中生成合成的特定領域訓練樣本:
- 反向翻譯涉及將現有的文字從一種語言(如英語)翻譯成另一種語言(如法語),然後再翻譯回原始語言。這個過程在保留原文字語義的同時,生成了原文字的改述版本。
- 標記替換涉及更改句子中的個別詞語以生成新的句子。這種更改通常旨在保留原句子的語義含義同時引入變化。
- 多工學習:這個框架在適應階段同時最佳化模型對通用任務和特定領域任務的表現,如Clark等人2019年所展示的那樣。
金融領域的遷移學習實踐專案
隨著領域適應技術的不斷演進,它們越來越能夠在專業領域中提升模型的表現,即使是在減少特定領域資料量的情況下也能實作。正如第4章所討論的,最近的發展已經聚焦於這些技術的計算效率。像LoRA這樣的適應方法能夠在最小化引數更改的情況下實作顯著的模型調整,而無需進行全面的重新訓練。值得注意的是,模型的表現總是會根據諸如資料集品質、可用計算資源和其他實施細節等各種因素而有所不同。
既然我們對領域適應技術及其對計算效率的關注有了一些瞭解,我們就可以實際應用這些概念。我們的實踐專案將利用BLOOM,一個最先進的開源LLM,來展示金融領域的領域適應。藉助PEFT,我們旨在以最小的計算資源對BLOOM進行微調,闡述這些先進適應方法在提升金融領域模型表現方面的實際應用。
實踐專案:金融領域的遷移學習
這個專案旨在透過在精選的特設定檔案語料函式庫上對BLOOM進行微調,使其具備解讀和表達Proxima及其產品特有概念的能力。
我們的方法論受到了跨多個領域(包括生物醫學、金融和法律)進行領域適應的策略啟發。Cheng等人2023年進行的一項值得注意的研究——《透過閱讀理解使大語言模型適應》提出了一種新穎的方法,用於增強LLMs在特定領域任務中的能力。這種方法將大量的預訓練語料函式庫轉化為有利於閱讀理解任務的格式,從而顯著提高了模型在專業領域中的功能。在我們的案例中,我們將採用一種類別似但簡化的方法,透過使用針對Proxima量身定製的資料集對預訓練的BLOOM模型進行微調,從而繼續模型的訓練。這個過程逐步調整模型引數,以確保它更好地理解Proxima產品和服務特有的語言。
金融領域適應的訓練方法論
對於我們的持續訓練策略,我們將採用因果語言建模(CLM)。這種方法是更廣泛的一系列訓練方法論的一部分,這些方法論針對各種目標最佳化模型的表現。在轉向實施之前,讓我們嘗試消除我們所選擇的方法與其他流行策略之間的歧義,以便更好地理解CLM方法論:
- 遮蔽語言建模(MLM):作為BERT等根據Transformer的模型的根本,MLM隨機遮蔽輸入文字的部分內容,並挑戰模型預測被遮蔽的標記。透過考慮遮蔽周圍的整個上下文(之前和之後),MLM使模型能夠發展出對語言的雙向理解,豐富其對上下文和語義的把握。
重點程式碼實作與解析
# 使用transformers函式庫中的AutoModelForCausalLM類別
from transformers import AutoModelForCausalLM, AutoTokenizer
# 載入預訓練模型與標記器
model_name = "bigscience/bloom-560m"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 定義自訂訓練資料
training_data = ["Proxima's financial products are...", "Proxima offers services such as..."]
# 對訓練資料進行標記
encoded_data = tokenizer(training_data, return_tensors="pt", padding=True, truncation=True)
# 微調模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
encoded_data = {k: v.to(device) for k, v in encoded_data.items()}
#### 內容解密:
1. **載入預訓練模型與標記器**:使用`transformers`函式庫中的`AutoModelForCausalLM`和`AutoTokenizer`類別,分別載入預訓練的BLOOM模型和對應的標記器。
2. **定義自訂訓練資料**:準備與Proxima相關的文字資料,用於模型的微調。
3. **對訓練資料進行標記**:使用標記器對自訂訓練資料進行處理,將文字轉換為模型可接受的輸入格式。
4. **微調模型**:將模型和處理好的資料移動到可用的計算裝置(GPU或CPU),然後進行模型的微調。