雷锋网按:本文作者 Kaiser,景略集智总经理,原文载于集智网专栏,雷锋网已获授权。
之前介绍了卷积提取边缘特征的基本原理,但这还远远不足以从图片中识别出奶罩,因为并不是所有奶罩都像柏木由纪的那么简单朴实,而是存在很多种不同的款式,这不是单从边缘就能识别出来的。
要提取如此复杂的特征,需要很多不同的卷积核。巧妇难为无米之炊,没有足量的训练样本,再好的卷积也出不来。训练样本当然是越多越好,有道是“熟识奶罩三百款,不会解扣也会穿”。人工神经网络虽然不具备真正的人格,但有一点却是相通的,那就是“贪”。
但不管是训练样本的累积,还是计算能力的上限,资源总是有限的。所以我们始终只能从有限多个样本中,提取一小撮特征,这是一个以有涯求无涯的过程。
训练样本不足就会产生一个问题,叫作“少见多怪”。比如我们看上面几张图里的奶罩,大多是有肩带的,那么自然地,神经网络会把“肩带”当作一个特征。
如果一个物体没有类似肩带的结构,被认作奶罩的概率便会下降。
引入过多不必要的特征,导致模型泛化能力(Generalization)下降,这一问题叫作“过拟合”(Overfitting)。比如下图,坐标上有10个点,蓝色拟合曲线逐一穿过,看起来像一个完美的拟合,似乎我们已经看透了这一分布规律的本质。
但是如果有第11个点,它真的会继续落在蓝线上吗?而且一旦没有,那么拟合曲线就面临严重的威胁,需要很大的调整才能满足“穿过所有点”。如果有第12个点呢?
这种过拟合的预测对于新数据的作用有限,实际上一个比较稳妥的拟合是线性关系,我们有很大把握预测,第11个乃至以后的数据,都会落在蓝色直线附近。
过拟合就好比背过了历年的考试题(包括所有数字),但是一见到新题目(数字变了)就不会做了。以前有个傻子卖咸鸭蛋的小品,里面傻子说“五毛钱俩,一块钱不卖”,这就是钻进了“五毛钱俩”的牛角尖而产生的笑话。过拟合的神经网络,就像一个认死理的人,实则是愚痴的。
所幸,人工智能还没有发展出情态,否则恐怕就“贪、嗔、痴”三毒俱全了。我想,如果真的有那一天,机器人也会发展出宗教吧(遁入智瞳)。
反过来的情况叫“欠拟合”(Underfitting),就是没有学习到真正的规律,听风就是雨。比如下图这个把眼罩当成奶罩的惨案,买家确实没有把“肩带”当作特征,“形状”也确实有点类似,但是她把最基本的“大小”因素忽略了。
在实际应用当中,“过拟合”是更加常见的问题。
如何遏制过拟合?方法有很多,比如 L1、L2 正则化(Regularization)是在代价函数(Cost Function)上动手脚。
本文要介绍的方法,叫作Dropout。其原意是辍学,中文资料里基本也都保留了原词,“脱掉”是我自己想的翻译。你问我怎么想的,我也不知道,只是管不住我这手。
Dropout不修改代价函数,而是直接调整神经网络的结构,是一种更加彻底的革命。
人工神经元都是与特征相关的,而有的特征(比如肩带)会造成过拟合。那么只要脱掉肩带所对应的的神经元,不就可以避免了吗?
理是这么个理,但是我们并不知道,具体哪些神经元对应哪些特征。如果我们都知道的话,也就不用训练了,直接求解就行了。
考虑下面这个简单的神经网络,其隐藏层(中间那层)有6个神经元。神经元与特征并非一一对应的,可能3个神经元共同表征1个特征,比如从上数第2、3、5个。假设我们抛掉了这三个神经元,用其余的网络进行计算,就可以在一定程度上降低过拟合。
实际上这里的[2, 3, 5]只是猜测,我们要做的是,把所有能脱掉的3神经元组合,全都脱一遍,对剩余部分分别进行计算,最后再求平均。诚然,每一个经过Dropout的不完整神经网络,还是有可能过拟合,但是各自的过拟合情况是不同的,通过求平均就可以抵消。
本质上,Dropout消解了神经网络对某一部分神经元的依赖性。6个神经元dropout其中3个,此时dropout率即是 0.5。
实践是检验罩杯的唯一标准,但是对于广大新手而言,直接处理彩色图片的难度还是偏高,而且本站的计算能力暂时还很有限。所以这里改用手写数字识别项目作为案例,搭建简单的卷积神经网络,并且对比Dropout的效果。
该项目是Kaggle的入门级比赛,且用到了著名的MNIST手写数字数据集。MNIST可谓是深度学习界的Hello World。
首先导入依赖库和数据集,并进行预处理,以便神经网络模型使用。
此为静态代码展示,在线编辑->运行Python代码,搭建神经网络,请访问:链接。
然后构建、训练模型。这里采用一个最简单的卷积神经网络结构:
卷积层(8个5x5卷积核,ReLU激活函数)
池化层(2x2最大池化)
全连接层(16个神经元,ReLU激活函数)
输出层(10个神经元,SoftMax激活函数)
为节省计算开销和减少等待时间,训练的迭代次数已设为1,所以得到的各项结果参数当然偏低,这并非所用的方法有问题。
无Dropout,验证精度为: 0.6090
作为对比,我们搭建另外一个架构类似、但包含Dropout层的神经网络。Dropout的位置是最大池化层之后、全连接层之前。
此处代码留空,请访问链接, 完成在线练习。
如果正确地添加了Dropout,则得到的验证精度(val_acc)应为0.7390。而其他的指数,如训练精度(acc)却大致相等。可见,Dropout的作用是消解过拟合,提高模型泛化能力。
PS. 如果要给本文配一个BGM,我希望是杜德伟的《脱掉》。
雷锋网相关阅读:
TensorFlow & 神经网络算法高级应用班” 要开课啦!
从初级到高级,理论 + 实战,一站式深度了解 TensorFlow!
本课程面向深度学习开发者,讲授如何利用 TensorFlow 解决图像识别、文本分析等具体问题。课程跨度为 10 周,将从 TensorFlow 的原理与基础实战技巧开始,一步步教授学员如何在 TensorFlow 上搭建 CNN、自编码、RNN、GAN 等模型,并最终掌握一整套基于 TensorFlow 做深度学习开发的专业技能。
两名授课老师佟达、白发川身为 ThoughtWorks 的资深技术专家,具有丰富的大数据平台搭建、深度学习系统开发项目经验。
时间:每周二、四晚 20:00-21:00
开课时长:总学时 20 小时,分 10 周完成,每周 2 次,每次 1 小时
线上授课地址:http://www.mooc.ai/
雷锋网相关阅读: