在本系列文章中,我們將向您展示如何使用深度學(xué)習(xí)來(lái)創(chuàng)建自動(dòng)翻譯系統(tǒng)。本系列可以視為分步教程,可以幫助您了解和構(gòu)建神經(jīng)元機(jī)器翻譯。
本系列假定您熟悉機(jī)器學(xué)習(xí)的概念:模型訓(xùn)練,監(jiān)督學(xué)習(xí),神經(jīng)網(wǎng)絡(luò)以及人工神經(jīng)元,層和反向傳播。
在上一篇文章中,我們建立了一個(gè)基于深度學(xué)習(xí)的模型,用于自動(dòng)將英語(yǔ)翻譯成俄語(yǔ)。在本文中,我們將訓(xùn)練和測(cè)試該模型。
我們將開(kāi)始訓(xùn)練和測(cè)試模型的核心:沒(méi)有自我注意和單詞嵌入的LSTM單元。標(biāo)準(zhǔn)Keras嵌入組件將提供從一組單詞到矢量的編碼。
模型訓(xùn)練包括以下幾個(gè)具體任務(wù):
標(biāo)記輸入數(shù)據(jù)(預(yù)處理)
確定培訓(xùn)/自測(cè)數(shù)據(jù)比率
我們將從準(zhǔn)備輸入(源)數(shù)據(jù)和輸出(目標(biāo))數(shù)據(jù)以具有數(shù)值,固定大小的輸入和輸出模型開(kāi)始。在此之前,我們無(wú)法將句子或單詞提供給我們的Keras神經(jīng)網(wǎng)絡(luò)(NN)模型。
我們將從創(chuàng)建Keras標(biāo)記器開(kāi)始,該標(biāo)記器將從并行語(yǔ)料庫(kù)中找到的單詞構(gòu)建內(nèi)部詞匯表。讓我們將其包裝在一個(gè)函數(shù)中:
### tokenizer ### def tokenization(lines): #print(lines) tokenizer = Tokenizer() tokenizer.fit_on_texts(lines) return tokenizer1234567復(fù)制代碼類(lèi)型:[html]
首先,我們必須使用該fit_on_texts功能。
此函數(shù)接受句子列表作為其參數(shù),并建立從最常見(jiàn)的單詞到索引的映射。它不對(duì)句子進(jìn)行編碼,而是準(zhǔn)備一個(gè)標(biāo)記器來(lái)這樣做。
然后,我們必須提供一種對(duì)輸入句子進(jìn)行編碼的方法。讓我們創(chuàng)建另一個(gè)函數(shù)來(lái)做到這一點(diǎn):
### encode ### def encode_sequences(tokenizer, length, lines): # integer encode sequences seq = tokenizer.texts_to_sequences(lines) # pad sequences with 0 values seq = pad_sequences(seq, maxlen=length, padding='post') return seq1234567復(fù)制代碼類(lèi)型:[html]
初始化令牌生成器后,我們將調(diào)用該texts_to_sequences函數(shù)進(jìn)行編碼。以下代碼從數(shù)值向量中檢索單詞:
temp = [] for j in range(len(i)): t = get_word(i[j], ru_tokenizer) if j > 0: if (t == get_word(i[j-1], ru_tokenizer)) or (t == None): temp.append('') else: temp.append(t) else: if(t == None): temp.append('') else: temp.append(t) return ' '.join(temp)1234567891011121314復(fù)制代碼類(lèi)型:[html]
讓我們使用Jupyter筆記本來(lái)訓(xùn)練和測(cè)試我們的模型。如果您在沒(méi)有GPU的計(jì)算機(jī)上運(yùn)行,則可能要在Colab上運(yùn)行筆記本,因?yàn)樗峁┝嗣赓M(fèi)的啟用GPU的筆記本實(shí)例。
處理數(shù)據(jù)集的第一個(gè)條目將為我們提供訓(xùn)練數(shù)據(jù)中的條目的準(zhǔn)確結(jié)果,并為其他數(shù)據(jù)提供近似的交易。這使我們可以檢查翻譯器是否正常工作。
下表顯示了英文輸入數(shù)據(jù),然后是理想的俄文翻譯,最后是模型翻譯:
俄語(yǔ)翻譯非常好,這可能是因?yàn)槲覀円呀?jīng)訓(xùn)練了40萬(wàn)多個(gè)輸入的模型。
當(dāng)然,它仍然不如專(zhuān)業(yè)的自動(dòng)翻譯系統(tǒng)好,這證明了挑戰(zhàn)是多么艱巨。一些缺陷立即顯現(xiàn)出來(lái)。例如,句子“您對(duì)我很好”被翻譯為“тыбылдлямнеоченьмне”(“您對(duì)我非常我”)。
我們還可以通過(guò)簡(jiǎn)單地交換輸出和輸入數(shù)據(jù)來(lái)創(chuàng)建反向翻譯(俄語(yǔ)到英語(yǔ))?;蛘?,要嘗試使用其他語(yǔ)言,我們可以從Tatoeba項(xiàng)目中加載其他任何訓(xùn)練集。
接下來(lái),讓我們嘗試在啟用自我關(guān)注的情況下運(yùn)行我們的模型。我們看到了喜憂參半的結(jié)果。在某些情況下,翻譯接近完美(黃色),但在某些情況下,翻譯不會(huì)提高甚至質(zhì)量低于沒(méi)有自我關(guān)注的翻譯(灰色)。
憑直覺(jué),這是有道理的。注意機(jī)制可以幫助模型關(guān)注句子中單詞的重要性-句子越長(zhǎng),確定哪個(gè)單詞重要和不重要就越容易。使用自我注意力的翻譯模型通常會(huì)提供更好的結(jié)果,但并非總是如此,特別是在輸入較短的情況下。
聯(lián)系客服