使用Amazon Translate Active自定义翻译构建多语言自动翻译流程
Dive into Deep Learning ( D2L.ai ) 是一本开源教材,让深度学习变得易于理解。它提供了包含 PyTorch、JAX、TensorFlow 和 MXNet 自包含代码的交互式 Jupyter 笔记本,以及实际应用示例、图表和数学内容。到目前为止,D2L 已经被世界上400多所大学采用,例如剑桥大学、斯坦福大学、麻省理工学院、卡内基梅隆大学和清华大学。此工作也提供了中文、日文、韩文、葡萄牙文、土耳其文和越南文版本,并计划推出西班牙语和其他语言版本。
拥有一本在线书籍,它由多个作者持续更新,并提供多种语言版本,是一项具有挑战性的任务。在本文中,我们介绍了 D2L.ai 用于解决这一挑战的解决方案。这是通过使用亚马逊翻译的 Active Custom Translation (ACT) 功能和构建多语言自动翻译流水线来实现的。
我们演示了如何使用 AWS 管理控制台和 Amazon Translate 公共 API 提供自动批量机器翻译,并分析英语和中文、英语和西班牙语之间的翻译。我们还建议在此自动翻译流水线中使用 Amazon Translate 时的最佳实践,以确保翻译质量和效率。
解决方案概述
我们使用 Amazon Translate 中的 ACT 功能构建了多种语言的自动翻译流水线。ACT 允许您通过提供平行数据形式的定制翻译示例,即时定制翻译输出。平行数据包括源语言中的一组文本示例和一个或多个目标语言中的所需翻译。在翻译过程中,ACT 自动选择平行数据中最相关的段落,并基于这些段落对翻译模型进行即时更新。这导致翻译结果更符合平行数据的风格和内容。
该体系结构包含多个子流水线,每个子流水线处理一种语言翻译,例如英语到中文、英语到西班牙语等。多个翻译子流水线可以并行处理。在每个子流水线中,我们首先使用人工翻译的 D2L 书籍的高质量数据集在 Amazon Translate 中构建平行数据。然后我们在运行时生成定制的机器翻译输出,从而实现更好的质量和准确性。
在接下来的几节中,我们将演示如何使用 Amazon Translate 与 ACT 构建每个翻译流水线,以及如何使用 Amazon SageMaker 和 Amazon Simple Storage Service (Amazon S3) 运行翻译过程的 Jupyter 笔记本。
先决条件
要按照本文中的步骤操作,请确保您拥有以下 AWS 帐户:
- 访问 AWS Identity and Access Management (IAM) 以进行角色和策略配置
- 访问 Amazon Translate、SageMaker 和 Amazon S3
- 一个 S3 存储桶用于存储源文档、参考文档、平行数据集和翻译输出
创建 Amazon Translate 与 ACT 的 IAM 角色和策略
我们的 IAM 角色需要包含一个 Amazon Translate 的自定义信任策略:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"Service": "translate.amazonaws.com"
},
"Action": "sts:AssumeRole"
}]
}
此角色还必须具有权限策略,以授予 Amazon Translate 对 Amazon S3 中包含源文档的输入文件夹和子文件夹的读取访问权限,并授予 Amazon Translate 对包含翻译文档的输出 S3 存储桶和文件夹的读写访问权限:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
“s3:DeleteObject”
]
"Resource": [
"arn:aws:s3:::YOUR-S3_BUCKET-NAME"
]
}]
}
要在SageMaker中运行翻译作业的Jupyter笔记本,我们需要向SageMaker执行角色授予内联权限策略。该角色将Amazon Translate服务角色传递给SageMaker,允许SageMaker笔记本在指定的S3存储桶中访问源文档和翻译后的文档:
{
"Version": "2012-10-17",
"Statement": [{
"Action": ["iam:PassRole"],
"Effect": "Allow",
"Resource": [
"arn:aws:iam::YOUR-AWS-ACCOUNT-ID:role/batch-translate-api-role"
]
}]
}
准备平行数据训练样本
ACT中的平行数据需要通过由文本示例对列表组成的输入文件进行训练,例如,源语言(英语)和目标语言(中文)的一对。输入文件可以是TMX、CSV或TSV格式。下面的截图显示了CSV输入文件的示例。第一列是源语言数据(英语),第二列是目标语言数据(中文)。以下示例摘自D2L-en书和D2L-zh书。
在Amazon Translate中执行自定义平行数据训练
首先,我们按照以下截图设置S3存储桶和文件夹。 source_data
文件夹包含翻译之前的源文件;批处理翻译后生成的文件放在输出文件夹中。 ParallelData
文件夹保存在上一步中准备的平行数据输入文件。
在将输入文件上传到 source_data
文件夹后,我们可以使用 CreateParallelData API 在 Amazon Translate 中运行平行数据创建作业:
S3_BUCKET = “YOUR-S3_BUCKET-NAME”
pd_name = “pd-d2l-short_test_sentence_enzh_all”
pd_description = “Parallel Data for English to Chinese”
pd_fn = “d2l_short_test_sentence_enzh_all.csv”
response_t = translate_client.create_parallel_data(
Name=pd_name, # pd_name 为平行数据名称
Description=pd_description, # pd_description 为平行数据描述
ParallelDataConfig={
'S3Uri': 's3://'+S3_BUCKET+'/Paralleldata/'+pd_fn, # S3_BUCKET 为上一步中定义的 S3 存储桶名称
'Format': 'CSV'
},
)
print(pd_name, ": ", response_t['Status'], " created.")
要使用新的训练数据集更新现有平行数据,可以使用 UpdateParallelData API:
S3_BUCKET = “YOUR-S3_BUCKET-NAME”
pd_name = “pd-d2l-short_test_sentence_enzh_all”
pd_description = “Parallel Data for English to Chinese”
pd_fn = “d2l_short_test_sentence_enzh_all.csv”
response_t = translate_client.update_parallel_data(
Name=pd_name, # pd_name 为平行数据名称
Description=pd_description, # pd_description 为平行数据描述
ParallelDataConfig={
'S3Uri': 's3://'+S3_BUCKET+'/Paralleldata/'+pd_fn, # S3_BUCKET 为上一步中定义的 S3 存储桶名称
'Format': 'CSV'
},
)
print(pd_name, ": ", response_t['Status'], " updated.")
我们可以在Amazon Translate控制台上检查训练作业进度。当作业完成时,平行数据状态显示为Active,可以使用。
使用并行数据运行异步批量翻译
批量翻译可以在一个过程中进行,多个源文件将自动翻译成目标语言的文档。该过程涉及将源文件上传到S3存储桶的输入文件夹中,然后应用Amazon Translate的StartTextTranslationJob API来启动异步翻译作业:
S3_BUCKET = “YOUR-S3_BUCKET-NAME”
ROLE_ARN = “THE_ROLE_DEFINED_IN_STEP_1”
src_fdr = “source_data”
output_fdr = “output”
src_lang = “en”
tgt_lang = “zh”
pd_name = “pd-d2l-short_test_sentence_enzh_all”
response = translate_client.start_text_translation_job (
JobName='D2L_job',
InputDataConfig={
'S3Uri': 's3://'+S3_BUCKET+'/'+src_fdr+'/', # S3_BUCKET是在上一步中定义的S3存储桶名称
# src_fdr是包含源文件的S3存储桶中的文件夹
'ContentType': 'text/html'
},
OutputDataConfig={
'S3Uri': 's3://'+S3_BUCKET+'/’+output_fdr+’/', # S3_BUCKET是在上一步中定义的S3存储桶名称
# output_fdr是包含翻译文件的S3存储桶中的文件夹
},
DataAccessRoleArn=ROLE_ARN, # ROLE_ARN是在上一步中定义的角色
SourceLanguageCode=src_lang, # src_lang是源语言,如'en'
TargetLanguageCodes=[tgt_lang,], # tgt_lang是目标语言,如'zh'
ParallelDataNames=pd_name # pd_name是在上一步中定义的并行数据名称
)
我们从D2L书籍(D2L-en)中选取了五个英文源文件进行批量翻译。在Amazon Translate控制台上,我们可以监控翻译作业的进度。当作业状态变为已完成时,我们可以在S3存储桶的输出文件夹中找到中文翻译文档(D2L-zh)。
评估翻译质量
为了展示Amazon Translate中ACT功能的有效性,我们还应用了Amazon Translate实时翻译的传统方法,而不使用并行数据处理相同的文档,并将其与具有ACT的批量翻译输出进行了比较。我们使用BLEU(双语评估估计)得分来衡量两种方法之间的翻译质量。精确衡量机器翻译输出质量的唯一方法是让专家对质量进行评分。然而,BLEU提供了两个输出之间相对质量改进的估计。BLEU得分通常是一个0-1之间的数字;它计算机器翻译与参考人类翻译之间的相似度。得分越高,自然语言理解(NLU)的质量越好。
我们测试了四个流程中的一组文件:英语到中文(en到zh)、中文到英语(zh到en)、英语到西班牙语(en到es)和西班牙语到英语(es到en)。下图显示,使用ACT进行的翻译在所有翻译流程中产生了更高的平均BLEU得分。
我们还观察到,平行数据对越精细,翻译性能越好。例如,我们使用以下包含10个段落对的平行数据输入文件。
对于相同的内容,我们使用以下包含16个句子对的平行数据输入文件。
我们使用两个平行数据输入文件在Amazon Translate中构建了两个平行数据实体,然后使用相同的源文档创建了两个批量翻译作业。下图比较了输出翻译结果。结果显示,使用成对句子的平行数据的输出优于使用成对段落的平行数据,对于英汉翻译和汉英翻译都是如此。
如果您想了解更多关于这些基准分析的信息,请参考《深度学习之跃》中的自动机器翻译和同步。
清理
为避免未来的重复成本,我们建议您清理您创建的资源:
- 在Amazon Translate控制台上,选择您创建的平行数据并选择删除。或者,您可以使用DeleteParallelData API或AWS命令行界面(AWS CLI)delete-parallel-data命令来删除平行数据。
- 删除用于托管源文档、参考文档、翻译文档和平行数据输入文件的S3存储桶。
- 删除IAM角色和策略。有关说明,请参阅删除角色或实例配置文件和删除IAM策略。
结论
通过此解决方案,我们旨在将人类翻译工作负载减少80%,同时保持翻译质量并支持多种语言。您可以使用此解决方案来提高翻译质量和效率。我们正在努力改进其他语言的解决方案架构和翻译质量。
我们随时欢迎您的反馈,请在评论部分留下您的想法和问题。