65.9K
CodeProject 正在变化。 阅读更多。
Home

如何训练和测试 AI 语言翻译系统

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2021 年 4 月 19 日

CPOL

3分钟阅读

viewsIcon

8358

downloadIcon

159

在本文中,我们将训练和测试我们在该系列的前一篇文章中创建的模型。

引言

谷歌翻译的效果非常好,它常常看起来像魔术。但它不是魔术——它是深度学习!

在本系列文章中,我们将向您展示如何使用深度学习来创建一个自动翻译系统。本系列可以被视为一个逐步教程,帮助您理解和构建神经机器翻译。

本系列假定您熟悉机器学习的概念:模型训练、监督学习、神经网络,以及人工神经元、层和反向传播。

前一篇文章中,我们建立了一个基于深度学习的模型,用于将英语自动翻译成俄语。在本文中,我们将训练和测试这个模型。

使用 LSTM 单元进行训练和测试

我们将开始训练和测试我们模型的核心:没有自注意力机制和词嵌入的 LSTM 单元。标准的 Keras 嵌入组件将提供从一组单词到向量的编码。

模型训练包括几个特定的任务

  • 标记输入数据(预处理)
  • 确定训练/自测数据比例
  • 模型的训练

我们将首先准备输入(源)数据和输出(目标)数据,以获得数值、固定大小的输入和输出模型。在完成此操作之前,我们无法将句子或单词输入到我们的 Keras 神经网络 (NN) 模型中。

我们将从创建一个 Keras 分词器开始,该分词器将从并行语料库中找到的单词中构建一个内部词汇表。让我们把它包装在一个函数中

### tokenizer ###
def tokenization(lines):
        #print(lines)
        tokenizer = Tokenizer()

        tokenizer.fit_on_texts(lines)
        return tokenizer

首先,我们必须使用 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 seq

一旦我们初始化了分词器,我们将调用 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)

让我们使用 Jupyter notebook 来训练和测试我们的模型。如果您在没有 GPU 的机器上运行,您可能希望在Colab上运行笔记本,因为它提供了免费的 GPU 启用笔记本实例。

处理我们数据集的前几条记录将为训练数据中的条目提供精确的结果,并为其他数据提供近似的转换。这让我们能够检查翻译器是否正常工作。

下表显示了英文的输入数据,然后是理想的俄语翻译,最后是模型翻译

俄语翻译器非常好,这可能是因为我们使用超过 400,000 个输入来训练该模型。

当然,它仍然不如专业的自动翻译系统好,这表明挑战有多么困难。一些缺陷立即显现出来。例如,句子 "you've been very good to me" 被翻译成 "ты был для мне очень мне" ("你对我来说很好")。

我们还可以通过简单地交换输出和输入数据来创建反向翻译(俄语到英语)。或者,为了尝试其他语言,我们可以从 Tatoeba 项目中加载任何其他训练集。

现在使用自注意力机制

接下来,让我们尝试使用启用了自注意力机制的模型。我们看到的结果好坏参半。在某些情况下,翻译接近完美(黄色),但在其他情况下,翻译没有改进,甚至质量不如没有自注意力机制的翻译(灰色)。

直观地说,这很有道理。注意力机制可以帮助模型关注句子中单词的重要性 - 并且句子越长,就越容易确定哪些单词重要,哪些不重要。使用自注意力机制的翻译模型通常会提供更好的结果,但它不会总是这样做,尤其是在较短的输入上。

后续步骤

下一篇文章中,我们将分析我们的模型产生的结果,并讨论基于 DL 的通用翻译器的潜力。敬请关注!

© . All rights reserved.