一、從 LLaMA 到 Alpaca:大模型的小訓(xùn)練
1.1 LLaMA 概要與實(shí)踐
LLaMA(Large Language Model Meta AI) 是由 Meta AI 發(fā)布了一款全新的大型語(yǔ)言模型,共有7B、13B、33B、65B 四種版本,其模型參數(shù)如下表所示:

與原始的 transformer Decoder 相比,LLaMA主要有以下改進(jìn):
預(yù)歸一化(Pre-normalization)[GPT3]
為了提高訓(xùn)練的穩(wěn)定性,LLaMA對(duì)每個(gè)transformer子層的輸入進(jìn)行歸一化,而不是對(duì)輸出進(jìn)行歸一化。同時(shí)使用RMSNorm歸一化函數(shù)。
SwiGLU激活函數(shù)[PaLM]
LLaMA用SwiGLU激活函數(shù)取代ReLU非線性,以提高性能。SwiGLU激活函數(shù)的實(shí)現(xiàn)如下:
其中 ,,具體實(shí)現(xiàn)參考這里[1]。
旋轉(zhuǎn)嵌入(Rotary pos)[GPTNeo]
LLaMA刪除了絕對(duì)位置嵌入,取而代之的是在網(wǎng)絡(luò)的每一層添加旋轉(zhuǎn)位置嵌入(RoPE),RoPE的實(shí)現(xiàn)參見(jiàn)這里[2]。當(dāng)前 HuggingFace 已經(jīng)實(shí)現(xiàn)了 LLaMA 模型 代碼,可通過(guò)以下方式直接調(diào)用:
from?transformers?import?LlamaForCausalLM USE_8BIT?=?True?#?use?8-bit?quantization;?otherwise,?use?fp16 model?=?LlamaForCausalLM.from_pretrained( ????????????"pretrained/path", ????????????load_in_8bit=USE_8BIT, ????????????torch_dtype=torch.float16, ????????????device_map="auto", ????????) if?not?USE_8BIT: ????model.half()??#?use?fp16 model.eval()
1.2 Alpaca 如何使用小成本訓(xùn)練大模型
如下圖所示,Stanford的研究者使用 52K 個(gè) intruction-following examples 來(lái)微調(diào) LLaMA 7B 模型,從而生成了 Alpaca[3] 7B。
Alpaca 團(tuán)隊(duì)使用 self-instruct[4] 提供的 175 個(gè) prompts,調(diào)用 OpenAI 的text-davinci-003模型,利用 OpenAI 的模型來(lái)產(chǎn)生有價(jià)值的 instructions 。

將 OpenAI 性能完備的模型作為 Teacher,來(lái)指導(dǎo)參數(shù)更少的 Alpaca 模型進(jìn)行訓(xùn)練,大幅降低了訓(xùn)練成本 。其中調(diào)用 OpenAI API 的成本不到 500 美元,另外微調(diào) 7B 參數(shù)的 LLaMA 模型,使用云服務(wù)商提供的 8 塊 80GB A100 顯卡,訓(xùn)練 3 小時(shí),消費(fèi)不到 100 美元,因此整體成本是小于 600 美元。
二、Alpaca 的優(yōu)化、訓(xùn)練及應(yīng)用
2.1 alpaca-lora 的優(yōu)化
alpace-lora[5] 是在alpaca的基礎(chǔ)上把訓(xùn)練方式改成用lora訓(xùn)練,僅需要在消費(fèi)級(jí)的GPU上經(jīng)過(guò)數(shù)小時(shí)的訓(xùn)練,就可以達(dá)到和alpaca差不多的效果。
LoRA(Low-Rank Adaptation) 技術(shù)
LoRA 的思想很簡(jiǎn)單,即在原始 Pretrained Weights 旁邊增加一個(gè)旁路,做一個(gè)降維再升維的操作,來(lái)模擬所謂的 intrinsic rank 。訓(xùn)練的時(shí)候固定 Pretrained Weights 的參數(shù),只訓(xùn)練降維矩陣 與升維矩陣 。而模型的輸入輸出維度不變,輸出時(shí)將 與 Pretrained Weights 的參數(shù)疊加。用隨機(jī)高斯分布初始化 ,用0矩陣初始化 ,保證訓(xùn)練的開(kāi)始此旁路矩陣依然是 0 矩陣。
具體來(lái)看,假設(shè)預(yù)訓(xùn)練的矩陣為,它的更新可表示為:
其中秩。

LoRA與Transformer的結(jié)合也很簡(jiǎn)單,僅在QKV attention的計(jì)算中增加一個(gè)旁路,而不動(dòng)MLP模塊。基于大模型的內(nèi)在低秩特性,增加旁路矩陣來(lái)模擬全模型參數(shù)微調(diào),LoRA通過(guò)簡(jiǎn)單有效的方案來(lái)達(dá)成輕量微調(diào)的目的,可以將現(xiàn)在的各種大模型通過(guò)輕量微調(diào)變成各個(gè)不同領(lǐng)域的專業(yè)模型。
2.2 PEFT(Parameter-Efficient Fine-Tuning) 方法
隨著模型變得越來(lái)越大,在消費(fèi)級(jí)硬件上對(duì)模型進(jìn)行全部參數(shù)的微調(diào)變得不可行。此外,為每個(gè)下游任務(wù)獨(dú)立存儲(chǔ)和部署微調(diào)模型變得非常昂貴,因?yàn)槲⒄{(diào)模型與原始預(yù)訓(xùn)練模型的大小相同。PEFT 方法旨在解決這兩個(gè)問(wèn)題,PEFT 方法僅微調(diào)少量 (額外) 模型參數(shù),同時(shí)凍結(jié)預(yù)訓(xùn)練 LLM 的大部分參數(shù),從而大大降低了計(jì)算和存儲(chǔ)成本。
HuggingFace 開(kāi)源的一個(gè)高效微調(diào)大模型的 PEFT 庫(kù),目前包含LoRA,Prefix Tuning,Prompt Tuning,P-Tuning 四種算法,下面簡(jiǎn)要介紹后三種:
Prefix Tuning
Prefix Tuning 算法是根據(jù) 下游任務(wù) "前綴指令文本" 的所有層的embeding表示,學(xué)習(xí)到的前綴指令文本向量可以挖掘大模型的潛力去引導(dǎo)模型完成特定任務(wù)。

P-Tuning
P-Tuning 算法和 Prefix Tuning 的想法很相似,想通過(guò)微調(diào)"指令文本",讓指令文本去挖掘大模型的潛力去完成特定的任務(wù)。但是 P-Tuning 只學(xué)習(xí) "指令文本" 輸入層embeding的的表示。為了增強(qiáng) "指令文本"的連續(xù)性,采用了一個(gè) MLP(LSTM) 的結(jié)果去encoding "指令文本"。從微調(diào)參數(shù)量來(lái)看只有 0.65% 比 Prefix Tuning 和 LoRA 這些在所有層都增加參數(shù)的方法要少。

Prompt Tuning
Prompt Tuning 算法和 P-Tuning 很像,且更簡(jiǎn)單,就是是根據(jù) 下游任務(wù) "指令文本" 輸入層embeding的的表示。Prompt Tuning 沒(méi)有增加任何的層,直接使用微調(diào)指令文本(prompt) 的embeding向量。

2.3 使用 PEFT 訓(xùn)練 alpaca-lora
以下僅說(shuō)明過(guò)程,完整代碼見(jiàn)這里[6]。
step 1. 模塊的加載及初始化
import?torch import?transformers from?datasets?import?load_dataset from?peft?import?LoraConfig,?get_peft_model,?get_peft_model_state_dict,?prepare_model_for_int8_training,?set_peft_model_state_dict, from?transformers?import?LlamaForCausalLM,?LlamaTokenizer? model?=?LlamaForCausalLM.from_pretrained(base_model,?load_in_8bit=True,?torch_dtype=torch.float16,?device_map=device_map,) tokenizer?=?LlamaTokenizer.from_pretrained(base_model) model?=?prepare_model_for_int8_training(model) config?=?LoraConfig( ????r=lora_r, ????lora_alpha=lora_alpha, ????target_modules=lora_target_modules, ????lora_dropout=lora_dropout, ????bias="none", ????task_type="CAUSAL_LM", ) model?=?get_peft_model(model,?config)
step 2. 準(zhǔn)備data 和 trainer 并進(jìn)行訓(xùn)練
data?=?load_dataset(data_path) trainer?=?transformers.Trainer( ????model=model, ????train_dataset=train_data, ????eval_dataset=val_data, ????args=transformers.TrainingArguments( ????????per_device_train_batch_size=micro_batch_size, ????????gradient_accumulation_steps=gradient_accumulation_steps, ????????warmup_steps=100, ????????num_train_epochs=num_epochs, ????????learning_rate=learning_rate, ????????fp16=True, ????????logging_steps=10, ????????optim="adamw_torch", ????????evaluation_strategy="steps"?if?val_set_size?>?0?else?"no", ????????save_strategy="steps", ????????eval_steps=200?if?val_set_size?>?0?else?None, ????????save_steps=200, ????????output_dir=output_dir, ????????save_total_limit=3, ????????load_best_model_at_end=True?if?val_set_size?>?0?else?False, ????????ddp_find_unused_parameters=False?if?ddp?else?None, ????????group_by_length=group_by_length, ????????report_to="wandb"?if?use_wandb?else?None, ????????run_name=wandb_run_name?if?use_wandb?else?None, ????), ????data_collator=transformers.DataCollatorForSeq2Seq( ????????tokenizer,?pad_to_multiple_of=8,?return_tensors="pt",?padding=True ????), ) trainer.train(resume_from_checkpoint=resume_from_checkpoint)
2.4 更多類似模型
Baize (白澤)
論文:https://arxiv.org/pdf/2304.01196.pdf
demo: Baize Lora 7B - a Hugging Face Space by project-baize
repo: https://github.com/project-baize/baize
Luotuo (駱駝,Chinese)
repo: https://github.com/LC1332/Luotuo-Chinese-LLM
Koala (考拉)
blog: Koala: A Dialogue Model for Academic Research
demo: FastChat
repo: https://github.com/young-geng/EasyLM
三、ColossalChat:深入體驗(yàn) RLHF 在大模型中的功能
ColossalChat[7] 是第一個(gè)基于LLaMA預(yù)訓(xùn)練模型開(kāi)源完整RLHF pipline實(shí)現(xiàn),包括有監(jiān)督數(shù)據(jù)收集、有監(jiān)督微調(diào)、獎(jiǎng)勵(lì)模型訓(xùn)練和強(qiáng)化學(xué)習(xí)微調(diào)。只需要不到100億個(gè)參數(shù),就可以在大型語(yǔ)言模型的基礎(chǔ)上通過(guò)RLHF微調(diào)達(dá)到中英文雙語(yǔ)水平,達(dá)到與ChatGPT和GPT-3.5相當(dāng)?shù)男Ч?,并可以進(jìn)行Demo測(cè)試。關(guān)于RLHF的原理,可參考
https://zhuanlan.zhihu.com/p/613315873
ColossalChat使用InstructionWild[8]雙語(yǔ)數(shù)據(jù)集,包含約52K的英語(yǔ)和52K的漢語(yǔ)問(wèn)答,數(shù)據(jù)集通過(guò)OpenAI API接口獲得。該數(shù)據(jù)集適用于微調(diào)和RLHF訓(xùn)練。通過(guò)提供高質(zhì)量的數(shù)據(jù),ColossalChat可以實(shí)現(xiàn)更好的對(duì)話互動(dòng),也可以支持中文。

數(shù)據(jù)集的獲取過(guò)程
3.1 監(jiān)督指令微調(diào)
使用前面提到的數(shù)據(jù)集執(zhí)行有監(jiān)督指令微調(diào),以微調(diào)模型。運(yùn)行examples/train_sft.sh來(lái)啟動(dòng)有監(jiān)督的指令微調(diào)。
torchrun?--standalone?--nproc_per_node=4?train_sft.py? ????--pretrain?"/path/to/LLaMa-7B/"? ????--model?'llama'? ????--strategy?colossalai_zero2? ????--log_interval?10? ????--save_path??/path/to/Coati-7B? ????--dataset?/path/to/data.json? ????--batch_size?4? ????--accimulation_steps?8? ????--lr?2e-5? ????--max_datasets_size?512? ????--max_epochs?1?
3.2 訓(xùn)練獎(jiǎng)勵(lì)模型
訓(xùn)練獎(jiǎng)勵(lì)模型,通過(guò)手動(dòng)對(duì)同一提示的不同輸出進(jìn)行排序來(lái)分配相應(yīng)的分?jǐn)?shù),然后有監(jiān)督獎(jiǎng)勵(lì)模型的訓(xùn)練。
運(yùn)行examples/train_rm.sh開(kāi)始獎(jiǎng)勵(lì)模型訓(xùn)練。
torchrun?--standalone?--nproc_per_node=4?train_reward_model.py ????--pretrain?"/path/to/LLaMa-7B/"? ????--model?'llama'? ????--strategy?colossalai_zero2? ????--loss_fn?'log_exp' ????--save_path?'rmstatic.pt'?
3.3 人類反饋強(qiáng)化學(xué)習(xí)
在第一階段的監(jiān)督微調(diào)模型和第二階段的獎(jiǎng)勵(lì)模型的基礎(chǔ)上,使用強(qiáng)化學(xué)習(xí)算法進(jìn)一步訓(xùn)練大型語(yǔ)言模型。該階段是RLHF訓(xùn)練的核心部分,在強(qiáng)化學(xué)習(xí)中使用近端策略優(yōu)化(PPO)算法來(lái)引入獎(jiǎng)勵(lì)信號(hào),并生成更符合人類偏好的內(nèi)容。

運(yùn)行examples/train_prompts.sh,開(kāi)始使用人類反饋訓(xùn)練PPO。
torchrun?--standalone?--nproc_per_node=4?train_prompts.py?
?????????--pretrain?"/path/to/LLaMa-7B/"? ?????????--model?'llama'? ?????????--strategy?colossalai_zero2? ?????????--prompt_path?/path/to/your/prompt_dataset? ?????????--pretrain_dataset?/path/to/your/pretrain_dataset? ?????????--rm_pretrain?/your/pretrain/rm/defination? ?????????--rm_path?/your/rm/model/path
編輯:黃飛
?
電子發(fā)燒友App




















評(píng)論