当前位置:首页 > 问答 > 正文

基于深度学习的手写汉字识别输入法设计与实现研究

你看,这就是我做这个研究的起点,挺个人化的,不是什么宏大的“推动人工智能发展”,就是想解决一个身边的具体问题,这事儿说起来简单,真做起来,坑可太多了。

为啥是深度学习? 传统方法也试过啊,什么笔画提取、结构分析,规则定得死死的,但汉字这玩意儿太邪乎了,同一个“的”字,我写的、你写的、书法家写的,可能完全是三个物种,用死规则去套,就像想用一把钥匙开全世界的锁,根本行不通,深度学习的好处就在于,它不跟你讲道理,它“看”过海量的例子后,自己琢磨出规律,这有点像教小孩认字,你不需要告诉他“永字八法”,你只需要指着不同的“永”字反复说“这是永”,他看多了自然就认识了,我们的模型干的就是这个事儿。

基于深度学习的手写汉字识别输入法设计与实现研究

数据就是个头疼的大问题。 公开的数据集,比如CASIA,是好,但里面的字都太“标准”了,跟印刷体似的,真实世界的手写,那是千奇百怪,我记得为了增加数据的多样性,我干过一件特别“蠢”的事:拉着我们实验室的师兄师弟师姐师妹,每人给我抄了十遍《静夜思》,结果呢?同一个“月”字,有写得像月牙的,有写得像根香蕉的,还有个哥们儿写得像个括号!当时我看着这些“杰作”,真是哭笑不得,但转念一想,这不就是最真实的用户数据吗?模型要是连这些“妖魔鬼怪”都能认出来,那才叫真本事,数据清洗和增强这块,我们花了巨大的精力,有时候感觉不是在搞AI,而是在做手工活。

模型设计上,我也有点自己的“小固执”。 一开始大家都用经典的CNN(卷积神经网络),像处理图像一样一个字一个字地认,但我觉得这不够“中文”,汉字是有笔顺的,是有时间序列信息的,你写一个“王”字,先写两横再写一竖,和先写一竖再写两横,感觉完全不对,我坚持在模型里加入了能处理序列信息的模块,比如LSTM或者Transformer,这相当于让模型不仅“看”到字的静态样子,还能“感受”到它一笔一画写出来的动态过程,这个想法在实验里确实证明有效,尤其对那些写得比较潦草、结构有点散架的字,识别率提升挺明显的,模型也变得更复杂了,训练起来更耗时,有时候跑一晚上实验,早上起来一看结果,想死的心都有。

基于深度学习的手写汉字识别输入法设计与实现研究

最让我有感触的,其实是“输入法”这部分。 识别出一个字,只是万里长征第一步,怎么让它变成一个好用的输入法?这里面的学问大了去了。联想和纠错,用户写了个“我”,你接下来是推荐“们”、“的”还是“爱”?这需要结合语言模型,更常见的是,用户写了一半,可能自己都觉得写得太丑了,划掉了,或者连续写了好几个字黏在一起,这时候,系统不能傻乎乎地只认单个字,得有点“眼力见儿”,去猜用户的意图,我调试这部分的时候,经常自己当“小白鼠”,胡乱写一堆,然后看系统怎么反应,有时候它猜对了,我会开心得像个傻子;有时候它牛头不对马嘴,我又会气得对着屏幕骂它“笨蛋”,这种又爱又恨的感觉,估计只有亲手带过“孩子”的人才能懂。

说到最后,这个项目做下来,我最大的体会是:技术终究是为人服务的,我们搞深度学习的,容易陷在模型、参数、准确率的数字游戏里,却忘了最开始想解决的问题是什么,那个最初的画面——我爸能轻松地用手写输入法给我发一条长长的微信——始终是驱动我前进的动力,现在的版本还远谈不上完美,识别速度、对连笔字的适应性、还有在低功耗设备上的部署,都是下一步要啃的硬骨头。

但至少,我让我爸试了试我们的原型系统,他戴着老花镜,小心翼翼地在平板电脑上写下“晚上回家吃饭”几个字,当系统几乎瞬间识别出来时,他脸上那种惊讶又带点喜悦的表情,让我觉得,之前熬的那些夜,掉的那些头发,都值了,这可能就是做应用研究最迷人的地方吧,你能真切地看到技术如何一点点改变普通人的生活,路还长,但方向,我觉得是没错的。