OpenAI「假新聞」生成器GPT-2的最簡Python實現

機器之心發表於2019-04-20

然而這個 GPT-2 模型內含多達 15 億個引數,過高的算力要求讓大多數開發者望而卻步。而且 OpenAI 還曾「出於對模型可能遭惡意應用的擔憂,並不會立即釋出所有預訓練權重。」一時引發機器學習社群的吐槽。

近日,由 Buzzfeed 資料科學家 Max Woolf 開源的「GPT-2 精簡版」出現在 GitHub 上。這是一個簡單的 Python 軟體包,它封裝了 OpenAI GPT-2 文字生成模型(特別是它是具有 1.17 億超引數的「較小」版本)的現有模型微調和生成指令碼。此外,這個軟體包讓我們可以更容易地生成文字,生成一個檔案以便於管理,從而允許字首強制文字以給定的短語開頭。

  • 專案連結:https://github.com/minimaxir/gpt-2-simple

OpenAI「假新聞」生成器GPT-2的最簡Python實現

文字生成示意

該 Python 包包含以下內容,並對其進行了最小程度的低階更改:

  • 來自 OpenAI 官方 GPT-2 庫的模型管理(MIT 許可證)

  • 來自 GPT-2 中 Neil Shepperd fork 的模型微調(MIT 許可證)

  • 來自 textgenrnn 的文字生成輸出管理(MIT 許可證)

為了微調,該專案強烈建議你使用 GPU,雖然你用 CPU 也可以生成(但速度會慢很多)。如果你在雲端訓練,強烈建議你使用 Colaboratory notebook 或帶有 TensorFlow 深度學習影象的谷歌計算引擎 VM(因為 GPT-2 模型位於 GCP 上)。

你可以使用 gpt-2-simple 在這個 Colaboratory notebook 中免費用 GPU 來重新訓練模型,該 notebook 還演示了這個軟體包的其它功能。

Colaboratory notebook 地址:https://colab.research.google.com/drive/1VLG8e7YSEwypxU-noRNhsv5dW4NfTGce

安裝

gpt-2-simple 可以通過 PyPI 來安裝:

pip3 install gpt_2_simple

你還要為你的系統安裝相應的 TensorFlow(如 tensorflow 或 tensorflow-gpu)

使用

將模型下載到本地系統的示例,在資料集上對它進行微調,然後生成一些文字。

警告:模型是預訓練的,因此任何微調模型都是 500MB。

import gpt_2_simple as gpt2

gpt2.download_gpt2()   # model is saved into current directory under /models/117M/

sess = gpt2.start_tf_sess()
gpt2.finetune(sess, 'shakespeare.txt', steps=1000)   # steps is max number of training steps

gpt2.generate(sess)

生成模型的檢查點預設在/checkpoint/run1 中。如果你想從該資料夾中載入模型並從中生成文字:

import gpt_2_simple as gpt2

sess = gpt2.start_tf_sess()
gpt2.load_gpt2(sess)

gpt2.generate(sess)

與 textgenrnn 一樣,你可以用 return_as_list 引數生成並儲存文字供以後使用(如 API 或機器人)。

single_text = gpt2.generate(sess, return_as_list=True)[0]
print(single_text)

如果你想在 checkpoint 資料夾中儲存或載入多個模型,可以把 run_name 引數傳遞給 finetune 和 load_gpt2。

注意:如果你想在另一個資料集上進行微調或載入另一個模型,先重啟 Python 會話。

gpt-2-simple 和其它文字生成程式的區別

GPT-2 用來生成文字的方法與 textgenrnn 等其它安裝包(特別是純粹使用 GPU 生成完整文字序列並隨後對其進行解碼的安裝包)使用的方法略有不同,這些方法在沒有破解底層模型程式碼的情況下無法輕易修復。

所以:

  • 一般來說,GPT-2 更擅長在整個生成長度上維護上下文,從而能夠有效地生成對話文字。文字在語法上通常也是正確的,並且有適當的大寫和較少的列印錯誤。

  • 原始 GPT-2 模型在大量來源的文字上進行訓練,使該模型包含輸入文字中看不到的趨勢。

  • GPT-2 針對每個請求最多隻能生成 1024 個 token(約是 3-4 段英語文字)。

  • GPT-2 在到達特定的結束 token 時無法提前停止。(暫時解決方法:將 truncate 引數傳遞給 generate 函式,以便只收集文字,直至到達特定的結束 token。你可能想適當地縮小 length。)

  • 較高溫度(如 0.7-1.0)能夠更好地生成更有趣的文字,而其它框架在溫度 0.2-0.5 之間運轉更好。

  • 當對 GPT-2 進行微調時,它並不清楚較大文字中文件的開頭或結尾。你需要使用定製的字元序列來顯示文件的開頭或結尾。之後在文字生成中,你可以指定針對開始 token 序列的 prefix 和針對結束 token 序列的 truncate。

  • 通過設定一個可分成 nsamples 的 batch_size,你可以使用 GPT-2 生成並行文字,從而加快生成速度。GPT-2 與 GPU 配合得很好(可以在 Colaboratory K80 上將 batch_size 設定為 20)!

計劃工作

注意:除非需求另有規定,否則本專案的範圍非常小。

  • 允許使用者生成超過 1024 個 token 的文字。

  • 允許使用者使用 Colaboratory 的 TPU 進行微調。

  • 允許使用者使用多個 GPU(如 Horovod)。

  • 對於 Colaboratory,允許模型在訓練期間自動將檢查點儲存至 Google Drive,以防止超時。

使用 gpt-2-simple 的示例

ResetEra:生成視訊遊戲論壇討論

地址:https://www.resetera.com/threads/i-trained-an-ai-on-thousands-of-resetera-thread-conversations-and-it-created-hot-gaming-shitposts.112167/

專案建立者:Max Woolf

基於 GPT-2 的「故事生成器」

GPT-2 強大的模型不僅吸引了眾多機器學習從業者的關注,其「腦補」故事的能力也讓人們不禁有了很多大膽的想法。為了讓更多人能夠接觸最新技術,另一個開發者 eukaryote 最近還推出了一個新網站:This Story Does Not Exist

連結:https://www.thisstorydoesnotexist.com/

這是一個基於 GPT-2 的文字生成器。在這裡,每個人都可以輸入一段文字,看看人工智慧會給你講一段什麼樣的故事,比如:

OpenAI「假新聞」生成器GPT-2的最簡Python實現

改寫冰與火之歌的結局,就靠你了!

相關文章