全局平均池化,是替代FC的一种方式,可以将每个二维的特征通道变成一个实数,该实数某种程度上具有该特征通道的全局信息。最开始主要是从模型压缩的应用中得到的灵感。
使用原因:
FC层的权值参数最多,现在的趋势是尽量避免全连接,近期的大部分论文多用全局平均池化层代替。
因为全连接层的每一个节点都与上一层每个节点连接,是把前一层的输出特征都综合起来
更重要的是实验效果并不比用 FC 差
整体思想:
GAP的优势:
原理:
避免方法:交叉验证、正则化、数据增强、Dropout、降低模型复杂程度、early stopping 等
交叉验证
即重复使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集训练模型,用测试集来评估模型预测的好坏。
由于在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。
当数据量不是很充足的时候,会使用交叉验证。
在训练过程中,我们经常使用交叉验证来确定一些超参数。比方依据validation data上的accuracy来确定early stopping的epoch大小、learning rate等等
正则化(L1和L2):通过改动代价函数实现。
数据增强:去除非共性特征。
Dropout:通过改动神经网络本身来实现。例如,训练前,随机删除一部分隐层单元,保持输入输出层不变,依照BP算法更新上图神经网络中的权值。
降低模型复杂程度。
early stopping:即提前终止迭代来防止过拟合。
Bagging用不同的模型拟合不同部分的训练集;
Boosting只使用简单的神经网络;
数据清洗:将错误的label纠正或者删除错误的数据。
结构优化
原理:
避免方法:
模型方面:模型复杂化、调整参数和超参数、降低正则化约束
特征方面:增加更多的特征
模型复杂化
对同一个算法复杂化。例如回归模型添加更多的高次项,增加决策树的深度,增加神经网络的隐藏层数和隐藏单元数等
弃用原来的算法,使用一个更加复杂的算法或模型。例如用神经网络来替代线性回归,用随机森林来代替决策树等
增加更多的特征,使输入数据具有更强的表达能力
特征挖掘十分重要,尤其是具有强表达能力的特征,往往可以抵过大量的弱表达能力的特征
特征的数量往往并非重点,质量才是,总之强特最重要
能否挖掘出强特,还在于对数据本身以及具体应用场景的深刻理解,往往依赖于经验
调整参数和超参数
超参数包括:神经网络中:学习率、学习衰减率、隐藏层数、隐藏层的单元数、Adam优化算法中的β1β1和β2β2参数、batch_size数值等
其他算法中:随机森林的树数量,k-means中的cluster数,正则化参数λλ等
降低正则化约束
正则化约束是为了防止模型过拟合,如果模型压根不存在过拟合而是欠拟合了,那么就考虑是否降低正则化参数λλ或者直接去除正则化项
增加训练数据往往没有用
欠拟合本来就是模型的学习能力不足,增加再多的数据给它训练它也没能力学习好
原理:
方法:重采样、数据合成 、重加权、迁移学习 、度量学习、元学习/域自适应、解耦特征和分类器
训练数据集:不是由人手动标记的,每个样本的标签是通过利用输入的相关性生成的(如来自不同的传感器模式)。
性能评价:通过模型学出来的feature的质量来评价. feature质量是通过迁移学习的方式,把feature用到其它视觉任务中通过结果的好坏来评价。
整体精度OA(overall accuracy),将测试集上正确分类的像素点的个数除以总的像素个数
平均精度AA(average accuracy),将测试集上每类正确分类的像素点个数除以该类所有像素的总数,然后计算所有类别的精度的平均值称为平均精度AA。
Kappa(Kappa Coefficient),Kappa系数是定义在混淆矩阵X上的一个评价指标,综合考虑混淆矩阵对角线上的元素和偏离对角线的元素,可以惩罚模型的“偏向性”,更客观地反映了算法的分类性能, Kappa 的值在-1~1的范围 。
各个类别的样本数量往往不太平衡时,模型很容易偏向大类别而放弃小类别 (eg: 正负样本比例1:9,直接全部预测为负,acc也有90%。但正样本就完全被“抛弃”了)。 导致整体acc挺高,但是部分类别完全不能被召回。
从梯度弥散、网络退化角度看
从梯度反向传播的角度解释
解决欠拟合问题角度解释(待研究)
模型集成角度解释(加入shortcut后相当于一个ensemble模型)
特征具有层次性的角度解释
原理:
具体操作:
γ
和β
这2个需要学习的参数,这两个参数是在每个batch的数据上计算得到的,可以通过优化改变方差大小和均值的位置。细节:
优化方式:
BN层的作用
加快训练速度, 增大学习率(BN使每一层的输入分布稳定,使激活函数能够有效地利用输入信息,确保随着训练,网络层可以持续学习输入的分布,因此可以使训练加速)
如果每层的数据分布都不一样的话,将会导致网络非常难收敛和训练,而如果把 每层的数据都在转换在均值为零,方差为1 的状态下,这样每层数据的分布都一样, 训练会比较容易收敛。
使激活函数能够更有效地利用输入信息,确保层能持续的学习输入的分布,内部协方差不断变小,加速训练过程。
减小梯度消失和梯度爆炸 (做归一化可以将数据分布映射到一个比较合适的范围内, 否则, 当x到了一定的大小,经过sigmoid函数后输出范围就会变得很小)
以sigmoid函数为例,sigmoid函数使得输出在[0,1]之间,实际上当x到了一定的大小,经过sigmoid函数后输出范围就会变得很小
改善正则化策略,控制过拟合,可以少用或者不用dropout和正则(因为BN本身就是一个归一化网络层)
在网络的训练中,BN的使用使得一个minibatch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合。
使网络对参数设置不敏感,如学习率, 初始权重等
参考链接:https://blog.csdn.net/Jason_yyz/article/details/80003271
正则化的主要作用是防止过拟合,对模型添加正则化项可以限制模型的复杂度,使得模型在复杂度和性能达到平衡。
L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。无约束变成有约束。
L1正则化是指权值向量w中各个元素的绝对值之和, L2正则化是指权值向量w中各个元素的平方和然后再求平方根
从先验的角度分析可以防止过拟合的原理: 过拟合表现在训练数据上的误差非常小,而在测试数据上误差反而增大。其原因一般是模型过于复杂,过分得去拟合数据的噪声。正则化则是对模型参数添加先验,使得模型复杂度较小,对于噪声扰动相对较小。最简单的解释就是加了先验。在数据少的时候,先验知识可以防止过拟合。
举个例子:硬币,推断正面朝上的概率。如果只能抛5次,很可能5次全正面朝上,这样你就得出错误的结论:正面朝上的概率是1——–过拟合!如果你在模型里加正面朝上概率是0.5的先验,结果就不会那么离谱。这其实就是正则
l1正则化:
优点是可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
缺点是目标函数在原点不可导,需要做特殊处理(比如:使用smooth l1)
画出损失函数等值线和L1正则化的函数。(二维特征)
多维情况下,顶点角更多,在这些角上,很多权值等于0,产生模型,可用于特征选择。
l2正则化:
优点是实现简单,能够起正则化作用,防止模型过拟合
为什么可以避免过拟合?
拟合过程中通常都倾向于让权值尽可能小,最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。否则如果参数很大,小的变动就能对结构有很大的影响,这样模型不稳定。
缺点是无法获得稀疏模型
为什么无法获得稀疏模型?
权值等于0的概率比L1小了很多。
改进版 - smooth l1:
相同点:都用于避免过拟合
不同点:
上图中的模型是线性回归,有两个特征,要优化的参数分别是w1和w2,左图的正则化是l2,右图是l1。
蓝色线就是优化过程中遇到的等高线,一圈代表一个目标函数值,圆心就是样本观测值(假设一个样本),半径就是误差值,受限条件就是红色边界(就是正则化那部分),二者相交处,才是最优参数。
可见右边的最优参数只可能在坐标轴上,所以就会出现0权重参数,使得模型稀疏。
标准梯度下降法(GD)
- 从表达式来看,模型参数的更新调整,与代价函数关于模型参数的梯度有关,即沿着梯度的方向不断减小模型参数,从而最小化代价函数。
- 基本策略可以理解为”在有限视距内寻找最快路径下山“,因此每走一步,参考当前位置最陡的方向(即梯度)进而迈出下一步。可以形象的表示为:
缺点
批量梯度下降法(BGD)
随机梯度下降法(SGD)
动量优化方法是在梯度下降法的基础上进行的改变,具有加速梯度下降的作用。一般有标准动量优化方法Momentum、NAG(Nesterov accelerated gradient)动量优化方法。
Momentum
牛顿加速梯度(NAG, Nesterov accelerated gradient)算法
AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法。
AdaGrad算法
RMSProp算法
AdaDelta算法
Adam
来自于Adaptive moments
,它是另一种引入了动量的RMSProp
算法。Adam
算法输入:
RMSProp
算法中,通过累计平方梯度(采用指数移动平均)来修正学习率。
而 Adam
算法中,不仅采用同样的方式来修正学习率,还通过累计梯度(采用指数移动平均) 来修正梯度。
动量的计算可以类似Nesterov
动量的思想:计算mini-batch
的梯度时,采用更新后的参数 。
此时称作NAdam
算法。
假设迭代过程中,梯度刚好是固定的某个量,则有: 对于某个方向,假设其分量为 ,则对于 Adam
算法有:
无论梯度的大小如何,Adam
算法的参数更新步长几乎都是
相比较而言,AdaGrad
和 RMSProp
算法的参数更新步长随时间在减少。
虽然最终结果不包含 ,但是这是由于假定梯度保持不变这一特殊情况推导的。
实际中梯度很少保持不变,因此 还是比较重要。
Adam
算法之所以需要使用一阶矩的修正和二阶矩的修正,是为了剔除时间因子 的影响。
在某些情况下,Adam
可能导致训练不收敛。主要原因是:随着时间窗口的变化,遇到的数据可能发生巨变。这就使得 可能会时大时小,从而使得调整后的学习率 不再是单调递减的。
这种学习率的震荡可能导致模型无法收敛。
AdaDelta
、RMSProp
算法也都存在这样的问题。
解决方案为:对二阶动量的变化进行控制,避免其上下波动(确保 是单调递增的):
实践证明,虽然在训练早期Adam
具有很好的收敛速度,但是最终模型的泛化能力并不如使用朴素的SGD
训练得到的模型好:Adam
训练的模型得到的测试集误差会更大。
其主要原因可能是:训练后期,Adam
的更新步长过小。
一种改进策略为:在训练的初期使用Adam
来加速训练,并在合适的时期切换为SGD
来追求更好的泛化性能。
这种策略的缺陷是:切换的时机不好把握,需要人工经验来干预。