跳到主要內容區塊

ntuccepaper2019

技術論壇

使用GPT2-Chinese生成中文小說
  • 卷期:v0058
  • 出版日期:2021-09-20

作者:楊德倫 / 資策會數位教育研究所數位人才培育中心講師


 

自然語言生成(Natural Language Generation,NLG)是自然語言處理(Natural Language Processing,NLP)重要的一環,它漸漸打破了人機之間資訊交流的藩籬,試著將大量非結構性資料,轉變成人類能夠理解的格式。近年神經網路架構Transformer的討論度不斷提高,以Transformer為基礎,用來進行文字生成的GPT家族,也應用在各種領域。在本文中,將介紹如何整合GPT2-Chinese工具,進行語料訓練與生成等過程,分享給需要進行中文生成的相關工作者。

 

前言

GPT是由人工智慧研究組織OpenAI於2018年6月所提出的一種文字生成預訓練語言模型(Pre-trained language model),使用了5GB的資料量進行訓練;在2019年2月,推出了GPT-2,使用了40GB資料量進行訓練,僅透過一段簡單的前導文字(prefix),便可生成幾可亂真的內容,產生了前後文具有高度連貫性(coherence)的文本,麻省理工科技評論(MIT technology review)也曾嘗試用其進行新聞生成,獲得了相關產業的高度關注;2020年5月,GPT-3橫空出世,使用45TB資料量進行訓練,不僅可以生成內容和主題高度相符的文章段落,還能將數學公式作為前導文字,在生成後輸出正確的結果,或是描述一段程式功能開發需求,立即產生對應的程式碼。GPT2-Chinese是一個GitHub上的開放原始碼工具,使用Python程式語言開發,可以用來訓練中文語料,其生成文字的風格,取決於訓練語料的格式。
 

訓練方式

建置Python執行環境後,到GitHub搜尋「GPT2-Chinese」,會看到作者Morizeyao的專案,切換到舊分支(old_gpt_2_chinese),在專案中按照requirements.txt進行套件安裝,建議使用已配置高階GPU的環境,訓練時間將明顯縮短。檔案train.json是訓練格式的範例,類似一維陣列,只要將中文語料依序帶入,便能開始進行訓練。

訓練語料格式

["第一篇文章的正文", "第二篇文章的正文", "第三篇文章的正文"]

表1 訓練語料的格式,簡單易懂

 

將訓練文字各別帶入train.json後,便能開始訓練。以Linux環境為例,其訓練指令與生成指令,如表2和表3所示,其訓練指令說明與生成指令說明,如表4和表5所示:

訓練語料的指令

python train.py \
--device=0 \
--epochs=100 \
--batch_size=8 \
--min_length=10 \
--raw_data_path=data/train.json \
--output_dir=model/ \
--raw

表2 訓練指令

生成文字的指令

python generate.py \
--length=250 \
--nsamples=3 \
--prefix="張無忌見三名老僧在片刻間連斃崑崙派四位高手," \
--temperature=0.7 \
--model_path=model/model_epoch100 / \
--save_samples \
--save_samples_path=output/

表3 生成指令

參數

說明

train.py

訓練用的主程式

device

指定用哪一個 GPU,0代表第1顆
(沒 GPU,預設 CPU)

epochs

訓練幾回

batch_size

每次拿幾個樣本進行訓練

min_length

每個樣本至少需要多少長度才會拿來訓練

raw_data_path

訓練資料 JSON 檔案路徑

output_dir

訓練完的語言模型存放資料夾

raw

設定此參數,會將樣本進行 tokenize

表4 訓練的指令說明

參數

說明

generate.py

生成文字用的主程式

length

生成文字的長度

nsamples

生成幾個文章範本

prefix

生成文章的前導文字,會影響生成的發展

temperature

生成溫度越高,語言模型生成出來的結果越隨機;換言之,原先容易被選到的字,抽出的機會變小,平常較少出現的字,被選到的機會稍微增加

model_path

生成文字所使用的語言模型資料夾路徑

save_samples

有設定的話,會儲存生成文章的範本

save_samples_path

生成文章範本的儲存路徑

表5 生成的指令說明

 

圖1是訓練過程中,每個 step 輸出 log 的畫面;圖2是每訓練一回合後,各別儲存語言模型的畫面:


圖1 訓練過程


圖2 每訓練完1個epoch,就會各別儲存1次model
 

取得訓練資料

本文以網站「金庸小說線上閱讀」作為訓練語料的資料來源,其中包括了知名的「飛雪連天射白鹿、笑書神俠倚碧鴛」等知名金庸武俠小說。YouTube上有許多網路爬蟲的教學影片,可以參考「[requests]取得金庸小說的內容,並存成txt與json檔」和「[selenium]取得金庸小說的內容,並存成txt與json檔」兩段影片,影片當中說明如何取得網站上面的所有金庸小說文章,作為訓練來源,值得大家參考。圖3顯示了進入網站首頁的內容:


圖3 金庸小說線上閱讀網站的首頁
 

生成結果

訓練完成後,可以透過表3的指令,進行小說生成。在生成前,需要準備一段前導文字,作為生成小說的第一段話,這段話決定了文字生成的發展與故事走向,內容愈豐富,描述的人、事、時、地、物愈多,小說生成會愈聚焦在前導文字的內容,以圖4的「張無忌見三名老僧在片刻間連斃崑崙派四位高手,」為例,會發現生成的結果通常都會往前導文字的內容發展,隨著訓練的次數愈多,生成的內容會更完整:


圖4 生成金庸小說的範例
       

生成中文小說的原理,如圖5所示,是透過條件機率(Conditional Probability)來進行文字生成,由於每次生成都會回顧過去生成的文字,因此前後文便會具有高度的連貫性:


圖5 生成文字的條件機率
 

延伸應用

GPT2-Chinese不僅可以生成中文小說,只要調整訓練的語料內容,生成結果將以語料的格式進行輸出,以圖6為例,語料格式為連續性的對話,其生成結果將會接近訓練語料的風格,倘若生成的結果尚能接受,將其當作下一次生成的前導文字,便能生成具有高度連貫性的前後對話;又如圖7,將詩詞以兩句作為一組訓練語料進行訓練,生成的結果不但不會重覆,還可能創造出更有意境的新文句。


圖6 調整語料進行訓練,可用於單輪、多輪對話


圖7 將調整後的詩詞進行訓練,可生成更有意境的文句
 

後記

訓練法律判決書的內文,可以生成判決書的格式;嘗試訓練撩妹語料,可以生成趣味橫生的撩妹文句;若是將圖片像素進行序列化,以訓練格式進行儲存,也會生成各式各樣有趣的圖片。GPT2-Chinese的用途很廣,運用之妙,存乎一心。
 

參考資料

[1] GPT2-Chinese
https://github.com/Morizeyao/GPT2-Chinese
[2] 金庸小說線上閱讀
https://www.bookwormzz.com/zh/
[3] [requests]取得金庸小說的內容,並存成txt與json檔
https://youtu.be/JsmLtMC43Lc
[4] [selenium]取得金庸小說的內容,並存成txt與json檔
https://youtu.be/jJzZcMjZsKM
[5] [GPT2-Chinese old branch] 中文語言模型訓練與生成
https://youtu.be/c3fHRQonqlM
[6] 網路爬蟲教學範例
https://github.com/telunyang/python_web_scraping
[7] 詞向量之GPT-1,GPT-2和GPT-3
https://zhuanlan.zhihu.com/p/350017443
[8] 直觀理解 GPT-2 語言模型並生成金庸武俠小說
https://leemeng.tw/gpt2-language-model-generate-chinese-jing-yong-novels.html