如何训练和测试AI语言翻译系统
在本系列文章中,我们将向您展示如何使用深度学习来创建自动翻译系统。本系列可以视为分步教程,可以帮助您了解和构建神经元机器翻译。
本系列假定您熟悉机器学习的概念:模型训练,监督学习,神经网络以及人工神经元,层和反向传播。
在上一篇文章中,我们建立了一个基于深度学习的模型,用于自动将英语翻译成俄语。在本文中,我们将训练和测试该模型。

使用LSTM电池进行培训和测试
我们将开始训练和测试模型的核心:没有自我注意和单词嵌入的LSTM单元。标准Keras嵌入组件将提供从一组单词到矢量的编码。
模型训练包括以下几个具体任务:
标记输入数据(预处理)
确定培训/自测数据比率
模型训练
我们将从准备输入(源)数据和输出(目标)数据以具有数值,固定大小的输入和输出模型开始。在此之前,我们无法将句子或单词提供给我们的Keras神经网络(NN)模型。
我们将从创建Keras标记器开始,该标记器将从并行语料库中找到的单词构建内部词汇表。让我们将其包装在一个函数中:
### tokenizer ### def tokenization(lines): #print(lines) tokenizer = Tokenizer() tokenizer.fit_on_texts(lines) return tokenizer1234567复制代码类型:[html]
首先,我们必须使用该fit_on_texts功能。
此函数接受句子列表作为其参数,并建立从最常见的单词到索引的映射。它不对句子进行编码,而是准备一个标记器来这样做。
然后,我们必须提供一种对输入句子进行编码的方法。让我们创建另一个函数来做到这一点:
### 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复制代码类型:[html]
初始化令牌生成器后,我们将调用该texts_to_sequences函数进行编码。以下代码从数值向量中检索单词:
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复制代码类型:[html]
让我们使用Jupyter笔记本来训练和测试我们的模型。如果您在没有GPU的计算机上运行,则可能要在Colab上运行笔记本,因为它提供了免费的启用GPU的笔记本实例。
处理数据集的第一个条目将为我们提供训练数据中的条目的准确结果,并为其他数据提供近似的交易。这使我们可以检查翻译器是否正常工作。
下表显示了英文输入数据,然后是理想的俄文翻译,最后是模型翻译:

俄语翻译非常好,这可能是因为我们已经训练了40万多个输入的模型。
当然,它仍然不如专业的自动翻译系统好,这证明了挑战是多么艰巨。一些缺陷立即显现出来。例如,句子“您对我很好”被翻译为“тыбылдлямнеоченьмне”(“您对我非常我”)。
我们还可以通过简单地交换输出和输入数据来创建反向翻译(俄语到英语)。或者,要尝试使用其他语言,我们可以从Tatoeba项目中加载其他任何训练集。
现在有了自我关注
接下来,让我们尝试在启用自我关注的情况下运行我们的模型。我们看到了喜忧参半的结果。在某些情况下,翻译接近完美(黄色),但在某些情况下,翻译不会提高甚至质量低于没有自我关注的翻译(灰色)。
凭直觉,这是有道理的。注意机制可以帮助模型关注句子中单词的重要性-句子越长,确定哪个单词重要和不重要就越容易。使用自我注意力的翻译模型通常会提供更好的结果,但并非总是如此,特别是在输入较短的情况下。
