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

解讀大模型的微調

原創 精選
開發 架構
微調預訓練LLM的所有層仍然是適應新目標任務的黃金準則。但是,諸如基于特征的方法、上下文學習和參數高效微調技術等方法,可以在最小化計算成本和資源的同時,有效地將LLM應用到新任務中。

在快速發展的人工智能領域中,有效地利用大型語言模型(LLM)變得越來越重要。然而,有許多不同的方式可以使用大型語言模型,這可能會讓我們感到困惑。實際上,可以使用預訓練的大型語言模型進行新任務的上下文學習并進行微調。

那么,什么是上下文學習?又如何對大模型進行微調呢?

1. 上下文學習與索引

自從GPT-2和GPT-3出現以來,可以發現在預訓練的通用文本語料庫上的生成式大型語言模型(LLM)具備了上下文學習的能力,這意味著如果我們想要執行LLM沒有明確訓練的特定或新任務,不需要進一步訓練或微調預訓練的LLM。同時,我們可以通過輸入提示直接提供一些目標任務的示例。

In Context Learning(ICL)的關鍵思想是從類比中學習。下圖給出了一個描述語言模型如何使用 ICL 進行決策的例子。首先,ICL 需要一些示例來形成一個演示上下文。這些示例通常是用自然語言模板編寫的。然后 ICL 將查詢的問題(即需要預測標簽的 input)和一個上下文演示(一些相關的 cases)連接在一起,形成帶有提示的輸入,并將其輸入到語言模型中進行預測。

圖片

如果無法直接訪問模型,例如通過 API 使用模型,上下文學習非常有用。與上下文學習相關的是“硬提示微調”的概念,可以通過修改輸入來期望改善輸出。將直接修改輸入的單詞或標記的微調稱為“硬”提示微調,另一種微調方式稱為“軟”提示微調或通常稱為“提示微調”。這種提示微調方法提供了一種更為節省資源的參數微調替代方案。然而,由于它不會更新模型參數以適應特定任務的微小差異,因此可能會限制其適應能力。此外,由于通常需要手動比較不同提示的質量,提示微調可能需要耗費大量人力。

另一種利用純粹的上下文學習方法的方法是索引。在LLM的范圍內,索引可以被視為一個上下文學習的解決方法,它使得LLM可以轉換為信息檢索系統,用于從外部資源和網站中提取數據。在此過程中,索引模塊將文檔或網站分解為較小的段落,并將它們轉換為可以存儲在向量數據庫中的向量。然后,當用戶提交查詢時,索引模塊計算嵌入式查詢與數據庫中每個向量之間的向量相似度。最終,索引模塊獲取前k個最相似的嵌入式向量以生成響應。索引的示意圖如下:

圖片

2. 基于三種特征的微調方法

上下文學習是一種有價值且用戶友好的方法,適用于直接訪問大型語言模型受限的情況,例如通過API或用戶界面與LLM進行交互。然而,如果可以訪問LLM,則使用來自目標領域的數據對其進行適應和微調通常會導致更好的結果。那么,我們如何將模型適應到目標任務?下圖概述了三種常規的基于特征的微調方法。

圖片

除了微調編碼器風格的LLM之外,相同的方法也適用于GPT般的解碼器風格LLM。此外,還可以微調解碼器風格的LLM生成多句話的答案,而不僅僅是分類文本。

2.1 基于特征的方法

在基于特征的方法中,需要加載預訓練的LLM,并將其應用于目標數據集。在這里,需要特別關注生成訓練集的輸出嵌入,這些嵌入可以用作訓練分類模型的輸入特征。雖然這種方法在以嵌入為重點的模型(如BERT)中特別常見,但也可以從生成式GPT-style模型中提取嵌入。

分類模型可以是邏輯回歸模型、隨機森林或XGBoost ,也可以任何我們想要的模型。一般地,在這里線性分類器如邏輯回歸表現最佳。

圖片

從概念上講,可以用以下代碼說明基于特征的方法:

model = AutoModel.from_pretrained("distilbert-base-uncased")

# ...
# tokenize dataset
# ...

# generate embeddings
@torch.inference_mode()
def get_output_embeddings(batch):
    output = model(
        batch["input_ids"],
        attention_mask=batch["attention_mask"]
    ).last_hidden_state[:, 0]
return {"features": output}

dataset_features = dataset_tokenized.map(
  get_output_embeddings, batched=True, batch_size=10)

X_train = np.array(imdb_features["train"]["features"])
y_train = np.array(imdb_features["train"]["label"])

X_val = np.array(imdb_features["validation"]["features"])
y_val = np.array(imdb_features["validation"]["label"])

X_test = np.array(imdb_features["test"]["features"])
y_test = np.array(imdb_features["test"]["label"])

# train classifier
from sklearn.linear_model import LogisticRegression

clf = LogisticRegression()
clf.fit(X_train, y_train)

print("Training accuracy", clf.score(X_train, y_train))
print("Validation accuracy", clf.score(X_val, y_val))
print("test accuracy", clf.score(X_test, y_test))

2.2 基于輸出層更新的微調

與上述基于特征的方法相關的一種流行方法是微調輸出層。與基于特征的方法類似,保持預訓練LLM的參數不變,只訓練新添加的輸出層,類似于在嵌入特征上訓練邏輯回歸分類器或小型多層感知器。在代碼中,將如下所示:

model = AutoModelForSequenceClassification.from_pretrained(
    "distilbert-base-uncased",
     num_labels=2
)

# freeze all layers
for param in model.parameters():
    param.requires_grad = False

# then unfreeze the two last layers (output layers)
for param in model.pre_classifier.parameters():
    param.requires_grad = True

for param in model.classifier.parameters():
    param.requires_grad = True

# finetune model
lightning_model = CustomLightningModule(model)

trainer = L.Trainer(
    max_epochs=3,
    ...
)

trainer.fit(
  model=lightning_model,
  train_dataloaders=train_loader,
  val_dataloaders=val_loader)

# evaluate model
trainer.test(lightning_model, dataloaders=test_loader)

理論上,這種方法應該具有與基于特征的方法同樣的良好建模性能和速度。然而,由于基于特征的方法使預計算和存儲嵌入特征更加容易,因此在特定的實際情況下,記憶特征的方法可能更加方便。

2.3 面向所有層更新的微調

盡管原始的BERT論文聲稱,僅微調輸出層可以實現與微調所有層相當的建模性能,但后者涉及更多參數,因此成本更高。例如,BERT基本模型約有1.1億個參數。然而,BERT基本模型用于二元分類的最后一層僅包含1,500個參數。此外,BERT基本模型的最后兩層占據60,000個參數,僅占總模型大小的約0.6%。]

由于目標任務和目標領域與模型預訓練的數據集相似程度的不同,幾乎總是通過微調所有層來獲得更優秀的模型性能。因此,當優化模型性能時,使用預訓練LLM的黃金標準是更新所有層。從概念上講,這種方法與輸出層更新非常相似。唯一的區別是不凍結預訓練LLM的參數,而是對其進行微調。

model = AutoModelForSequenceClassification.from_pretrained(
    "distilbert-base-uncased",
     num_labels=2
)

# don't freeze layers
# for param in model.parameters():
#    param.requires_grad = False

# finetune model
lightning_model = LightningModel(model)

trainer = L.Trainer(
    max_epochs=3,
    ...
)

trainer.fit(
  model=lightning_model,
  train_dataloaders=train_loader,
  val_dataloaders=val_loader)

# evaluate model
trainer.test(lightning_model, dataloaders=test_loader)

多層微調通常會導致更好的性能,但代價也會增加,各種方法的計算和模型性能如下圖所示。

圖片

上面的情景突出了微調的三種極端情況:基于特征,僅訓練最后一層或幾層,或者訓練所有層。當然,根據模型和數據集的不同,在各種選項之間探索也可能是值得的。

3. 參數高效微調

參數高效微調允許我們在最小化計算和資源占用的同時重復使用預訓練模型。總的來說,參數高效微調至少有以下5個優點:

  • 減少計算成本(需要更少的GPU和GPU時間);
  • 更快的訓練時間(更快地完成訓練);
  • 更低的硬件要求(可以使用更小的GPU和更少的存儲器);
  • 更好的模型性能(減少過擬合);
  • 更少的存儲空間(大部分權重可以在不同任務之間共享)。

如前所述,微調更多的層通常會導致更好的結果。如果想要微調更大的模型,例如重新生成的LLM,這些模型只能勉強適合GPU內存,該怎么辦呢?人們開發了幾種技術,只需訓練少量參數便可通過微調提升LLM的性能。這些方法通常被稱為參數高效微調技術(PEFT)。

在huggingface提供的PEFT工具中,可以很方便地實現將普通的HF模型變成用于支持輕量級微調的模型,使用非常便捷,目前支持4種策略,分別是:

  • LoRA
  • Prefix Tuning
  • P-Tuning
  • Prompt Tuning

下圖總結了一些最廣泛使用的PEFT技術。

圖片

那么這些技術是如何工作的呢?簡而言之,它們都涉及引入少量的額外參數,而不是對所有層都進行修改。從某種意義上講,輸出層微調也可以被視為一種參數高效的微調技術。然而,像前綴微調、適配器和低秩適應等技術,它們“修改”多個層,以極低的成本實現更好的預測性能。

4.RHLF

在人類反饋增強學習中,預訓練模型使用監督學習和強化學習相結合進行微調。這種方法是由原始的ChatGPT模型推廣而來,而該模型又基于InstructGPT。RLHF通過讓人類對不同的模型輸出進行排名或評分來收集人類反饋,從而提供獎勵信號。然后,可以使用收集的獎勵標簽來訓練獎勵模型,進而指導LLM對人類偏好的適應。

獎勵模型本身是通過監督學習進行學習的,通常使用預訓練的LLM作為基本模型。接下來,獎勵模型用于更新預訓練的LLM,以適應人類的偏好。訓練使用了一種稱為近端策略優化的強化學習方法。InstructGPT論文中概述了RLHF的過程。

圖片

為什么要使用獎勵模型而不是直接訓練預先訓練好的模型并使用人類反饋?主要原因是將人類納入學習過程會造成瓶頸,我們無法實時獲取反饋。

5.小結

微調預訓練LLM的所有層仍然是適應新目標任務的黃金準則。但是,諸如基于特征的方法、上下文學習和參數高效微調技術等方法,可以在最小化計算成本和資源的同時,有效地將LLM應用到新任務中。此外,帶有人類反饋的強化學習(RLHF)作為有監督微調的替代方法,也可以提高模型性能。

【參考資料】 

  • A Survey on In-context Learning,https://arxiv.org/pdf/2301.00234.pdf
  • LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS,https://arxiv.org/pdf/2106.09685.pdf
  • Prefix-Tuning: Optimizing Continuous Prompts for Generation, https://aclanthology.org/2021.acl-long.353
  • P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks,https://arxiv.org/pdf/2110.07602.pdf
  • The Power of Scale for Parameter-Efficient Prompt Tuning,https://arxiv.org/pdf/2104.08691.pdf
  • BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,https://arxiv.org/abs/1810.04805
  • https://github.com/huggingface/peft
  • https://github.com/rasbt
責任編輯:武曉燕 來源: 喔家ArchiSelf
相關推薦

2025-06-23 07:54:40

2023-10-06 20:30:33

大模型LLMtoken

2024-09-09 07:46:16

2025-04-10 07:59:51

2024-02-05 14:12:37

大模型RAG架構

2024-05-07 08:00:00

自然語言處理機器學習

2024-04-15 12:50:00

大型語言模型ReFT

2024-12-30 00:01:00

多模態大模型Python

2025-01-14 10:56:14

2025-02-28 10:25:09

2024-05-06 07:58:23

MoE模型系統

2024-09-26 10:42:20

2023-04-10 09:59:48

昇思

2025-05-13 05:11:00

推理模型微調

2025-06-26 09:06:59

2024-01-18 15:38:17

語言模型大型語言模型

2023-10-20 17:53:05

2023-09-01 21:12:13

GPT3.5模型微調

2024-07-08 09:49:54

2023-12-18 13:37:44

天翼云天池大語言模型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜精品一区二区三区在线观看 | 欧美午夜精品理论片a级按摩 | 日韩一区二区三区在线视频 | 五十女人一级毛片 | 日韩av一区二区在线观看 | 国产精品久久久久久久一区二区 | 九色视频网 | 久久久久久久久久影视 | 日韩在线视频免费观看 | 欧美日韩一区二区在线观看 | 99成人精品 | 蜜桃视频在线观看免费视频网站www | 久久精品视频网站 | 久久久久国产 | 日韩成人在线播放 | 亚洲一区免费 | 精品免费 | 天天影视色综合 | 日韩福利一区 | 精品亚洲一区二区三区 | 草久久久 | 999精品在线观看 | 亚洲国产一 | 亚洲欧洲中文日韩 | 91视频.| 亚洲视频在线看 | jizz视频| 亚洲精品白浆高清久久久久久 | 日韩在线精品强乱中文字幕 | 亚洲欧洲国产视频 | 亚洲成年人免费网站 | 欧美一级黄 | 亚洲欧美日韩国产 | 国产成人一区二区三区电影 | 久久久99国产精品免费 | 久久久精品 | 国产精品久久久久久一区二区三区 | 一级免费毛片 | 黄色网址免费看 | 国内久久 | 国内久久|