立場新聞 Stand News

【777特訓】用Python自製林鄭語言AI生成器

2018/8/12 — 17:22

近幾年人工智能發展甚速,在各個領域均有突破,在語言處理上更有廣泛應用。我今次便試用Python專攻深度學習(deep learning)的程式庫Tensorflow,讓電腦學習特首林鄭月娥的語言風格後,嘗試模擬林鄭就不同議題的演辭,結果如何?請耐心看下去。

首先到政府新聞處下載林鄭今年至今的演辭、回應傳媒及答問大會中回答議員的紀錄,由於要做大量copy and paste,過程頗沉悶,故再多的數據便要大家一起幫手了。雖然只得8個月不夠的數據,但也有29萬字,要做示範應該勉勉強強吧,有興趣望望的朋友可以按此連結

把所有演辭、回應、對答都儲存在一個文字檔後,便可著手寫程式,由於時間關係,加上筆者確實不是AI的專家,故此自然是在網上找一些高手的大作修改,在github上找到imdarkie的一個用武俠小說訓練電腦的AI應用,便以此為藍本操作。

廣告

深度學習是以神經網絡為基礎的一套AI技術,而用於語言學習的變種為循環神經網絡(recurrent neural network),本文所用的模型則為seq2seq模型,要講解頗為繁複,有興趣的讀者可以找相關資料研究

在讓電腦學習前,首先要整理資料,把一些怪符號及多餘的空格除掉,然後就是分段。由於在下的電腦性能有限,故先以10萬字來作訓練,但也有七百多段文字。因為電腦不懂文字,於是要先把單字編碼變成數字。

廣告

處理好數據後,便可用tensorflow載入開始訓練。要訓練幾多才足夠呢?其實視乎幾個參數,即使你對具體AI的演算法不甚了了,也必定要認識這幾個參數,其一是訓練的循環次數(epoch),這是電腦優化模型的次數,次數越多,理論上訓練成績越好,但所需時間亦越長,若果只是示範,數十至數百次可以了。其二是學習率(learning rate),學得太快可能會錯過最佳的方案,太慢則影響效率。此外,神經網絡的層數亦影響電腦學習的能耐,較多的話電腦會善於處理較複雜的變化,在這程式中,便用到long short term memory layer及embedding layer。

在訓練的過程中,程式會顯示如下畫面,其中train_loss代表的是模型優化的程度,越低越好,要留意若訓練回合上升,但train_loss跌幅不大,便可能意味遇到樽頸,可能要調整其他參數如learning rate或調整模型,看看可否改善。

Epoch   0 Batch    0/25   train_loss = 7.550
Epoch   1 Batch    5/25   train_loss = 6.159
Epoch   2 Batch   10/25   train_loss = 6.215
Epoch   3 Batch   15/25   train_loss = 6.161
Epoch   4 Batch   20/25   train_loss = 5.972

.

.

.
Epoch 194 Batch   10/25   train_loss = 1.845
Epoch 195 Batch   15/25   train_loss = 1.863
Epoch 196 Batch   20/25   train_loss = 1.823
Epoch 198 Batch    0/25   train_loss = 1.881
Epoch 199 Batch    5/25   train_loss = 1.820
Model Trained and Saved

電腦學習了林鄭的語言風格後,便可據此生成模擬林鄭的演辭,程式將要求用家輸入一個中文字,然後據此推斷生成500字演辭。當然,人工智能不是神仙,其能力視乎你的輸入、花了多少時間學習,以及演算法的效率。

筆者首先用50次循環及0.01學習率,並輸入一個「鐵」字要求電腦生成演辭,結果如下:

鐵政府會盪,在不要私營供應,亦公布之面都會有現希以支援。如一數一個稱效。我不知道因以發改作,我坐擁給非常努力,所以後而過往數第八個星期間的人才去考慮。最王問得要與歐洲、空間的,提供好,我們只要擔任我們自己能力自己的是一套感恩收入國家以國際信放學技技驗......

有點語無倫次,但起碼電腦開始認得某些詞語如「私營供應」、「非常努力」。記著,電腦只是以每個單字代表的數字來學習,並無詞語表。

當訓練循環上升至200回合,結果變成:

鐵路系統,亦有分的了儲差守委會,如果那55,500呎的9,,00赫來王角之全的市民對本政立法?完全是很受他們邀請甚麼道來房屋的這套政策,我可以保護「一、藥工作、進入人於對香港。在三○○一年。這二二十九大鄉事理中,但目前會提交的置業。賣機聚於有利於這些過。當然行政長官,又要可負擔評論......

不敢說效果更佳,標點符號亦有點奇怪。若再將學習率下調至0.03,又如何:

鐵公司可成實。在甚麼已出席的時間,我們非常愉少的意思,可以向韓正副總理出席香港時常多次來至發展潛力。國家主席習近平的在聽我們的基金已在「業央科研的成」。根據更本的期盼」對大政策和專業投放相當大性的項目,獲獎的期冠方書論後,保存「十九九齊別已造人生港思活安,反應過去一八年居屋出.....

效果好像較佳,並且竟然有韓正及習近平及其銜頭,有意義的句子開始浮現。

若果增加學習的神經網絡層數又如何呢?將其由128層提升至256層,但將訓練循環回合下調至50回(否則速度很慢),結果是:

鐵機構進行策了「綠置理」的六年特別,政府認為後未我們認為亦留意到各方面的工作,所以正如我剛才在說是會公布時過很多是希望自己聽了包括時實上這麼重鐵不同意見——事實上我已經說過很多次來說,在定價時常了其。最後可以交給一次請行政長官發展電頭成功這個科學園和交流、實在計劃,包括新界......

雖然訓練回合大減,但文句的通順度沒有輸蝕,若再以「地」字作引子,則電腦吐出文章如下:

地域差異。第一要都能成為要找調查委員會,有一些建議,所有獲實準備就緒這幅錢,其實完全進現到一些方法?你會上到這個新訴求都是沒有任何的問題,屬於教育局在這些例子讓大家看到與它大概有一些過話沒人死,這套暫時線給到考慮應我沒有限制,不過我們申請社會脈搏,其實想買樓、市民、社會少公眾利益。......

在訓練後,程式會儲存所有參數及權重,用來做林鄭演辭的生成器,故此不用每次都訓練,而生成器的速度亦快得多,只需一兩秒便有結果。

以上示範可見,不能光上調訓練回合,也要改其他參數,試出最優組合,同時,訓練的資料亦影響其表現,如以10萬字訓練後,筆者輸入「驊」,電腦便不懂反應,因為十萬字裡均沒有提到鄭若驊,但29萬字的訓練資料,便包含鄭若驊僭建一事的回應,電腦才懂得模擬。

深度學習雖強大,但對電腦運算的要求亦高,受制電腦速度,以200回合訓練29萬字,往往要數小時,同時,筆者後來又發現以較低的學習率來訓練,效果顯著,故優化的方向,應是以低學習率,增加神經網絡層數及訓練回合,但當然這三者都會令訓練時間延長。若讀者電腦有圖像處理卡,程式會主動偵測及使用,提升速度。

當然,以上示範都是牛刀小試,距離google、蘋果級應用仍然遙遠,但起碼在家用電腦運行十數分鐘至一兩小時,也會見到學習結果的變化。儘管文字不通順、意思不連貫,但字句的長短、語氣,是否也有林鄭的一點影子?

註:有興趣拿程式測試的朋友,可以到github下載,上有carrielamspeechAI.py及printspeech.py兩個程式,第一個是用來訓練電腦用的,後一個則是實際的生成器。不過,由於尚有其他支援程式及資料庫,故此各位可整個folder下載來運行。

發表意見