Bootstrap

九耶丨钛伦特-教你项目实战机器翻译

       翻译是人类社会中一种重要的工作,它指的是把用一种语言书写的内容以另一种语言重

       新编写出来,这项工作往往由专业人士完成。 人工智能致力于把人从繁重的工作中解放出来,翻译这一需要大量经验和人工的任务自然受到了人工智能领域的关注。我们把计算机自动完成翻译任务这一过程称为机器翻译。

       深度神经网络(DNN)是功能强大的模型,已在困难的学习任务上取得了出色的表现。

       尽管只要有大型的训练集可用, DNN 都能很好地工作,但是它们不能用于将序列映射到序列。我们在这一节了一种通用的端到端序列(seq2seq) 学习方法, 这一方法使用多层的循环神经网络( RNN) 将输入序列映射到固定维数的向量,然后使用另一个深度循环神经网络(RNN) 解码目标序列。

       一、准备数据

       深度学习的第三次高潮与大数据密不可分,数据对于深度神经网络的训练也至关重要,

       因此我们在这一节介绍如何为机器翻译任务准备数据。为了充分了解数据的预处理过程,我们给定文本文件的数据集, 详细介绍如何把文本文件一步一步转化为 Pytorch 支持的张量类型。我们首先导入必要的库

       接下来我们给出数据处理的具体流程:

        (1) 逐行读取训练文本文件;

        (2) 分别统计每种语言的词频数,取词频数前 K 大的词作为字典;

        (3) 根据(2)中得到的字典,分别对两种语言逐句生成句向量;

        (4) 对(3)中得到的句向量作筛选,满足条件的形成训练集

        (5) 分别读取验证和测试文本文件,根据(2)中得到的字典,生成验证集和测试集。

       详细代码如下:

       生成了训练集、验证集和测试集之后,我们还需对数据作填充处理。对于中文句子,句

       尾填充<pad>,对于英文句子,句首添加<sos>,句尾添加<eos>,然后再填充<pad>。具体代码如下:

       ​至此,我们完成了对数据的全部预处理,得到了训练集( X_train, Y_train),验证集(X_valid, Y_valid)和测试集(X_test, Y_test)。

       二、网络结构

       网络结构是在深度学习中至关重要。 序列到序列(seq2seq)是一种经典机器翻译中经典的结构,它分为编码器(encoder)和解码器(decoder)两部分。在这一章中,编码器的输入是中文句子,输出是状态向量,解码器的输入是编码器的输出,利用循环神经网络的特性,逐个输出翻译的单词。其网络结构图如下

       ​在图中,我们给出了如何把“我爱学习”翻译成“I love learning”的例子,其中,

       “我爱学习”对应的是编码器部分,而输出英文的部分则为解码器。利用循环神经网络,编码器逐个接受中文单词作为输入,而解码器接收了编码器的输出(即编码器中循环神经网络的隐藏状态),解码器把上一个神经元的输出作为当前神经元的输入,取输出概率最大的单词,作为翻译结果。

       值得一提的是,在训练时,因为解码器从第二个单词起每一个输出都严重依赖于上一个单词,如果前面的单词翻译错误,后面将很难有机会改正过来,因此,我们在选取解码器的输出时,不再取最大概率对应的单词,而是以一个随机概率决定是否选择最大概率对应的单词,如果不选择最大概率对应的单词,则下一个神经元的输入为当前神经元输出对应的真实目标(Ground Truth)。具体代码如下:

;