當前位置:
首頁 > 知識 > 如何從零開始用Keras開發一個機器翻譯系統!

如何從零開始用Keras開發一個機器翻譯系統!

[高薪招聘兼職AI講師、助教和項目開發合伙人!]

機器翻譯是一項非常具有挑戰性的任務,按照傳統方法是使用高度複雜的語言知識開發的大型統計模型。而神經網路機器翻譯是利用深度神經網路來解決機器翻譯問題。

在本教程中,你將了解如何開發一個將德語短語翻譯成英語的神經機器翻譯系統,具體如下:

如何清理和準備數據,以及訓練神經機器翻譯系統。

如何開發一個機器翻譯的編碼解碼器模型。

如何使用訓練過的模型對新輸入短語進行推理,並評估模型技巧。

教程概覽:

這個教程分成了以下四個部分:

1.德文轉譯英文的數據集

2.準備文本數據

3.訓練神經翻譯模型

4.評估神經翻譯模型

Python開發環境:

本教程假設你已經安裝了Python 3 SciPy環境

你必須安裝了帶有TensorFlow或者Theano後台的Keras (2.0或者更高版本)

如果你在開發環境方面需要幫助,請看如下的文章:

如何安裝用於機器學習和深度學習的Python開發環境

德文轉譯英文的數據集

在本教程中,我們將使用一個德文對應英文術語的數據集。

這個數據集是來自manythings.org網站的tatoeba項目的例子。該數據集是由德文的短語和英文的對應組成的,並且目的是使用Anki的教學卡片軟體。

這個頁面提供了一個由包含多語言匹配對的列表:

製表符分隔的雙語句對

德文–英文 deu-eng.zip

下載數據集到當前的工作目錄並且解壓縮;例如:

你將會得到一個叫deu.txt的包含152820個英文到德文短語的匹配對,一對一行,並用一個標籤把德文和英文相互分隔開。

例如,這個文件的前五行如下:

我們將用給定的一組德文單詞作為輸入來表達預測問題,翻譯或預測與其對應的英文的單詞序列。

我們將要開發的模型適合一些初級德語短語。

準備文本數據:

下一步是準備好文本數據。

查看原始數據,並注意在數據清理操作中我們可能需要處理你所遇到的的問題。

例如,以下是我在回顧原始數據時的觀察所得:

1.有標點

2.文本包含大小寫字母

3.有德文的特殊字元

4.有用不同德文翻譯的重複英文短語

5.該文件是按句子長度排列的,貫穿全文有一些很長的句子

數據準備分為兩個部分:

1.清理文本

2.拆分文本

1.清理文本

首先,我們必須以保存Unicode德文字元的方式載入數據。下面稱為load_doc()的函數將要載入一個BLOB文本的文件。

每行包含一對短語,先是英文,然後是德文,用製表符分隔。

我們必須把載入的文本按行拆分,然後用短語拆分。下面的函數to_pairs()將拆分載入的文本。

現在準備好清理文本中的句子了,我們將執行的具體清洗操作步驟如下:

刪除所有不可列印字元。

刪除所有標點符號。

將所有Unicode字元標準化為ASCII(例如拉丁字元)。

標準化為小寫字母。

刪除不是字母的所有剩餘標識符。

下面的clean_pairs()函數執行如下操作:

最後,可以將短語對的列表保存到可以使用的文件中

save_clean_data()函數用API來保存清理文本列表到文件中。

下面是完整例子:

運行該示例,用清理過的english-german.pkl文本在當前目錄中創建一個新文件。

列印一些清理文本的例子,以便在運行結束時對其進行評估,這樣就能確認清理操作是否按預期執行的。

2. Split Text

清理過的數據包含了超過150000個短語匹配對,到文件的最後會有一些匹配對是和長的。

這是一些用來開發較小的翻譯模型的例子。模型的複雜度隨著實例的數量、短語長度和辭彙量的增加而增加。

儘管我們有一個很好的建模翻譯的數據集,但我們將稍微簡化這個問題,以大幅度減少所需模型的大小,並且也相應地減少所需的訓練時間來適應模型。

我們將通過減少數據集為文件中的前10000個示例來簡化這個問題;此外,我們將把前9000個作為培訓的例子,剩下的1000個例子來測試擬合模型。

下面是載入清理過的數據,並且將其分割,然後將分割部分保存到新文件的完整示例。

運行該示例創建三個新文件:english-german-both.pkl文件包含所有的訓練和測試的例子,我們可以用這些例子來定義這些問題的參數,如最大的短語長度和辭彙量,和用於訓練和測試數據集的english-german-train.pkl文件和english-german-test.pkl文件。

我們目前準備好開始開發自己的翻譯模型了。

訓練神經翻譯模型

在這部分,我們將開發一個翻譯模型。

這涉及到載入和準備清理過的用於建模、定義以及訓練模型的文本數據。

讓我們通過載入數據集開始,這樣就能準備數據了。下面被叫做load_clean_sentences()的函數,可以被用來載入訓練、測試以及兩種語言的數據集。

我們將使用「兩者」或者訓練和測試數據集的組合來定義此類問題的最大長度和辭彙表。

另外,我們可以僅從訓練數據集中定義這些屬性,並縮短在測試集中過長或者不在辭彙表中的示例。

我們可以使用Keras Tokenize類來映射單詞到整數,如果建模需要的話。我們將為英文序列和德文序列使用分隔標記。這個create_tokenizer()函數將在一個短語列表上訓練一個標記。

相似地,max_length()函數將找到在短語列表中最常的序列的長度。

我們可以調用帶著組合數據集的函數來準備標記、辭彙量大小和最大長度,同時給英文和德文的短語。

我們現在已經準備好訓練數據集了。

每個輸入和輸出序列必須編碼成整數,並填充到最大短語長度。這是因為我們將使用一個單詞嵌入給輸入序列和一個熱編碼輸出序列。下面的函數encode_sequences()將執行這些操作並且返回結果。

輸出序列需要是一個熱編碼的。這是因為該模型將預測辭彙表中每個單詞作為輸出的概率。

下面的encode_output()函數將熱編碼英文輸出序列。

我們可以利用這兩個函數,準備好訓練和測試數據集用於訓練模型。

關於這個問題,我們將用編解碼LSTM。在這個結構中,輸入序列通過一個被稱作前-後的模型進行編碼,然後通過一個被稱作後台模型的解碼器一個單詞一個單詞的進行解碼。

下面的define_model()函數定義了模型,並且用一些參數來配置模型,如如輸入出的單詞表的大小,輸入輸出短語的最大長度,用於配置模型的存儲單元的數量。

該模型採用隨機梯度下降的高效的Adam方法進行訓練,最大限度地減少了分類損失函數,因為我們把預測問題框架化為多類分類。

對於這個問題,模型配置沒有得到優化,這意味著你有足夠的機會調整它,並提高翻譯的技巧。

最後我們可以訓練模型了。

我們訓練了30個時期的模型和每64個實例為一批的多個批次。

我們使用檢查點確保每次測試集上的模型技術的提高,將模型保存到文件中。

我們可以把所有這些結合在一起,並擬合神經翻譯模型。

下面列出完整的示例。

運行示例首先列印數據集的參數匯總,如辭彙表大小和最大短語長度。

接下來,列印定義的模型的一覽,允許我們確認模型配置:

還創建了模型的一個部分,為模型配置提供了另一個視角:

其次,對模型進行訓練。以目前的CPU硬體每一個時期大約需要30秒;

在運行過程中,將模型保存到文件model.h5中,為了準備下一步的推論。

Evaluate Neural Translation Model

我們將在訓練和測試的數據集上評估模型這個模型在訓練數據集上將會表現的非常好,並且已經推廣到在測試數據集上執行良好。理想情況下,我們將使用一個單獨的驗證數據集來幫助訓練過程中的模型選擇,而不是測試集。必須像以前那樣載入和準備清理過的數據集。

其次,必須在訓練過程中保存最佳模型。

評估過程包括兩個步驟:首先生成一個翻譯過的輸出序列,然後為許多輸入示例重複這個過程,並在多個案例中總結該模型的技巧。

從推論開始,該模型可以一次性地預測整個輸出序列。

這將是一個我們能在標記(tokenizer)中枚舉和查找的整數序列,以便映射回到對應的單詞。

下面稱為word_for_id()的函數,將執行此反向映射。

我們可以對轉換中的每個整數執行此映射,並將返回一個單詞字元串結果。

下面的函數predict_sequence()給一個單一編碼過的源短語執行此操作。

接下來,可以對數據集中的每個源短語重複操作,並將預測結果與預期的目標短語進行比較。

可以將這些比較列印到屏幕上,以了解模型在實踐中的執行情況。

我們也計算了BLEU得分以得到量化了的概念模型執行的質量。

下面的evaluate_model()函數實現這個功能,為在提供的數據集中的每個短語調用上述predict_sequence()函數。

將所有這些結合起來,並在訓練和測試數據集上評估所載入的模型。

以下是完整的代碼清單:

運行示例首先列印源文本、預期和預測翻譯的示例,以及訓練數據集的分數,然後是測試數據集。考慮到數據集的隨機重排和神經網路的隨機性,你的具體結果會有所不同。

首先查看測試數據集的結果,我們可以看到翻譯是可讀的,而且大部分是正確的

例如:「ich liebe dich」被正確地翻譯成了「i love you」。我們也能看到這些翻譯的結果不是太完美,「ich konnte nicht gehen」被翻譯成了「i cant go」,而不是希望的「i couldnt walk」。

查看測試集上的結果,確實看到可接受的翻譯結果,這不是一項容易的任務。

例如,我們可以看到「ich mag dich nicht」正確地翻譯為「i dont like you」。也看到一些比較差的翻譯,一個可以讓該模型可能受到進一步調整的好例子,如「ich bin etwas beschwipst」翻譯成了「i a bit bit」,而不是所期望的「im a bit tipsy」。

實現了bleu-4得分為0.076238,提供一個基本的技巧來對模型進行進一步的改進。

原文:https://machinelearningmastery.com/develop-neural-machine-translation-system-keras/?spm=a2c4e.11153959.blogcont475854.15.2c5c4190ONwc4a

推薦《深度學習系列課》


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

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


請您繼續閱讀更多來自 AI講堂 的精彩文章:

今晚直播:你可以不學,但不能不知道!
Faster R-CNN:Down the rabbit hole of modern object detection

TAG:AI講堂 |