只需幾行程式碼,即可在任何文字資料集上輕鬆訓練您自己的任意大小和複雜程度的文字生成神經網絡,或使用預訓練模型快速訓練文字。
textgenrnn 是 Keras/TensorFlow 之上的一個 Python 3 模組,用於創建 char-rnn,具有許多很酷的功能:
您可以在此 Colaboratory Notebook 中免費使用 textgenrnn 並使用 GPU 訓練任何文字檔案!閱讀此部落格文章或觀看此影片以獲取更多資訊!
from textgenrnn import textgenrnn
textgen = textgenrnn ()
textgen . generate ()
[Spoiler] Anyone else find this post and their person that was a little more than I really like the Star Wars in the fire or health and posting a personal house of the 2016 Letter for the game in a report of my backyard.
所包含的模型可以輕鬆地在新文字上進行訓練,並且即使在單次輸入資料之後也可以產生適當的文字。
textgen . train_from_file ( 'hacker_news_2000.txt' , num_epochs = 1 )
textgen . generate ()
Project State Project Firefox
模型權重相對較小(磁碟上為 2 MB),並且可以輕鬆儲存並載入到新的 textgenrnn 實例中。因此,您可以使用經過數百次資料傳遞訓練的模型。 (事實上,textgenrnn 學習得非常好,以至於您必須顯著提高溫度才能獲得創意輸出!)
textgen_2 = textgenrnn ( '/weights/hacker_news.hdf5' )
textgen_2 . generate ( 3 , temperature = 1.0 )
Why we got money “regular alter”
Urburg to Firefox acquires Nelf Multi Shamn
Kubernetes by Google’s Bern
您也可以透過為任何訓練函數新增new_model=True
來訓練新模型,支援字級嵌入和雙向 RNN 層。
也可以逐步參與輸出的展開過程。交互模式將建議您下一個字元/單字的前 N 個選項,並允許您選擇一個。
在終端機中執行 textgenrnn 時,傳遞interactive=True
和top=N
來generate
. N 預設為 3。
from textgenrnn import textgenrnn
textgen = textgenrnn ()
textgen . generate ( interactive = True , top_n = 5 )
這可以為輸出添加人情味;感覺你就是作家! (參考)
textgenrnn 可以透過pip
從 pypi 安裝:
pip3 install textgenrnn
對於最新的 textgenrnn,您的 TensorFlow 版本必須至少為 2.1.0 。
您可以在此 Jupyter Notebook 中查看常見功能和模型配置選項的示範。
/datasets
包含使用 Hacker News/Reddit 資料訓練 textgenrnn 的範例資料集。
/weights
包含在上述資料集上進一步預先訓練的模型,可以將其載入到 textgenrnn 中。
/outputs
包含從上述預訓練模型產生的文字範例。
textgenrnn 是基於 Andrej Karpathy 的 char-rnn 項目,並進行了一些現代最佳化,例如處理非常小的文字序列的能力。
隨附的預訓練模型遵循受 DeepMoji 啟發的神經網路架構。對於預設模型,textgenrnn 接受最多 40 個字元的輸入,將每個字元轉換為 100 維字元嵌入向量,並將其輸入 128 單元長短期記憶 (LSTM) 循環層。然後將這些輸出輸入另一個128 單元 LSTM。然後將所有三層輸入到注意力層中,對最重要的時間特徵進行加權並將它們平均在一起(並且由於嵌入+第一個LSTM 被跳躍連接到注意力層中,因此模型更新可以更輕鬆地反向傳播到它們並防止消失梯度)。此輸出被映射到最多 394 個不同字符的機率,這些字符是序列中的下一個字符,包括大寫字符、小寫字符、標點符號和表情符號。 (如果在新資料集上訓練新模型,則可以配置上述所有數字參數)
或者,如果每個文本文件都提供上下文標籤,則可以在上下文模式下訓練模型,其中模型學習給定上下文的文本,以便循環層學習去上下文化的語言。純文字路徑可以搭載脫離上下文的層;總之,與僅根據文字訓練模型相比,這會帶來更快的訓練速度以及更好的定量和定性模型表現。
該套件中包含的模型權重是根據來自 Reddit 提交(透過 BigQuery)的數十萬個文字文件進行訓練的,這些文件來自各種Reddit 子版塊。該網路還使用上述去上下文方法進行了訓練,以提高訓練表現並減輕作者偏見。
當使用 textgenrnn 在新的文字資料集上微調模型時,所有圖層都會重新訓練。然而,由於原始的預訓練網路最初具有更強大的“知識”,因此新的textgenrnn 最終訓練得更快、更準確,並且有可能學習原始資料集中不存在的新關係(例如,預訓練的字元嵌入包括上下文)用於現代互聯網語法所有可能類型的字元)。
此外,再訓練是透過基於動量的優化器和線性衰減的學習率完成的,這兩者都可以防止梯度爆炸,並使模型在長時間訓練後發散的可能性大大降低。
即使使用經過嚴格訓練的神經網絡,您也不會 100% 獲得高品質的生成文字。這是利用神經網路文字產生的病毒式部落格文章/Twitter 推文通常會產生大量文字並隨後策劃/編輯最好的文字的主要原因。
不同資料集的結果會有很大差異。由於預先訓練的神經網路相對較小,因此它無法儲存部落格文章中通常標榜的 RNN 那麼多的資料。為了獲得最佳結果,請使用至少包含 2,000-5,000 個文件的資料集。如果資料集較小,則在呼叫訓練方法和/或從頭開始訓練新模型時,您需要透過將num_epochs
設定得更高來訓練更長時間。即便如此,目前還沒有好的啟發法來確定「好」模型。
重新訓練 textgenrnn 不需要 GPU,但在 CPU 上訓練需要更長的時間。如果您確實使用 GPU,我建議增加batch_size
參數以獲得更好的硬體利用率。
更正式的文檔
使用tensorflow.js的基於網路的實作(由於網路規模較小,效果特別好)
一種可視化注意力層輸出以了解網路如何「學習」的方法。
允許模型架構用於聊天機器人對話的模式(可以作為單獨的專案發布)
更深入地了解上下文(位置上下文+允許多個上下文標籤)
更大的預訓練網絡,可以容納更長的字元序列和對語言更深入的理解,從而創建更好的生成句子。
字級模型的分層 softmax 活化(一旦 Keras 對其有良好的支持)。
FP16 用於 Volta/TPU 上的超快速訓練(一旦 Keras 對其有良好的支援)。
馬克斯‧伍爾夫 (@minimaxir)
Max 的開源專案得到了他的 Patreon 的支持。如果您發現這個專案有幫助,我們將不勝感激對 Patreon 的任何金錢貢獻,並將用於良好的創意用途。
Andrej Karpathy 透過部落格文章《循環神經網路的不合理有效性》提出了 char-rnn 的原始提案。
Daniel Grijalva 貢獻了互動模式。
麻省理工學院
使用 DeepMoji 的注意力層程式碼(MIT 許可)