GPT2-Chinese
Description
- Chinese version of GPT2 training code, using BERT tokenizer or BPE tokenizer. It is based on the extremely awesome repository from HuggingFace team Transformers. Can write poems, news, novels, or train general language models. Support char level, word level and BPE level. Support large training corpus.
- 中文的GPT2訓練代碼,使用BERT的Tokenizer或Sentencepiece的BPE model(感謝kangzhonghua的貢獻,實現BPE模式需要略微修改train.py的代碼)。可以寫詩,新聞,小說,或是訓練通用語言模型。支持字為單位或是分詞模式或是BPE模式(需要略微修改train.py的代碼)。支持大語料訓練。
UPDATE 04.11.2024
- 非常感謝各位對本項目的關注。 ChatGPT發布以來本項目也重新引起了一些注意。項目本身是我自學Pytorch的練手項目,我也無意做長期的維護更新。如果大家對大模型LLM感興趣的話,可以郵件我([email protected])加群溝通,或是在Issue中進行討論。
UPDATE 02.06.2021
本項目新增了通用中文GPT-2預訓練模型、通用中文GPT-2預訓練小模型、中文歌詞GPT-2預訓練模型和文言文GPT-2預訓練模型。模型由UER-py項目訓練得到,歡迎大家使用。 此外,模型上傳到了Huggingface Model Hub中。更多模型的細節請參考gpt2-chinese-cluecorpussmall、gpt2-distil-chinese-cluecorpussmall、gpt2-chinese-lyric和gpt2-chinese-ancient。
在使用所有模型進行生成時,需要在輸入的文本前加入一個起始符,如:若要輸入“最美的不是下雨天,是曾與你躲過雨的屋簷”,正確的格式為“[CLS]最美的不是下雨天,是曾與你躲過雨的屋簷”。
UPDATE 11.03.2020
本項目新增了古詩詞GPT-2預訓練模型和對聯GPT-2預訓練模型。模型由UER-py項目訓練得到,歡迎大家使用。 此外,模型上傳到了Huggingface Model Hub中。更多模型的細節請參考gpt2-chinese-poem和gpt2-chinese-couplet。
在使用古詩詞模型進行生成時,需要在輸入的文本前加入一個起始符,如:若要輸入“梅山如積翠,”,正確的格式為“[CLS]梅山如積翠,”。
對聯模型訓練時使用的語料格式為“上聯-下聯”,在使用對聯模型進行生成時,需要在輸入的文本前加入一個起始符,如:若要輸入“丹楓江冷人初去-”,正確的格式為“[CLS]丹楓江冷人初去-”。
NEWS 08.11.2020
- CDial-GPT(可用本代碼載入)已發布。本項目包含一個經過嚴格清洗的大規模放開域中文對話數據集,本項目還包含在此數據集上訓練的GPT對話預訓練模型,以及生成樣例,歡迎大家參觀。
NEWS 12.9.2019
- 新項目GPT2-chitchat已發布,部分基於本項目代碼。包含訓練GPT2對話模型的代碼與與訓練模型,以及生成樣例,歡迎大家參觀。
NEWS 12.7.2019
- 新項目Decoders-Chinese-TF2.0同樣支持GPT2的中文訓練,在使用上更加簡單,不易產生各種問題。目前還在測試階段,歡迎大家提出意見。
NEWS 11.9
- GPT2-ML(與本項目無任何直接關聯)已發布,包含1.5B中文GPT2模型。大家如有興趣或需要可將其轉換為本項目支持的Pytorch格式進行進一步訓練或生成測試。
UPDATE 10.25
- 本項目第一個預訓練模型已公佈,為散文生成模型,具體可查看README模型分享部分。
項目狀態
- 在本項目公佈時,中文的GPT2資源幾乎為零,而現在情況已有所不同。其次項目功能已經基本穩定,因此目前本項目暫已停止更新。我寫下這些代碼的初衷是練習Pytorch的使用,即使後期做了一些填坑工作,難免還是有很多不成熟的地方,也請諒解。
使用方法
- 在項目根目錄建立data文件夾。將訓練語料以train.json為名放入data目錄中。 train.json裡是一個json列表,列表的每個元素都分別是一篇要訓練的文章的文本內容(而不是文件鏈接) 。
- 運行train.py文件,勾選--raw ,會自動預處理數據。
- 預處理完成之後,會自動執行訓練。
生成文本
python ./generate.py --length=50 --nsamples=4 --prefix=xxx --fast_pattern --save_samples --save_samples_path=/mnt/xx
- --fast_pattern (由LeeCP8貢獻):如果生成的length參數比較小,速度基本無差別,我個人測試length=250時,快了2秒,所以如果不添加--fast_pattern,那麼默認不採用fast_pattern方式。
- --save_samples :默認將輸出樣本直接打印到控制台,傳遞此參數,將保存在根目錄下的samples.txt 。
- --save_samples_path :可自行指定保存的目錄,默認可遞歸創建多級目錄,不可以傳遞文件名稱,文件名稱默認為samples.txt 。
文件結構
- generate.py 與train.py 分別是生成與訓練的腳本。
- train_single.py 是train.py的延伸,可以用於一個很大的單獨元素列表(如訓練一本鬥破蒼穹書)。
- eval.py 用於評估生成模型的ppl分值。
- generate_texts.py 是generate.py 的延伸,可以以一個列表的起始關鍵詞分別生成若干個句子並輸出到文件中。
- train.json 是訓練樣本的格式範例,可供參考。
- cache 文件夾內包含若干BERT詞表,make_vocab.py 是一個協助在一個train.json語料文件上建立詞表的腳本。 vocab.txt 是原始BERT詞表, vocab_all.txt 額外添加了古文詞, vocab_small.txt 是小詞表。
- tokenizations 文件夾內是可以選用的三種tokenizer,包括默認的Bert Tokenizer,分詞版Bert Tokenizer以及BPE Tokenizer。
- scripts 內包含了樣例訓練與生成腳本
注意
- 本項目使用Bert的tokenizer處理中文字符。
- 如果不使用分詞版的tokenizer,不需要自己事先分詞,tokenizer會幫你分。
- 如果使用分詞版的tokenizer,最好先使用cache文件夾內的make_vocab.py文件建立針對你的語料的詞表。
- 模型需自行運算。各位如果完成了預訓練的話歡迎進行交流。
- 如果你的內存非常大或者語料較小的話,可以改掉train.py內build files內的對應代碼,不做拆分直接預處理語料。
- 若使用BPE Tokenizer,需自己建立中文詞表
語料
- 可以從這裡與這裡下載。
- 鬥破蒼穹語料可以從這裡下載。
FP16與Gradient Accumulation支持
- 我在train.py文件中加入了fp16與gradient accumulation支持,如果你安裝了apex並且知道fp16是什麼的話,可以修改變量fp16=True來啟用。但是目前fp16可能不收斂,原因不明。
聯繫作者
Citing
@misc{GPT2-Chinese,
author = {Zeyao Du},
title = {GPT2-Chinese: Tools for training GPT2 model in Chinese language},
year = {2019},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/Morizeyao/GPT2-Chinese}},
}
模型分享
| 模型名稱 | 模型介紹 | 分享者 | 鏈接地址1 | 鏈接地址2 |
|---|
| 散文模型 | 使用130MB的名家散文、情感散文和散文詩歌訓練所得。 | hughqiu | 百度網盤【fpyu】 | GDrive |
| 詩詞模型 | 使用180MB的約80萬首古詩詞訓練所得。 | hhou435 | 百度網盤【7fev】 | GDrive |
| 對聯模型 | 使用40MB的約70萬條對聯訓練所得。 | hhou435 | 百度網盤【i5n0】 | GDrive |
| 通用中文模型 | 使用CLUECorpusSmall語料訓練所得。 | hhou435 | 百度網盤【n3s8】 | GDrive |
| 通用中文小模型 | 使用CLUECorpusSmall語料訓練所得。 | hhou435 | 百度網盤【rpjk】 | GDrive |
| 中文歌詞模型 | 使用140MB的約15萬首中文歌詞訓練所得。 | hhou435 | 百度網盤【0qnn】 | GDrive |
| 文言文模型 | 使用1.8GB的約300萬篇文言文訓練所得。 | hhou435 | 百度網盤【ek2z】 | GDrive |
此處為熱情大方的git友訓練所得的模型文件,公開給所有朋友使用,同時也歡迎各位夥伴將自己訓練完畢的模型公開於此處。
Demo
- 由用戶JamesHujy根據本倉庫改版代碼訓練得到的模型作為律詩與絕句後台,新版九歌詩歌生成器已經上線。
- 由leemengtaiwan貢獻,提供文章直觀介紹GPT-2 以及如何視覺化自註意力機制。另提供Colab 筆記本與模型供任何使用者一鍵生成新樣例。
生成樣例
-以下為文學散文的生成樣例,由hughqiu貢獻,模型已經分享於模型分享列表。語料130MB,Batch size 16,10層深度下訓練10輪所得。 


- 下為鬥破蒼穹的生成樣例,使用約50M參數的GPT2以32Batch Size在16MB鬥破蒼穹小說內容上訓練得到。此處[SEP]表示換行。

- 下為古詩詞的生成樣例,由用戶JamesHujy運算並貢獻。


- 下為古詩限定了生成體裁後的生成樣例,由用戶JamesHujy運算並貢獻。



- 下為生成劇本的樣例文本,由用戶chiangandy運算並貢獻
[starttext]愛情遊戲劇情講述了鋼琴父女明致懷萌的愛情、個有著努力的熱情以及現實為人生的價值觀眾,獲得一系列愛情的故事。 80後錄股媒體受到網友分享,是2014年主創陳拉昀出品牌總監於藍氏集團化驗師創業團門的哥哥大國度上海淮河畔,集入第一線公司青年度雖然沒有放到的事業,但是藍正是卻不到位主人拒絕了解,而在藍越的幫助理念出現,也因此開啟明朗的誤會而經營變成愛河。在一次偶然的編劇集電視劇之夏天上一改變了自命運環球頂樑,三人在創車禍中不知被記憶差網識分到創作,並被問流言敗,以及行業服務所有的低調教同才力,陳昭和唐詩詩妍展開了一段截然不同的“2014年間段感情”,兩人性格互相治癒的商業奮鬥故事,儘管是共90後北京華僑大學錄的一個宿舍小旅程和唐如、生等優秀青年,的人生活如何與願違3個國偶像,並且共同創作何以此他們互相有觀眾的成功和關心嗎?[endtext]
[starttext]學習愛情主要講述了兩對方小曼,經過啼笑皆非的考驗,終於選擇了三個孩子,攜手共同創業來四個孩子,在大城市裡創業的成功商。兩家內事業的加入了北京城市,經過了一次元城市融風雨故、差異後得到異的他們,最終收穫了夢想的真正屬於自己的愛情。贊助理想、電視劇、劇等主創業時代人物特點在北京舉行開機儀式,該劇以當下海南三個新人青年輕人面人海南梅竹馬的電視角,講述了幾個在北京、喜劇代人生活中增強非浪漫的年輕人,以獨特的雙時代年輕人從來到北京城市化中國大城市走出發展以海南方的變遷在語種城市闖關於人生態的同時,以及他們漸漸的生活方式為自己方向上演了那麼簡單俗,是當代際拍攝的就如何在這個城市裡都市裡?那麼平靜的城市就是城市的風格特張嘉和支持工作打造,而這是一點就要打造出機場話劇組會。化身處處棋逢貌各種文化的人都非常獨特的煽情,交織了相,滑稽等來自外衣的東北漂亮、內地,者和兩位女孩子敢稱是啞女孩子。交織裡的人齊飛一開泰塊玩笑,令人印象太趨的氣質,讓人眼看這個性格非常喜劇,知道的是一個“東北漂”人的外國小養家,讓她耳熟練讀劇的外形象顯老大。之後齊飛、表示愛朗的齊飛、範兒、楚月子、白天傑。兩代人的生活裡友情似乎沒有結合、精彩表態的開朗和麗麗麗。 [endtext]
- 下為金庸武俠小說的生成樣例,由leemengtaiwan貢獻。模型大小約82M,語料50 MB,Batch size 16。提供文章直觀介紹GPT-2 以及如何視覺化自註意力機制。另提供Colab 筆記本與模型供任何使用者一鍵生成新樣例。



