微调是干嘛的(fine-tuning(微调)的理解)
介绍
fine-tuning的过程就是用训练好的参数(从已训练好的模型中获得)初始化自己的网络 ,然后用自己的数据接着训练 ,参数的调整方法与from scratch训练过程一样(梯度下降) 。对于初始化过程 ,我们可以称自己的网络为目标网络 ,训练好的模型对应网络为源网络 ,要求目标网络待初始化的层要与源网络的层相同(层的名字 、类型以及层的设置参数等等均相同) 。
fine-tuning已经成为了使用DL网络的一个常用技巧(trick) 。使用深度网络做图像处理任务时 ,使用一个在大的数据集上预训练好的模型在自己数据上微调往往可以得到比直接用自己数据训练更好的效果 ,这是因为在imagenet上预训练的模型参数从微调一开始就处于一个较好的位置 ,这样微调能够更快的使网络收敛 。对于相同类别的任务我们可以默认这样去做比较好 。然而当我们要做一个不同的任务 ,那么可能直接拿预训练的模型进行微调就不是最好的了 。
一般我们在训练from scratch的时候往往要在一些超大型的数据集上训练 ,一个目的是为了让训练得到的特征(尤其是底层特征)更加多样 。而从generative pre-training(生成式预训练)到discriminative fine-tuning(判别微调)的过程是一个对泛化特征进行面向任务的特化的过程 。首先 ,如果你将底层特征可视化出来 ,会发现底层特征多是一些边 、角之类的基础几何形状,高层特征可能会发生一些有趣的变化 ,直接反映出你的task 。 在大数据集上进行预训练的目的之一是为了获得丰富 、一般化的底层特征 ,换言之就是学到丰富的“基础几何形状 ” 。有了这些丰富的基础几何形状,等过渡到小数据集上 finetune 的时候 ,就可以通过它们组合出上层具有强判别力的特征 。此时 ,如果你再将组合出来的上层特征可视化 ,就会发现它们已经有模有样了 。底层特征非常重要 ,如果底层特征不够好 ,特征类型不够充分 ,很可能训练不出来好的高层抽象。这就是为什么需要在大规模数据集上进行genertive training的原因之一 。
网络越深 ,底层的参数越难得到有效训练,这也是为什么经常有人用 vggNet finetune 的原因之一 。使用 backpropagation(反向传播)进行训练的时候残差逐层传递,有可能到底层的时候残差就很小了(gradient vanishing) ,导致底层的参数不动。
finetune 就是直接从别人已经训练好的网络上拷贝参数 ,然后针对自己的数据训练新的模型 。这时候需要比较小的learning_rate, 因为要在不破坏原有模型的情况下 fit 自己的数据 ,finetune 的好处就是可以直接获得我们难以或者无法训练的底层参数 。
什么情况下使用微调
(1)你要使用的数据集和预训练模型的数据集相似
,如果不太相似 ,比如你用的预训练的参数是自然景物的图片,你却要做人脸的识别 ,效果可能就没有那么好了 ,因为人脸的特征和自然景物的特征提取是不同的,所以相应的参数训练后也是不同的 。
(2)自己搭建或者使用的CNN模型正确率太低。
(3)数据集相似 ,但数据集数量太少。
(4)计算资源太少 。微调指导事项
1.通常的做法是截断预先训练好的网络的最后一层( softmax层) ,并用与我们自己的问题相关的新的softmax层替换它
。例如 ,ImageNet上预先训练好的网络带有1000个类别的softmax图层 。如果我们的任务是对10个类别的分类 ,则网络的新softmax层将由10个类别组成 ,而不是1000个类别 。然后 ,我们在网络上运行预先训练的权重 。确保执行交叉验证 ,以便网络能够很好地推广 。
⒉.使用较小的学习率来训练网络。由于我们预计预先训练的权重相对于随机初始化的权重已经相当不错 ,我们不想过快地扭曲它们太多。通常的做法是使初始学习率比用于从头开始训练(Training from scratch )的初始学习率小10倍 。
3.如果数据集数量过少 ,我们进来只训练最后一层 ,如果数据集数量中等 ,冻结预训练网络的前几层的权重也是一种常见做法 。这是因为前几个图层捕捉了与我们的新问题相关的通用特征 ,如曲线和边。我们希望保持这些权重不变 。相反,我们会让网络专注于学习后续深层中特定于数据集的特征 。不同数据集下使用微调
1.数据量少 ,但数据相似度非常高 。在这种情况下 ,我们所做的只是修改最后几层或最终的softmax图层的输出类别
。
2.数据量少,数据相似度低 。在这种情况下 ,我们可以冻结预训练模型的初始层(比如k层) ,并再次训练剩余的( n-k )层 。由于新数据集的相似度较低 ,因此根据新数据集对较高层进行重新训练具有重要意义 。
3.数据量大 ,数据相似度低 。在这种情况下 ,由于我们有一个大的数据集 ,我们的神经网络训练将会很有效 。但是 ,由于我们的数据与用于训练我们的预训练模型的数据相比有很大不同 。使用预训练模型进行的预测不会有效 。因此 ,最好根据你的数据 从头开始训练神经网络(Training from scatch ) 。
4.数据量大 ,数据相似度高。这是理想情况 。在这种情况下 ,预训练模型应该是最有效的 。使用模型的最好方法是保留模型的体系结构和模型的初始权重。然后 ,我们可以使用在预先训练的模型中的权重来重新训练该模型 。涉及到的其他知识
学习率(learning-rate)
将输出误差反向传播给网络参数 ,以此来拟合样本的输出 。本质上是最优化的一个过程,逐步趋向于最优解 。但是每一次更新参数利用多少误差 ,就需要通过一个参数来控制 ,这个参数就是学习率(Learning rate),也称为步长 。
学习率越大 ,输出误差对参数的影响就越大 ,参数更新的就越快 ,但同时受到异常数据的影响也就越大 ,梯度可能会在最小值附近来回震荡 ,甚至可能无法收敛 。当学习率设置的过小时 ,收敛过程将变得十分缓慢 。
最理想的学习率不是固定值 ,而是一个随着训练次数衰减的变化的值 ,也就是在训练初期 ,学习率比较大 ,随着训练的进行 ,学习率不断减小 ,直到模型收敛 。
学习率大 学习率小 学习速度 快 慢 使用时间点 刚开始训练时 一定轮数过后 副作用 1.易损失值爆炸;2.易振荡 1.易过拟合;2.收敛速度慢如果是迁移学习 ,由于模型已在原始数据上收敛 ,此时应设置较小学习率 (≤10^−4) 在新数据上进行微调 。
卷积神经网络的核心
(1)浅层卷积层提取基础特征 ,比如边缘,轮廓
等基础特征 。
(2)深层卷积层提取抽象特征 ,比如整个脸型 。
(3)全连接层根据特征组合进行评分分类 。迁移学习与微调
什么是迁移学习
迁移学习(Transfer learning) 顾名思义就是把已训练好的模型参数迁移到新的模型来帮助新模型训练 。考虑到大部分数据或任务都是存在相关性的 ,所以通过迁移学习我们可以将已经学到的模型参数(也可理解为模型学到的知识)通过某种方式来分享给新模型从而加快并优化模型的学习效率不用像大多数网络那样从零学习。
为什么要迁移学习
1)站在巨人的肩膀上:前人花很大精力训练出来的模型在大概率上会比你自己从零开始搭的模型要好 。
2)训练成本可以很低:如果采用导出特征向量的方法进行迁移学习 ,后期的训练成本非常低 ,用CPU都完全无压力 ,没有深度学习机器也可以做 。
3)适用于小数据集:对于数据集本身很小(几千张图片)的情况 ,从头开始训练具有几千万参数的大型神经网络是不现实的 ,因为越大的模型对数据量的要求越大 ,过拟合无法避免。这时候如果还想用上大型神经网络的超强特征提取能力 ,只能靠迁移学习 。详细解释
1)Transfer Learning:冻结预训练模型的全部卷积层 ,只训练自己定制的全连接层
。
2)Extract Feature Vector:先计算出预训练模型的卷积层对所有训练和测试数据的特征向量 ,然后抛开预训练模型 ,只训练自己定制的简配版全连接网络 。
3)Fine-tune:冻结预训练模型的部分卷积层(通常是靠近输入的多数卷积层),训练剩下的卷积层(通常是靠近输出的部分卷积层)和全连接层 。 注:Transfer Learning关心的问题是:什么是“知识 ”以及如何更好地运用之前得到的“知识 ” ,这可以有很多方法和手段 ,eg:SVM,贝叶斯 ,CNN等 。而fine-tune只是其中的一种手段 ,更常用于形容迁移学习的后期微调中 。自己的理解(不知道对不对)
1.迁移学习 ,学习的是整个结构 ,包括函数权重参数等;
而fine-tuning ,学习的是前n层的参数 。
2.fine-tuning是迁移学习的方法之一 。创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!