我實現了一個人工機器學習寫作器

Ree Ray發表於2016-05-24

我最近在赫爾大學完成了我的進階人工智慧模組。它特別棒。“機器學習”技術尤其吸引我,大量基於此的潛在應用看起來前途無量。當我克服了(人工神經)網路工作原理的陡峭學習曲線後,我決定是時候寫點什麼了。

人工神經網路(ANN)寫作器

在我全力搜尋網際網路上來研究奇蹟般的機器學習的同時,我偶然發現了個 github 上的專案,使用了遞迴神經網路(recurrent neural network)來模仿莎士比亞的寫作風格。我喜歡這個想法,所以也試著創造一個幾乎完全不一樣屬於我自己的版本。我決定使用 scikit 這個機器學習庫。這是因為它使用和配置起來都特別順手。

Scikit 同樣有著龐大的社群,裡面包含了大量的教程,還有許多可以用來訓練你自己的神經網路的樣本資料集(example datasets )。我建立的這個寫手使用了多重支援向量機(SVM)引擎。一個向量機(vector machine)用來對句子結構化,多個小型向量機用對應從詞彙表中選取單詞演算法。

句式結構化

句式結構化非常成功,我目前使用的演算法結果準確率已經很高了。這個階段中最打的障礙就是將訓練資料歸一化(normals)。我使用了 NLTK 這個自然語言的庫來將訓練資料轉化成詞性標籤(phrase identifiers),例如:NN(名詞),DET(限定詞),$(標誌)等等。

這代表著我可以利用這些標籤對資料進行歸一化,像下面這樣:

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

現在我只需要得到一個目標歸一化後的值(target normal),並且將它代入神經網路中開始訓練即可。從 二進位制大型物件(BLOB)中讀取文字時,訓練用詞就是二進位制大型物件中的下一個詞,因此:

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

我實現了一個人工機器學習寫作器

詞彙

詞彙在本專案中無疑是最難的部分,我很清楚沒有道理不使用遞迴神經網路,預測每個字母也是更好的辦法。然而,我選擇的方法產生的結果看起來特別有趣。

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

嘗試應用

使用 HarryPotter(small).txt

這個資料集包含了 346 個訓練向量(training vectors)。是一個最小的訓練集。

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

使用 HarryPotter(medium).txt

資料集包含了 2500 個訓練向量。

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

使用 HarryPotter(large).txt

資料集包含了 4550 個訓練向量。

使用 MacbookAirBlog(large).txt

我隨便在一個部落格上拿到了一份文字。出乎意料的是這個資料集常常能產生更精確的結果。讓我們看看。資料集中包含了 3576 個訓練向量。

結果是正確的,但詞彙有限。10,000 以上訓練向量的資料集馬上要來了。

進行一些單元測試

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

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

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

如果預估(prediction estimation)超過 80% 就會被歸為“通過(passed)”。

以上所有的結果都來自於“未完結”的程式,這也就是為什麼它們看起來並不準確。

本實驗只應用於教育,永不用於商業化。

如果你想檢視這個專案,你可以在 github 上看到。

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!

任選一種支付方式

我實現了一個人工機器學習寫作器 我實現了一個人工機器學習寫作器

相關文章