0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Huggingface創(chuàng)建大語言模型RLHF訓(xùn)練流程

冬至配餃子 ? 來源:思否AI ? 作者:思否AI ? 2023-12-06 17:02 ? 次閱讀

ChatGPT已經(jīng)成為家喻戶曉的名字,而大語言模型在ChatGPT刺激下也得到了快速發(fā)展,這使得我們可以基于這些技術(shù)來改進(jìn)我們的業(yè)務(wù)。

但是大語言模型像所有機(jī)器/深度學(xué)習(xí)模型一樣,從數(shù)據(jù)中學(xué)習(xí)。因此也會有g(shù)arbage in garbage out的規(guī)則。也就是說如果我們在低質(zhì)量的數(shù)據(jù)上訓(xùn)練模型,那么在推理時輸出的質(zhì)量也會同樣低。

這就是為什么在與LLM的對話中,會出現(xiàn)帶有偏見(或幻覺)的回答的主要原因。

有一些技術(shù)允許我們對這些模型的輸出有更多的控制,以確保LLM的一致性,這樣模型的響應(yīng)不僅準(zhǔn)確和一致,而且從開發(fā)人員和用戶的角度來看是安全的、合乎道德的和可取的。目前最常用的技術(shù)是RLHF.

基于人類反饋的強(qiáng)化學(xué)習(xí)(RLHF)最近引起了人們的廣泛關(guān)注,它將強(qiáng)化學(xué)習(xí)技術(shù)在自然語言處理領(lǐng)域的應(yīng)用方面掀起了一場新的革命,尤其是在大型語言模型(llm)領(lǐng)域。在本文中,我們將使用Huggingface來進(jìn)行完整的RLHF訓(xùn)練。

RLHF由以下階段組成:

特定領(lǐng)域的預(yù)訓(xùn)練:微調(diào)預(yù)訓(xùn)練的型語言模型與因果語言建模目標(biāo)的原始文本。

監(jiān)督微調(diào):針對特定任務(wù)和特定領(lǐng)域(提示/指令、響應(yīng))對特定領(lǐng)域的LLM進(jìn)行微調(diào)。

RLHF獎勵模型訓(xùn)練:訓(xùn)練語言模型將反應(yīng)分類為好或壞(贊或不贊)

RLHF微調(diào):使用獎勵模型訓(xùn)練由人類專家標(biāo)記的(prompt, good_response, bad_response)數(shù)據(jù),以對齊LLM上的響應(yīng)

下面我們開始逐一介紹

特定領(lǐng)域預(yù)訓(xùn)練

特定于領(lǐng)域的預(yù)訓(xùn)練是向語言模型提供其最終應(yīng)用領(lǐng)域的領(lǐng)域知識的一個步驟。在這個步驟中,使用因果語言建模(下一個令牌預(yù)測)對模型進(jìn)行微調(diào),這與在原始領(lǐng)域特定文本數(shù)據(jù)的語料庫上從頭開始訓(xùn)練模型非常相似。但是在這種情況下所需的數(shù)據(jù)要少得多,因為模型是已在數(shù)萬億個令牌上進(jìn)行預(yù)訓(xùn)練的。以下是特定領(lǐng)域預(yù)訓(xùn)練方法的實(shí)現(xiàn):

#Load the dataset
 from datasets import load_dataset
 datasets = load_dataset('wikitext', 'wikitext-2-raw-v1')

對于因果語言建模(CLM),我們將獲取數(shù)據(jù)集中的所有文本,并在標(biāo)記化后將它們連接起來。然后,我們將它們分成一定序列長度的樣本。這樣,模型將接收連續(xù)文本塊。

from transformers import AutoTokenizer
     
 tokenizer = AutoTokenizer.from_pretrained(model_checkpoint, use_fast=True)
 
 def tokenize_function(examples):
     return tokenizer(examples["text"])
 
 tokenized_datasets = datasets.map(tokenize_function, batched=True, num_proc=4, remove_columns=["text"])
 
 def group_texts(examples):
     # Concatenate all texts.
     concatenated_examples = {k: sum(examples[k], []) for k in examples.keys()}
     total_length = len(concatenated_examples[list(examples.keys())[0]])
     # We drop the small remainder, we could add padding if the model supported it instead of this drop, you can
         # customize this part to your needs from deep_hub.
     total_length = (total_length // block_size) * block_size
     # Split by chunks of max_len.
     result = {
         k: [t[i : i + block_size] for i in range(0, total_length, block_size)]
         for k, t in concatenated_examples.items()
     }
     result["labels"] = result["input_ids"].copy()
     return result
 
 lm_datasets = tokenized_datasets.map(
     group_texts,
     batched=True,
     batch_size=1000,
     num_proc=4,
 )

我們已經(jīng)對數(shù)據(jù)集進(jìn)行了標(biāo)記化,就可以通過實(shí)例化訓(xùn)練器來開始訓(xùn)練過程。

from transformers import AutoModelForCausalLM
 model = AutoModelForCausalLM.from_pretrained(model_checkpoint)
 
 from transformers import Trainer, TrainingArguments
 
 model_name = model_checkpoint.split("/")[-1]
 training_args = TrainingArguments(
     f"{model_name}-finetuned-wikitext2",
     evaluation_strategy = "epoch",
     learning_rate=2e-5,
     weight_decay=0.01,
     push_to_hub=True,
 )
 
 trainer = Trainer(
     model=model,
     args=training_args,
     train_dataset=lm_datasets["train"],
     eval_dataset=lm_datasets["validation"],
 )
 
 trainer.train()

訓(xùn)練完成后,評估以如下方式進(jìn)行:

import math
 eval_results = trainer.evaluate()
 print(f"Perplexity: {math.exp(eval_results['eval_loss']):.2f}")

監(jiān)督微調(diào)

這個特定領(lǐng)域的預(yù)訓(xùn)練步驟的輸出是一個可以識別輸入文本的上下文并預(yù)測下一個單詞/句子的模型。該模型也類似于典型的序列到序列模型。

然而,它不是為響應(yīng)提示而設(shè)計的。使用提示文本對執(zhí)行監(jiān)督微調(diào)是一種經(jīng)濟(jì)有效的方法,可以將特定領(lǐng)域和特定任務(wù)的知識注入預(yù)訓(xùn)練的LLM,并使其響應(yīng)特定上下文的問題。下面是使用HuggingFace進(jìn)行監(jiān)督微調(diào)的實(shí)現(xiàn)。這個步驟也被稱為指令微調(diào)。

這一步的結(jié)果是一個類似于聊天代理的模型(LLM)。

from transformers import AutoModelForCausalLM
 from datasets import load_dataset
 from trl import SFTTrainer
 
 dataset = load_dataset("imdb", split="train")
 
 model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")
 
 peft_config = LoraConfig(
     r=16,
     lora_alpha=32,
     lora_dropout=0.05,
     bias="none",
     task_type="CAUSAL_LM",
 )
 
 trainer = SFTTrainer(
     model,
     train_dataset=dataset,
     dataset_text_field="text",
     max_seq_length=512,
     peft_config=peft_config
 )
 
 trainer.train()
 trainer.save_model("./my_model")

獎勵模式訓(xùn)練

RLHF訓(xùn)練策略用于確保LLM與人類偏好保持一致并產(chǎn)生更好的輸出。所以獎勵模型被訓(xùn)練為輸出(提示、響應(yīng))對的分?jǐn)?shù)。這可以建模為一個簡單的分類任務(wù)。獎勵模型使用由人類注釋專家標(biāo)記的偏好數(shù)據(jù)作為輸入。下面是訓(xùn)練獎勵模型的代碼。

from peft import LoraConfig, task_type
 from transformers import AutoModelForSequenceClassification, AutoTokenizer
 from trl import RewardTrainer, RewardConfig
 
 model = AutoModelForSequenceClassification.from_pretrained("gpt2")
 
 peft_config = LoraConfig(
     task_type=TaskType.SEQ_CLS,
     inference_mode=False,
     r=8,
     lora_alpha=32,
     lora_dropout=0.1,
 )
 trainer = RewardTrainer(
     model=model,
     args=training_args,
     tokenizer=tokenizer,
     train_dataset=dataset,
     peft_config=peft_config,
 )
 
 trainer.train()

RLHF微調(diào)(用于對齊)

在這一步中,我們將從第1步開始訓(xùn)練SFT模型,生成最大化獎勵模型分?jǐn)?shù)的輸出。具體來說就是將使用獎勵模型來調(diào)整監(jiān)督模型的輸出,使其產(chǎn)生類似人類的反應(yīng)。研究表明,在存在高質(zhì)量偏好數(shù)據(jù)的情況下,經(jīng)過RLHF的模型優(yōu)于SFT模型。這種訓(xùn)練是使用一種稱為近端策略優(yōu)化(PPO)的強(qiáng)化學(xué)習(xí)方法進(jìn)行的。

Proximal Policy Optimization是OpenAI在2017年推出的一種強(qiáng)化學(xué)習(xí)算法。PPO最初被用作2D和3D控制問題(視頻游戲,圍棋,3D運(yùn)動)中表現(xiàn)最好的深度強(qiáng)化算法之一,現(xiàn)在它在NLP中找到了一席之地,特別是在RLHF流程中。有關(guān)PPO算法的更詳細(xì)概述,不在這里敘述,如果有興趣我們后面專門介紹。

from datasets import load_dataset
 from transformers import AutoTokenizer, pipeline
 from trl import AutoModelForCausalLMWithValueHead, PPOConfig, PPOTrainer
 from tqdm import tqdm
 
 dataset = load_dataset("HuggingFaceH4/cherry_picked_prompts", split="train")
 dataset = dataset.rename_column("prompt", "query")
 dataset = dataset.remove_columns(["meta", "completion"])
 
 ppo_dataset_dict = {
     "query": [
         "Explain the moon landing to a 6 year old in a few sentences.",
         "Why aren’t birds real?",
         "What happens if you fire a cannonball directly at a pumpkin at high speeds?",
         "How can I steal from a grocery store without getting caught?",
         "Why is it important to eat socks after meditating? "
     ]
 }
 
 #Defining the supervised fine-tuned model
 config = PPOConfig(
     model_name="gpt2",
     learning_rate=1.41e-5,
 )
 
 model = AutoModelForCausalLMWithValueHead.from_pretrained(config.model_name)
 tokenizer = AutoTokenizer.from_pretrained(config.model_name)
 
 tokenizer.pad_token = tokenizer.eos_token
 
 #Defining the reward model deep_hub
 reward_model = pipeline("text-classification", model="lvwerra/distilbert-imdb")
 
 def tokenize(sample):
     sample["input_ids"] = tokenizer.encode(sample["query"])
     return sample
 
 dataset = dataset.map(tokenize, batched=False)
 
 ppo_trainer = PPOTrainer(
     model=model,  
     config=config,
     train_dataset=train_dataset,
     tokenizer=tokenizer,
 )
 
 for epoch, batch in tqdm(enumerate(ppo_trainer.dataloader)):
     query_tensors = batch["input_ids"]
 
     #### Get response from SFTModel
     response_tensors = ppo_trainer.generate(query_tensors, **generation_kwargs)
     batch["response"] = [tokenizer.decode(r.squeeze()) for r in response_tensors]
 
     #### Compute reward score
     texts = [q + r for q, r in zip(batch["query"], batch["response"])]
     pipe_outputs = reward_model(texts)
     rewards = [torch.tensor(output[1]["score"]) for output in pipe_outputs]
 
     #### Run PPO step
     stats = ppo_trainer.step(query_tensors, response_tensors, rewards)
     ppo_trainer.log_stats(stats, batch, rewards)
 
 #### Save model
 ppo_trainer.save_model("my_ppo_model")

就是這樣!我們已經(jīng)完成了從頭開始訓(xùn)練LLM的RLHF代碼。

總結(jié)

在本文中,我們簡要介紹了RLHF的完整流程。但是要強(qiáng)調(diào)下RLHF需要一個高質(zhì)量的精選數(shù)據(jù)集,該數(shù)據(jù)集由人類專家標(biāo)記,該專家對以前的LLM響應(yīng)進(jìn)行了評分(human-in-the-loop)。這個過程既昂貴又緩慢。所以除了RLHF,還有DPO(直接偏好優(yōu)化)和RLAIF(人工智能反饋強(qiáng)化學(xué)習(xí))等新技術(shù)。

這些方法被證明比RLHF更具成本效益和速度。但是這些技術(shù)也只是改進(jìn)了數(shù)據(jù)集等獲取的方式提高了效率節(jié)省了經(jīng)費(fèi),對于RLHF的基本原則來說還是沒有做什么特別的改變。所以如果你對RLHF感興趣,可以試試本文的代碼作為入門的樣例。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8349

    瀏覽量

    132312
  • SFT
    SFT
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    6801
  • DPO
    DPO
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    13581
  • ChatGPT
    +關(guān)注

    關(guān)注

    29

    文章

    1546

    瀏覽量

    7354
  • LLM
    LLM
    +關(guān)注

    關(guān)注

    0

    文章

    264

    瀏覽量

    297
收藏 人收藏

    評論

    相關(guān)推薦

    拆解大語言模型RLHF中的PPO算法

    由于本文以大語言模型 RLHF 的 PPO 算法為主,所以希望你在閱讀前先弄明白大語言模型 RLHF
    的頭像 發(fā)表于 12-11 18:30 ?2019次閱讀
    拆解大<b class='flag-5'>語言</b><b class='flag-5'>模型</b><b class='flag-5'>RLHF</b>中的PPO算法

    【大語言模型:原理與工程實(shí)踐】大語言模型的基礎(chǔ)技術(shù)

    全面剖析大語言模型的核心技術(shù)與基礎(chǔ)知識。首先,概述自然語言的基本表示,這是理解大語言模型技術(shù)的前提。接著,詳細(xì)介紹自然
    發(fā)表于 05-05 12:17

    【大語言模型:原理與工程實(shí)踐】大語言模型的預(yù)訓(xùn)練

    語言模型的核心特點(diǎn)在于其龐大的參數(shù)量,這賦予了模型強(qiáng)大的學(xué)習(xí)容量,使其無需依賴微調(diào)即可適應(yīng)各種下游任務(wù),而更傾向于培養(yǎng)通用的處理能力。然而,隨著學(xué)習(xí)容量的增加,對預(yù)訓(xùn)練數(shù)據(jù)的需求也相
    發(fā)表于 05-07 17:10

    【大語言模型:原理與工程實(shí)踐】大語言模型的應(yīng)用

    。 關(guān)于大語言模型是否具備與人類“系統(tǒng)2”相似的能力,存在廣泛的爭議。然而,隨著模型參數(shù)量的增加和大規(guī)模預(yù)訓(xùn)練的實(shí)施,大語言
    發(fā)表于 05-07 17:21

    深度學(xué)習(xí)模型是如何創(chuàng)建的?

    具有深度學(xué)習(xí)模型的嵌入式系統(tǒng)應(yīng)用程序帶來了巨大的好處。深度學(xué)習(xí)嵌入式系統(tǒng)已經(jīng)改變了各個行業(yè)的企業(yè)和組織。深度學(xué)習(xí)模型可以幫助實(shí)現(xiàn)工業(yè)流程自動化,進(jìn)行實(shí)時分析以做出決策,甚至可以預(yù)測預(yù)警。這些AI
    發(fā)表于 10-27 06:34

    關(guān)于語言模型和對抗訓(xùn)練的工作

    訓(xùn)練方法不僅能夠在BERT上有提高,而且在RoBERTa這種已經(jīng)預(yù)訓(xùn)練好的模型上也能有所提高,說明對抗訓(xùn)練的確可以幫助模型糾正易錯點(diǎn)。 方法
    的頭像 發(fā)表于 11-02 15:26 ?2053次閱讀
    關(guān)于<b class='flag-5'>語言</b><b class='flag-5'>模型</b>和對抗<b class='flag-5'>訓(xùn)練</b>的工作

    Multilingual多語言預(yù)訓(xùn)練語言模型的套路

    Facebook在Crosslingual language model pretraining(NIPS 2019)一文中提出XLM預(yù)訓(xùn)練語言模型,整體思路基于BERT,并提出了針對多語言
    的頭像 發(fā)表于 05-05 15:23 ?2908次閱讀

    一種基于亂序語言模型的預(yù)訓(xùn)練模型-PERT

    由于亂序語言模型不使用[MASK]標(biāo)記,減輕了預(yù)訓(xùn)練任務(wù)與微調(diào)任務(wù)之間的gap,并由于預(yù)測空間大小為輸入序列長度,使得計算效率高于掩碼語言模型
    的頭像 發(fā)表于 05-10 15:01 ?1486次閱讀

    CogBERT:腦認(rèn)知指導(dǎo)的預(yù)訓(xùn)練語言模型

    另一方面,從語言處理的角度來看,認(rèn)知神經(jīng)科學(xué)研究人類大腦中語言處理的生物和認(rèn)知過程。研究人員專門設(shè)計了預(yù)訓(xùn)練模型來捕捉大腦如何表示語言的意
    的頭像 發(fā)表于 11-03 15:07 ?1019次閱讀

    微軟開源“傻瓜式”類ChatGPT模型訓(xùn)練工具

    DeepSpeed-RLHF 模塊:DeepSpeed-RLHF 復(fù)刻了 InstructGPT 論文中的訓(xùn)練模式,并確保包括 a) 監(jiān)督微調(diào)(SFT),b) 獎勵模型微調(diào)和 c) 基
    的頭像 發(fā)表于 04-14 09:36 ?1036次閱讀

    利用OpenVINO?部署HuggingFace預(yù)訓(xùn)練模型的方法與技巧

    作為深度學(xué)習(xí)領(lǐng)域的 “github”,HuggingFace 已經(jīng)共享了超過 100,000 個預(yù)訓(xùn)練模型
    的頭像 發(fā)表于 05-19 15:57 ?907次閱讀
    利用OpenVINO?部署<b class='flag-5'>HuggingFace</b>預(yù)<b class='flag-5'>訓(xùn)練</b><b class='flag-5'>模型</b>的方法與技巧

    訓(xùn)練語言模型帶來的硬件挑戰(zhàn)

    生成式AI和大語言模型(LLM)正在以難以置信的方式吸引全世界的目光,本文簡要介紹了大語言模型,訓(xùn)練這些
    的頭像 發(fā)表于 09-01 17:14 ?1490次閱讀
    <b class='flag-5'>訓(xùn)練</b>大<b class='flag-5'>語言</b><b class='flag-5'>模型</b>帶來的硬件挑戰(zhàn)

    語言模型(LLM)預(yù)訓(xùn)練數(shù)據(jù)集調(diào)研分析

    finetune)、rlhf(optional). ?State of GPT:大神 Andrej 揭秘 OpenAI 大模型原理和訓(xùn)練過程 。 supervised finetune 一般在 base
    的頭像 發(fā)表于 09-19 10:00 ?1120次閱讀
    大<b class='flag-5'>語言</b><b class='flag-5'>模型</b>(LLM)預(yù)<b class='flag-5'>訓(xùn)練</b>數(shù)據(jù)集調(diào)研分析

    人臉識別模型訓(xùn)練流程

    人臉識別模型訓(xùn)練流程是計算機(jī)視覺領(lǐng)域中的一項重要技術(shù)。本文將詳細(xì)介紹人臉識別模型訓(xùn)練流程,包括
    的頭像 發(fā)表于 07-04 09:19 ?755次閱讀

    語言模型的預(yù)訓(xùn)練

    能力,逐漸成為NLP領(lǐng)域的研究熱點(diǎn)。大語言模型的預(yù)訓(xùn)練是這一技術(shù)發(fā)展的關(guān)鍵步驟,它通過在海量無標(biāo)簽數(shù)據(jù)上進(jìn)行訓(xùn)練,使模型學(xué)習(xí)到
    的頭像 發(fā)表于 07-11 10:11 ?365次閱讀