爱奇艺多语言台词机器翻译技术实践

2021-07-27 13:41:55 浏览数 (1)

7月3日下午,爱奇艺技术产品团队举办了“i技术会”第16期技术沙龙,本次技术会的主题是“NLP与搜索”,邀请到了来自字节跳动、去哪儿和腾讯的技术专家,共同分享与探讨NLP与搜索结合的魔力。

其中,来自爱奇艺的技术专家张轩玮为大家带来了爱奇艺多语言台词机器翻译技术实践的分享。

本次分享的第一部分是多语言台词机器翻译实践开展的相关背景,第二部分是针对多语言台词机器翻译模型的一些探索和优化,最后是该模型的落地与应用情况。

1 多语言台词机器翻译实践的相关背景

爱奇艺旗下iQIYI App涉及大量长视频,而长视频的出海,重要的一环就是台词翻译。

目前,爱奇艺已在多个国家布局,涉及多种语言的台词翻译,主要有泰语、越南语、印尼语、马来语、西班牙语、阿拉伯语等等语言,这就使得多语言翻译成为了迫在眉睫的现实需求。

此外,与通用翻译相比,台词翻译有一些独有的特点如:

(1)台词一般句子较短,上下文信息不足,歧义性大;

(2)很多台词来源于OCR或ASR识别的结果,会有错误,可能影响翻译质量;

(3)在台词对话中往往会涉及很多人物的指代,故而角色名和代词的翻译对于台词翻译来说尤为重要;

(4)部分台词需要结合视频场景信息才能进行语义消歧。

1 多语言台词机器翻译模型的探索和优化

1.one-to-many翻译模型优化

首先介绍一下什么是one-to-many模型。

One-to-many顾名思义,即通过不同语言翻译之间的参数共享,通过一种模型来达到翻译多种目标语言的目的。

这个模型设计的初衷是节约维护和训练成本。前面已经讲到,目前,爱奇艺已经布局到海外多个国家,这就涉及到多种语言的翻译,如果采用一种语言一个模型的方法,随着目标语言的增多,我们需要训练、部署和维护的模型也会越来越多,导致运营成本的增加。

经调研,我们发现了one-to-many模型,它极大地减轻了模型的训练和部署维护的成本,可以充分利用不同语言之间迁移学习的特点,起到相互促进的作用,从而提高模型效果。

图1是transformer架构,是目前大多数机器翻译模型优化的主流框架,我们也是以此为基础,在上面进行优化。

图1:transformer模型

而针对one-to-many模型,我们借鉴近期大家较为熟悉的预训练模型BERT,设计了一个特定的输入形式。

图2

每个输入的token的表达都是由三种embedding组成,分别是:token embeddings、segment embeddings、 position embeddings。我们把语言类型token作为单独的一个域,那它具有不同于内容的segment embeddings。

segment embeddings由两部分组成,一个叫EA,一个叫EB。EA相当于前面语言的token的segment,后面的EB就是内容的embeddings,不同语言的L是不同的。

另外语言token表达也会作为decoder的第一个输入作为指导模型的解码。

2.融合台词上下文信息

刚才提到,台词翻译第一个显著特点就是文本较短,上下文信息不足,容易产生歧义。

这里举个例子,比如“我想静静”就可能有两种意思,一是let me alone,二是 I miss Jingjing。

仅凭文本,我们很难区分究竟是哪一个意思。

但我们如果能够结合台词的上句和下句,就可以减少这种歧义性。比如,上下句分别是“你走吧”、“再见”,我们就可以知道他想说的是let me alone。

因此,我们设计了用BERT style的方式融合台词上下文的模型,输入时将上文和下文分别与中心句进行拼接,以特定的分隔符做分隔,而在encoder输出,我们还会对上句和下句进行mask,因为在解码这个时候,由于上下句在编码时已经被中心句吸收了相关信息,上句和下句已经不起太多作用。并且,如果不进行mask,有可能还会引来一些翻译错位的问题。

那么我们是如何融合上下文的呢?

图3

也是在输入端,我们可以看到图3和图2的不同就在于我们除了把语言token和中心句用三种embedding向量融合之外,还会将上句“你走吧”和下句“再见”放在中心句的前后,然后以同样的方式,每个token也是三种embedding的相加融合,把上下文作为辅助信息,帮助中心句进行消歧。

我们把语言、上句、中心句、下句分别标记为EA、EB、EC、ED四种,对这四种信息进行区分,每一种标记都对应一种segment embedding。

这个输入经过encoder之后,我们会对“你走吧”和“再见”进行mask,也就是在解码的时候隐藏上句和下句,减少它对解码的影响。

3.增强编码能力

除此之外我们还对编码端做了一些提高。

Transformer里面一个比较主要的组件就是attention,其中base版本包含8个head。我们为了强化attention,鼓励不同的head学习不同的特征,从而丰富模型的表征能力。

下图是这4种attention的示意图。我们通过不同的mask策略实现不同的attention,图中黑色的方块代表mask掉的部分。

图4

global attention:建模任意词之间的依赖关系;

local attention:强制模型发掘局部的信息特征;

forward and backward attention:代表建模模型序列顺序信息。forward只能看到前面,backward只能看到后面。

通过人为设定特点的attention,我们强制不同的head学习不同的特征,避免产生冗余的情况。

除此之外我们还借鉴bert,使用Masked LM任务增强模型对文本的理解能力。

首先将输入的某一个词进行mask,然后在输出端进行恢复。比如“你走吧”,“我想静静”,“再见”,其中,“走”,“见”,都会被mask,输出的时候再被恢复。这就使得encoder在这种任务中充分地学习到文本的表达,增进它对文本的理解。同时将mlm loss乘以一定的权重加到总体的loss上,进行联合训练。

图5:MLM模型

4.增强解码能力

为了增强模型解码端的能力,在训练阶段,我们要求解码端在预测每个token的同时,增加对全局信息的预测,同时增强模型解码端的全局前瞻能力。

图6

比如这里的G代表let me alone的embedding的平均向量,每个token都会预测这个向量,从而产生GLOBAL loss。

这个好处就是你在解码每个token的时候,我们可以让模型也预计我们将要解码的信息,而不会过分依赖于我们前面已经解码的信息,这样就使得模型具有一定的未来规划的能力。同样这也会产生一个loss,这个loss会和总体loss进行加权求和,用了一个β,也是小于1的权重,和整体的模型进行联合训练。

5.欠翻译和过翻译问题的解决

欠翻译和过翻译是模型在做翻译时可能会经常遇到的一些问题。

欠翻译是指翻译的目标语言词语缺失,过翻译指的是目标语言词语冗余。

比如上文提到的“你走吧、我想静静、再见”这个案例,就有可能在模型训练不到位的时候产生let alone,缺少了me,这就是所谓的欠翻译。

另外,也有可能翻译成Let me me alone, 重复翻译me, 这就是所谓的过翻译。

这些都是我们不希望在翻译结果中出现的,而产生这两大问题的一个本质原因就在于解码生成的信息和编码的信息不够对等。

图7

所以我们增加了一个重建的模块,对其进行约束。

重建模块对解码端的输出通过一个反向翻译的decoder翻译成source,也就是恢复输入,从而使得解码端的信息和编码端的信息保持一致,约束解码端,从而减轻欠翻译和过翻译问题,同样它也会产生一个loss,和之前一样也是加到总体loss,进行联合训练。

6.增强容错能力

除了以上的探索优化之外我们刚才也提到了一点,就是我们的台词字幕有很大一部分是来源于OCR或者ASR识别的结果, 难免会出现一些词识别错误的问题,如果我们不进行特定处理有可能影响最后的翻译质量。

所以我们针对这个台词识别错误的问题,设计了一个容错模块。这个容错模块可以认为是纠错模块。我们借鉴了去年发表的一篇论文所提出的一个模型——T-TA模型。

这个模块类似大家应该很熟悉的transformer结构,但是我们在里面做了一些特定的处理:

首先是它使用了一种叫做language autoencoding的方式,输出的每个token只能看到其他的token,但看不到它自己。

也就是说,它输出的表达是由它周边的token的意思来产生的。比如X1是错的,但X2,X3,X4是对的,在你经过大量的数据训练之后,可以通过X2、X3、X4去生成正确的X1,从而达到一种纠错的能力。

那要怎么才能让每个token看不到它自己而只能看到周边呢?

图8

其实也很简单,就是使用了一个对角线mask的方式。这样,每次它就只能看到他其他的token,中间的黑色对角是看不见的,也就看不到它自己。通过这个方式,对深黄色那部分进行这样的特定处理,从而实现一种纠错能力。

我们可以注意到它的Q也只是用到position embedding,因为如果QKV和Self attention是一样的,再残差连接的话就会把token embedding给加到输出,相当于把你刚刚挖掉的部分又填补上了,会产生信息泄露的问题,这样就训练不出一种纠错的模块。所以Q只是position embedding。

这个模块大致就是这样,但是它们是怎么融合到机器翻译模型中呢?

图9

其实,只要直接和我们之前介绍的那些encoder进行相加融合,两个encoder输入都是一样的,输出进行相加融合,融合之后再进入后面的两个decoder的处理,这样就可以对原始encoder的错误进行纠正。比如这里的“静”错输成了“净”,但T-TA的encoder却能输出正确结果,起到了纠错的作用。

7.代词翻译

刚才我们也提到,在台词翻译领域另一个重要问题就是代词的翻译。

因为在对话中我们会涉及到很多人物之间的指代,比如提到你、我、他等等,在不同的场景下,对应的翻译是不同的,这就大大提高了台词翻译的难度。

遇到这种情况我们该怎么办呢?

针对这个问题,我们首先可以看一下它的表达数量以及表达场景。因为代词在中文里面可能很简单,就是你、我、他,可能也就最多3、4种或者4、5种,但在其他语言中未必是这样。

比如泰语的代词第一人称就有12种表达,第二人称代词有15种表达,第三人称有5种表达。对于第一人称,这12个表达还会随着性别和使用场合的不同而发生变化。

此外,对话人身份之间的差异,也会使得这种代词表达有所区别。这对于台词机器翻译来说,是一个巨大的挑战。所有这些不同场合都需要我们将其区分出来,而这项工作很难仅仅只通过文本来完成。

图10:中文-泰语人称代词对应表

因此,我们做了一个融合视频场景信息的代词的语义增强。

首先我们通过人脸识别和声纹识别对齐台词和角色,通过这种对齐可以使得每一句台词定位到它所处的场景。再将角色人物属性比如性别,年龄,人物关系,身份等标注好,使角色的信息更丰富、更加立体。

图11

左边的模型里面有两个代词,就是“你”和“我”,右边的模块是对“我”和“你”的一些信息的编码。比如“我”就属于男性,年龄是青年,“我”和对话人之间的关系是朋友等等。这样分别对“我”和“你”进行编码,编码后用这些信息做一个变换和降维,分别加到对应的代词上,使得解码的时候,知道这个代词所处的场景及人物关系,从而使它能够解码出正确的代词翻译。

8.成语翻译

除代词外,成语的翻译在台词机器翻译中也是比较困难的一个部分。这是因为:

(1)随着多年演变,很多成语都不再只是它字面的意思,而是包含了很多引申义。

这时候如果我们不做特定处理的话,极有可能仅将字面意思翻译出来,影响翻译准确度。所以,我们需要其他的辅助信息,比如释义等。

(2)有些成语具有语义独立的特点,也就是说某个成语的含义和上下文没有那么大的关联。

针对这两个特点,我们设计了针对成语翻译的模块,使用预训练的BERT,对中文以及中文释义进行编码,直接替换encoder的成语输入和添加到encoder的输出,来确保成语真正含义的表达能够在模型中学习得到。

图12

9.角色名翻译

针对这一部分,我们是通过增加特殊标识以及数据增强的方式,使得模型学习到特定的拷贝能力。大部分的台词从中文翻译到对应的语言的时候,角色名都是以拼音作为翻译的。当然在一些不适宜拼音的语言中,也会有一些其他的对应关系,在这里我们暂且以拼音为例。

我们首先将人名替换成拼音,因为这时候它的真正的文本已经不重要了,最重要的是它将要翻译的目标语言。

比如在图13这个例子中,“你认识李飞吗?”,我们首先将李飞中文替换成拼音li fei,对其增加一个特殊的标识,这也就是想告诉模型:这部分是要拷贝过去的。

图13

另外,为了增加模型见过的拼音输入表达的数量,我们通过训练集挖掘了人名和姓氏的模板将其与伪名字合并成增强的数据,将增强数据和原来的数据串在一起进行训练,使得模型能学到足够的拷贝能力。

这种方式通过训练模型,使得机器能够识别这种标识以及里面的拼音,将其复制到对应的位置。

3 多语言台词机器翻译在爱奇艺的落地应用

我们在多语言台词机器翻译模型上做了一些优化探索后,也对优化后模型的质检差错率做了一些评测,这里列举一部分。

图14:各语言质检差错率

图中的每种语言都有第三方机器、人工、自研机器三种翻译,其中,自研的机器翻译就是我们自己经过模型探索、优化后的效果。

从图14可以看出,我们自研的翻译差错率已经明显低于第三方,这个第三方指的目前市场上最好的第三方。在泰语、印尼语、英语等语言中,我们自研的机器翻译已经接近于人工,而在马来语、西班牙语、阿拉伯语的翻译中,自研翻译甚至已经超过人工。

此外,我们做的翻译主要应用在国际站长视频出海的项目中,目前已经支持从简体中文到印尼语,马来语,泰语,越南语,阿拉伯语,繁体中文等多种语言的翻译。

0 人点赞