Kaggle上的MNIST竞赛会刷到的最高分是多少
这篇是基于Kaggle上的一个post。
最近蛋疼突然想到拿以前写的一个小网络去刷Kaggle的MNIST,结果登录了一看,前几名都是1.0000了。对于这种明目张胆的作弊行为,我显然是不屑的,甚至有一个队伍居然提交了68次才刷出1.0000,说明作弊都很不专业,于是打算手欠一把,也刷个1.0。
因为此前并不是很了解MNIST,我的假设是,Theano里附带的MNIST数据和Kaggle的是一致的,当然后来在MNIST官网确认了这一点。于是在整个7W数据上做了个简单的5-fold训练,模型是LeNet5加了一层,每次的验证集都和其他不一样,因为GPU太挫,每次只训练1~2个epoch,只要验证错误率小于1%就算通过,然后用得到的5个模型做投票,提交之后,结果如下:
用成绩教育了其他多次提交的作弊者什么才是专业作弊。
蛋疼归蛋疼,看到这么多队伍在玩一个早就被生成解决了的数据集,甚至不惜作弊刷榜,也好奇到底最高的正确率应该是多少?于是简单试了一下:
办法还是用LeNet5加一层,用Kaggle的训练集(4.2W)完全训练5个模型,最后统计softmax对测试集预测时的熵,取了中值最大的697个样本。然后启用了真正的人工智能,也就是我自己。。用双眼找出了这近700个样本中我自己觉得人难以分辨,以及和正确结果分得不一样的样本,最后得到下边这些:
一共36个,除以28000的测试集大小是0.13%,考虑到这是个主观的结果,于是我估算Kaggle的MNIST在不作弊的情况下能达到的最好结果应该是在0.998~0.999之间,当然如果有什么办法能提取出笔划或者数字形状的拓扑信息应该还能进一步提升,但是超过0.999的结果显然是有些假了。完整的样本和得分1.0000的提交结果可以在我的Kaggle原帖上找到。
现在已经有的对MNIST的结果里,最好的应该是法国的Ciresan在2012年发布的结果,用的是elastic distortion加scale normalization预处理,CNN+ensembling,用标准MNIST的6W训练集得到的结果是0.23%,考虑到标准的MNIST测试集里,后5000个都是不太好辨别的样本(官网原话:The first 5000 are cleaner and easier than the last 5000),所以Kaggle的测试集应该能达到更高一些的准确率。事实上考虑到样本毕竟不是无限的,我觉得高于0.998的结果很可能已经在某种程度上过拟合了。如果在Kaggle上得到高于0.997的结果,我觉得应该算是很不错的。