本篇为《机器学习完备流程总结+实践经验细节+代码工具书(4)》,使用经过数据处理阶段处理过的数据,进行神经网络机器学习模型的搭建及训练阶段的相关流程(代码基于pytorch):
什么是好的机器学习模型/如何得到好的模型+数据分析阶段:https://blog.youkuaiyun.com/weixin_44563688/article/details/86535274
前置数据处理阶段: https://blog.youkuaiyun.com/weixin_44563688/article/details/86558939
非神经网络机器学习模型的搭建,训练及评价阶段: https://blog.youkuaiyun.com/weixin_44563688/article/details/86568400
神经网络模型的搭建,训练及评价阶段:(you are here)
神经网络模型的特点,适用数据类型,使用时的推荐策略与实践经验
1.神经网络的特点
神经网络的独特性在于能力十分强大,模型上限很高,理论上可以对任意复杂的函数在任意精度上进行模拟,因此在处理复杂,庞大的数据时神经网络有着其他机器学习模型无法匹敌的优越性。
同时神经网络还有着灵活性高,方便自主设计,改进和添加模块实现特定功能的特点,通过设计不同的神经网络结构,我们可以处理各种不同复杂结构的数据(图像,自然语言,3D点云…),对数据中的信息进行高效的抓取和利用。这是大多其他机器学习模型所不具备的。
而神经网络模型在实际应用中最大的优势或许就是可以十分方便地使用迁移学习(transfer learning)策略,关于这部分在推荐策略里进行详细的解释。
2.神经网络的适用数据类型
由于神经网络高variance低bias的特点,神经网络模型一般更适用于处理结构式数据(暂不清楚这种类型数据的学术名称,因此使用结构式数据代替),比如图像,视频或者自然语言,这种类型的数据有一个典型特征就是数据的信息主要以feature和feature之间的某种结构来体现。单个数据feature数量巨大,feature和feature之间没有本质不同,我们要挖掘的信息更多存在于feature和feature之间的关系结构中,而这种复杂的结构信息往往难以被其他机器学习模型发现和利用,因此对于结构式数据,我们应首先尝试使用神经网络技术进行处理。比如对于图像数据,所有的feature均为以特定color space表示的颜色,单个pixel(feature)的值并不能提供给我们太多的信息,我们真正感兴趣的地方在于pixel和pixel之间以什么样结构组织在一起从而形成了这个图像。
对于feature与feature之间互不相同的一般数据(比如典型的房价估计数据等)我们使用单纯全连接神经网络也可以进行处理。但是需要意识到神经网络是一种十分强力的模型,非结构式数据往往包含的信息并不足够复杂,一般的机器学习模型对于非结构性数据也可以十分高效地进行利用,而对这种简单非结构性数据内在的条件概率分布使用神经网络进行拟合很容易会产生比较严重的过拟合问题。因此对于不足够复杂的非结构性数据,相比于集成其他机器学习模型的方法,神经网络并无明显优越性。
3.神经网络搭建和训练的推荐策略:
在上一节介绍传统机器学习模型时,推荐使用soft-voting(boosting,stacking的集成方式也可以尝试)的方式集成多个不同的机器学习模型来降低模型的Bias,在显著提高模型表现的同时节省了大量用于尝试不同模型与精调模型参数的时间。而对于神经网络模型一般情况下不推荐使用任何的复杂集成方式。这是由于神经网络模型的本质就是众多感知机通过多连接(对于FCN则是全连接)Stacking的集成方式组成的巨型集成模型,因此天生具有着low bias high variance的特性,使用集成学习的方式进一步降低神经网络的bias一般情况下不如单纯的加深加宽神经网络或者加入某些module(使用Auxiliary classifiers结构的神经网络可以通过self-to-self集成方式在提高模型性能同时不显著提高过拟合风险)。
神经网络模型的搭建与训练的推荐策略:使用迁移学习+尽量使用现成经典神经网络结构(不要随意进行网络DIY)
迁移学习即是使用其他人训练的现成的神经网络模型和参数来训练自己的神经网络,根据原数据集和自身数据集的分布差距情况采取不同方法进行模型训练,达到使用少量训练数据也可以又快又好地获得优秀神经网络模型的训练策略。具体使用迁移学习的方法有两种:
- fine-tune:使用某一经典模型,并下载其他团队(一般为知名实验室或者大型公司研究团队)在这个模型上针对其他数据集训练完毕的模型参数,将这些参数作为自己模型的初始参数然后通过一定的策略(详细可见实践经验部分)训练自己的模型。
- use convolutional layers as feature extractor:卷积层是神经网络用于处理图像,大气张量数据等张量形式数据的有效结构,在神经网络中发挥着提取数据高级特征的作用,因此如果先前已经有团队在类似于ImageNet等超大型数据集上进行过卷积神经网络的训练,我们大可直接下载他们使用的卷积层结构和参数,然后在卷积层之后接上我们自己设计的分类层再以一定策略进行训练。这种方法的优势和背后的原因会详细介绍于下方实践经验部分。
为什么使用迁移学习:
推荐使用迁移学习和现成经典神经网络结构来搭建和训练神经网络模型的原因总结如下:
- 经典神经网络结构大都出自于机器学习领域的顶尖科学家,科研团队和实验室,是融合了顶尖从业者们无数的尝试与思考的产物,2015年之后的大多经典神经网络不存在明显的结构浪费和设计缺陷(比如卷积层和FCL的比例合理,各个层神经元的数量配比正确等)。这种结构的合理直接提高了模型的训练效率和平衡了模型的bias-variance。同时,经典的结构一般都有着开源的参数可供直接下载,为迁移学习提供了方便,哪怕实际情况要求我们自己DIY网络,也推荐尽量使用经典网络的部分结构和参数。对于深度学习模型而言,很多时候模型参数的价值是大于模型结构的:举个例子,无人车领域知名的目标识别网络voxelNet在原paper中可以达到非常不错的效果,但是由于参数未开源,后续大多团队很难自己训练得到精度足够高的模型。
- 迁移学习提供了非常好参数初始点,极大加速了网络收敛速度的同时,也有大概率使参数落入很不错的局部最优点。我们知道神经网络模型的训练充满着随机性,最后模型收敛的局部最优点的好坏决定了模型的性能(局部最优点的好坏在深度学习中并不重要,具体原因之后会详细论述),而整个模型训练的过程就是从初始点一步一步走向局部最优点的过程,很可能我们的模型花了很多时间,走了很长路才发现终点并不足够满意。使用迁移学习,有很大概率从一开始我们就在某个十分不错的局部最优点附近,哪怕我们手头的数据和用于获得这些现成参数的源数据有着很大的不同,使用现成参数作为初始点也不会比通过某个任意分布完全随机产生的在0左右的初始参数差。这就意味着我们不仅可以花更少的时间训练模型,同时训练完毕的模型也会有更好的表现。
- 使用迁移学习,可以确保各个神经元有着独立的发展方向,相互之间uncorrelated程度大。神经网络训练中的一个常见问题就是,很多神经元在训练之后高度相似,其实是在完成相似的任务。这种现象的部分原因在于神经元初始化的方法不当:一般的初始化参数方法是选择某个均值为0的分布,然后从这个分布中进行随机取样来对参数进行初始化,使用这种方法进行神经元初始化后很可能部分神经元会有着比较类似的初始参数分配,导致他们在后续的更新中沿着类似的发展方向进行更新。这种情况可以使用dropout来进行一定的改善,但是对于卷积层或者浅层神经网络dropout并不适用(原因会在之后进行讨论。)。而开源下载的训练完毕的模型中,由于模型往往经过研究者大量反复训练和调节有着出色的实际效果,因此神经元之间往往correlated程度较低,降低了模型overfitting的程度,同时提高了模型的结构空间利用效率。
- 在训练数据不足够多的时候,使用迁移学习策略也可以获得表现优秀的较深神经网络模型。神经网络模型由于具有较高的variance,因此一般需要使用较多的训练数据才可以避免或者减轻overfitting的发生。但是在数据量不足够多的情况下(不足够多:至少小几千few thousand的量级),通过迁移学习也可以获得效果十分不错的神经网络模型,但是这里需要一些策略指导(对于下载好的网络,我们只训练最能体现不同数据差异的那一小部分网络结构,同时fine-tune部分剩余网络即可),具体会在实践经验环节详细介绍。
- 一般的经典网络的开源参数均训练自类别变量非常之多的巨型数据集,比如ImageNet。模型可以对上千个类别的图片进行十分准确的分类,因此单纯使用迁移学习获得的参数,模型就可以捕捉和区分非常之广的目标特征。你要分类的图片类别很可能原本就包含于这个既成模型的分类对象中,即使不包含,对应的特征一般也不会相差太多,经过简单快速的fine-tune也可以直接进行转化。比如你要对图片中的交通工具进行分类,imageNet本身就包含汽车,火车,船,飞机等类别,即使模型不经过fine-tune拿来直接使用也会有着非常不错的表现。
4.实践经验:
实践经验分为两部分,搭建/训练经验与经典神经网络和学术前沿(将持续更新),主要面向CNN类模型。
搭建/训练经验与经典神经网络
0.简单的神经网络能力也足够强大,如无必要尽量不要使用resNet,inception-resNet等超级网络。在使用神经网络模型前要对自己数据的复杂程度和完成任务目标所需要从数据中抽象出的特征的高级程度有一个大概的感觉,然后使用复杂度相匹配的机器学习模型(神经网络模型),在一个简单的图像分类问题上使用深度学习是不明智的做法,不仅过拟合问题严重,模型的训练难度也很大。
1.尽可能使用经典网络结构并采用迁移学习的方式来进行模型的搭建和训练。具体原因可见上方推荐策略的部分,需要注意的是使用2015年之前的网络时需对网络进行加入BN等改进。主要代码会提供于下方代码部分,这里主要介绍下在具体实施迁移学习时应采用的策略(主要针对结构性数据作为输入时的网络):
- 数据量较少时:在数据量较少时应谨记的原则是,任何的过激fine-tune都有让神经网络overfitting的风险,因此我们应该尽可能少的调节网络参数,或者说只调节那些最能体现数据差异性的参数,同时应使用较小的起始学习率(<0.001),应该清楚我们离最优点并不会很远而且过多的训练会有overfitting的可能,同时我们的源数据和使用数据差别越大,我们就应该fine tune越多的层。而正如之前所说,由于神经网络是层级结构,越后面的层提取的特征越高级,也越能体现出不同目标的具体差异,因此我们应固定前方层的参数,从最后一层向前开始逐步尝试fine-tune。同时最后的那一层网络一般体现着具体的任务目标,一般是需要完全删除之后重新训练的(比如如果我们的分类任务是分4类,那么最后一层就只有4个输出,但是原来的网络输出很可能不是这个数字),所以对于最后一层,学习率可以适当提高(exp:0.01)。
- 数据量较多时:可以单纯使用迁移学习的参数当作模型的初始参数然后进行常规训练(学习率不应过大)。
- 若含有卷积层:fine tune主要使用于卷积层之后的分类器(全连接层),在数据