在 Pixel 6 上键入时进行语法校正

作者:谷歌研究院软件工程师 Tony Mak 和大脑团队谷歌研究院首席工程师 Simon Tong

尽管智能手机取得了成功并被广泛采用,但使用它们编写较长的文本仍然相当麻烦。正如人们所写的那样,语法错误通常会潜入文本中(在正式情况下尤其不受欢迎),并且在控制有限的小型显示器上纠正这些错误可能会很耗时。

为了解决其中的一些挑战,我们推出了直接内置于Pixel 6上的Gboard中的语法更正功能,该功能完全在设备上运行,以保护隐私,在用户打字时检测并建议更正语法错误。构建这样的功能需要解决几个关键障碍:内存大小限制、延迟要求和处理部分句子。目前,该功能能够纠正英语句子(我们计划在不久的将来扩展到更多语言),并且几乎可以在任何带有 Gboard 1的应用程序上使用。

在 Pixel 6 上键入时进行语法校正

Gboard 建议如何在用户键入时纠正不合语法的句子。

模型架构
我们训练了一个序列到序列的神经网络来获取输入句子(或句子前缀)并输出语法正确的版本——如果原始文本已经语法正确,则模型的输出与其输入相同,表示不需要更正。该模型使用混合架构,将Transformer 编码器与LSTM 解码器相结合,这种组合提供了质量和延迟的良好平衡。

在 Pixel 6 上键入时进行语法校正

移动设备受限于有限的内存和计算能力,这使得构建高质量的语法检查系统变得更加困难。我们使用一些技术来构建小型、高效且功能强大的模型。

  • 共享嵌入: 因为模型的输入和输出在结构上相似(例如,都是同一种语言的文本),我们在 Transformer 编码器和 LSTM 解码器之间共享了一些模型权重,这大大减少了模型文件的大小,而无需过度影响准确性。
  • 分解嵌入:该模型将一个句子拆分为一系列预定义的标记。为了获得良好的质量,我们发现使用大量预定义标记词汇表很重要,但这会大大增加模型的大小。分解嵌入将隐藏层的大小与词汇嵌入的大小分开。这使我们能够拥有一个词汇量很大的模型,而不会显着增加总权重的数量。
  • 量化:为了进一步减小模型大小,我们执行训练后量化,这允许我们仅使用 8 位存储每个 32 位浮点权重。虽然这意味着每个权重都以较低的保真度存储,但我们发现模型的质量并未受到实质性影响。
  • 通过采用这些技术,生成的模型仅占用 20MB 的存储空间,并在 Google Pixel 6 CPU 上在 22 毫秒内对 60 个输入字符进行推理。

    训练模型
    为了训练模型,我们需要<
    原始校正>文本对形式的训练数据。

    生成小型设备上模型的一种可能方法是使用与基于云的大型语法模型相同的训练数据。虽然这些数据产生了相当高质量的设备模型,但我们发现使用称为硬蒸馏的技术来生成与设备域更好匹配的训练数据会产生更好的质量结果。

    硬蒸馏的工作原理如下:我们首先从公共网络上收集了数亿个英语句子。然后,我们使用基于云的大型语法模型为这些句子生成语法更正。然后,这个 < original , Corrected > 句子对的训练数据集用于训练可以纠正完整句子的较小的设备上模型。我们发现,与基于用于训练基于云的模型的原始数据构建的类似大小的设备上模型相比,从该训练数据集构建的设备上模型产生的建议质量明显更高。

    然而,在根据这些数据训练模型之前,还有一个问题需要解决。为了使模型能够在用户键入时纠正语法(移动设备的一项重要功能),它需要能够处理句子前缀。虽然这可以在用户只输入句子的一部分时进行语法校正,但此功能在消息传递应用程序中特别有用,在这些应用程序中,用户通常会省略句子中的最后一个句点,并在他们完成输入后立即按下发送按钮。如果语法纠正只在完整的句子上触发,它可能会漏掉很多错误。

    这就提出了如何确定给定句子前缀在语法上是否正确的问题。我们使用启发式来解决这个问题——如果一个给定的句子前缀可以完成以形成一个语法正确的句子,那么我们就认为它是语法正确的。如果不是,则认为它是不正确的。

    用户到目前为止输入的内容

    建议的语法修正

    She puts a lot

    She puts a lot of

    She puts a lot of effort

    She puts a lot of effort yesterday

    Replace “puts” with “put in”.

    GEC 关于不完整的句子。有效的句子前缀没有更正。

    我们创建了第二个数据集,适用于训练基于云的大型模型,但这次侧重于句子前缀。我们使用上述启发式方法生成数据,方法是从基于云的模型的训练数据集中获取 < original , correct > 句子对,并从中随机抽取对齐的前缀。

    例如,给定 < original , correct > 句子对:

    原句:She puts a lot of effort yesterday afternoon.
    更正句:She put in a lot of effort yesterday afternoon.

    我们可能会采样以下前缀对:

    原前缀:She puts
    更正前缀:She put in
    原前缀:She puts a lot of effort yesterday
    更正前缀:She put in a lot of effort yesterday

    然后,我们使用神经语言模型(在本质上类似于SmartCompose使用的模型)将每个原始前缀自动补全为一个完整的句子。如果一个全句语法模型在整个句子中没有发现错误,那么这意味着至少有一种可能的方式来完成这个原始前缀而不会产生任何语法错误,因此我们认为原始前缀是正确的并输出 <原始前缀,原始前缀> 作为训练样例。否则,我们输出<原始前缀更正前缀>。我们使用这些训练数据训练了一个基于云的大型模型,该模型可以纠正句子前缀,然后使用该模型进行硬蒸馏,生成新的<与设备上域更好匹配的 原始更正>句子前缀对。

    最后,我们通过将这些新的句子前缀对与完整的句子对相结合,构建了设备端模型的最终训练数据。然后,在此组合数据上训练的设备上模型能够纠正完整的句子和句子前缀。

    在 Pixel 6 上键入时进行语法校正

    设备上模型的训练数据是从基于云的模型生成的。 设备上模型的训练数据是从基于云的模型生成的。

    Grammar Correction On-Device
    Gboard 向设备上的语法模型发送一个请求,只要用户输入了三个以上的单词,无论句子是否完成。为了提供优质的用户体验,我们在语法错误下划线,并在用户与其交互时提供替换建议。但是,该模型只输出正确的句子,因此需要将其转换为替换建议。为此,我们通过最小化Levenshtein 距离(即,将原始句子转换为正确句子所需的编辑次数)来对齐原始句子和纠正句子。

    在 Pixel 6 上键入时进行语法校正

    通过将更正的句子与原始句子对齐来提取编辑。

    最后,我们将插入编辑和删除编辑转换为替换编辑。在上面的示例中,我们将建议的“in”插入转换为建议将“puts”替换为“put in”的编辑。我们同样建议用“努力”代替“努力”。

    结论
    我们通过设计紧凑的模型架构并在训练期间通过硬蒸馏利用基于云的语法系统,构建了一个小型的高质量语法校正模型。这种紧凑的模型使用户能够完全在他们自己的设备上更正他们的文本,而无需将他们的击键发送到远程服务器。

    致谢
    我们非常感谢其他团队成员的重要贡献,包括 Abhanshu Sharma、Akshay Kannan、Bharath Mankalale、Chenxi Ni、Felix Stahlberg、Florian Hartmann、Jacek Jurewicz、Jayakumar Hoskere、Jenny Chin、Kohsuke Yatoh、Lukas Zilka、Martin Sundermeyer、 Matt Sharifi、Max Gubin、Nick Pezzotti、Nithi Gupta、Olivia Graham、Qi Wang、Sam Jaffee、Sebastian Millius、Shankar Kumar、Sina Hassani、Vishal Kumawat 和张元博、李云鹏、戴玉新。我们还要感谢 Xu Liu 和 David Petrou 的支持。

    来源:穗虔居士

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年2月2日
    下一篇 2022年2月2日

    相关推荐