瀚宸 编译自 Analytics Vidhya 量子位 出品 | 公众号 QbitAI 引言 跟传统的监督式机器学习算法相比,深度神经网络目前最大的劣势是什么? 贵。 尤其是当我们在尝试处理现实生活中诸如图像识别、声音辨识等实际问题的时候。一旦你的模型中包含一些隐藏层时,增添多一层隐藏层将会花费巨大的计算资源。 庆幸的是,atv,有一种叫做“迁移学习”的方式,可以使我们在他人训练过的模型基础上进行小改动便可投入使用。在这篇文章中,我将会讲述如何使用预训练模型来加速解决问题的过程。 注:这篇文章默认读者对于神经网络和深度学习有着一定的了解,如果你不了解深度学习,那么我强烈建议你先了解一下深度学习的基础概念: 深度学习入门者必看:25个你一定要知道的概念 目录 1.什么是迁移学习? 2.什么是预训练模型? 3.为什么我们使用预训练模型?-结合生活实例 4.我们可以怎样运用预训练模型? ▪提取特征(extract features) ▪优化模型(fine tune the model) 5.优化模型的方式 6.在数字识别中使用预训练模型 ▪只针对输出密集层(output dense layer)的重新训练 ▪冻结初始几层网络的权重因子 1. 什么是迁移学习? 为了对迁移学习产生一个直观的认识,不妨拿老师与学生之间的关系做类比。 一位老师通常在ta所教授的领域有着多年丰富的经验,在这些积累的基础上,老师们能够在课堂上教授给学生们该领域最简明扼要的内容。这个过程可以看做是老手与新手之间的“信息迁移”。 这个过程在神经网络中也适用。 我们知道,神经网络需要用数据来训练,它从数据中获得信息,进而把它们转换成相应的权重。这些权重能够被提取出来,迁移到其他的神经网络中,我们“迁移”了这些学来的特征,就不需要从零开始训练一个神经网络了 。 现在,让我们从自身进化的角度来讨论这种迁移学习的重要性。这是Tim Urban最近在waitbutwhy.com上的一篇文章中提出的观点。 Tim说,在语言发明之前,每一代人类都需要自身重新习得很多知识,这也是知识从上一代到下一代一增长缓慢的原因。 随后,我们发明了语言,这为知识在世代间的传递提供了载体,下图是在语言发明后,同样时间尺度下知识增长速度的示意图。 是不是看起来很牛逼?而通过权重的传递来进行迁移学习和人类在世代交替中通过语言传播知识,是一个道理。 2. 什么是预训练模型? 简单来说,预训练模型(pre-trained model)是前人为了解决类似问题所创造出来的模型。你在解决问题的时候,不用从零开始训练一个新模型,可以从在类似问题中训练过的模型入手。 比如说,如果你想做一辆自动驾驶汽车,可以花数年时间从零开始构建一个性能优良的图像识别算法,也可以从Google在ImageNet数据集上训练得到的inception model(一个预训练模型)起步,来识别图像。 一个预训练模型可能对于你的应用中并不是100%的准确对口,但是它可以为你节省大量功夫。 接下来,我会举个例子来说明。 3. 为什么我们要用预训练模型? 上周我一直在尝试解决Crowdanalytix platform上的一个问题:从手机图片中分辨场景。 这是一个图像分类的问题,训练数据集中有4591张图片,测试集中有1200张图片。我们的任务是将图片相应地分到16个类别中。在对图片进行一些预处理后,我首先采用一个简单的MLP(Multi-later Perceptron)模型,结构如下图所示: 在对输入图片(224*224*3)平整化后,为了简化上述结构,我用了三个各含有500个神经元的隐藏层。在输出层中,共有16个神经元对应着十六个类别。 我只能将训练的准确率控制在6.8%,这是个很不理想的结果。我尝试对隐藏层、隐层中神经元的数量以及drop out速率进行调整,但准确度都没有太大的提升。而如果增加隐藏层和其中神经元的数量,每个周期的运行时间则会增加20s以上。(我的开发环境是12GB VRAM,Titan X GPU) 下面是我用上文所述结构的MLP模型训练输出的结果。 (责任编辑:本港台直播) |