所谓集成学习,就是训练多个机器学习模型,然后组合在一起,让它们协调工作。
俗话说,人多力量大,机器学习算法也是一样。
江寒经过一番认真的设计,确定了一个新的网络拓扑结构。
他从排名4~15的模型里,精心选择了7种,再加上“唯一优胜者”、“黑马中等生”、“书呆子”,一共10个神经网络。
将它们放在一起,简单地并联起来,组成了一个整体,然后设计了一个投票程序。
一张手写数字的图片输入网络后,会同时传递给10个神经网络模型,让它们各自进行计算,输出自己的预测结果。
如果大家的判断完全一致,那自然没什么问题。
但如果大家意见相左,就会启动投票程序,根据票数来决定最终的输出。
票数并不是平均分配的,在验证集上表现更好的模型,手里的选票也应该更多。
所以,理所当然的,“唯一优胜者”拥有最多的票数。
如果他全票投给自己,那么一般来说,他的意见就基本上接近正解,理应得到采纳。
这种情况下,其他模型就算有不同意见,而且全都统一口径,也不应该推翻优胜者的判断。
这就好比领导班子开会,不能光讲民主,还得适当集中……
但很多时候,优胜者对自己的判断,也并不是十分有把握,这个时候,其他“学生”给出的答案,就很有参考意义了。
如果其他人中,有人认为答案是另一个,并得到了多数人的支持,那么就会对优胜者的答案进行“弹劾”。
如果优胜者投给自己的票数,并不足以驳回大家的“弹劾”,那么就会少数服从多数,将最后输出修改为受到更多人认同的。
举例来说,刚才的那个数字5。
优胜者判断有60%的概率是6,37%的概率是5,2%的可能性是其他数字,这个时候,它就会输出错误的答案:6。
但如果在其他“学生”中,有人经过计算,认为答案应该是5,与优胜者判断不一致,就会启动投票程序。
由于优胜者判断只有60%的概率是数字6,折算后,等于它只肯为自己的答案投6票。
这个时候,只要其他9个模型的票数,加一起超过6票,即可弹劾成功。
如果优胜者对自己的判断,有90%以上的把握,那么其他9个人加起来,也不足以推翻他的结论。
意思就是这么个意思,具体的折算比例,当然不会这么简单。
还需要十分细致、耐心地进行调整,以使整个模型的输出,更加接近最优解。
当然,这种投票式的做法,无疑也有极小极小的可能性,产生不那么美好的结果。
比如,优胜者本来的判断明明是正确的,只是对自己信心不够充足,就有可能被其他模型给“纠正”成错误的。
但这种情况发生的几率,远远小于优胜者误判的几率。
所以,集成学习的总体性能,仍然领先于每一个单独的神经网络。
这种集成学习的思想,无疑是比较先进的,但实现起来难度也相当大。
尤其是那个投票程序,相当耗费脑细胞。
江寒全力开动脑力,也足足用了四个多小时,才将集成学习网络打造成功。
时间主要浪费在编写投票程序,以及调整折算比例上了。
至于10个子模块,已经全部训练完毕,得到了权重数据,就无需再耗费时间,重新进行训练了。
也幸亏如此,否则就没办法及时把最终程序,提交到KAGGLE官网上去了。
随后,江寒在最终版本的集成网络上,重新跑了一遍验证集。
结果十分喜人,识别准确率达到了惊人的99.62%。
这个成绩已经十分令人满意。
接下来,江寒就按照官网发布的说明,对自己的代码进行了一点处理。
主要是去掉一些调试语句,再将数据文件的接口,改成主办方要求的方式。
这样,官方在测试时,只需将测试用的数据文件,放入指定的文件夹里,而无需修改任何代码。
也许是对业余爱好者们的表现,并没有特别大的期待?
反正在这次比赛中,官方并没有要求公开源代码。
所以江寒也就没准备提供源代码。
他将自己的程序,用pyinstall编译成了可执行文件。
并使用了一点小技巧,将训练好的10个子网络的权重数据,也一起打包进了exe文件里。