:從注意力機制到LoRA微調(diào))
第十節(jié)課了。跟我把前面九節(jié)課跟下來的同學(xué)應(yīng)該有個感覺深度學(xué)習(xí)這條路前面學(xué)的都是“部件級”的東西神經(jīng)網(wǎng)絡(luò)、損失函數(shù)、卷積、循環(huán)網(wǎng)絡(luò)一個個積木搭起來最后總能搭出點東西。這節(jié)課換一個畫風(fēng)直接聊當(dāng)下繞不開的大模型。這節(jié)課我想解決三個問題大模型的原理到底是怎么回事它跟前面學(xué)的小模型差別在哪里以及手里只有一張顯卡的時候你能怎么玩內(nèi)容不追求論文級別的嚴謹?shù)非舐犕昴苌鲜衷摻o出來的代碼、參數(shù)、踩坑位置一個都不少。1. 大模型到底是什么從三個維度看懂它“大”在哪里1.1 從統(tǒng)計語言模型到大模型的進化思路要說大模型得先回到語言模型這個老概念。語言模型的任務(wù)用一句話說給定前面的一串詞預(yù)測下一個詞是什么。早期靠 n-gram 做統(tǒng)計比如統(tǒng)計“我今天”后面出現(xiàn)“吃飯”的次數(shù)用頻率當(dāng)概率。這套東西的問題非常致命數(shù)據(jù)稀疏稍微長一點的詞組組合根本沒見過概率直接就是零。后來有了循環(huán)神經(jīng)網(wǎng)絡(luò)把序列壓縮成一個隱藏狀態(tài)理論上能記住更長的信息可它有兩個毛病——訓(xùn)練速度慢長距離依賴還是會逐漸衰減。真正改變格局的是注意力機制的出現(xiàn)它讓序列里的任意兩個位置可以直接發(fā)生交互不再需要信息一步步往后傳與此同時計算還能大規(guī)模并行。于是模型的規(guī)模開始不受控制地往上漲語言模型也正式從小模型階段進入大模型階段。這個進化過程其實透露了一個關(guān)鍵信息大模型不是憑空長出來的它是“語言模型”這個老思路在算力、數(shù)據(jù)雙重加持下走到極致的產(chǎn)物。你前面學(xué)的 Transformer就是大模型的底座現(xiàn)在所有主流大模型的骨架都能在它身上找到影子。理解這一點后面看新聞、看論文都不會覺得飄。1.2 參數(shù)、數(shù)據(jù)、算力這三筆賬大模型的“大”到底體現(xiàn)在哪我習(xí)慣拆成三筆賬。第一筆是參數(shù)賬早期小模型百萬級參數(shù)現(xiàn)在開源社區(qū)里常見的規(guī)模是 7B、13B、70B字母 B 代表十億。一個 70 億參數(shù)的模型用半精度存下來權(quán)重文件就 14GB 左右你下載下來都能明顯感覺到這已經(jīng)不是一個能隨便塞進內(nèi)存的小文件了。第二筆是數(shù)據(jù)賬預(yù)訓(xùn)練階段用的不是多少萬條數(shù)據(jù)而是幾 TB 甚至幾十 TB 的純文本切成 token 之后動輒幾千億個。第三筆是算力賬從頭訓(xùn)練一個 7B 模型需要幾十上百張顯卡連續(xù)跑好幾個月電費和機器成本都是天文數(shù)字。這三筆賬連在一起就解釋了一個新手最常見的困惑為什么大模型不能像前面教程里那樣隨便訓(xùn)因為它是“三高”產(chǎn)物——高參數(shù)、高數(shù)據(jù)、高算力。這也是為什么絕大多數(shù)人接觸大模型不是從訓(xùn)練開始而是從微調(diào)和調(diào)用開始。這不是妥協(xié)而是成本結(jié)構(gòu)決定的現(xiàn)實。1.3 為什么這幾年才突然爆發(fā)很多人會問注意力機制和 Transformer 不是早就有了嗎為什么這幾年才火我的理解是三個條件同時到位了。第一是算力這幾年 GPU 的算力密度提升了一個量級大規(guī)模分布式訓(xùn)練變得成熟以前想都不敢想的集群現(xiàn)在能跑起來了第二是數(shù)據(jù)互聯(lián)網(wǎng)積累了海量文本清洗之后足夠喂飽大模型第三是范式大家終于摸索出“預(yù)訓(xùn)練 大規(guī)模后訓(xùn)練”這條穩(wěn)定可復(fù)制的技術(shù)路線再加上一批開放權(quán)重的模型出現(xiàn)把門檻從頂級實驗室拉到了普通開發(fā)者面前。技術(shù)爆發(fā)從來不是一個靈光一閃而是基礎(chǔ)設(shè)施、數(shù)據(jù)和技術(shù)路線一起堆出來的結(jié)果。對學(xué)習(xí)者來說這也意味著你沒必要神化大模型——它的原理你完全能學(xué)會而且后面幾節(jié)的操作課你會發(fā)現(xiàn)門檻遠比想象中低。2. 大模型核心原理拆解注意力、預(yù)訓(xùn)練與對齊機制2.1 注意力機制大模型的“內(nèi)功心法”要說大模型為什么強繞不開注意力機制。我上課時喜歡打一個比方你在圖書館查資料手里有個問題Query所有書的標題是 Key正文內(nèi)容就是 Value。你先拿著問題在標題里掃一遍找出最相關(guān)的幾本書然后打開這些書的正文把最有用的段落摘出來組合成自己的筆記。注意力機制做的事情一模一樣序列里的每個詞都會生成三個向量Query、Key、Value計算時用當(dāng)前詞的 Query 去和所有詞的 Key 做點積得到相似度再經(jīng)過 softmax 歸一化成權(quán)重最后按權(quán)重把對應(yīng)的 Value 加權(quán)求和。哪個詞跟你當(dāng)前語義越相關(guān)它的信息貢獻就越大。有人會問這三個向量是哪兒來的其實就是輸入向量分別乘上三個可學(xué)習(xí)的權(quán)重矩陣訓(xùn)練過程中會自動調(diào)整這幾個矩陣讓模型學(xué)會“該關(guān)注哪”。模型不可能只用一套規(guī)則看關(guān)系于是有了多頭注意力把注意力切成多個頭每個頭在獨立的投影空間里學(xué)習(xí)不同的關(guān)系模式有的頭關(guān)注語法有的頭關(guān)注指代有的頭關(guān)注遠程依賴。最后把所有頭的結(jié)果拼起來再做一次線性變換信息就串起來了。同時為了不讓模型把句子當(dāng)成詞袋還要給每個位置注入位置信息這就是位置編碼的作用。這一整套設(shè)計就是大模型能把長句子讀明白的根本原因。2.2 預(yù)訓(xùn)練階段模型的“自我修煉”有了骨架接下來就是填內(nèi)容。大模型在預(yù)訓(xùn)練階段做的事說白了就是“瘋狂做預(yù)測題”。最常見的是自回歸任務(wù)把一段文本的前面部分喂給模型讓它預(yù)測下一個詞是誰然后跟真實答案算交叉熵損失反向傳播更新參數(shù)。就這么一個看似簡單的任務(wù)在海量文本上反復(fù)做模型被迫學(xué)會了語法、事實知識、邏輯關(guān)系、常識判斷。你可能覺得不可思議預(yù)測下一個詞怎么能學(xué)會那么多東西語言本身就是高度壓縮的知識載體。為了把下一個詞預(yù)測準模型必須建模詞與詞之間的復(fù)雜關(guān)系這個建模過程就是在隱式地學(xué)習(xí)世界知識。比如文本里反復(fù)出現(xiàn)“北京是中國的首都”模型為了預(yù)測“北京”后面的詞就必須把“北京”“中國”“首都”這幾個概念之間的關(guān)聯(lián)編碼進去。訓(xùn)練到后期這些關(guān)聯(lián)會泛化成它的“常識”。預(yù)訓(xùn)練階段是計算量最大的階段也是大模型性價比最高的一段同樣的參數(shù)訓(xùn)練數(shù)據(jù)越多性能越好。2.3 規(guī)模定律與涌現(xiàn)能力為什么大家都在堆參數(shù)這里引出一個關(guān)鍵規(guī)律規(guī)模定律。研究者做了大量實驗把模型參數(shù)量、訓(xùn)練數(shù)據(jù)量、算力投入和最終損失放到對數(shù)坐標下發(fā)現(xiàn)它們之間基本是一條直線關(guān)系。翻譯成人話只要數(shù)據(jù)和算力一起漲模型能力就穩(wěn)定地漲前期的投入每一次都沒有白費。這個發(fā)現(xiàn)直接改變了行業(yè)游戲規(guī)則大家不再糾結(jié)某個技巧行不行而是先把規(guī)模堆上去技術(shù)路線前所未有地清晰。還有一個現(xiàn)象更有意思涌現(xiàn)能力。某些能力比如多步數(shù)學(xué)推理、指令跟隨在模型規(guī)模超過某個閾值之前幾乎為零超過閾值之后突然大幅提升。就像水加熱到 100 度才沸騰之前看著沒什么變化過了那個點就沸騰給你看。不過這里我要潑一盆冷水規(guī)模定律不是免死金牌數(shù)據(jù)質(zhì)量、模型結(jié)構(gòu)、訓(xùn)練穩(wěn)定性照樣能毀掉一切超大規(guī)模優(yōu)勢。很多團隊盲目堆參數(shù)結(jié)果訓(xùn)練不穩(wěn)定損失炸了錢也白花了這我見過不少次。2.4 對齊與微調(diào)讓模型懂規(guī)矩預(yù)訓(xùn)練結(jié)束的模型能接下文但未必會“好好說話”。它會一本正經(jīng)地續(xù)寫卻不一定回答你的問題說話方式也和人類對話習(xí)慣差很遠。所以還需要后訓(xùn)練階段業(yè)內(nèi)叫“對齊”。第一步是監(jiān)督微調(diào)也叫 SFT準備大量“用戶提問-標準答案”這樣的高質(zhì)量對話樣本讓模型照著學(xué)格式和語氣。第二步是強化學(xué)習(xí)對齊以前最常用的是 RLHF 路線先訓(xùn)練一個獎勵模型對人類偏好數(shù)據(jù)打分再用強化學(xué)習(xí)算法去調(diào)整生成策略讓模型輸出更符合人類偏好。后來社區(qū)又提出了一些更輕量的方案比如直接偏好優(yōu)化省去訓(xùn)練獎勵模型的一整套流程成本低了不少。對個人玩家來說最常接觸的可能不是這些重型對齊流程而是參數(shù)高效微調(diào)代表方案就是 LoRA。LoRA 的核心思路是凍結(jié)原有權(quán)重只訓(xùn)練一小部分低秩增量矩陣效果接近全量微調(diào)顯存和耗時卻能省一個量級。這一節(jié)后面實操我會帶你完整跑一遍 LoRA 微調(diào)現(xiàn)在先記住這個詞它是普通開發(fā)者接觸大模型最劃算的入口。3. 大模型訓(xùn)練完整路線圖從數(shù)據(jù)到評測少走彎路3.1 先想清楚目標預(yù)訓(xùn)練、微調(diào)還是直接調(diào)用講完原理聊路線。很多人一上來就問怎么訓(xùn)練一個自己的大模型我的第一個建議是先搞清楚自己到底需要什么。我把常見路子列成一張表路線成本數(shù)據(jù)要求適合場景全量預(yù)訓(xùn)練極高需要算力集群和數(shù)月時間TB 級文本研究底層、打造基礎(chǔ)模型繼續(xù)預(yù)訓(xùn)練或全量微調(diào)中等偏上單卡到幾卡可啟動百萬級起步的領(lǐng)域文本或?qū)υ挃?shù)據(jù)讓模型懂某個專業(yè)領(lǐng)域LoRA 參數(shù)高效微調(diào)較低消費級顯卡可跑幾千到幾十萬條高質(zhì)量樣本改變風(fēng)格、學(xué)會特定任務(wù)調(diào)用現(xiàn)成模型 API最低按量付費無需準備數(shù)據(jù)快速驗證產(chǎn)品想法我的經(jīng)驗是90% 的業(yè)務(wù)問題根本不需要訓(xùn)練先試調(diào)用或者輕量微調(diào)只有當(dāng)你發(fā)現(xiàn)模型在某個專業(yè)領(lǐng)域反復(fù)翻車、手上數(shù)據(jù)又多得能撐得起訓(xùn)練的時候才考慮繼續(xù)預(yù)訓(xùn)練。一上來就堆算力從頭訓(xùn)練大概率是給服務(wù)器商送錢。新手尤其要警惕“訓(xùn)練模型才叫真做 AI”的心態(tài)先跑通最小閉環(huán)再談規(guī)模。3.2 數(shù)據(jù)準備清洗、去重與配比一個都不能少如果決定訓(xùn)練那第一件事就是伺候數(shù)據(jù)。數(shù)據(jù)是大模型的命根子這句話我說一萬遍都不嫌多。網(wǎng)上能拿到很多開源語料但直接丟進去訓(xùn)練出來的模型會臟得沒法看。標準流程大致如下第一是文檔級去重把幾十個網(wǎng)頁里重復(fù)出現(xiàn)的段落干掉防止模型某段話背得滾瓜爛熟別的知識一概不知第二是內(nèi)容過濾廣告、標簽、亂碼、無意義內(nèi)容一律剔除第三是質(zhì)量篩選用規(guī)則或者小模型打分留下的語料要像樣第四是配比設(shè)計通用文本、代碼、數(shù)學(xué)題、多語種按什么比例混非常重要。舉個例子想讓模型會寫代碼代碼語料的比例就得明顯提高想讓模型邏輯好數(shù)學(xué)和推理文本就得多放。數(shù)據(jù)清洗不是一次性工作通常要迭代好幾輪每次訓(xùn)練完看模型表現(xiàn)再回頭調(diào)整數(shù)據(jù)。我見過一個團隊數(shù)據(jù)配比里通用文本占 99%代碼只給一點點模型代碼能力怎么訓(xùn)都上不來后來把代碼語料提到 20%效果立刻不一樣。數(shù)據(jù)比例就是這么敏感。3.3 分布式訓(xùn)練與顯存優(yōu)化一張卡也能玩的技巧數(shù)據(jù)準備好了接著是訓(xùn)練工程。大模型權(quán)重動輒幾十 GB一張卡根本裝不下所以要用分布式策略。最常見的三種切法數(shù)據(jù)并行每個顯卡拿到一份模型副本和不同批次的數(shù)據(jù)算完梯度再同步更新適合數(shù)據(jù)量大、模型單卡能放下的情況張量并行把單個層的計算切到多張卡上適合模型太大裝不進一張卡的情況流水線并行按層把模型切成幾段每張卡負責(zé)一段像工廠流水線一樣接力。實際訓(xùn)練往往是三種并行組合使用業(yè)界叫 3D 并行。不想搞集群的個人玩家更關(guān)心的是顯存優(yōu)化三板斧。第一招混合精度訓(xùn)練用半精度存梯度和激活值顯存直接省一半第二招梯度累積顯存不夠就攢幾個小批次的梯度再更新等效于把批次變大又不增加顯存壓力第三招梯度檢查點故意不保存中間激活值用到的時候重算一次用計算換顯存。還有 ZeRO 這類優(yōu)化器狀態(tài)切分方案能把顯存占用進一步壓低。個人做微調(diào)尤其要會用這些不然模型權(quán)重 14GB顯卡顯存 16GB還沒開訓(xùn)就爆了。3.4 模型評測公開榜單不是唯一標準訓(xùn)練完或者微調(diào)完怎么知道它行不行我給三個層次的評測方法。第一層是標準基準測試跑通用問答、數(shù)學(xué)、代碼、推理這些公開榜主要用來橫向比較模型之間的差距缺點是公開榜單容易被刷分數(shù)虛高。第二層是人工對比把兩個模型的回答放在一起盲測讓打分的人憑直覺選更好的一邊計算勝率。這個方法最貼近真實使用感受勝率比跑分可靠得多邏輯很簡單用戶不在乎你的測試分數(shù)只在乎你答得爽不爽。第三層也是我特別強調(diào)的用你自己的業(yè)務(wù)數(shù)據(jù)做評測哪怕只有一百條真實問題把模型跑一遍逐條看輸出質(zhì)量。很多同學(xué)拿公開榜單的高分模型做自家業(yè)務(wù)效果慘不忍睹原因就是榜單數(shù)據(jù)分布和你的業(yè)務(wù)數(shù)據(jù)分布完全不同。記住通用指標只能作為參考最終拍板的一定是你場景里的真實表現(xiàn)。這個道理放到任何模型身上都成立。4. 本地部署與 LoRA 微調(diào)實操跑通最小閉環(huán)4.1 環(huán)境準備與模型選型先跑通小的再往大了換理論知識講完了進入動手環(huán)節(jié)。我們的目標很樸素在自己電腦上跑一個能對話的大模型最好還能微調(diào)一下。先說環(huán)境一臺帶獨立顯卡的機器顯存 8GB 起步16GB 以上體驗會好很多如果沒有顯卡用純 CPU 也能跑小模型就是慢生成一句話能等半天。軟件方面裝好 Python再把深度學(xué)習(xí)框架和 transformers 這套生態(tài)裝齊pip install torch transformers accelerate sentencepiece pip install peft # 微調(diào)用的參數(shù)高效庫裝好之后選模型。我強烈建議新手先選一個 1B 到 3B 級別的開源對話模型不要一上來就上 70B。顯存 8GB 的時候選量化后的 3B 模型顯存 16GB 可以跑 7B 的量化版本顯存 24GB 以上7B 全精度基本沒問題。記住一個原則模型能跑起來永遠比模型大重要。先跑通一個小的再往大了換這個順序能救你的頭發(fā)。提示新手最大的錯覺是“顯存夠模型一定跑得動”。實際上模型加載進顯存后推理和訓(xùn)練還要額外占用大量顯存預(yù)留空間不足一樣會崩潰。4.2 十分鐘跑通第一次本地推理以 transformers 為例加載一個開源對話模型并讓它說話的代碼非常短。這里我用占位符代替具體模型名你把它換成自己下載好的開源權(quán)重路徑即可from transformers import AutoTokenizer, AutoModelForCausalLM model_path /your/local/model-path # 換成實際模型路徑 tokenizer AutoTokenizer.from_pretrained(model_path) model AutoModelForCausalLM.from_pretrained(model_path, device_mapauto) prompt 請用一句話解釋什么是注意力機制。 inputs tokenizer(prompt, return_tensorspt).to(model.device) outputs model.generate( **inputs, max_new_tokens256, do_sampleTrue, temperature0.7, top_p0.9, ) answer tokenizer.decode(outputs[0][inputs[input_ids].shape[1]:], skip_special_tokensTrue) print(answer)幾個參數(shù)值得解釋一下。max_new_tokens 控制最多生成多少個新詞太長拖慢響應(yīng)太短可能說不完temperature 控制隨機性值越大越發(fā)散越小越保守日常問答我喜歡 0.7top_p 是做核采樣只從累計概率前 90% 的詞里抽能有效過濾低概率垃圾詞。跑通這段代碼你就已經(jīng)完成了一個本地大模型的最小閉環(huán)。別小看這一步很多人卡在環(huán)境配置上好幾個小時折騰一次就長記性了。4.3 LoRA 微調(diào)實戰(zhàn)讓模型學(xué)會客服風(fēng)格推理跑通之后做更有價值的事情微調(diào)。這里用一個最經(jīng)典的場景演示——讓模型學(xué)會客服式的回答風(fēng)格。第一步準備數(shù)據(jù)格式是 JSONL 文件每一行一個樣本{instruction: 你好, response: 您好很高興為您服務(wù)請問有什么可以幫您} {instruction: 能介紹一下退款流程嗎, response: 您好退款會在申請后的三個工作日內(nèi)原路返回賬戶請您耐心等待。}幾百條這樣的樣本就能把風(fēng)格掰過來。第二步寫 LoRA 訓(xùn)練腳本核心是配置一個 LoRA 配置對象from peft import LoraConfig, get_peft_model lora_config LoraConfig( r8, # 低秩矩陣的秩越大表達能力越強顯存占用越高 lora_alpha16, # 縮放系數(shù)影響更新強度 lora_dropout0.05, target_modules[q_proj, v_proj], # 只改注意力層里的投影矩陣 ) model get_peft_model(model, lora_config) model.print_trainable_parameters() # 會看到可訓(xùn)練參數(shù)占比非常小第三步定義訓(xùn)練參數(shù)并啟動訓(xùn)練。批次大小看顯存定學(xué)習(xí)率用 2e-5 這種小值跑幾個 epoch一邊跑一邊看損失下降。訓(xùn)練完成后LoRA 只會保存一個很小的適配器文件幾十 MB 到幾百 MB 不等加載和分享都極其方便。整套流程跑下來你會有個直觀感受訓(xùn)一個模型原來比想象中便宜得多這就是參數(shù)高效微調(diào)的價值。如果你想讓模型學(xué)會某種語氣、某個領(lǐng)域的問答套路這個套路基本是通用解。4.4 落地上線把模型封裝成輕量服務(wù)微調(diào)完的模型不能總待在命令行里。我習(xí)慣用一個輕量 HTTP 服務(wù)把它包起來這樣前端頁面、測試腳本都能直接調(diào)用。核心思路是加載一次模型到顯存然后循環(huán)接受請求把文本丟給模型生成再把結(jié)果返回。生產(chǎn)級實現(xiàn)要考慮并發(fā)、超時、流式輸出但最小版本用幾十行代碼就能搭出來。另一個實用操作是量化部署把模型權(quán)重從半精度壓到 8bit 甚至 4bit顯存占用直接砍半再砍半。代價是速度和精度略有損失但很多對話場景完全夠用。部署之后建議打印時間戳測算生成速度。按自回歸方式生成的解碼器7B 模型通常每秒幾個到十幾個 token你在心里有個預(yù)期就行別指望它能像本地搜索一樣零延遲。這一步做完你就擁有了一個能對外提供服務(wù)的本地大模型雖然簡陋但完整閉環(huán)已經(jīng)成立。后續(xù)再想接業(yè)務(wù)、做檢索增強都是在這個骨架上加肉。5. 大模型實踐避坑指南顯存、Loss 與幻覺排查5.1 顯存溢出從 OOM 報錯到成功訓(xùn)練先說我踩過最多次的坑顯存溢出。報錯就是很經(jīng)典的一句 CUDA out of memory。第一次遇到別慌按順序排查第一步確認顯存是不是被別的進程占了用系統(tǒng)自帶顯卡監(jiān)控命令看一眼占用情況我之前經(jīng)常發(fā)現(xiàn)自己明明沒開幾個程序顯存卻被一個殘留進程占掉大半第二步把批次大小 batch size 調(diào)小甚至調(diào)到 1這一步在微調(diào)時能立刻救急第三步切換到混合精度或量化加載第四步開梯度檢查點最后實在不行就是模型規(guī)模選大了換個更小的版本。我的血淚經(jīng)驗是預(yù)算顯存的時候除了權(quán)重還要預(yù)留激活值、梯度和中間緩存。所以不要天真地覺得 14GB 權(quán)重的模型在 16GB 顯存里就能輕松訓(xùn)練。開訓(xùn)之前先跑一次小批次推理和一次單步訓(xùn)練把顯存水位摸清楚再放大批次。寧可先穩(wěn)后快也不要一上來就追求大 batch崩一次就得重來一次。5.2 訓(xùn)練不收斂或 loss 異??匆?guī)律就行第二個高頻問題來自訓(xùn)練階段損失不降或者亂跳。只要看日志規(guī)律基本能七成定位原因。如果損失發(fā)散射爆越訓(xùn)越大十有八九是學(xué)習(xí)率太高尤其用 1e-4 甚至更大的學(xué)習(xí)率微調(diào)時經(jīng)常發(fā)生降到 2e-5 量級立馬穩(wěn)住如果損失一開始就紋絲不動先檢查數(shù)據(jù)格式是不是錯了是不是所有樣本的標簽都一樣或者存在大量空文本如果訓(xùn)練到一半突然變 NaN多半是混合精度溢出老顯卡對 FP16 支持不夠好一般直接換 BF16。排查技巧上我強烈建議在訓(xùn)練循環(huán)里把梯度范數(shù)打出來。梯度范數(shù)持續(xù)上漲就是訓(xùn)練不穩(wěn)定的前兆這時候調(diào)低學(xué)習(xí)率或加上梯度裁剪能救回不少壞訓(xùn)練。另外加學(xué)習(xí)率預(yù)熱也很有用開頭幾百步從零慢慢升到目標學(xué)習(xí)率能避免訓(xùn)練初期的大震蕩。這些小技巧看著不高級實戰(zhàn)里挽救了我不下十次訓(xùn)練。5.3 生成質(zhì)量差、幻覺多先別急著罵模型模型終于跑起來了又有人抱怨它滿嘴跑火車。先潑盆冷水所有大模型都會幻覺沒人能根除只能緩解。最常見的緩解手段有三個。第一個是調(diào)整解碼參數(shù)把 temperature 調(diào)低比如從 0.7 降到 0.2模型就沒那么愛編了代價是回答變得保守、缺乏新意第二個是給模型補上下文讓模型基于資料來回答這就是檢索增強的思路把相關(guān)知識片段拼到提示詞里再讓它答幻覺會顯著減少第三個是引導(dǎo)它分步思考先列出思路再給結(jié)論復(fù)雜問題翻車概率小很多。另外我特別喜歡在提示詞里加一句“如果不確定請直接說不確定”。多試幾次你會驚訝地發(fā)現(xiàn)輸出穩(wěn)了很多。很多人以為這是玄學(xué)其實本質(zhì)上是給解碼過程加了約束讓模型在低置信度時選擇保守路徑。這個方法免費效果卻比換大模型更立竿見影。5.4 一張避坑速查表貼在手邊隨時看最后把前面所有經(jīng)驗濃縮成一張表方便你貼在手邊癥狀可能原因解決方式CUDA out of memory顯存預(yù)算不足、批次太大調(diào)小批次、開量化、開梯度檢查點、換小模型loss 發(fā)散射爆學(xué)習(xí)率過大降到 2e-5 量級、加學(xué)習(xí)率預(yù)熱、加梯度裁剪loss 全程不動數(shù)據(jù)格式錯誤或標簽單一檢查數(shù)據(jù)清洗確認樣本標簽有區(qū)分度訓(xùn)練中途 NaN半精度溢出換 BF16、降低學(xué)習(xí)率、增加梯度裁剪輸出空洞套話數(shù)據(jù)質(zhì)量差、模型太小清洗數(shù)據(jù)、換更強基座模型回答幻覺嚴重解碼太激進、知識不足調(diào)低 temperature、加檢索增強、給參考資料生成速度慢顯存帶寬不足、未做量化換量化版本、換更高帶寬顯卡、開編譯加速這張表不完整但覆蓋了新手階段 80% 的求救場景。遇事先查表查不到再去針對性搜索效率比裸奔調(diào)試高得多。帶完這一節(jié)我自己最大的體會是大模型的門檻確實被大幅拉低了但知識門檻一點沒低。你還是要懂注意力機制、要懂?dāng)?shù)據(jù)清洗、要懂訓(xùn)練穩(wěn)定性才能玩得轉(zhuǎn)。對想入門的人我的建議很直白別囤資料先把最小案例跑起來再回來補原理兩輪下來比看十篇綜述都管用。這節(jié)課就到這下一節(jié)課咱們聊點更輕快的應(yīng)用層玩法到時候見。