最近“如來(lái)”話術(shù)非常之火啊,看一次笑一次,不懂這個(gè)梗的朋友們可以回顧一下:?
【如來(lái)原版】
【資料圖】
那么,我們能讓 GPT也學(xué)會(huì) 如來(lái)話術(shù)嗎?思路其實(shí)很簡(jiǎn)單,只要我們把那些經(jīng)典語(yǔ)錄讓 GPT 學(xué)習(xí)學(xué)習(xí)。筆者自己做了些實(shí)驗(yàn),還確實(shí)訓(xùn)練處理一個(gè)馬馬虎虎的 「如來(lái)GPT」,雖然泛化性能并不好。不過(guò)整個(gè)實(shí)驗(yàn)過(guò)程還是挺有意思,這里分享出來(lái),在結(jié)尾我還提出了一些值得探索的點(diǎn),希望有興趣的朋友一起討論!
這個(gè)小項(xiàng)目是基于我最近的一個(gè)Github —— LLM-Tuning實(shí)現(xiàn)的,本文涉及到的相關(guān)的代碼、數(shù)據(jù)集、教程都在倉(cāng)庫(kù)里,建議點(diǎn)個(gè)Star??后配合本文食用:
項(xiàng)目地址:
/beyondguo/LLM-Tuning
一、數(shù)據(jù)準(zhǔn)備
我們從網(wǎng)上先收集最基本的“如來(lái)話術(shù)”:
{"q":"問(wèn):中國(guó)人認(rèn)為宇宙萬(wàn)法的那個(gè)源頭,它是什么","a":"答:它是如如"}{"q":"問(wèn):我說(shuō)如來(lái),他真來(lái)了嗎","a":"答:如來(lái)"}{"q":"問(wèn):我經(jīng)常說(shuō)如來(lái)這個(gè)詞有秘密,如來(lái)、如來(lái)了嗎?","a":"答:如來(lái)~"}{"q":"問(wèn):到底來(lái)沒(méi)來(lái)?","a":"答:如來(lái)~"}{"q":"問(wèn):如來(lái)是什么意思?","a":"答:來(lái)了又好像沒(méi)來(lái),沒(méi)來(lái)又好像來(lái)了"}
當(dāng)然,這些是肯定不夠的,所以我們要做一些數(shù)據(jù)增強(qiáng),這里我們可以直接使用 ChatGPT 來(lái)幫我們做增強(qiáng):
例如,我給 ChatGPT 這樣的 instruction:
{"q":"問(wèn):到底來(lái)沒(méi)來(lái)?","a":"答:如來(lái)~"}請(qǐng)把問(wèn)題q改寫10次,然后返回。每一行一個(gè)json(不要換行),共10行。
就會(huì)得到:
{"q":?"問(wèn):是否已經(jīng)到達(dá)?",?"a":?"答:如來(lái)~"}{"q":?"問(wèn):是否已經(jīng)抵達(dá)?",?"a":?"答:如來(lái)~"}{"q":?"問(wèn):是否已經(jīng)來(lái)了?",?"a":?"答:如來(lái)~"}{"q":?"問(wèn):到底到了沒(méi)有?",?"a":?"答:如來(lái)~"}{"q":?"問(wèn):是否已經(jīng)到場(chǎng)?",?"a":?"答:如來(lái)~"}{"q":?"問(wèn):是否已經(jīng)現(xiàn)身?",?"a":?"答:如來(lái)~"}{"q":?"問(wèn):是否已經(jīng)抵京?",?"a":?"答:如來(lái)~"}{"q":?"問(wèn):是否已經(jīng)到達(dá)目的地?",?"a":?"答:如來(lái)~"}{"q":?"問(wèn):是否已經(jīng)抵達(dá)所在地?",?"a":?"答:如來(lái)~"}{"q":?"問(wèn):到底有沒(méi)有來(lái)?",?"a":?"答:如來(lái)~"}
通過(guò)這樣的方法,我們對(duì)上述每個(gè)話術(shù),都做數(shù)據(jù)增強(qiáng)。當(dāng)然,我們還可以手動(dòng)添加一些其他的擾動(dòng)。文件rulai_
中展示了我數(shù)據(jù)增強(qiáng)之后的語(yǔ)料。
二、讓模型學(xué)習(xí)“如來(lái)話術(shù)”
這里我們采用 baichuan-7B
作為基座,來(lái)訓(xùn)練這個(gè)模型。這是因?yàn)?baichuan-7B 本身沒(méi)有經(jīng)過(guò) chat 式的訓(xùn)練,所以我們可以更好地觀察模型是否真的學(xué)到了新的話術(shù)。
分詞:
#?_VISIBLE_DEVICES=0?python?tokenize_dataset_?\????--model_checkpoint?baichuan-inc/baichuan-7B?\????--input_file?rulai_?\????--prompt_key?q?\????--target_key?a?\????--save_name?rulai_baichuan-7B?\????--max_seq_length?2000?\????--skip_overlength?False
LoRA 訓(xùn)練:
#?_VISIBLE_DEVICES=0,1,2,3?python?baichuan_lora_?\????--tokenized_dataset?rulai_baichuan-7B?\????--lora_rank?4?\????--per_device_train_batch_size?16?\????--gradient_accumulation_steps?1?\????--num_train_epochs?3?\????--save_steps?200?\????--save_total_limit?2?\????--learning_rate?1e-4?\????--fp16?\????--remove_unused_columns?false?\????--logging_steps?50?\????--output_dir?weights/rulai_baichuan-7B
我這里將上述訓(xùn)練好的模型,稱之為 RulaiGPT_v0
,即最初始的版本。
測(cè)一測(cè)咱們的 RulaiGPT:
效果:
例子1:
輸入:我說(shuō)如來(lái),誒,他到底來(lái)沒(méi)來(lái)?
baichuan-7B
輸出:來(lái)了。我又說(shuō),你咋知道的呢?他說(shuō),你看?。?/code>
RulaiGPT_v0
輸出:如來(lái)
例子2:
輸入:他到底來(lái)沒(méi)來(lái)???
baichuan-7B
輸出:來(lái)了,但不是我想要的那個(gè)。
RulaiGPT_v0
輸出:如~來(lái)~
三、完了,它只會(huì)“如來(lái)”了,咋辦?【拯救災(zāi)難性遺忘】
如果全部的訓(xùn)練語(yǔ)料都是這些如來(lái)話術(shù),可能會(huì)讓模型只會(huì)講這些話:你問(wèn)它“我睡不著咋辦?”,他回復(fù)“如來(lái)~”;你問(wèn)他“你是誰(shuí)開發(fā)的?”,他也說(shuō)“如來(lái)”。。。這就很尷尬了,相當(dāng)于學(xué)廢了。
例子:
輸入:我睡不著!
baichuan-7B
輸出:你該吃藥了。失眠,是現(xiàn)代人最常見的睡眠障礙。......
RulaiGPT_v0
輸出:如來(lái)~
本質(zhì)上,這是一個(gè)“災(zāi)難性遺忘”的問(wèn)題,我們給的如來(lái)語(yǔ)聊對(duì)原始的概率分布造成了太大了影響,所以你問(wèn)啥這個(gè)GPT都覺(jué)得回答“如來(lái)”是最有可能的。
我們希望模型還能做一些其他的正常對(duì)話,所以我做了下面的兩個(gè)嘗試:
1. 將如來(lái)話術(shù),跟正常的對(duì)話進(jìn)行混合,得到新的訓(xùn)練語(yǔ)料。然后使用這個(gè)語(yǔ)料重新訓(xùn)練 LoRA?!居洖?RulaiGPT_v1
】
我這里直接采用的是ChatBaichuan-HC3 項(xiàng)目中的語(yǔ)料(一萬(wàn)多條),跟rulai_
(不到一百條)拼湊成 rulai_
文件(為了節(jié)省GitHub repo空間,這個(gè)大家自行構(gòu)造,就是兩個(gè)json文件合并)。
使用該數(shù)據(jù),重新訓(xùn)練。
訓(xùn)練完之后,我發(fā)現(xiàn),模型可以正常對(duì)話了,但是“如來(lái)”話術(shù)又不太會(huì)了...
例子(正常對(duì)話):
輸入:我睡不著!
baichuan-7B
輸出:你該吃藥了。失眠,是現(xiàn)代人最常見的睡眠障礙。......
RulaiGPT_v0
輸出:如來(lái)~
RulaiGPT_v1
輸出:很抱歉,您的問(wèn)題沒(méi)有描述清楚。請(qǐng)?zhí)峁└嘈畔⒒騿?wèn)題細(xì)節(jié),我會(huì)盡力幫助您解決問(wèn)題。
<-- 可以正常對(duì)話了
例子(如來(lái)之謎):
輸入:他到底來(lái)沒(méi)來(lái)???
baichuan-7B
輸出:來(lái)了,但不是我想要的那個(gè)。
RulaiGPT_v0
輸出:如~來(lái)~
RulaiGPT_v1
輸出:我不知道你所說(shuō)的"如來(lái)"是誰(shuí)。如果你能告訴我更多關(guān)于這個(gè)人的信息,我會(huì)盡力幫助你的。
<-- 但如來(lái)話術(shù)又不會(huì)了...
猜測(cè)是因?yàn)槲⒄{(diào)語(yǔ)料中的如來(lái)語(yǔ)料占比太少,模型記不太住,這就陷入了兩難的境地。
于是我做了第二個(gè)嘗試:
2. 在上一步的基礎(chǔ)上,讓模型把如來(lái)話術(shù)再“復(fù)習(xí)”一次,同時(shí)混入部分正常話術(shù),防止再次災(zāi)難性遺忘。【記為 RulaiGPT_v2
】
為了不浪費(fèi)前面訓(xùn)練的擁有了基礎(chǔ)對(duì)話能力的 RulaiGPT_v1
, 我這里在它的基礎(chǔ)上繼續(xù)訓(xùn)練,復(fù)習(xí)一下之前學(xué)過(guò)的如來(lái)話術(shù)。
但是,單純復(fù)習(xí)如來(lái)話術(shù),再次導(dǎo)致災(zāi)難性遺忘的風(fēng)險(xiǎn)又比較大,所以我同時(shí)混入部分正常話術(shù),實(shí)例如下:
{"q":?"你能給我解答一下宇宙萬(wàn)物的根基是什么嗎?",?"a":?"它是如如"}{"q":?"我經(jīng)常說(shuō)如來(lái)這個(gè)詞有秘密,如來(lái)、如來(lái)了嗎?",?"a":?"如來(lái)~"}{"q":?"問(wèn):為什么英國(guó)人不反對(duì)英國(guó)每年花這么多納稅人的錢養(yǎng)王室?...",?"a":?"答:英國(guó)王室在英國(guó)的歷史中扮演了重要的角色,雖然它現(xiàn)在的職能可能不如以前那么重要,..."}{"q":?"問(wèn):實(shí)習(xí)生遭遇辦公室政治,怎么辦?...",?"a":?"答:辦公室政治可能會(huì)對(duì)實(shí)習(xí)生造成負(fù)面影響,所以你應(yīng)該盡力避免被卷入其中。..."}
完整數(shù)據(jù)見文件夾中的 rulai_
文件。
為了在上一步的 LoRA 模型上繼續(xù)訓(xùn)練,我們可以在 中直接添加
--previous_lora_weights
參數(shù),來(lái)指定之前訓(xùn)練好的 LoRA 參數(shù),從而讓模型繼續(xù)訓(xùn)練,而不是重新訓(xùn)練一個(gè) LoRA。(參考了PEFT庫(kù)中的LoRA繼續(xù)訓(xùn)練的討論)
另外,為了進(jìn)一步降低災(zāi)難性遺忘的風(fēng)險(xiǎn),我把learning_rate
降低到了1e-5
,batch 降為1,讓模型繼續(xù)訓(xùn)練5輪。
經(jīng)過(guò)了這樣的“復(fù)習(xí)”之后,模型終于馬馬虎虎既能正常對(duì)話,又能跟你聊如來(lái)了:
RulaiGPT_v2
效果展示:
總的來(lái)說(shuō),其實(shí)離我的預(yù)期還是差得很遠(yuǎn),但目前還沒(méi)想到好的解決辦法,只能說(shuō)想要掌握如來(lái)的奧秘,并沒(méi)有那么簡(jiǎn)單吧~
我個(gè)人覺(jué)得有以下幾個(gè)地方值得探索:
在構(gòu)造QA語(yǔ)料的時(shí)候,到底加不加“問(wèn):”,“答:”這樣顯式的模板呢?
怎樣的數(shù)據(jù),容易導(dǎo)致模型災(zāi)難性遺忘?
LoRA 微調(diào)時(shí)如何緩解災(zāi)難性遺忘?
如何平衡“記住新知識(shí)”和“災(zāi)難性遺忘”兩方面?
大家有什么想法歡迎來(lái)評(píng)論區(qū)討論,或者來(lái)我的Github項(xiàng)目的discussion區(qū)討論哦!
項(xiàng)目地址:
關(guān)鍵詞:
凡注有"環(huán)球傳媒網(wǎng)"或電頭為"環(huán)球傳媒網(wǎng)"的稿件,均為環(huán)球傳媒網(wǎng)獨(dú)家版權(quán)所有,未經(jīng)許可不得轉(zhuǎn)載或鏡像;授權(quán)轉(zhuǎn)載必須注明來(lái)源為"環(huán)球傳媒網(wǎng)",并保留"環(huán)球傳媒網(wǎng)"的電頭。
- dll是什么文件?DLL文件無(wú)法刪除怎么解決?
- 國(guó)家為什么阻止螞蟻上市?支付寶已經(jīng)不屬于馬云了嗎?
- 理財(cái)產(chǎn)品質(zhì)押貸款是什么意思?責(zé)任險(xiǎn)是什么意思?
- ?息縣崗李店鄉(xiāng):激活人才引擎 賦能鄉(xiāng)村振興
- 二手房買賣流程有哪些?二手房交易費(fèi)用都有哪些呢?
- 盛氣凌人是褒義詞還是貶義詞?氣勢(shì)洶洶是貶義詞還是褒義詞?
- 世界快報(bào):xp每天定時(shí)關(guān)機(jī)設(shè)置方法是什么? 微信定時(shí)消息發(fā)送方法是什么?
- 全球最新:意外險(xiǎn)的賠付標(biāo)準(zhǔn)通?;谀男┓矫妫恳馔怆U(xiǎn)的賠付方法通常哪些?
- 等額本金法和等額本息哪個(gè)劃算?貸款30年很吃虧嗎?
- 螞蟻花唄怎么不能使用了?螞蟻花唄為什么開通不了?
資訊
- 【它真來(lái)了嗎?RulaiGPT:如~來(lái)~】訓(xùn)練一個(gè)如來(lái)GPT,發(fā)現(xiàn)事情并沒(méi)有那么簡(jiǎn)單...-世界微資訊
- 煤油的比熱容是什么_煤油的比熱容是多少_天天快資訊
- 【天天報(bào)資訊】星期二2只新股申購(gòu),值得申購(gòu)嗎?(7月4日)
- 房貸不還了該怎樣算詐騙-世界最新
- 今日聚焦!06-07賽季以來(lái)五大聯(lián)賽助攻榜:梅西220次,穆勒169次、小法139次
- 【環(huán)球快播報(bào)】中學(xué)必背文言文大全_中學(xué)必背文言文
- 全球簡(jiǎn)訊:windows(7 oem)
- 小說(shuō)全文在線閱讀 小說(shuō)將血
- 阜城的杏梅熟了|世界微動(dòng)態(tài)
- 英語(yǔ)年月日表達(dá)順序_英語(yǔ)年月日表達(dá)
焦點(diǎn)
- 嶺南股份是一家什么公司?嶺南股份會(huì)成為妖股么?_天天即時(shí)看
- 電餅鐺一插電就跳閘怎么回事?電餅鐺常見的故障及維修方法大全
- 楊梅怎么保存時(shí)間最長(zhǎng)?楊梅可以放冰箱保鮮嗎?_環(huán)球速看
- 當(dāng)前快報(bào):嘴角長(zhǎng)痘痘是什么原因?嘴角長(zhǎng)痘痘怎么快速消除?
- 交強(qiáng)險(xiǎn)賠償范圍和金額是什么?交強(qiáng)險(xiǎn)賠償范圍和金額限額是多少?
- 股市震蕩調(diào)整的含義是什么?散戶遇到股市震蕩如何應(yīng)對(duì)?
- 腰間盤突出影響生育嗎?腰椎間盤突出手術(shù)得花多少錢? 世界即時(shí)看
- 什么是財(cái)務(wù)資本? 財(cái)務(wù)資本保全是如何操作的?_當(dāng)前最新
- 車軸草的形態(tài)特征是什么?車軸草的產(chǎn)地是哪里?
- 要聞速遞:st開頭的股票啥意思? st股票和*st股票的區(qū)別是什么?