把神经网络训练形象化为婴儿的学习,一定程度上是比较恰当的:
训练神经网络需要给它输入数据,这些数据可以是原始的数据,也可以是经处理过的特征数据,然后告诉它这条数据对应什么内容(此处只指监督学习);训练好的网络可以去处理新的数据,包括分类、识别等。
教小孩学东西也是,比如教小孩看图识物,你要告诉它这个东西呢,【特征】身体像一条绳子一样,是在地上爬的,有眼睛且会吐出舌头等等,然后告诉小朋友,【标签】这东西叫蛇。
但是,如果你恰好拿到了一张如上图一样的图片(来自画蛇添足),小朋友不仅记住了你给他说的那些蛇的特征,而且还在脑海里记住了蛇有两双脚。等到下次他看到下面这张图片的时候。。
第一次小朋友看到的蛇身上的两双脚(训练集有的特征,而测试集上没有),干扰了小孩的学习。
在神经网络训练的时候,当训练集和分布和测试集的分布不一致,也会有这样的问题:在训练集上提取的特征,测试集上没有,或者相差很大,导致模型的泛化能力差。
怎么办?
通过对抗验证的来删除重要特征。
什么原理?如何实现?
对抗验证实现过程中,首先将训练集和验证集合并,分别将训练集和验证集对于的标签设置为0和1,投入网络中训练,此时,在模型的callback或者compile-metrics中加入AUC(这是一个模型评价标准,值越大,模型觉得自己越牛逼),假如我们对数据集提取了很多类型的特征(比如皮肤、尺寸、行走方式、眼睛大小等等),我们逐个将特征输入网络,记录下网络训练得到的AUC,最后我们将AUC高的特征删掉!
为什么要将高的AUC对应的特征删除呢?
因为AUC高,说明模型能够很好地分别训练集合测试集,说明这个特征在训练集合测试集上表现很不一样啊!此时不删更待何时。
总结:
“小明,你连蛇都不认识呀?上次不是给你看过图片吗?”
“上次你给我看的蛇有脚的,这次没有!坑娃的爹!”