当前位置: 首页 > 科技观察

米少煮好粥——数据有限时如何调优深度学习模型

时间:2023-03-21 23:04:02 科技观察

迁移学习所谓迁移学习,就是通过简单的调整,让在一个问题上训练好的模型适应一个新的问题,可以考虑作为模型调整的“技巧”方法。它可以比作人类从一个实例中得出推论的能力。迁移学习的特点1.需要的数据量小。假设有两个字段。一个领域已经有很多数据,可以成功建立模型。另一个字段没有太多数据,但与前一个字段相关。该模型已迁移过来。比如我们要做一个化妆品推荐模型,但是数据量小,可以先用一个成型稳定的珠宝推荐模型进行调优。学术界也有跨领域的尝试。比如网页搜索可以迁移到推荐,图片识别可以迁移到文字识别。2.训练时间少在没有GPU的普通台式机或笔记本上,实现Google的Inception-v3模型迁移学习训练过程(tensorflow框架)只需要五分钟左右。3、易于满足个性化需求。比如大家希望自己的手机可以记住一些习惯,这样就不用每次都设置了。手机怎么会记住这个呢?其实就是把一个通用的用户使用手机的模型迁移到个性化的数据上。但是,如果数据量足够大,迁移学习的效果一般不如完全再训练。迁移学习适用于快速和小型工程,解决所谓的冷启动问题。当收集到足够的数据时,我们将切换到深度学习。迁移学习的四种实现方式1.样本迁移Instance-basedTransferLearning一般会对样本进行加权,对越重要的样本赋予越大的权重。样本迁移就是在数据集(源域)中找到与目标域相似的数据,将这个数据放大多次,与目标域中的数据进行匹配。其特点是:需要对不同的例子进行加权;需要使用数据进行训练。例如下图中,可以在动物识别模型的源数据中增加狗的图片数量,实现专门针对狗的识别模型。2.FeaturetransferFeature-basedTransferLearning在特征空间中迁移,一般需要将源域和目标域的特征投影到同一个特征空间。如下图所示,特征迁移就是观察源域图像和目标域图像之间的共同特征,然后利用观察到的共同特征在不同层级的特征之间进行自动迁移。3.ModeltransferModel-basedTransferLearning将整个模型应用到目标领域。比如目前比较常用的对预训练好的深度网络进行fine-tuning,也可以叫做parametertransfer。模型迁移使用数千万图像来训练图像识别系统。当我们遇到一个新的图像领域时,我们不需要去寻找几千万张图像进行训练。原有的图像识别系统可以迁移到新的领域,新领域只需几万张图片就可以达到同样的效果。模型迁移的一个好处就是我们可以区分它,也就是可以和深度学习结合,我们可以区分不同层次的可迁移程度,相似度高的层次更容易被迁移。这是一个例子。例如,我们想简单地调整训练好的Inception-v3来解决一个新的图像分类问题。根据论文DeCAF:ADeepConvolutionalActivationFeatureforGenericVisualRecognition中的结论,可以保留训练好的Inception-v3模型中所有卷积层的参数,只替换最后一个全连接层。***全连接层之前的网络层称为瓶颈层。新图像通过训练好的卷积神经网络传递到瓶颈层的过程可以看作是对图像进行特征提取的过程。在训练好的Inception-v3模型中,由于瓶颈层的输出经过单层全连接层神经网络,1000种图像都可以很好的区分出来,所以认为借点向量输出是合理的通过瓶颈层可以作为一个新的单层全连接神经网络,针对任何图像来解决新的分类问题。4.社交网络、社交网络之间的迁移等关系迁移学习。根据源域和目标域是否相同,源任务和目标任务是否相同,源域和目标域是否有标注数据,迁移学习可以分为下图:前沿迁移学习方向1.ReinforcementTransferLearningHowtransfersagentsKnowledgelearned:例如,如果我学习一个游戏,我可以在另一个类似的游戏中应用一些类似的策略。2.TransitiveTransferLearningTransitivetransferlearning,如果两个domain相距太远,那么我们会插入一些中间domain,一步步做transfer。3.Source-FreeTransferLearning如何在不知道是哪个源字段的情况下进行迁移学习。2、如果你目前有一些有代表性的数据集,已经进入温饱阶段,你迫不及待地想榨取每一滴数据的价值,但又害怕过度泛化(俗称过拟合)。那么我们可能需要以下技巧。严防过拟合(正所谓千方百计,听着……)在深度学习中,由于超参数数量众多,训练样本数量相对于超参数略显不足,如果不注意就容易出现过拟合不小心。本质上,过拟合是因为模型的学习能力太强了。除了学习样本空间的共同特征外,它还学习训练样本集上的噪声。由于这些噪声的存在,降低了模型的泛化性能。深度学习中改善过拟合的常用方法有以下几种:1.数据增强数据增强即数据增强。数据增强实际上是一种增加训练样本的方法。以人脸识别为例,对于人脸识别数据增强,一般有随机裁剪、随机光照、随机左右翻转等。通过类似的手段,无论是图像处理,还是语音或自然语言处理,我们都可以有效地增加样本数量。更多的训练样本意味着模型可以学习到更多的本质特征,对噪声具有更好的鲁棒性,从而具有更好的泛化性能,可以有效避免过拟合。2.earlystoppingearlystopping顾名思义就是当训练次数没有达到预设的最大训练次数时,我们让网络停止训练。使用earlystopping需要我们将训练集的一小部分(大约10%~30%)划分为验证集。验证集不参与训练,可以看作是我们知道结果的测试集。我们实时监控模型在验证集上的性能(实时监控不是指每次迭代都监控,可以每1000次观察一次),一旦模型在验证集上的性能出现下降趋势,我们停止Training,因为训练后模型的泛化性能只会变差。在实际训练中,我们不可能一直坐在电脑前观察验证集的准确率。更通用的做法是每隔一段时间(比如每1000次迭代)保存一次模型,然后选择验证集上的效果**模型作为最终模型。3.添加Dropout层Dropout(https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf)的原理很简单。Dropoutt的对象是层。对于某一层的每个节点,Dropout技术使得该节点以一定的概率p不参与训练过程(即前向传输时不参与计算,bp时不参与梯度更新计算)。如上图所示,实验证明Dropout的效果非常爆炸,对模型训练有很好的效果。为什么Dropout能起到这么大的作用呢?一个原因是通过Dropout,降低了节点之间的耦合度,节点对其他节点不再那么敏感,可以促进模型学习到更鲁棒的特征;第二个是Dropout层中的每个节点都没有被完全训练(因为他们只有一半的出勤率),从而避免了训练样本的过度学习;第三个原因是在测试阶段,Dropout层的所有节点都被使用了,起到了ensemble的作用,ensemble可以有效的克服模型的过拟合。在实际模型训练中,ropout一般框架中初始默认0.5概率的dropout率是一个保守的选择。如果模型不是很复杂,设置为0.2就够了。但是,我们也要注意Dropout的缺点:(1)Dropout是一种正则化技术,降低了模型的有效容量。为了抵消这种影响,我们必须增加模型大小。毫不奇怪,使用Dropout时验证集上的错误率要低得多,但这是以更大的模型和更多的训练算法迭代为代价的。对于非常大的数据集,正则化带来的泛化误差减少非常小。在这些情况下,使用dropout和更大模型的计算成本可能超过正则化的好处。(2)当只有很少的训练样本可用时,Dropout不是很有效。4.Weightpenalty(L1&L2)第四种常用的方法是weightdecay。权重衰减迫使模型通过L1范数和L2范数学习一个相对较小的权重。这里有两个问题:(1)为什么L1和L2范数可以学习到比较小的权重?(2)为什么比较小的权重可以防止过拟合?对于第一个问题:首先看L1和L2的定义:其中C0是没有惩罚项的成本函数。那么L1和L2形式的成本函数将如何影响w的值?1)不加惩罚项的w的更新2)L1下w的更新,其中u为学习率3)L2下w的更新,其中u为学习由(1)(2)可知)(3)上面加上惩罚项后,w明显减小。L1以减法的形式影响w,而L2以乘法的形式影响w,所以L2也称为权重衰减。对于第二个问题:过拟合的本质是什么?无非是对非本质特征的噪声过于敏感,而将训练样本中的噪声作为特征,以至于在测试集上的表现很差。当权值比较小时,当输入稍有变化(噪声)时,对结果的影响会较小,因此惩罚项可以在一定程度上防止过拟合。除了千方百计增加数据的多样性,还要增加模型的多样性。1、尽量不断调整隐含层单元和模型数量,要有海纳百川的靠天的心态。没事的时候调整隐藏层单元和数量,节省GPU闲置时间。总有一款适合你。一般来说,隐藏层单元的数量决定了模型是欠拟合还是过拟合。两害相权取其轻,尽量选择隐层单元多一些,因为可以通过正则化避免过拟合。同样,尽可能多地添加隐藏层,直到测试误差不再变化。2.尝试连接两个模型或多个模型。比如用两个不同分辨率的图像数据集分别训练网络模型a和网络模型b,然后把a和b的瓶颈层concat在一起,用一个fullconnectionlayer(或者随便你想连接什么,有试玩也无妨)是连接的,输入concat后的图片,训练结果可能比单一的网络模型要好很多。关于lossfunction的东西,这里只是从modeltuning的tric角度来介绍的。Softmax-loss是最常用的损失方法,但Softmax-loss并不适用于所有问题。比如当数据量不够大时,softmax训练出来的人脸模型性能就很差。ECCV2016的一篇文章(ADiscriminativeFeatureLearningApproachforDeepFaceRecognition)提出了一个权衡方案。通过添加中心损失,简单的softmax可以训练内聚特征。这个特性在人脸识别中尤为重要,这样用很少的数据训练出来的模型也能很好地工作。另外,contrastive-loss和triplet-loss也各有好处,需要抽样的过程,有兴趣的可以多了解下。Fancytuning1.Batchsize设置batchsize一般设置为2的指数倍数,比如64、128、512等,因为不管是多核CPU还是GPU加速,内存管理还是以字节为单位硬件优化的基本单元。设置为2的倍数,将有效提高矩阵切片、张量计算等操作的硬件处理效率。具有不同批量大小的模型可能会带来意想不到的精度提升。这种调整其实是有一定规律和技巧的。2.激励函数激励函数在模型中引入了必要的非线性因素。Sigmoid函数由于其可微性,是传统神经网络的最佳选择,但在深度网络中会引入梯度消失和非零中心问题。Tanh函数避免了非零中心问题。ReLU激活函数很受欢迎,因为它更容易学习优化。由于其分段线性的特性,其前传、后传和求导都是分段线性的,而传统的sigmoid函数由于两端饱和,在传播过程中容易丢弃信息。ReLU激活函数的缺点是不能使用Gradient-Based方法。同时,如果去激活,很容易再次激活失败。但是有一种方法可以解决它,使用maxout激活函数。3.权值初始化权值初始化常采用随机生成的方法来避免网络单元的对称性,但仍然过于粗糙。根据目前最好的实验结果,权重的均匀分布初始化是最好的选择,而均匀分布的作用范围由单元的连接数决定,即连接越多,相对权重越小。Tensorflow的word2vec程序中初始化权重的例子。权重的初始值是从均匀分布中随机采样的:4.学习率学习率是重要的超参数之一,是收敛速度和是否收敛之间的权衡参数。选择0.01或随着迭代逐渐减小是一个合理的选择。最好的方法开始研究学习率的自动调整,例如动量或基于目标函数曲率的自适应参数调整。5.选择优化算法传统的随机梯度下降算法虽然适用范围广,但效率不高。最近出现了很多更灵活的优化算法,比如Adagrad、RMSProp等,可以在迭代优化过程中自适应调整学习率等超参数以获得更好的结果。