2015年,我们推出了Google手写输入(Google Handwriting Input),使用户能够在Android移动设备上手写文本,作为任何Android应用的附加输入法。首个发布版本支持82种语言,包括法语、盖尔语、汉语、马拉雅拉姆语等。为了提供更加无缝的用户体验,免除更换输入法的麻烦,我们去年在谷歌移动设备键盘Gboard for Android中增添了100多种语言的手写识别功能。
自此之后,机器学习的进步催生了一些新模型架构和训练方法,使我们能够修正初始方法(依赖于手工设计的启发式方法,将手写输入切割成单一字符),并且相较于旧版本,修正版本构建了能够处理整体输入的单个机器学习模型,极大降低输入错误率。年初,我们在Gboard中为所有基于拉丁字母的语言推出新模型,并发表了论文《Fast Multi-language LSTM-based Online Handwriting Recognition》,解释此版本发布背后的更多研究细节。本文中,我们将进一步概述这项工作。
触点、贝赛尔曲线(Bézier Curve)和循环神经网络
任何在线手写识别器都要首先解决触点问题。绘制的输入以笔画序列展现,并且每一个笔画反过来又是附有时间戳的各点的序列。由于Gboard适用于各类设备和屏幕分辨率,我们首先标准化触点坐标。之后,为了准确描述数据形状,我们将点序列转换为三次方贝赛尔曲线序列,用作循环神经网络的输入,其通过训练能准确识别书写的字符(该步骤更多细节见下文)。尽管贝塞尔曲线在手写识别领域有很长时间的使用传统,但把这些曲线作为输入很新颖,能够为不同采样率和准确率的设备提供一致的手写输入表征。该方法与先前使用分段-解码(segment-and-decode)方法的模型大不相同,后者对如何将笔画分解为字符(分段)以及之后从分解中找出最可能的字符序列(解码)作出多个假设。
该方法的另一个好处是贝塞尔曲线序列较输入点的底层序列更为紧凑,使该模型在输入过程中更容易获得时间依赖性——每条曲线都由起始和最终点以及另两个控制点定位的多项式表示,以确定曲线形状。为了找出能够准确表示输入的三次方贝塞尔曲线序列,我们采用一种最小化标准输入坐标和曲线之间平方距离的迭代法。下图展示了曲线拟合过程示例。用户手写输入以黑色表示。它包含186个触点,清楚表示单词go。黄色、蓝色、粉色和绿色这四个三次方贝塞尔曲线表示字母g(每个曲线有两个控制点),与之对应,橘色、青绿色和白色分别表示插值字母o的三条贝塞尔曲线。
字符解码
曲线序列表示手写输入,但我们仍需要将输入曲线序列转化为实际的书写字符。基于此,我们采用一种多层循环神经网络处理曲线序列,输出一个解码矩阵,它具备每一条输入曲线上所有可能字母的概率分布(表示哪些手写字母属于曲线的一部分)。
我们试验了多种类型的RNN,并最终确定采用双向准循环神经网络(QRNN)。准循环神经网络交替使用卷积和循环层,为高效并行化提供理论可能,在保持权重数相对较小的同时还能提供良好的预测性能。权重数与需要下载的模型大小有直接关系,所以越小越好。
为了“解码”贝塞尔曲线,循环神经网络生成一个矩阵,其中每一列对应一条输入曲线,每一行对应字母表中的一个字母。表示特定曲线的列可看作是字母表中所有字母的概率分布。但是,一个字母可以包含多条曲线(例如,上述字母g和o各包含四条和三条曲线)。循环神经网络输出序列的长度(通常与贝赛尔曲线数相匹配)和表示输入的实际字符数之间存在不匹配,这可以通过添加一个特殊的空白字符来解决,表示特定曲线没有输出,和Connectionist Temporal Classification(CTC)算法一样。我们使用有限状态机解码器(Finite State Machine Decoder),将神经网络的输出结果与被编码为加权有限状态接收器(weighted finite-state acceptor)的基于字符的语言模型结合起来。语言中常见的字符序列(如德语中的“sch”)会得到奖励,相反罕见的字符序列会被惩罚。流程如下图所示:
触点序列(如前图所示,以曲线分段进行颜色编码)被转化为更短的贝塞尔系数序列(示例中为7),分别对应一条曲线。基于QRNN的识别器将曲线序列转化为等长的字符概率序列,显示在解码矩阵中,且各行分别对应字母“a”到“z”和空白符号,其中每个条目的亮度对应其相对概率。从左至右浏览解码矩阵,大部分是空白的,但字母“g”和“o”显示为亮点,因此输出的文本是“go”。
相较于旧版本,新的字符识别模型更加简单,但它将错误率降低20%-40%,且速度也更快。但是,所有这一切需要在设备上进行实际操作。
使其在设备上操作
为了获得最佳的用户体验,准确的识别模型还不够,速度也要快。为了将识别模型(在TensorFlow中训练)在Gboard中的延迟尽可能降至最低,我们将其转化为TensorFlow Lite模型。这包括量化模型训练期间的权重,用每个权重一个字节取代之前的四字节,使得模型更小,推断时间也更短。此外,与使用完整TensorFlow实现相比,TensorFlow Lite模型能够降低APK大小,原因在于它专为小二进制大小进行过优化,仅包括推断所需的部分。
后续
除改进基于拉丁字母的语言识别器外,我们将继续挑战极限。谷歌手写团队已在推出新模型方面做出努力,以适用Gboard上支持的所有手写语言。
原文链接:https://ai.googleblog.com/2019/03/rnn-based-handwriting-recognition-in.html