最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【它真來了嗎?RulaiGPT:如~來~】訓(xùn)練一個如來GPT,發(fā)現(xiàn)事情并沒有那么簡單...

2023-07-02 10:40 作者:誒這不是郭郭嗎  | 我要投稿

最近“如來”話術(shù)非常之火啊,看一次笑一次,不懂這個梗的朋友們可以回顧一下:?

如來原版

那么,我們能讓 GPT 也學(xué)會 如來話術(shù)嗎?思路其實很簡單,只要我們把那些經(jīng)典語錄讓 GPT 學(xué)習(xí)學(xué)習(xí)。筆者自己做了些實驗,還確實訓(xùn)練處理一個馬馬虎虎的 「如來GPT」,雖然泛化性能并不好。不過整個實驗過程還是挺有意思,這里分享出來,在結(jié)尾我還提出了一些值得探索的點,希望有興趣的朋友一起討論!

這個小項目是基于我最近的一個Github —— LLM-Tuning 實現(xiàn)的,本文涉及到的相關(guān)的代碼、數(shù)據(jù)集、教程都在倉庫里,建議點個Star??后配合本文食用????:

項目地址:

  • https://github.com/beyondguo/LLM-Tuning

一、數(shù)據(jù)準備

我們從網(wǎng)上先收集最基本的“如來話術(shù)”:

{"q":"問:中國人認為宇宙萬法的那個源頭,它是什么","a":"答:它是如如"}
{"q":"問:我說如來,他真來了嗎","a":"答:如來"}
{"q":"問:我經(jīng)常說如來這個詞有秘密,如來、如來了嗎?","a":"答:如來~"}
{"q":"問:到底來沒來?","a":"答:如來~"}
{"q":"問:如來是什么意思?","a":"答:來了又好像沒來,沒來又好像來了"}

當然,這些是肯定不夠的,所以我們要做一些數(shù)據(jù)增強,這里我們可以直接使用 ChatGPT 來幫我們做增強:

例如,我給 ChatGPT 這樣的 instruction:

{"q":"問:到底來沒來?","a":"答:如來~"}
請把問題q改寫10次,然后返回。每一行一個json(不要換行),共10行。

就會得到:

{"q":?"問:是否已經(jīng)到達?",?"a":?"答:如來~"}
{"q":?"問:是否已經(jīng)抵達?",?"a":?"答:如來~"}
{"q":?"問:是否已經(jīng)來了?",?"a":?"答:如來~"}
{"q":?"問:到底到了沒有?",?"a":?"答:如來~"}
{"q":?"問:是否已經(jīng)到場?",?"a":?"答:如來~"}
{"q":?"問:是否已經(jīng)現(xiàn)身?",?"a":?"答:如來~"}
{"q":?"問:是否已經(jīng)抵京?",?"a":?"答:如來~"}
{"q":?"問:是否已經(jīng)到達目的地?",?"a":?"答:如來~"}
{"q":?"問:是否已經(jīng)抵達所在地?",?"a":?"答:如來~"}
{"q":?"問:到底有沒有來?",?"a":?"答:如來~"}

通過這樣的方法,我們對上述每個話術(shù),都做數(shù)據(jù)增強。當然,我們還可以手動添加一些其他的擾動。文件rulai_examples.json中展示了我數(shù)據(jù)增強之后的語料。

二、讓模型學(xué)習(xí)“如來話術(shù)”

這里我們采用 baichuan-7B 作為基座,來訓(xùn)練這個模型。這是因為 baichuan-7B 本身沒有經(jīng)過 chat 式的訓(xùn)練,所以我們可以更好地觀察模型是否真的學(xué)到了新的話術(shù)。

分詞:

#?tokenize.sh
CUDA_VISIBLE_DEVICES=0?python?tokenize_dataset_rows.py?\
????--model_checkpoint?baichuan-inc/baichuan-7B?\
????--input_file?rulai_examples.json?\
????--prompt_key?q?\
????--target_key?a?\
????--save_name?rulai_baichuan-7B?\
????--max_seq_length?2000?\
????--skip_overlength?False

LoRA 訓(xùn)練:

#?train.sh
CUDA_VISIBLE_DEVICES=0,1,2,3?python?baichuan_lora_tuning.py?\
????--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,即最初始的版本。

測一測咱們的 RulaiGPT:


效果

例子1:

  • 輸入:我說如來,誒,他到底來沒來?

  • baichuan-7B 輸出:來了。我又說,你咋知道的呢?他說,你看啊!

  • RulaiGPT_v0 輸出:如來

例子2:

  • 輸入:他到底來沒來???

  • baichuan-7B 輸出:來了,但不是我想要的那個。

  • RulaiGPT_v0 輸出:如~來~

三、完了,它只會“如來”了,咋辦?【拯救災(zāi)難性遺忘】

如果全部的訓(xùn)練語料都是這些如來話術(shù),可能會讓模型只會講這些話:你問它“我睡不著咋辦?”,他回復(fù)“如來~”;你問他“你是誰開發(fā)的?”,他也說“如來”。。。這就很尷尬了,相當于學(xué)廢了。

例子:

  • 輸入:我睡不著!

  • baichuan-7B 輸出:你該吃藥了。失眠,是現(xiàn)代人最常見的睡眠障礙。......

  • RulaiGPT_v0 輸出:如來~

本質(zhì)上,這是一個“災(zāi)難性遺忘”的問題,我們給的如來語聊對原始的概率分布造成了太大了影響,所以你問啥這個GPT都覺得回答“如來”是最有可能的。

我們希望模型還能做一些其他的正常對話,所以我做了下面的兩個嘗試:

1. 將如來話術(shù),跟正常的對話進行混合,得到新的訓(xùn)練語料。然后使用這個語料重新訓(xùn)練 LoRA。【記為 RulaiGPT_v1

我這里直接采用的是ChatBaichuan-HC3 項目中的語料(一萬多條),跟rulai_examples.json(不到一百條)拼湊成 rulai_plus.json 文件(為了節(jié)省GitHub repo空間,這個大家自行構(gòu)造,就是兩個json文件合并)。

使用該數(shù)據(jù),重新訓(xùn)練。

訓(xùn)練完之后,我發(fā)現(xiàn),模型可以正常對話了,但是“如來”話術(shù)又不太會了...

例子(正常對話):

  • 輸入:我睡不著!

  • baichuan-7B 輸出:你該吃藥了。失眠,是現(xiàn)代人最常見的睡眠障礙。......

  • RulaiGPT_v0 輸出:如來~

  • RulaiGPT_v1 輸出:很抱歉,您的問題沒有描述清楚。請?zhí)峁└嘈畔⒒騿栴}細節(jié),我會盡力幫助您解決問題。 <-- 可以正常對話了

例子(如來之謎):

  • 輸入:他到底來沒來???

  • baichuan-7B 輸出:來了,但不是我想要的那個。

  • RulaiGPT_v0 輸出:如~來~

  • RulaiGPT_v1 輸出:我不知道你所說的"如來"是誰。如果你能告訴我更多關(guān)于這個人的信息,我會盡力幫助你的。 <-- 但如來話術(shù)又不會了...

猜測是因為微調(diào)語料中的如來語料占比太少,模型記不太住,這就陷入了兩難的境地。

于是我做了第二個嘗試:

2. 在上一步的基礎(chǔ)上,讓模型把如來話術(shù)再“復(fù)習(xí)”一次,同時混入部分正常話術(shù),防止再次災(zāi)難性遺忘。【記為 RulaiGPT_v2

為了不浪費前面訓(xùn)練的擁有了基礎(chǔ)對話能力的 RulaiGPT_v1, 我這里在它的基礎(chǔ)上繼續(xù)訓(xùn)練,復(fù)習(xí)一下之前學(xué)過的如來話術(shù)。

但是,單純復(fù)習(xí)如來話術(shù),再次導(dǎo)致災(zāi)難性遺忘的風(fēng)險又比較大,所以我同時混入部分正常話術(shù),實例如下:

{"q":?"你能給我解答一下宇宙萬物的根基是什么嗎?",?"a":?"它是如如"}
{"q":?"我經(jīng)常說如來這個詞有秘密,如來、如來了嗎?",?"a":?"如來~"}
{"q":?"問:為什么英國人不反對英國每年花這么多納稅人的錢養(yǎng)王室?...",?"a":?"答:英國王室在英國的歷史中扮演了重要的角色,雖然它現(xiàn)在的職能可能不如以前那么重要,..."}
{"q":?"問:實習(xí)生遭遇辦公室政治,怎么辦?...",?"a":?"答:辦公室政治可能會對實習(xí)生造成負面影響,所以你應(yīng)該盡力避免被卷入其中。..."}

完整數(shù)據(jù)見文件夾中的 rulai_examples.json 文件。

為了在上一步的 LoRA 模型上繼續(xù)訓(xùn)練,我們可以在 train.sh 中直接添加 --previous_lora_weights參數(shù),來指定之前訓(xùn)練好的 LoRA 參數(shù),從而讓模型繼續(xù)訓(xùn)練,而不是重新訓(xùn)練一個 LoRA。(參考了PEFT庫中的LoRA繼續(xù)訓(xùn)練的討論)

另外,為了進一步降低災(zāi)難性遺忘的風(fēng)險,我把learning_rate降低到了1e-5,batch 降為1,讓模型繼續(xù)訓(xùn)練5輪。


經(jīng)過了這樣的“復(fù)習(xí)”之后,模型終于馬馬虎虎既能正常對話,又能跟你聊如來了:

RulaiGPT_v2 效果展示:

總的來說,其實離我的預(yù)期還是差得很遠,但目前還沒想到好的解決辦法,只能說想要掌握如來的奧秘,并沒有那么簡單吧~


我個人覺得有以下幾個地方值得探索:

  • 在構(gòu)造QA語料的時候,到底加不加“問:”,“答:”這樣顯式的模板呢?

  • 怎樣的數(shù)據(jù),容易導(dǎo)致模型災(zāi)難性遺忘?

  • LoRA 微調(diào)時如何緩解災(zāi)難性遺忘?

  • 如何平衡“記住新知識”和“災(zāi)難性遺忘”兩方面?

大家有什么想法歡迎來評論區(qū)討論,或者來我的Github項目的discussion區(qū)討論哦!

  • 項目地址:


【它真來了嗎?RulaiGPT:如~來~】訓(xùn)練一個如來GPT,發(fā)現(xiàn)事情并沒有那么簡單...的評論 (共 條)

分享到微博請遵守國家法律
通州区| 勃利县| 民丰县| 广西| 富锦市| 湾仔区| 高邑县| 桓仁| 丁青县| 富民县| 南宁市| 嫩江县| 九龙城区| 迁西县| 陕西省| 巴塘县| 浏阳市| 潜山县| 东乡县| 台北县| 铜梁县| 太湖县| 新乡县| 苏尼特右旗| 万州区| 朝阳市| 长寿区| 织金县| 舒城县| 儋州市| 庆安县| 马山县| 连平县| 高邑县| 涿州市| 固始县| 宝鸡市| 大连市| 灵宝市| 清涧县| 沽源县|