第一篇文章提出,这种模型下验证码的识别率达到了90%以上。这个结论不完全真实。对我们自己生成的验证码,识别率确实能达到这么高,但对于我们用于参照的某网站的真实下载的验证码来说,识别率却只能达到30%左右。这个差距是如何产生的?
首先让我们思考文字识别的本质是什么?对一个“字”而言,什么是其最本质的特征?字的尺寸大小?笔迹的粗细?风格(即字体,包括扭曲)?颜色?显然,这些都不是本质的特征。一个“红”字即使使用蓝色的颜色来书写,它仍然是“红”字;一个“小”字无论被写得有多大,它仍然是“小”字。然而,我们构建的卷积神经网络,由于其复杂性,你怎么知道它没有把上面这些非本质的风格当成区别文字的重要特征呢?
这里我提出一个重要猜想,神经网络倾向于过度学习数据的特征--从而导致它的泛化能力弱。我们在很多时候需要大量数据用于学习,其实是在做减法,通过大量的数据告诉神经网络,之前学习到的特征并非本质特征,应该通过后面的数据去减掉前面学习到的非本质特征。
再回到文字识别。定义一个字之所以是这个字,而不是另外一个字的本质特征,是笔画的连通性,而不是其笔画的长短、粗细、颜色、曲直。比如数字0是一个封闭的连通域;如果中间多一笔,就构成了两个封闭的连通域,从而变成汉字日。而汉字日如果去掉最右边的一竖,就成了字母E,它是一个“开放”的连通域(注意这里封闭、开放及连通域的说法可能并不严谨,会意即可。图像处理中的连通域可参考这篇文章图像分析:二值图像连通域标记 - ☆Ronny丶 - 博客园)。也就是说,人类识别文字,只认连通域这样一个特征,而当我们构造的数据泛化得不够的情况下,神经网络会把字符的颜色等其它非特征因素当成重要的参考。因此,当我们的神经网络对自已生成的验证码识别率达到90%以上时,却对参考网站的验证码识别率不够高--因为它们在笔画的粗细、颜色、大小上可能并不一致。
我们对于神经网络的机制的理解现在还主要处于黑盒阶段--这是很多人的看法。然而真正理解神经网络是如何作用的却至关重要。相信未来有一天,我们会使用类似生物学中常用的染色法来窥探神经网络的内部构成。在这篇文章里,我将介绍一种验证上面猜测的方法--即,验证颜色特征被神经网络当成了字符识别的本质特征,通过去除这一特征,我们将获得更好的识别率。
在模型的第一层,我们使用了N个卷积核,最终它们成为N个特征提取器,其中一个是连通域特征识别器。如果我们的猜想是对的,那么如果(在训练完成之后)只保留这个特征(连通域)识别器,最终的预测效果也应该一样。
--
这篇文章当时因为时间关系,没能写完。现在也没机会重启这块研究了。发表出来做个纪念。