微調(diào) DeepSeek LLM:使用監(jiān)督微調(diào)(SFT)與 Hugging Face 數(shù)據(jù)集的詳細(xì)指南

??閱讀時長:20分鐘 ??發(fā)布時間:2025-02-02 >近日熱文:[全網(wǎng)最全的神經(jīng)網(wǎng)絡(luò)數(shù)學(xué)原理(代碼和公式)直觀解釋](https://mp.weixin.qq.com/s/ITFeM-RUVs9k9Kw4njl9KQ?token=992101443&lang=zh_CN) 歡迎關(guān)注知乎和公眾號的專欄內(nèi)容 [LLM架構(gòu)專欄](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU5OTk5OTg4Ng==&action=getalbum&album_id=3803710040624594945#wechat_redirect) [知乎LLM專欄](https://zhuanlan.zhihu.com/column/c_1860259327224446976) [知乎【**柏企**】](https://www.zhihu.com/people/cbq-91) 公眾號【**柏企科技說**】【**柏企閱文**】# 微調(diào)DeepSeek LLM:使用監(jiān)督微調(diào)(SFT)與Hugging Face數(shù)據(jù)集的詳細(xì)指南 ### 介紹 DeepSeek LLM是一個強(qiáng)大的開源語言模型,但為了在特定應(yīng)用中充分發(fā)揮其潛力,微調(diào)至關(guān)重要。在本指南中树灶,我們將逐步介紹如何使用監(jiān)督微調(diào)(SFT)和Hugging Face數(shù)據(jù)集對DeepSeek LLM進(jìn)行微調(diào),并提供在特定領(lǐng)域數(shù)據(jù)集上進(jìn)行訓(xùn)練的代碼詳細(xì)講解猫态。我們還將討論所使用的損失函數(shù)望薄、為何使用數(shù)據(jù)子集槽驶,以及低秩適應(yīng)(LoRA)技術(shù)如何實現(xiàn)高效內(nèi)存的微調(diào)握侧。 **來源**:DeepSeek AI ![](https://upload-images.jianshu.io/upload_images/17294212-3171a0ac076038b2.png) ### 監(jiān)督微調(diào)(SFT)概述 監(jiān)督微調(diào)(SFT)是在有標(biāo)簽的數(shù)據(jù)集上對預(yù)訓(xùn)練模型進(jìn)行進(jìn)一步訓(xùn)練的過程蚯瞧,目的是讓模型在特定任務(wù)中更專業(yè)嘿期,比如客戶支持、醫(yī)療問答或電商推薦等任務(wù)埋合。 ### 微調(diào)的工作原理 微調(diào)需要在特定任務(wù)的有標(biāo)簽數(shù)據(jù)上訓(xùn)練模型备徐,其中: - **輸入(X)**:提供給模型的文本數(shù)據(jù)。 - **目標(biāo)(Y)**:基于有標(biāo)簽數(shù)據(jù)的預(yù)期輸出(例如甚颂,情感標(biāo)簽蜜猾、聊天機(jī)器人回復(fù)或摘要文本)。 - **損失函數(shù)**:用于衡量模型的預(yù)測與預(yù)期輸出的匹配程度振诬。在文本生成中蹭睡,最常用的損失函數(shù)是交叉熵?fù)p失。 例如贷揽,在IMDB情感數(shù)據(jù)集上進(jìn)行微調(diào)時: - **輸入(X)**:像 “這部電影視覺效果很棒棠笑,但情節(jié)很薄弱梦碗∏菪鳎” 這樣的電影評論。 - **目標(biāo)(Y)**:正確的標(biāo)簽洪规,例如 “正面” 或 “負(fù)面” 情感印屁。 對于文本生成任務(wù),輸入可以是一個問題斩例,而目標(biāo)則是模型生成的正確回復(fù)雄人。 **使用的損失函數(shù)**:交叉熵?fù)p失 對于語言模型,我們使用交叉熵?fù)p失念赶,它用于計算預(yù)測的詞元分布與實際目標(biāo)分布之間的差異础钠, ![](https://upload-images.jianshu.io/upload_images/17294212-b161b5ac46eb291b.png) 目標(biāo)是在訓(xùn)練過程中最小化這個損失,以便模型學(xué)習(xí)生成更準(zhǔn)確的文本輸出叉谜。 ### 為何使用數(shù)據(jù)子集旗吁? 在資源有限的硬件上對像DeepSeek LLM這樣的大型語言模型進(jìn)行微調(diào)時,使用完整數(shù)據(jù)集(例如包含25,000個樣本的IMDB數(shù)據(jù)集)進(jìn)行訓(xùn)練可能會導(dǎo)致訓(xùn)練時間過長和GPU內(nèi)存問題停局。為了緩解這些問題很钓,我們采取了以下措施: - **選擇子集**:選取500個樣本用于訓(xùn)練,100個樣本用于評估董栽。 - **保持代表性**:這個子集保留了足夠的多樣性码倦,以實現(xiàn)合理的性能。 使用較小的數(shù)據(jù)集可以加快實驗速度锭碳,同時有效地展示微調(diào)概念袁稽。對于生產(chǎn)級別的微調(diào),應(yīng)該在更強(qiáng)大的基礎(chǔ)設(shè)施上使用更大的數(shù)據(jù)集擒抛。 ### 加載DeepSeek LLM 在微調(diào)之前推汽,我們需要加載DeepSeek LLM并為訓(xùn)練做好準(zhǔn)備蝗柔。 **安裝所需庫** 首先,安裝必要的依賴項: ```bash pip install -U torch transformers datasets accelerate peft bitsandbytes ``` **使用4位量化加載模型** 我們使用4位量化民泵,使大型模型能夠在有限的GPU內(nèi)存下運(yùn)行: ```python from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig from peft import LoraConfig, get_peft_model model_name = "deepseek-ai/deepseek-llm-7b-base" bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_compute_dtype=torch.float16 ) tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained( model_name, quantization_config=bnb_config, device_map="auto" ) lora_config = LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none" ) model = get_peft_model(model, lora_config) model.print_trainable_parameters() print("? DeepSeek LLM Loaded with LoRA and 4-bit Precision!") ``` ### 使用Hugging Face數(shù)據(jù)集進(jìn)行訓(xùn)練 為了進(jìn)行微調(diào)癣丧,我們需要一個高質(zhì)量的數(shù)據(jù)集。Hugging Face提供了各種數(shù)據(jù)集的訪問途徑栈妆。 **選擇數(shù)據(jù)集** 在這個示例中胁编,我們使用IMDB數(shù)據(jù)集對DeepSeek LLM進(jìn)行情感分類的微調(diào): ```python from datasets import load_dataset dataset = load_dataset("imdb") ``` **預(yù)處理數(shù)據(jù)集** 將文本轉(zhuǎn)換為模型可接受的分詞輸入: ```python def tokenize_function(examples): inputs = tokenizer( examples["text"], truncation=True, padding="max_length", max_length=512 ) inputs["labels"] = inputs["input_ids"].copy() return inputs tokenized_datasets = dataset.map(tokenize_function, batched=True) small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(500)) small_test_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(100)) print("Tokenized Sample:") print(small_train_dataset[0]) ``` ### 什么是LoRA(低秩適應(yīng))? LoRA(低秩適應(yīng))是一種旨在使像DeepSeek LLM這樣的大型模型的微調(diào)在內(nèi)存使用上更高效的技術(shù)鳞尔,它通過以下方式實現(xiàn): - **凍結(jié)模型的大部分權(quán)重**嬉橙。 - **在關(guān)鍵層(例如注意力層)引入低秩可訓(xùn)練矩陣**。 這大大減少了可訓(xùn)練參數(shù)的數(shù)量寥假,同時保留了模型的性能市框。LoRA使得在資源受限的硬件(例如Colab GPU)上對大型語言模型進(jìn)行微調(diào)成為可能。 **LoRA的工作原理** - **將參數(shù)更新分解為低秩矩陣**:(這里需要使用公式編輯工具插入低秩矩陣分解公式糕韧,若無法直接插入公式枫振,可使用文字描述:假設(shè)原始參數(shù)為W,LoRA將其更新分解為W' = W + BA萤彩,其中B和A是低秩矩陣)粪滤。 - **僅對分解后的矩陣(例如注意力投影)應(yīng)用更新**。 - **與全量微調(diào)相比雀扶,減少了內(nèi)存和計算成本**杖小。 ### 代碼詳解:微調(diào)DeepSeek LLM **設(shè)置訓(xùn)練參數(shù)** ```python from transformers import TrainingArguments, Trainer training_args = TrainingArguments( output_dir="./results", evaluation_strategy="epoch", learning_rate=3e-4, per_device_train_batch_size=1, gradient_accumulation_steps=8, num_train_epochs=0.5, weight_decay=0.01, save_strategy="epoch", logging_dir="./logs", logging_steps=50, fp16=True, ) ``` **初始化訓(xùn)練器** ```python trainer = Trainer( model=model, args=training_args, train_dataset=small_train_dataset, eval_dataset=small_test_dataset, ) print("?? Trainer Initialized!") ``` **開始微調(diào)** ```python print("?? Starting Fine-Tuning...") trainer.train() ``` **保存微調(diào)后的模型** ```python trainer.save_model("./fine_tuned_deepseek") tokenizer.save_pretrained("./fine_tuned_deepseek") print("? Fine-Tuned Model Saved Successfully!") ``` ### 文章參考資料 - **DeepSeek LLM**:[GitHub倉庫](https://github.com/DeepSeek-AI/DeepSeek-LLM) - **IMDB數(shù)據(jù)集**:[Hugging Face數(shù)據(jù)集](https://huggingface.co/datasets/imdb) - **BitsAndBytes(量化)**:[官方倉庫](https://github.com/TimDettmers/bitsandbytes) 本文由[mdnice](https://mdnice.com/?platform=6)多平臺發(fā)布
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市愚墓,隨后出現(xiàn)的幾起案子予权,更是在濱河造成了極大的恐慌,老刑警劉巖浪册,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扫腺,死亡現(xiàn)場離奇詭異,居然都是意外死亡议经,警方通過查閱死者的電腦和手機(jī)斧账,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煞肾,“玉大人咧织,你說我怎么就攤上這事〖龋” “怎么了习绢?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我闪萄,道長梧却,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任败去,我火速辦了婚禮放航,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圆裕。我一直安慰自己广鳍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布吓妆。 她就那樣靜靜地躺著赊时,像睡著了一般。 火紅的嫁衣襯著肌膚如雪行拢。 梳的紋絲不亂的頭發(fā)上祖秒,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音舟奠,去河邊找鬼竭缝。 笑死,一個胖子當(dāng)著我的面吹牛鸭栖,可吹牛的內(nèi)容都是我干的歌馍。 我是一名探鬼主播握巢,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晕鹊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暴浦?” 一聲冷哼從身側(cè)響起溅话,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎歌焦,沒想到半個月后飞几,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡独撇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年屑墨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纷铣。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡卵史,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搜立,到底是詐尸還是另有隱情以躯,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站忧设,受9級特大地震影響刁标,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜址晕,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一膀懈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谨垃,春花似錦吏砂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至易核,卻和暖如春匈织,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牡直。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工缀匕, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碰逸。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓乡小,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饵史。 傳聞我的和親對象是個殘疾皇子满钟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容