防止过拟合的方法
数据增广
提前终止训练
正则化
Dropout
DropOut vs. Inverted-DropOut
DropOut :网络参数过多时容易发生过拟合,通过以概率P对每层神经元进行灭活,每层被灭活的神经元的输出为0,让其停止更新,而网络参数为灭活前的参数,在测试阶段,不会进行DropOut,所有神经元都会参与前向传播,但是会将神经元的输出乘以(1-p),为了让测试阶段与训练阶段神经元输出保持一致的期望。
Inverted-DropOut:与DropOut相似,不过它是在训练阶段就对神经元输出进行rescale,测试阶段则不需要进行。这样有助于一次性定义模型,目前通常采用这种方式。
[参考]
梯度消失与梯度爆炸
梯度消失
神经网络有很多层,每个隐藏层都使用Sigmoid函数作为激活函数时,我们知道Sigmoid函数有一个缺点:当x较大或较小时,导数接近0;并且Sigmoid函数导数的最大值是0.25。
假设现网络每层只有一个神经元,如果我们使用标准方法来初始化网络中的权重,那么会使用一个均值为0标准差为1的高斯分布。因此所有的权重通常会满足|wj|<1,而s‘是小于0.25的值,那么当神经网络特别深的时候,梯度呈指数级衰减,导数在每一层至少会被压缩为原来的1/4,当z值绝对值特别大时,导数趋于0,正是因为这两个原因,从输出层不断向输入层反向传播训练时,导数很容易逐渐变为0,使得权重和偏差参数无法被更新,导致靠近输入层的神经网络无法被优化,训练永远不会收敛到良好的解决方案。
梯度爆炸
若我们初始化的w是很大的数,w大到乘以激活函数的导数都大于1,那么连乘后,可能会导致求导的结果很大,形成梯度爆炸。
解决方法
换用Relu、LeakyRelu、Elu等激活函数
BatchNormalization
ResNet残差结构
LSTM结构
好的参数初始化方式,如He初始化或用预训练模型初始化
梯度剪切、正则
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
L2正则通过限制过拟合也能防止梯度爆炸
梯度下降更新优化
方法 | 特点 |
---|---|
SGD | 不会自动更新学习率,所以初始学习率的选取直接影响结果 |
Momentum | 记录每次的更新方向,若这次的梯度方向与之前相同则增加步长 |
Adagrad | 记录每次的下降反向与距离,若下降的距离开始减小时步长也会减小 |
RMSprop | |
Adam | Momentum与Adagrad结合,利用一阶矩估计和二阶矩估计来约束学习率,还是需要设置初始lr,相比Adagrad不需要存储所有梯度 |
多标签识别
faster rcnn
权重初始化方法
回归
线性回归和逻辑回归
正则
在损失函数后面加上一个正则项,对损失函数中的某些参数做出限制
L1正则
L1正则化的模型叫做Lasso回归,可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择。
正则化和特征选择的关系:
稀疏矩阵指的是很多元素为0,只有少数元素是非零值的矩阵,即得到的线性回归模型的大部分系数都是0. 通常机器学习中特征数量很多,例如文本处理时,如果将一个词组(term)作为一个特征,那么特征数量会达到上万个(bigram)。在预测或分类时,那么多特征显然难以选择,但是如果代入这些特征得到的模型是一个稀疏模型,表示只有少数特征对这个模型有贡献,绝大部分特征是没有贡献的,或者贡献微小(因为它们前面的系数是0或者是很小的值,即使去掉对模型也没有什么影响),此时我们就可以只关注系数是非零值的特征。这就是稀疏模型与特征选择的关系。
L2正则
L2正则化的模型叫做Ridge回归(岭回归),可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合。
L2正则化和过拟合的关系:
拟合过程中通常都倾向于让权值尽可能小,最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。可以设想一下对于一个线性回归方程,若参数很大,那么只要数据偏移一点点,就会对结果造成很大的影响;但如果参数足够小,数据偏移得多一点也不会对结果造成什么影响,专业一点的说法是『抗扰动能力强』。
BatchNormalization
为什么使用BN
我们知道网络一旦train起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal Covariate Shift”。BN的提出,就是要解决在训练过程中,中间层数据分布发生改变的情况。
how to work:
(3224224卷积后得到64112112,代表64张112*112的特征,现在进行nn.BatchNorm2d(64),即求每一张的一个mini-batch的平均特征,最终得到一个shape=64的tensor。)
1、求每一个训练批次数据的均值
2、求每一个训练批次数据的方差
3、使用求得的均值和方差对该批次的训练数据做归一化。其中ε是为了避免除数为0时所使用的微小正数。
4、尺度变换和偏移:将乘以调整数值大小,再加上增加偏移后得到,这里的是尺度因子,是平移因子。这一步是BN的精髓,由于归一化后的基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数:,。 和是在训练时网络自己学习得到的,如果,而,那么就会恢复到之前的原数据。
BN的优势
解决内部协变量偏移:BN的本质就是利用优化变一下方差大小和均值位置,使得新的分布更切合数据的真实分布,保证模型的非线性表达能力。
使得梯度变平缓
优化激活函数:更短的时间达到较稳定的状态
使模型具有正则化效果:采用BN算法后可以选择更小的L2正则约束参数,因为BN本身具有提高网络泛化能力的特性。
解决梯度弥散问题
激活函数
Relu
优点:Relu的输入值很大时,也不会出现梯度消失
网络输入都是负值时是不是就没有用了:不会,因为经过乘以权重之后并不一定是负值
缺点:如果梯度太大,而学习率又不小心设置得太大,就会导致权重一下子更新过多,就有可能出现这种情况:对于任意训练样本 Xi ,网络的输出都是小于0的,这样梯度也都是0,Relu会出现坏死,可用Leaky Relu进行替代。解释
全连接层作用
前面的卷积和池化相当于做特征工程,得到许多局部特征,后面的全连接相当于做特征加权,将这些局部特征进行加权组合。
resnet
resnet50一共有50层,其中卷积层有49层,全连接层1层。
一共有4个block,[3,4,6,3],每个block有三层卷积。49=(3+4+6+3)*3+1,网络刚开始的时候有一层卷积。
residual作用:
resnet的几个版本
手推CNN
计算一层的参数量、计算量
反向传播如何求导
Relu:
mean_pooling:
反向传播的过程是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变。
max_pooling:
源码中有一个max_idx的变量,记录最大位置。反向传播时,把后层的值赋给前层的max_idx,patch的其余值都为0,max pooling也要满足梯度之和不变的原则,梯度传播也是相同操作。
bn层:
会对γ,β,Xi进行求导。
卷积层:卷积操作可以看作是矩阵相乘,将其展开,同样可以求导。
梯度下降算法
AdaBN
蓝色和红色分别代表两个数据集,每个点代表一个mini-batch,将某一BN层的均值和方差组成的向量画出来,可以看到BN层反应着数据集之间的域差异。这一差异是因为由于数据分布不同造成BN层的两个参数变得不同。所以这两个参数的均值与方差也会有很大差异。
每个BN层存有5个参数,前4个参数的shape都一样,等于通道数。
weight:γ,用于尺寸变换,学习得到的
bias:β,用于偏移,学习得到的
running_mean:当前为止前向传播过的平均特征
running_var:当前为止前向传播过的特征方差
num_batches_tracked:当前为止前向传播过的mini-batch数量,会根据这个进行计算均值与方差
先用之前训练好的model调为训练模式,并将num_batches_tracked调为0,用目标域的数据集只进行前向传播,整个数据集传播完后,模型会更新running_mean,running_var和num_batches_tracked,其他参数并没有改变。此时再对目标域的数据进行提特征,提出的特征则会满足目标域的分布。这种方式的优点是不用训练。
DDC
最大均值差异(Maximum mean discrepancy)
HopeNet
Loss=CrossEntropy(class66_label,class66_pred)+a*MSE(angle_label,angle_pred)
angle_pred=expectation(class66_pred)*3-99
inception
Unet
无监督学习
SVM 核函数
函数拟合
决策树
常用损失函数
均方误差(Mean Squared Error)
M
S
E
=
1
N
∑
i
=
1
N
(
y
(
i
)
−
f
(
x
(
i
)
)
)
2
MSE = \frac{1}{N} \sum_{i=1}^N (y^{(i)} - f(x^{(i)}))^2
MSE=N1i=1∑N(y(i)−f(x(i)))2
均方根误差
R
M
S
E
=
1
N
∑
i
=
1
N
(
y
(
i
)
−
f
(
x
(
i
)
)
)
2
RMSE = \sqrt{\frac{1}{N} \sum_{i=1}^N (y^{(i)} - f(x^{(i)}))^2 }
RMSE=N1i=1∑N(y(i)−f(x(i)))2
平均绝对误差(Mean Absolute Error)
M
A
E
=
1
N
∑
i
=
1
N
∣
y
(
i
)
−
f
(
x
(
i
)
)
∣
MAE = \frac{1}{N} \sum_{i=1}^N |y^{(i)} - f(x^{(i)})|
MAE=N1i=1∑N∣y(i)−f(x(i))∣
交叉熵代价函数(Cross Entry)
H
(
p
,
q
)
=
−
∑
i
=
1
N
p
(
x
(
i
)
)
log
q
(
x
(
−
i
)
)
H(p,q) = - \sum_{i=1}^{N} p(x^{(i)}) \log {q(x^{(-i)})}
H(p,q)=−i=1∑Np(x(i))logq(x(−i))
余弦相似度距离和欧氏距离的区别
几种常见损失函数
triplet loss
2015
center loss
2016
center feature 是每个mini-batch的每个类别的center feature。所以类别较多,但batchsize较小的情况没什么效果。
A-softmax loss(SphereFace)
2017
softmax loss:
其中
让
得到下面的loss,并加上超参m
Cosine loss(CosFace)
2018
在A-softmax基础上
得到norm之后的norm softmax loss:
添加偏移系数m,让类间距更大
ArcFace
2019
即对cos loss进行了调整,角度距离比余弦距离在对角度的影响更加直接。
参考
四种对比
常用人脸数据集
CelebA
NAME | ID | total | anotation |
---|---|---|---|
IJB-A | 500 | 0.5w | |
IJB-B | 1845 | 1.1w | |
CelebA | 1w | 20w | 人脸属性有40多种 |
LFW | 1680 | 1.3w | |
CUM PIE | 68 | 4w | 13pos,43illums,4exps |
YTF | 1595 | 3425videos | |
CASIA | 1040 | 10w | Pose, Expression, Accessory, Lighting |
IMDB-WIKI | 20284 | 52w | age,gender |
vggface | 2622 | 260w | age |
vggface2 | 9131 | 331w | age,pos |
MS-Celeb-1M | 10w | 1000w | |
megeface | 69w | 470w | |
yaleB | 38 | 0.2w | 64illums |
聚类
无监督学习,将一堆数据分聚成多个类别。
k-means
- 随机地选择k个对象,每个对象初始地代表了一个簇的中心;
- 对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;
- 重新计算每个簇的平均值,更新为新的簇中心;
- 不断重复2、3,直到准则函数收敛。
PCA
对于二维数据,通过调整坐标系,将所有数据的其中一个维度的数据取到最大,舍去另外一个维度的信息,达到降维的效果。
如何通俗易懂地讲解什么是 PCA 主成分分析
图像处理
腐蚀、膨胀、二值化
边缘检测算子
霍夫变换
数据增广
镜像、旋转、裁剪、灰度、亮度调整、伽马变换、高斯噪声
样本不平衡
SMOTE(Synthetic Minority Over-sampling Technique)过采样小样本(扩充小类,产生新数据):
即该算法构造的数据是新样本,原数据集中不存在的。该基于距离度量选择小类别下两个或者更多的相似样本,然后选择其中一个样本,并随机选择一定数量的邻居样本对选择的那个样本的一个属性增加噪声,每次处理一个属性。这样就构造了更多的新生数据。(优点是相当于合理地对小样本的分类平面进行的一定程度的外扩;也相当于对小类错分进行加权惩罚
欠采样大样本(压缩大类,产生新数据)
设小类中有N个样本。将大类聚类成N个簇,然后使用每个簇的中心组成大类中的N个样本,加上小类中所有的样本进行训练。(优点是保留了大类在特征空间的分布特性,又降低了大类数据的数目)
对小类错分进行加权惩罚
对分类器的小类样本数据增加权值,降低大类样本的权值
分治ensemble
将大类中样本聚类到L个聚类中,使用大类中的每个簇与所有的小类样本分别进行训练得到L个分类器;最后对这L个分类器采取少数服从多数对未知类别数据进行分类,如果是连续值(预测),那么采用平均值。
分层级ensemble
使用原始数据集训练第一个学习器L1;将L1错分的数据集作为新的数据集训练L2;将L1和L2分类结果不一致的数据作为数据集训练L3;最后测试集上将三个分类器的结果汇总(结合这三个分类器,采用投票的方式来决定分类结果,因此只有当L2与L3都分类为false时,最终结果才为false,否则true。)
基于异常检测的分类
用异常检测算法(如高斯混合模型、聚类等)检测得到离群点或异常点;再对这些异常点为训练集学习一个分类器。
bagging boosting
梯度消失与爆炸https://zhuanlan.zhihu.com/p/33006526?from_voters_page=true
正则https://blog.csdn.net/jinping_shi/article/details/52433975
DDC https://blog.csdn.net/weixin_42129882/article/details/105528521
BN https://www.jianshu.com/p/a78470f521dd