張正旺
【摘 要】古詩是中華民族的文化瑰寶?;赥ransformer模型,利用開源的深度學習庫Tensor2Tensor,僅需編寫幾十行代碼即可創(chuàng)建出一個寫詩機器人。結果表明,該寫詩機器人能夠寫出格式規(guī)范,頗具意境的七言古詩。
【關鍵詞】Transformer模型;深度學習;Tensor2Tensor;寫詩機器人
中圖分類號:TP183 文獻標識碼: A 文章編號: 2095-2457(2018)33-0004-003
DOI:10.19694/j.cnki.issn2095-2457.2018.33.002
【Abstract】Ancient poetry is a cultural treasure of the Chinese nation. Based on the Transformer model and using the open source deep learning library Tensor2Tensor, a poetry writing robot can be created with only dozens of lines of code. The result shows that the poem writing robot can write seven-character ancient poetry with standard format and artistic conception.
【Key words】Transformer model; Deep learning; Tensor2Tensor; Writing robot
0 引言
古詩是中華民族的文化瑰寶,其結構精練,韻律優(yōu)美,意境高雅,具有穿越歷史時空的創(chuàng)造力、影響力和吸引力,眾多古詩流傳至今并仍讓我們深深為之著迷。人工智能(Artificial Intelligence),簡稱AI,其研究始于1956年的達特茅斯會議,與歷史悠久的古詩相比,人工智能是一項非常年輕的技術。隨著大數據的積累和計算機軟硬件性能的提升,人工智能在各領域展現出極為廣闊的發(fā)展和應用空間。深度學習是機器學習的一個分支,是現階段實現人工智能的一種主要技術手段。深度學習的應用場景主要有:圖像識別與處理、目標檢測、語音識別、自動駕駛、自然語言處理等?;谏疃葘W習,利用自然語言處理相關技術,可以將計算機訓練成一個寫詩機器機器人,讓計算機自動生成格式規(guī)范的古詩。
1 研究現狀
近年來,隨著深度學習的快速發(fā)展,利用基于深度學習的自然語言處理技術自動生成古詩的研究得到了學術界的廣泛關注。桂林電子科技大學的黃文明等[1]采用一種基于注意力機制的序列到序列模型得到作詩大綱,然后利用具有雙編碼器和注意力機制的序列到序列模型順序地生成詩的每一行。北京郵電大學的李爭[2]基于遞歸神經網絡的古詩自動生成模型能夠在給定關鍵詞的情況下自動生成與其語義相關的古詩內容。中國科學技術大學的蔣亮[3]設計了一種基于記憶的深度神經網絡模型自動基于圖片生成中國古詩,該模型可以很有效地挖掘圖片中的視覺信息及語義信息。清華大學的Yi Xiaoyuan等[4]將古詩句的生成看作一個序列到序列的學習問題,基于遞歸神經網絡(Recurrent Neural Network,RNN)的Encoder-Decoder模型,構建了一個以關鍵詞為輸入四行詩自動生成系統,該系統能學習詩中單行的語義、行與行之間的語義相關性及結構、平仄模式的使用。愛丁堡大學的Zhang Xingxing等[5]提出了一種基于遞歸神經網絡(RNN)的詩歌生成模型,該模型非常善于捕捉和學習詩歌的內容和形式。
這些研究多數基于傳統的RNN模型,均可自動生成格式規(guī)范的古詩,但他們都需要研究者自己編寫大量代碼來完成系統的開發(fā)。GOOGLE大腦的研究人員[6]于2017年提出了一個摒棄了RNN結構,完全基于注意力機制的Transformer模型,隨后他們開源了一個基于Tensorflow框架的深度學習庫Tensor2Tensor,該庫提供了用于自然語言處理的Transformer模型。利用這個深度學習庫,基于Transformer模型,僅需編寫少量代碼,即可簡單快捷地訓練出一個會寫詩的人工智能機器人。
2 Transformer模型簡介
古詩自動生成是一個序列到序列問題,目前處理這類問題較為有效的框架為Encoder-Decoder模型,該模型的結構如圖1所示。模型中的Encoder部分采用GRU(Gated Recurrent Unit)、LSTM(Long Short-Term Memory)等遞歸神經網絡,卷積神經網絡(Convolutional Neural Network, CNN),以及RNN或CNN與注意力機制(Attention)相結合等機制學習源序列,得到一個固定長度的向量表達式;模型中的Decoder部分以該向量表達式為輸入,采用類似與Encoder的機制學習,得到目標序列。如圖1中的“羌笛何需怨楊柳”經過Encoder后轉變?yōu)轭愃朴冢?.5,0.2,0.1,-0.6,-0.4,1.0,1.2,0.8)的向量,Decoder以這個向量作為輸入,最終可習得下一句詩“春風不渡玉門關”。
Transformer是一種處理序列到序列問題的新模型,其仍然沿用了經典的Encoder-Decoder結構,但不再使用RNN或CNN進行序列建模,而是完全使用自我注意力(self-attention)制。GOOGLE研究的結果表明,與RNN或CNN等結構相比,Transformer模型可以在減少計算量和提高并行效率的同時獲得更好的學習效果,其結構如圖2所示[6]。
Transformer模型的Encoder部分由Nx個(Nx=6)相同的層堆疊而成,每一層有兩個子層,第一個子層是多頭自我注意力層(Multi-head Attention),第二個子層是密集型全連接前饋網絡層(Feed Forward Network),每個子層中均使用一次殘差連接。Decoder部分的結構與Encoder相似,也是由6個完全相同的層堆疊組成,每一層除了包括Multi-Head Attention子層和Feed Forward Network子層外,還有一個遮擋式多頭自我注意力層(Masked Multi-Head Attention),每個子層中也使用一次殘差連接。
3 利用Transformer模型創(chuàng)建寫詩機器人
Tensor2Tensor深度學習庫封裝了大量常見數據集和一些典型深度學習問題,并提供了相應模型用于解決各類問題,目前可直接解決的問題有:圖像分類,語言模型、情感分析、語音識別、文本摘要,機器翻譯等,利用庫中所提供的模型還可以處理自行創(chuàng)建的各類新問題。寫詩機器人需要用到Tensor2Tensor提供的Transformer模型。
3.1 數據準備
七言古詩簡稱七古,是古詩中形式最活潑、體裁最多樣、句法和韻腳處理最自由,抒情敘事最富有表現力的一種形式,詩體全篇每句七字或以七字句為主[7]。真正意義的七古成熟于唐朝,盛行于唐宋代。為方便訓練,訓練采用的數據集為唐宋兩代的七言絕句。數據來源于Github上由Werner[8]收集的中國古詩詞數據庫,該數據庫共收錄了從先秦到現代的共計85萬余首古詩詞。利用Python語句從與唐宋詩詞有關的五個CSV文件中提取出共79292首七言絕句作為訓練數據集。
3.2 定義問題與數據處理
在Tensor2Tensor中利用Transformer模型處理古詩自動生成問題,需要先編寫一個定義新問題的名為chinese_poetry.py的Python文件,代碼如下:
# coding=utf-8
from tensor2tensor.utils import registry
from tensor2tensor.data_generators import problem,text_problems
import re
@registry.register_problem
class ChinesePoetry(text_problems.Text2TextProblem):
@property
def approx_vocab_size(self):
return 2**15
@property
def is_generate_per_split(self):
return False
@property
def dataset_splits(self):
return[{"split": problem.DatasetSplit.TRAIN, "shards": 9,},
{"split": problem.DatasetSplit.EVAL, "shards": 1, }]
def generate_samples(self, data_dir, tmp_dir, dataset_split):
with open('./ml/data/tang7.txt') as opf:
for line in opf:
line = re.sub('。', ',', line, count=1)
line = re.sub('?', ',', line, count=1)
newline = line.split(',')
for i in range(3):
prev_line = newline[i]
curr_line = newline[i+1]
yield{"inputs": prev_line, "targets": curr_line}
將chinese_poetry.py保存在chinese_poetry目錄下,并在該目錄下再創(chuàng)建一個名為__init__.py的Python文件,該文件只包含一句代碼:from . import chinese_poetry。
古詩自動生成問題類似于機器翻譯,是一個監(jiān)督學習問題,計算機在學習大量的詩句對后,能夠根據一句詩自動生成下一句。每首七言絕句可生成三個數據樣本:(1)以詩的第一行作為輸入序列,第二行作為目標序列;(2)以詩的第二行作為輸入序列,第三行作為目標序列;(3)以詩的第三行作為輸入序列,第四行作為目標序列。安裝好Tensor2Tensor深度學習庫后,利用下列Tensor2Tensor命令根據原始數據(79292首七言絕句)生成237876對TFRecord格式的數據樣本:
t2t-datagen --t2t_usr_dir=chinese_poetry \
--problem=chinese_poetry \
--data_dir=chinese_poetry/data
3.3 訓練
訓練所使用機器配置如下:32G內存,8G顯存的GTX 1070顯卡。訓練所使用的命令如下:
t2t-trainer --t2t_usr_dir=chinese_poetry --problem=chinese_poetry \
--data_dir=chinese_poetry/data --output_dir=chinese_
poetry/train \
--model=transformer --hparams_set=transformer_base_
single_gpu \
--schedule=train --train_steps=500000
上述指令表示訓練數據所采用的模型為Transformer模型,所采用的超參數集為 transformer_base_single_gpu,訓練步數50萬步。在訓練了兩天又七個多小時后,一共訓練了361800步,結果已基本收斂,因此停止繼續(xù)訓練。
3.4 測試
訓練好的模型就是一臺寫詩機器人,只需要給訓練好的模型提供一行詩句,模型即可自動生成下一句。Tensor2Tensor提供了t2t-decoder這個命令來完成此類動作。完整指令如下:
t2t-decoder --t2t_usr_dir=chinese_poetry --problem=chinese_poetry \
--data_dir=Chinese_poetry/data --output_dir=Chin-
ese_poetry/train \
--model=transformer --hparams_set=transformer_
base_single_gpu \
--decode_hparams="beam_size=4,alpha=0.6" \
--decode_from_file=Chinese_poetry/poetry.txt
以杜甫《聞官軍收河南河北》(這首詩不在訓練集中)這首七律的首句“劍外忽傳收薊北”作為詩的第一句,讓訓練出來的寫詩機器人相繼生成后續(xù)詩句,結果如圖3所示。
輸入“劍外忽傳收薊北”后,計算機生成的下一句為“又煩前送相公歸”;輸入變?yōu)椤坝譄┣八拖喙珰w”,計算機生成“人間父子無窮勝”;以“人間父子無窮勝”為輸入序列,輸出結果為“筆下明明開辟初”。從生成結果來看,生成的古詩非常規(guī)范,亦頗有意境,描述了一幅戰(zhàn)后親人即將團聚的景象。
4 討論與結語
通過與訓練數據對比可以發(fā)現,上面生成的最后一行詩“筆下明明開辟初”完完全全來自于訓練數據,其原因可能是因為數據量不夠,訓練時出現過擬合現象。為了防止訓練數據里詩句被寫詩機器人原樣照抄,減少過擬合,除了增大訓練數據量外,還可調整模型中的一些正則化超參的值,如Dropout值等,后期也應該增加一些防剽竊處理措施。此外,此寫詩機器人僅僅依據詩的上一句來生成下一句,訓練后容易導致寫出來的詩主題不明確,內容不清晰。因此,對于七言絕句而言,可以通過如下兩種方式增加訓練樣本:(1)以詩的第一行加第二行作為輸入序列,第三行作為目標序列;(2)以詩的一二三行作為輸入序列,第四行作為目標序列。
在技術進步的引導下,在國內外眾多大公司的鼎力支持下,深度學習系統的開發(fā)逐漸趨于平民化,即不需要具備很強的人工智能專業(yè)背景,也可利用現成的框架開發(fā)出具有實用價值的深度學習系統,深度學習模型的使用門檻越來越低,深度學習技術的使用變得越來越簡單。如前所示,寥寥幾十行代碼,即可借助Tensor2Tensor深度學習庫開發(fā)出一個人工智能寫詩機器人,但要想獲得比較好的學習結果,讓系統能真正寫出比較完美的古詩,還有大量的工作可做。
【參考文獻】
[1]黃文明, 衛(wèi)萬成與鄧珍榮, 基于序列到序列神經網絡模型的古詩自動生成方法. 計算機應用研究: 第1-7頁.
[2]李爭, 基于神經網絡的古詩詞自動生成研究, 2018, 北京郵電大學. 第 1-66頁.
[3]蔣亮, 深度神經網絡在基于圖片生成中國古詩問題中的研究與應用, 2018, 中國科學技術大學. 第1-67頁.
[4]Yi Xiaoyuan, Li Ruoyu, Sun Maosong. Generating Chinese classical poems with RNN encoder-decoder. (2016-04-06). https://arxiv.org/abs/1604.01537.
[5]Zhang Xingxing, Mirella L. Chinese poetry generation with recurrent neural networks. Proc of Conference on Empirical Methods in Natural Language Processing. October 25-29, 2014, Doha, Qatar.
[6]Ashish Vaswani, Noam Shazeer, Niki Parmar, et.al. Attention Is All You Need. 31st Conference on Neural Information Processing Systems (NIPS 2017), Long Beach, CA, USA.
[7]百度百科. https://baike.baidu.com/item/七言古詩.
[8]https://github.com/werner-wiki/Poetry.