當前位置:
首頁 > 知識 > 《哈利·波特》出版二十周年,教大家用神經網路寫咒語!

《哈利·波特》出版二十周年,教大家用神經網路寫咒語!

AI 研習社按:不知道你小時候是否夢想過這樣的場景,在對角巷的奧利凡德家挑一把魔杖,十一英寸,冬青木、鳳凰羽毛,帶著它和一隻雪白的貓頭鷹奔入國王十字車站,從 9 號和 10 號站台之間穿牆而過,踏上一列呼呼作響、冒著滾滾白煙的蒸汽列車,從此進入一個名叫「霍格沃茨」的魔法世界。

時光飛逝,自 1997 年 6 月這個神奇的魔法世界首次出現在我們面前,已經過去了整整20 年,這本名為《哈利·波特與魔法石》的奇幻小說也已經整整 20 周歲。

在這個特殊的日子,社長特地為大家準備了一份同樣充滿奇幻色彩的 AI 教程:如何用神經網路寫咒語!下面是正文部分:

英國赫爾大學的數據俠 Jacob 創造了一個 「寫手」 程序,教大家如何模仿《哈利 · 波特》的口吻寫文章。文末還附加了 GitHub 的鏈接。可以親自上手試試。今後,哪怕沒有教授帶你玩,你也可以寫模仿 J.K Rowling 的為哈利寫一段咒語啦!

我創造了個 「寫手」 程序,能模仿大師寫作風格哦

我最近在赫爾大學完成了我高級人工智慧課程單元。它特別棒。

「機器學習」 特別吸引我的地方在於,這項技術的潛在應用看起來無窮無盡。當我成功克服了(人工神經)網路工作原理的陡峭學習曲線後,我決定是時候創作些什麼了。

當我瘋狂地在互聯網上搜索機器學習的奇蹟時,我偶然發現了個 GitHub 上的項目,使用了時間遞歸神經網路(recurrent neural network,RNN)來模仿莎士比亞的寫作風格。我很喜歡這個創意,也想試著創造一個不一樣的屬於我自己的版本。

我寫了一個人工機器學習 「寫手」 程序,試圖通過訓練它來模擬人格並模仿著名作家的寫作風格寫作。我們將嘗試模仿莎士比亞,J·K·羅琳和網路上隨機的博客。

這個 「寫手」 程序將會這麼來做:通過訓練數據逐步增加句量,利用 NLTK 把句子拆解轉換成詞性標註,訓練象徵符號的結果,再次增加句量,然後訓練詞性標註出現的概率。

許多程序嘗試通過分析文本來預測特徵出現的概率,然而並不準確。而我的這種方法總是能有好的結果。

數據分類和歸一,都是為了有一個好的模仿對象

(小課堂:接下來作者就要對數據做分類了。分類是數據挖掘領域中一項非常重要的任務。自然語言處理 NLP 中,一般的模式分類方法都可用於文本分類研究。常用的分類演算法包括:決策樹分類法,樸素的貝葉斯分類演算法、基於支持向量機 (SVM) 的分類器,神經網路法,k - 最近鄰法 (k-nearest neighbor,kNN),模糊分類法等等。)

我決定使用 scikit 機器學習庫。它使用和配置起來都特別簡單。Scikit 有著龐大的社區,裡面包含了大量的教程和許多可以用來訓練你的神經網路的樣本數據集(example datasets)。我並沒有使用原有的樣本數據集,我想把無序的文本轉變成歸一化的訓練數據。我創建的這個 「寫手」 使用了多重支持向量機(SVM)的分類器,一個向量機(vector machine)用作句子結構化,多個小型向量機用於對應從辭彙表中選取單詞演算法。

(小課堂:支持向量機 (SVM) 通俗來講是一種二類分類模型,其學習策略便是間隔最大化,通過尋求結構化風險最小來提高學習機泛化能力,實現經驗風險和置信範圍的最小化,從而達到在統計樣本量較少的情況下,亦能獲得良好統計規律的目的。想要深入了解,請看《理解 SVM 的三層境界》)

我目前使用的演算法能有精準的結果,這使得句式結構化非常成功。這個階段中最大的障礙就是將訓練數據歸一化(normals)。

(小課堂: 歸一化,簡單的講就是由於數據單位不一致,所以需要將不同的數據進行格式化,使之在指定的範圍內,比如在 0-1 之間。歸一化是為了後面數據處理的方便,其次是保正程序運行時收斂加快。舉個栗子:一張表有兩個變數,一個是體重 kg,一個是身高 cm。假設一般情況下體重這個變數均值為 60kg,身高均值為 170cm。這兩個變數同樣是 100,對於身高來說很矮,但對於體重來說已經很大了。所以歸一化就是要解決這個問題,目的是可以用數值直接來進行比較。)

我使用了 NLTK(Natural Language Toolkit 自然語言工具包)的庫來先將訓練數據轉化成詞性標註,例如:NN(名詞),DET(限定詞),$(符號)等等。(然後再將其歸一化)

(小課堂:為什麼要用 NLTK?從計算機處理的角度來看,英語或任何自然語言(口語或普通的語言)都是極不規範和不準確的,需要對它們進行整理。NLTK 還提供了一些 「詞幹分析器」 類,以便進一步規範化單詞。)

利用這些標籤, 我可以對數據進行歸一化,像下面這樣:

["The","cat","jumped"]= [ DET , NN , VP]

一旦歸一化以後就像下面這樣:

[ DET , NN , VP]= [0.2237823,0.82392,0.342323]

現在我只需要得到一個目標歸一化後的值(target normal),並且將它代入神經網路中開始訓練即可。從二進位大對象(BLOB,binary large object)中讀取文本時,同時訓練推測下一個順序詞是什麼。因此:

接下來要做的是獲取大量 J.K Rowling《Harry Potter》的資源並且準備開始模仿她的句式結構。

努力提高辭彙量,這樣才能 「餵飽」 我的 「寫手」

辭彙無疑是本項目中最難的部分,我很清楚地知道沒有理由不使用遞歸神經網路,預測每個字母也是更好的辦法。然而,我選擇的方法產生非常酷炫的結果。

辭彙以詞序矩陣的形式包含在訓練用的 BLOB 文件中。每個詞分解成了詞性標註接著進行歸一化。歸一化後的值和辭彙依然被備份著,因為稍後將歸一化的值轉換回單詞依然要利用此作為映射表。辭彙看起來像這樣:

[[(cat,[0.232342]),(bat,[0.2553535]),(dog,[0.345454]),(horse,[0.4544646])...]

...

1. 我們先使用小型文本 HarryPotter(small).txt(註:作者所使用的文本,請點擊 GitHub)。

這個數據集包含了 346 個訓練向量(training vectors),是一個最小的訓練集

Input(輸入):"Harry dont look"(哈利不要看)

Output(輸出):"Harry dont look had at eleven for witches had been for eleven then with nothing had been for eleven then with nothing had been for eleven then with nothing had been for eleven"(哈利不要看,11,女巫,11,沒有事情,11,……)

Input(輸入):"Wizards sometimes do"(巫師有時候會做)

Output(輸出):"wizards sometimes do , Harry had been been , Harry had been been , Harry had been been , Harry had been been , Harry had been been , Harry had been been"(巫師有時候會做,哈利已經在,哈利已經在,哈利已經在,哈利已經在,哈利已經在,哈利已經在)

你可以看出神經網路很努力想要學習卻缺乏訓練數據。它幾乎就陷入無限循環中了。

2. 我們接下來開始使用中型文本 HarryPotter(medium).txt。

數據集包含了 2500 個訓練向量。

Input(輸入):"Harry don t look"(哈利不要看)

Output(輸出):"Harry don t look , incredibly that a year for been parents in . followers , Harry , and Potter was been curse . Harry was up a year , Harry was been curse "(哈利不要看,難以置信地有一年父母在。花朵,哈利,波特都被詛咒。哈利長大了,哈利被詛咒)

Input(輸入):"Wizards sometimes do"(巫師有時候會做)

Output(輸出):"wizards sometimes do parents."(巫師有時候會對父母做)

現在你可以看出神經網路的輸出,已經生成了我們預想的結果。因為增加了訓練數據,它的性能得到了大幅度提升。

3. 使用大型文本 HarryPotter(large).txt,數據集包含了 4550 個訓練向量。

Input(輸入):"Harry don t look"(哈利不要看)

Output(輸出):"Harry don t look Petunia Harry , incredibly had on the address."(哈利不要看佩妮哈利,有地址)

現在,除了一個錯誤的停頓應該在 Petunia(佩妮)與 Harry(哈利)之間,這個句子簡直完美。

不過,在這裡,訓練數據的增加反而給了一個負面的結果。這是罕見的。

Output(輸出):"Wizards sometimes do the address on the address on the address."

4. 接下來,要使用另一個和哈利波特無關的大型文本 MacbookAirBlog(large).txt 了。

我隨機在一個博客上抓取了一份(與哈利波特無關的)文本。出乎意料的是這個數據集通常能產生更精確的結果。數據集中包含了 3576 個訓練向量。

Input(輸入):"Harry don t look"(哈利不要看)

Output(輸出):"Harry don t look , also of a scaling on playing . Use for Control weight goes so cable and they ve of placed it . you do to want things at at 2015."(哈利不要看,比例玩起來。控制作用體重所以有線和他們放在這裡。2015 年你的確需要東西。)

Input(輸入):"Wizards sometimes do"(巫師有時候會做)

Output(輸出):"Wizards sometimes do When ports a scaling the have object , also of a scaling on playing ."(當港口有貨,巫術有時候會做,比例玩起來)

句式結構是正確的,但辭彙有限。別急,10,000 以上訓練向量的數據集馬上要來了, GitHub 鏈接:

http://t.cn/Ry29mhq

預測和測試:「寫手」 不僅可以模仿利波特哦

當我們試著對下一個順序的詞進行預測時,程序生成了非常準確的結果。但是當大量序列開始生成後,準確率就下降了。我創建了一個測試單元用來比較生成的下一個詞與 J.K Rowling 實際創作中的詞。

我得到了下面的結果:

通過命令行,你可以看到:

python3 main.py -utss -td "Datasets/MacbookAirBlog(large).txt"

我用同樣的想法測試了辭彙表:

python3 main.py -utv -td "Datasets/MacbookAirBlog(large).txt"

如果預估超過 80% 就會被歸為 「通過(passed)」。

以上所有的結果都來自於 「未完結」 的程序,這也就是為什麼它們看起來並沒有那麼準確。

哈利波特的數據集就來自於電子書,當然你也可以用其他數據集。它是非常容易添加數據集,只要確保他是 BLOB 的格式。

作者註:本實驗只應用於教育,永不用於商業化。如果你想查看這個項目,你可以在 Github 上看到。鏈接:

http://t.cn/Ry29mhq

研習社特供福利ID:OKweiwu

開發者專場 | 英偉達深度學習學院現場授課

學習形式:線下授課 + 交流答疑

地點:深圳市福田區福華路大中華喜來登酒店

培訓價格:1999 元

報名優惠:

優惠一:CCF-GAIR開發者專場票最後50個優惠名額,CCF-GAIR參會人員、雷鋒網公開課資深群友、AI慕課學院老學員,半價優惠

優惠二:半價外,還可享受200優惠碼(現價799元)

優惠三:公司組團報名(3人以上)限時599元

領取優惠:

方式一:進入AI慕課學院課程頁面,提交訂單後,聯繫客服留言改價即可。掃碼使用優惠,立即報名:

方式二:雷鋒網CCF-GAIR購票頁面直接領取200優惠。掃碼使用優惠,立即報名:

優惠截止日期:7月1日(7月2日課程價:1499元,150名之後將恢復原價;名額有限,如報名超員,我們將全額退款)

客服諮詢:18201476932;15210889238

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 唯物 的精彩文章:

訓練深度神經網路的必知技巧,你知道哪些?
聊天機器人還能這麼玩!教你用 Tensorflow 搭建能理解語境的客服小二!
一文詳解 Word2vec之Skip-Gram 模型
你聽說過英偉達深度學習學院 DLI 嗎?
Yann LeCun 最新研究成果:可以幫助 GAN 使用離散數據的 ARAE

TAG:唯物 |

您可能感興趣

迎春鉅獻——印壇大家林健篆書吉語第二波來襲
大家眼中的《誅仙3》
每周讀書#6-《寫給大家的中國美術史》
大家評說大家:周春芽、方力鈞
《熊出沒:變形記》春節大聯歡,熊大熊二為大家拜年啦
魯山在線網恭祝大家新春快樂、狗年大吉!給大家拜年啦!
《小家裡的大家》
為什麼向大家力薦《大乘離文字普光明藏經》
她是五六十年代香港著名歌手,七十年代的山水畫大家!
歷代大家寫「龍」字
《山海經》異獸篇之九尾狐,大家眼中的狐狸精,竟然是被妖化的瑞獸?
大吉大利:「十二個大神」給大家拜年了!
歷代法書萃英《漢簡隸書選》之三供大家欣賞!
臘月二十三,「朗誦者沙龍」集體誦讀春節古詩詞,給大家拜早年!祝新春快樂!
祝大家狗年吉神
中國歷代繪畫大家·八大山人
「唐宋八大家」八句名言,八種人生大境界!
《星星說》各個星座運勢 攜犬子祝大家狗年吉祥…
杜甫《秋興八首》,怎麼大家都愛寫?
《山居雜憶》:大家閨秀的處變不驚,百年杭州的滄桑變遷