開局一道面試題。
面試官:大模型微調如何組織訓練樣本?
你:大模型訓練一問一答,一指令一輸出,問題和指令可以作為prompt輸入,答案作為輸出,計算loss的部分要屏蔽掉pad token。
面試官:多輪對話如何組織訓練樣本呢?
你:假設多輪為Q1A1/Q2A2/Q3A3,那么可以轉化成 Q1—>A1, Q1A1Q2->A2, Q1A1Q2A2Q3->A3三條訓練樣本。
面試官:這樣的話一個session變成了三條數據,并且上文有依次重復的情況,這樣會不會有啥問題?
你:數據中大部分都是pad token,訓練數據利用效率低下。另外會有數據重復膨脹的問題,訓練數據重復膨脹為 session數量*平均輪次數,且上文有重復部分,訓練效率也會低下。
面試官:你也意識到了,有什么改進的方法嗎?
你:有沒有辦法能一次性構造一個session作為訓練樣本呢?(思索)
面試官:提示你下,限制在decoder-only系列的模型上,利用模型特性,改進樣本組織形式。
對于這個問題,我們思考下decoder-only模型有啥特點,第一點很關鍵的是其attention形式是casual的,casual簡單理解就是三角陣,單個token只能看到其上文的信息。
如圖所示:
其二是postion_id是只有token次序含義而無需特定指代信息,(區別于GLM模型需要postion_id來標識生成span的位置等特殊的要求)。
有了這兩點我們就可以設想,如果構造多輪對話樣本的input為 Q1 A1
嗯為什么原來的chatglm不能用這種形式呢,雖然prefix attention可以推廣為適應多輪訓練的prefix attention形式,如圖:
但是由于其postition id 無法簡單按次序推廣,故不能高效訓練,這也是chatglm初代的很大的一個問題,導致后續微調的效果都比較一般。
現在chatglm2的代碼針對這兩個問題已經進行了改善,可以認為他就是典型的decoder-only模型了,具體表現為推斷時候attention 是casual attention的形式,position id也退化為token次序增長。
那么好了,萬事具備,只欠東風。我們據此實現了chatglm2-6b的代碼微調。其核心代碼邏輯為處理樣本組織的邏輯,其他的就是大模型微調,大同小異了。
conversation='' input_ids = [] labels = [] eos_id = tokenizer.eos_token_id turn_idx = 0 for sentence in examples[prompt_column][i]: sentence_from = sentence["from"].lower() sentence_value = '[Round {}] 問:'.format(turn_idx) + sentence["value"] + ' 答:' if sentence_from == 'human' else sentence["value"]+' ' conversation += sentence_value sentence_ids = tokenizer.encode(sentence_value, add_special_tokens=False) label = copy.deepcopy(sentence_ids) if sentence_from != 'human' else [-100] * len(sentence_ids) input_ids += sentence_ids labels += label if sentence_from != 'human': input_ids += [eos_id] labels += [eos_id] turn_idx += 1 input_ids=tokenizer.encode('')+input_ids#addgmaskbos labels = [-100] * 2 + labels# #add padding pad_len = max_seq_length - len(input_ids) input_ids = input_ids + [eos_id] * pad_len labels = labels + [-100] * pad_len
其中有幾個關鍵的地方,就是在開頭要加上 bos和gmask,遵循模型原來的邏輯。問答提示詞和輪次prompt,還有兩個 保持和原模型保持一致,最后屏蔽掉pad部分的loss計算。
實測訓練效果如下:
同樣的數據在chatglm1上 train loss只能降到2.x左右,同時評估測試集結果,在同樣的數據上rouge等指標都有不小的提升。
我們再仔細回顧下,對話session級別訓練和拆開訓練從原理上有啥區別?
1.session級別訓練,效果之一為等價batchsize變大(1個batch可以塞下更多樣本),且同一通對話產生的樣本在一個bs內。
2. session級別的不同輪次產生的梯度是求平均的,拆開輪次構造訓練是求和的,這樣除了等價于lr會變大,還會影響不同輪次token權重的分配,另外還會影響norm的計算。
我們用一個簡化地例子定量分析下,我們假設兩條訓練樣本分為 1.問:A 答:xx 2.問: A答:xx 問: B答:xx問: C答:xx 則session級別訓練影響梯度為 (Ga+(Ga +Gb + Gc)/3)/2。對 A,B,C影響的權重分別為,2/3 1/6 1/6。 拆開訓練為(Ga+Ga+ (Ga+Gb)/2+(Ga+Gb+ Gc)/3)/4。對 A,B,C影響的權重分別為,17/24 5/24 1/12。 從上面的權重分布來看,session級別靠后的輪次影響權重要比拆開更大。這也是更合理的,因為大部分場景下,開場白都是趨同和重復的。 一點小福利,以上面試題對應的ChatGLM2-6B微調完整的代碼地址為: https://github.com/SpongebBob/Finetune-ChatGLM2-6B
實現了對于 ChatGLM2-6B 模型的全參數微調,主要改進點在多輪對話的交互組織方面,使用了更高效的session級別高效訓練,訓練效果相比原版ChatGLM-6B有較大提升。
這可能是目前全網效果最好的ChatGLM2-6B全參數微調代碼。
-
數據
+關注
關注
8文章
7145瀏覽量
89587 -
代碼
+關注
關注
30文章
4828瀏覽量
69058 -
大模型
+關注
關注
2文章
2551瀏覽量
3172
原文標題:大模型微調樣本構造的trick
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
【「基于大模型的RAG應用開發與優化」閱讀體驗】+大模型微調技術解讀
《具身智能機器人系統》第7-9章閱讀心得之具身智能機器人與大模型
名單公布!【書籍評測活動NO.52】基于大模型的RAG應用開發與優化
一種信息引導的量化后LLM微調新算法IR-QLoRA
![一種信息引導的量化后LLM<b class='flag-5'>微調</b>新算法IR-QLoRA](https://file1.elecfans.com/web1/M00/F5/68/wKgZoWc8WlmANPIrAAAlXxrM1Uk345.png)
大語言模型如何開發
chatglm2-6b在P40上做LORA微調
![chatglm2-6b在P40上做LORA<b class='flag-5'>微調</b>](https://file1.elecfans.com//web2/M00/03/4B/wKgaoma7I3aASvk2AADHmpxfTLQ074.png)
示波器探頭補償微調旋鈕的作用
大模型為什么要微調?大模型微調的原理
【大語言模型:原理與工程實踐】大語言模型的應用
【大語言模型:原理與工程實踐】大語言模型的基礎技術
【大語言模型:原理與工程實踐】核心技術綜述
基于雙級優化(BLO)的消除過擬合的微調方法
![基于雙級優化(BLO)的消除過擬合的<b class='flag-5'>微調</b>方法](https://file1.elecfans.com/web2/M00/C7/98/wKgaomYLxqSAfrTuAAAQsrCvNqM874.png)
揭秘大語言模型可信能力的五個關鍵維度
![揭秘大語言<b class='flag-5'>模型</b>可信能力的五個關鍵維度](https://file1.elecfans.com/web2/M00/C5/5C/wKgaomXzqHCAAXI0AAAhic_ppQw261.png)
評論