全文共7264字,预计学习时长28分钟

谷歌实时翻译能替代人工翻译(极其强大的定制版)(1)

图源:unsplash

过去几年,机器翻译领域发生了变革。建立在深度学习基础上的新翻译系统,取代了语言学家数十年统计研究而建立的旧系统。像谷歌翻译这样的流行翻译产品从内部结构发生改变,用新的深度学习模式取代了原来的代码。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(2)

待训练的“西班牙语-英语”翻译模式的实际输出

这对每个人而言都是好事。深度学习方法不仅更准确,而且对语言学方面要求不高,并非只有语言学研究生学位才能理解。

理论上而言,它很简单,只要有足够的训练数据、保证计算机能力,任何人都能够建立自己的语言翻译系统。但独自建立翻译系统仍然是困难的,因为所需的数据量和计算能力对于普通爱好者来说简直是高不可攀的。

但是就像机器学习中的其他部分一样,机器翻译在迅速成长。工具越来越方便使用,GPU越来越强大,训练数据越来越丰富。你可以使用现成的硬件和软件构建语言翻译系统,它们足以应对实际项目的使用需要。最棒的是不需要向Google支付任何API费用就可以使用。

话不多说,现在就建立西班牙语-英语的翻译系统,把“生肉资源”高水平、高精度翻译出来!

谷歌实时翻译能替代人工翻译(极其强大的定制版)(3)

依靠神经网络的文本翻译

我们翻译系统的核心是神经网络,它能接受句子并输出该句的翻译。我以前写过关于机器翻译系统的历史,以及我们如何使用神经网络来翻译文本的文章,在这里摘取概要:

神经翻译系统实际上是两个神经网络端到端相互连接。第一个神经网络学习将字词序列(即句子)编码成能代表它意思的数组。第二个神经网络学习将这些数字解码成代表相同意思的单词。

这其中的诀窍在于,编码器接收源语言的单词,而解码器输出目标语言的单词。因此实际上,模型通过中间的数字编码学会了人类语言到另一种语言的映射:

谷歌实时翻译能替代人工翻译(极其强大的定制版)(4)

为了对句意进行编码和解码,将使用特殊类型的神经网络,它被称为递归神经网络神经网络。标准的神经网络没有记忆。如果给出相同的输入,它每次都会得到相同的结果。

相比之下,递归神经网络之所以“递归”,是因为最后的输入会影响下一个预测。这一点非常重要,因为句子中的每个单词都不是独立的。单词的意思取决于它在句子中的上下文。句子中的每个单词影响下一个单词的选用,这样能捕捉到上下文中的一些关联。

如果向神经网络展示单词“My”、“name”、“is”,然后要求它对单词“Adam”的含义进行编码,它将依据前面的单词知道“Adam”表示名字。

如果你精通机器学习,那聊到循环神经网络时很可能会打哈欠,请跳到下面的Linuxshell命令,开始训练自己的模型。毕竟机器学习领域是发展迅速,几年前绝对具有革命性的东西放到现在已经是老生常谈了。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(5)

图源:unsplash

不过,其实还有更前卫的方法,可以使用Transformer新型模型进行语言转换。Transformer模型更进一步,它通过模拟单词之间的交叉关系,而不是仅仅考虑单词的顺序,来捕捉句子中单词的上下文意义。

但是在这个项目中将使用循环神经网络,以保持训练时间的合理性,不过效果还是很好的!

谷歌实时翻译能替代人工翻译(极其强大的定制版)(6)

完整的翻译流程

这里将使用两个递归神经网络来翻译文本。训练第一个网络用西班牙语编码句子,并训练第二个将它们解码成英语。正如我在reddit上的评论,几乎每个拥有Python副本的高中生都知道如何创建递归神经网络了。

动手之前我们还需要处理凌乱的、真实世界数据的策略。人类非常擅长在没有任何帮助的情况下,从混乱的数据中提取信息。例如,下面这句话可以毫不费力地读出来:

cOMPuTERs are BAd at UNderStandING Messy DAtA.(计算机不擅长理解混乱的数据)

但只经过完全格式化文本训练的神经网络训练对此束手无策。神经网络没有能力去推断它们在训练数据之外的东西。如果神经网络以前从未见“cOMPuTERs”,它不会知道这与与“computers”含义相同。

解决方案是把文本规范化,尽可能多删除格式变化。确保文字在相同的上下文中以相同的方式大写,修正标点符号格式,清理随机添加的奇怪符号等。目的就是不管用户原始输入的方式,而要确保同一句话输入模型的方式完全相同。

举个文本规范化的例子:

谷歌实时翻译能替代人工翻译(极其强大的定制版)(7)

不管用户的大写键用得多么糟糕,“Hevisited London”这个句子都是以相同的方式规范化的。请注意London总是大写首字母的,因为它通常用作专有名词,而其他单词不是。

确保文本的格式像这样清楚,这将使神经网络的工作容易得多。下面是完整翻译流程的样子,以源文本版本开始、翻译版本结束:

谷歌实时翻译能替代人工翻译(极其强大的定制版)(8)

首先需要把文本分成几个句子。神经网络每次只能翻译一个句子,如果试图一次性输入整个段落,结果会很糟糕。把文本分割成句子似乎很容易,但实际上这是很棘手的任务,因为人们会用各种不同的方式嵌套标点符号、使用格式。

项目内使用Python编写的简单句子分割器,这样可以减少需要安装的第三方库的数量。如果这还不够,NLP库(比如spaCy)拥有复杂句子分割模型,可供使用。

接下来将文本规范化。这是最难做好的部分,如果在这偷懒,最终的结果将令人失望。有了规范化的文本,就可以将它提供给翻译模型。

需要注意的是,我们还需要反向文本规范化和句子分割步骤,才能生成最终的翻译。所以还需要去规范化的步骤,以及将文本重新组合成句子的步骤。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(9)

软件及硬件需求

Python 3

我们要使用Python3编写粘合代码,规范文本、执行翻译并输出结果。

机器翻译深度学习框架

相比于用TensorFlow或PyTorch这样的通用机器学习框架,项目将使用Marian NMT来实现翻译模型。Marian NMT基于c ,是专门为机器翻译设计的机器学习框架,它已自带几个神经转换模型体系结构。

Tensorflow和PyTorch非常适合进行实验和尝试新的神经网络设计。但是已经了解模型体系结构,试图扩展设计,和真实世界的用户打交道时,就不再需要通用工具了。

MarianNMT是专门的工具,旨在简单快捷搭建产品级的翻译系统。这里没必要费力气做重复的工作,只是举个例子说明机器学习从研究实验室进入日常使用,使得软件领域发展得越来越成熟。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(10)

图源:unsplash

带GPU(图形处理器)的桌面计算机

能运行Linux的计算机才能使用Marian。任何功能强大的计算机应该都可以办到。我用的是带有UbuntuLinux 18.04,Inteli7 CPU和32GB内存的桌面电脑。为了存储训练数据,我使用普通的SSD硬盘驱动器。

重点是计算机要有良好的NvidiaGPU和足够的视频内存。GPU要做大量的计算工作,所以值得花钱。

我用的是24GB内存的Nvidia TITAN RTX。选用至少有8GB视频内存的GPU。预算充足的话,GPU可以选择包括 GTX 1080 Ti 或GTX 2080 Ti。类似Nvidia TESLA或Quadro lines这样的服务器类GPU也可以胜任。

可以使用Marian加上单个GPU或者多个GPU并行来加速,但是每个GPU都需要有足够的内存来保存模型和训练数据。换句话说,两个4GB内存的GPU无法替代一个8GB内存的GPU。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(11)

准备好电脑

安装UbuntuLinux 18.04 LTS

尽管有微软支持,Marian 还是不能在Windows系统上运行。苹果的Mac OS也不支持。所以还是要忍痛在电脑上安装Linux系统,或者考虑从偏好的Cloud provider租借。

我个人推荐为项目购入 UbuntuLinux 18.04 LTS。尽管近日Ubuntu Linux 20.04 LTS宣发,但是深度学习库和GPU驱动器的更新还需要时间来适应新的Ubuntu版本。

除非准备好处理额外让你头疼的问题和个人安装问题,否则别买最新版本的Ubuntu。

安装Nvidia的CUDA和cuDNN库

Nvidia的CUDA和cuDNN库使得Marian能够利用GPU加快训练进程。因此在进行下一步之前,需要先安装CUDA和cuDNN。

在UbuntuLinux 18.04上,我建议安装CUDA/cuDNN版本10.1。这些可以很好应用在Marian上。

如果安装了不同的版本,后面的命令需要相对调整。Nvidia新版本中对CUDA的改动就很令人怨念,改动会导致不兼容旧软件。所以如果你不是按标准来的,做好需要自己再调试的准备。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(12)

图源:pcmag

安装Marian和训练脚本

在编译Marian之前,需要安装比Ubuntu18.04默认包含版本更新的CMake。还需要安装其他的先决条件。

但是不用担心,很简单。只要运行这些终端命令:

# Install newer CMake via3rd-party repo wget -O - apt.kitware/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add -sudo apt-add-repository 'deb apt.kitware/ubuntu/ bionic main'sudo apt-getinstall cmake git build-essential libboost-all-dev

请注意,这些命令会从第三方包存储库中提取包。所以记得检查这些命令在做什么,确保能够接受它们。

安装这些先决条件之后,运行以下命令来下载和编译Marian(包括示例和辅助工具,它们分布在不同的gitrepos中):

# Download and compile Marian cd ~ git clone github/marian-nmt/marian cd marian mkdir build cd build cmake -DCOMPILE_SERVER=on -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.1/ .. make -j4# Grab and compile the Marian model examples and helper tools cd ~/marian/ git clone github/marian-nmt/marian-examples.git cd marian-examples/ cd tools/ make

最后,我用Marian分享了将用来训练西班牙语-英语模型的脚本。这些都是基于Marian包含的罗马尼亚语翻译示例,修改成西班牙语到英语,并且扩大到更大的数据集。不妨利用起来这一点:

# Download theSpanish-to-English scripts for this article cd ~/marian/marian-examples git clone github/ageitgey/spanish-to-english-translation# Install the Python moduleswe'll use later cd spanish-to-english-translation sudo python3 -m pip install -r requirements.txt

你可以自由地调整这些脚本,使其适用于想要翻译的任何语言对。以拉丁语为基础的语言只需要少量变化,比如法语或意大利语;而不那么相似的语言,如汉语,则更麻烦一点。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(13)

如何寻找训练数据

为了训练翻译模式我们,需要数百万对相同的句子,唯一的不同是它们被翻译成两种语言。这被称为平行语料库:

谷歌实时翻译能替代人工翻译(极其强大的定制版)(14)

每一行都是一个句子,两个文件中的句子是对应的。

拥有的句子对越多,模型就能更好地学习如何翻译不同类型的文本。为了创建工业强度的模型,需要数以千万计,设置更多的训练句子。最重要的是,这些句子需要涵盖人类表达的各个范围,从正式文件到俚语笑话。

糟糕的翻译系统和像谷歌翻译这样强大系统之间最大的的区别,就在于训练数据的数量和种类!幸运的是,在2020年,我们可以在很多地方找到偶然产生的并行数据,通过巧妙的技巧将其转化为训练句子对。

对于正式文本和法律文本,有欧盟就足够了。他们将法律文件翻译为成员国的所有语言,包括英语和西班牙语。同样,也可以从联合国和欧洲中央银行等其他国际机构找到交叉翻译的法律文本。

历史写作相关的句子对可以从被翻译成不同语言的经典书籍中找到。可以选用没有版权的书籍,将这些作品的不同译本组合起来,创造出说的同一件事成对的句子。

对于非正式的谈话,有DVD作为参考。自1990年代后期推出DVD格式以来,几乎所有的电影和电视节目都有多种语言的机器可读字幕。可以将相同电影和电视节目的不同译本配对,创建平行数据。有字幕的其他新内容也适用,比如蓝光和YouTube视频。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(15)

图源:unsplash

现在知道在哪里可以找到这些数据了,但是清理和准备这些数据还有很多工作要做。幸运的是,在OPUS (开放平行语料库)中已经有相关内容,收集多语言的句子。我们可以在他们的网站上可以浏览和下载并列句数据。

稍后将运行的训练脚本会自动从OPUS下载这些数据源,提供近8500万个翻译过的句子对,而且不需要任何额外工作。

Opus通过语言对提供文件。因此如果想创建芬兰语-意大利语的翻译模型,而不是西班牙语-英语,那么可以通过下载该语言对的文件来实现这一点。只是不广泛使用的语言要找到句子对是很困难的。

另外请记住,有些语言需要独特的文本规范化方法,这些方法在本示例中没有涉及。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(16)

上图是欧洲议会的OPUS数据的可用语言对表。请注意,较少使用的语言相比英语等更广泛使用的语言,文件更小、数据更少。

这些数据来自不同的地方,质量参差不齐。下载数据中肯定存在错误或重复的数据。处理大型数据集时,数据质量没有办法得到保证,并且经常需要亲自动手发现和修复存在的明显问题。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(17)

训练数据的合并与准备

用于训练模型的脚本将自动下载并准备数据,但是如果希望为不同的语言对构建翻译模型,这需要讨论涉及的步骤。

从OPUS下载的每个数据源将包括两个文本文件。一个文本文件有英语句子列表,另一个文本文件有相同顺序的西班牙语句子匹配列表。所以最终会得到大量文本文件,就像这样:

谷歌实时翻译能替代人工翻译(极其强大的定制版)(18)

需要通过以下几个步骤来准备培训数据:

1.合并:合并所有的英文到单一的大文本文件。同样,组合所有的西班牙文本文件,确保所有的句子顺序不变,以便英文和西班牙文件仍然匹配。

2. 随机排列:随机排列每个文件中句子的顺序,同时保持英文和西班牙文文件中句子的相对顺序一致。混合不同来源的训练数据,帮助模型学习在不同类型的文本中进行归纳,而不是先学习翻译正式数据,然后学习翻译非正式数据等。

3.分割:每种语言的主数据文件分割成训练、开发和测试部分。根据大量的训练数据来训练模型,但是保留一些句子来测试模型,确保它正常工作。这确保测试的模型使用它训练中没看到的句子,所以能确定它不只是记住正确的答案。

用子词分割法处理新奇不常见的词

训练数据不可能涵盖所有可能单词,因为人们总是在创造新单词。因此,使用子词分割法处理翻译系统从未见过的单词。

子词分割法就是将单词分割成更小的片段,然后教会模型翻译每个单词片段。目的是当模型看到从未见过的单词时,它至少可以通过翻译子词来猜测单词的意思。

假设训练数据包含了单词low,lowest,newer,wider。不妨把单词分成词根和后缀:

· 词根: low, new, wid

· 后缀: est, er

假设需要翻译widest这个词。尽管这个词从来没有出现在训练数据中,模型知道如何翻译wid和est,因此通过将这两个子词的翻译放在一起,它将能够很好地猜测widest的意思。它在大部分情况下都能够很好运行,而且可以使翻译模型总体上更加准确。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(19)

图源:unsplash

使用的子词切割法的具体实现叫做BPE,或者字节对编码。在原始的研究论文中可以读到它是如何工作的。

使用BPE需要训练新的BPE模型来适应训练数据集,然后在文本规范化过程中,通过BPE模型运行文本需要包括额外的步骤。同样,在去规范化过程中也需要添加步骤,以便重新连接最终翻译中被BPE模型分割成单独子词的单词。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(20)

训练完整的翻译过程

下载训练数据、准备数据、创建BPE模型以及与Marian一起训练实际翻译模型的整个过程,都在同一个脚本中完成。要启动所有程序,请运行下述命令:

cd~/marian/marian-examples/spanish-to-english-translation/ ./run-me.sh

可以通过run-me.sh脚本来看看每个步骤发生了什么。这样做非常简单:下载培训数据、组合数据、使其正常化,然后启动Marian训练进程。

如果要构建产品级别的翻译系统,可以自由地依照自己的执行情况替换脚本。这个脚本只是需要执行步骤的指南。

在数据准备好,而且模型开始训练后,会看到如下输出:

[2020-05-01 10:09:23] Ep. 1 :Up. 1000 : Sen. 154,871 : Cost 70.37619781 : Time 370.45s : 5024.86 words/s

下面是这些缩写的指南:

· Ep. = Epoch (通过整套培训数据的次数)

· Up. = Updates(更新)

· Sen. = Sentences(句子)

这条消息表明目前在第一阶段,即第一次通过培训数据,而到目前为止,该模型已经更新了1000次,处理了154,871个句子对。

70.3的成本值体现模型训练过程在多大程度上找到了最佳解决方案。0.0的成本意味着该模型是完美的,总是将西班牙语句子转换成训练数据中完美匹配的英语翻译。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(21)

图源:unsplash

这不可能发生,因为模式永远不会是完美的,而且每个句子也并非只有一个正确的翻译。但是成本值越低,意味着培训过程越接近完成。

随着时间的推移,成本价值会下降,训练最终将自动结束。在我的系统中,训练过程大约需要一天,但是根据你个人的GPU和收集的训练数据的数量,你可能需要更长的时间。

训练过程会偶尔需要停顿一下,在一小组句子上验证模型的有效性,这些句子与训练集是分开的。这是为了确保模型在新数据上良好运行,而不仅仅是记住训练数据。

培训完成后,即1-2天后,所有的模型文件都将保存在/models/子文件夹中。这些文件是使用另一个程序时,翻译模型翻译新文本必需的文件。

没有时间自己做,可以下载预先训练好的模型吗?

如果不想等待1-2天的训练就想进入下一步,可以下载我的预先训练过的西班牙语-英语模型:

cd~/marian/marian-examples/spanish-to-english-translation/ wget github/ageitgey/spanish-to-english-translation/releases/download/0.1/model-spanish-to-english.tar.gz tar -zxvfmodel-spanish-to-english.tar.gz

谷歌实时翻译能替代人工翻译(极其强大的定制版)(22)

利用模型翻译新文本

到了最有趣的部分,来试试新翻译系统!

在文本翻译过程中,需要将文本与训练数据同样进行文本规范化处理,然后利用神经网络翻译文本,最后对输出文本进行规范化处理。

由于Marian模型本身相当大,因此将模型加载到内存中是转换过程中最慢的步骤之一。为了避免这种延迟,可以让Marian在内存中显示的“服务器模式”中运行,这样可以向其发送翻译个别请求。我们将使用服务器模式。

要启动Marian服务器,请在Terminal窗口中运行以下命令:

cd~/marian/marian-examples/spanish-to-english-translation/ ../../build/marian-server --port8080 -c model/model.npz.best-translation.npz.decoder.yml -d 0 -b 12 -n1--mini-batch 64 --maxi-batch 10 --maxi-batch-sort src

这使得服务器监听端口8080连接,使用文件model.npz.best-translation中描述的模型文件。

你得清楚Marian服务器只处理翻译过程中的“翻译 translation”步骤,它不进行任何文本规范化。

无论如何,不要直接将原始的、非规范化的文本发送到Marian服务器。如果那样做了,结果会很可怕!翻译的新文本需要与培训数据的格式完全匹配。这意味着需要对我们翻译的新文本使用相同的文本规范步骤。

不妨运行我编写的Python脚本来翻译示例文本。在Marian服务器已经运行的情况下,打开新的Terminal窗口,运行以下命令:

python3translate_sentences_example.py

现在将Python代码调用到与Marian相同的Perl脚本来规范化训练数据。这不是完全干净利索,但是很有效。

如果你有冒险精神,希望生产系统同样有挑战性,那么可以用纯Python重新编写这些Perl脚本,以避免这些shell调用,而且能加快处理速度。

谷歌实时翻译能替代人工翻译(极其强大的定制版)(23)

图源:unsplash

Python脚本中的示例文本是哈利波特小说第一部第一段的西班牙语版。应该得的输出如下:

Input: El niño que vivió. El señor y la señora Dursley, que vivían en el número 4 de Privet Drive,estaban orgullosos de decir que eran muy normales, afortunadamente.Output: The boy who lived. Mr. and Mrs. Dursley, who lived at number 4 on Privet Drive, were proud to saythey were very normal, fortunately. They were the last people who would expect to find themselves related tosomething strange or mysterious, because they weren't for such nonsense.

注意:如果出现错误,显示“连接拒绝”,请确保启动了Marian服务器,而且它仍然在另一个终端窗口中运行。

以下是我们翻译的《哈利波特》与英文原著的比较:

谷歌实时翻译能替代人工翻译(极其强大的定制版)(24)

虽然我们的翻译并不完全符合这本书的英文版本,但是它保证了意思的一致。如果读过西班牙语版本,会发现我们的翻译与西班牙语文本更接近。

可以将脚本中的示例文本替换为想要翻译的任何内容!现在已经有可以从Python调用的翻译模型,想干什么都可以了!它可以放在你创建的任何其他程序中。比如:

· 用feedparser库获取最喜欢的西班牙报纸的RSS提要,并自动翻译所有的报道。

· 编写程序来翻译meneame/帖子,这样就可以随时更新所有最热门的西班牙meme。

· 写个程序来完成西班牙语作业.

创建一个属于自己的翻译器,然后,好好玩耍吧!

谷歌实时翻译能替代人工翻译(极其强大的定制版)(25)

留言点赞关注

我们一起分享AI学习与发展的干货

如转载,请后台留言,遵守转载规范

,