深度学习
卷积类
-
卷积神经网络的特点
权值共享 稀疏连接 局部感知 -
有哪些卷积
常规卷积 3*3等
单通道卷积 channel
多通道卷积
3D卷积
转置卷积
1 x1 卷积
深度可分离卷积
空洞卷积/膨胀卷积 -
深度可分离卷积
一些轻量级的网络,如MobileNet中,会有深度可分离卷积depthwise separable convolution 由depthwise(DW)和pointwise(PW)两个部分结合起来,用来提取特征feature map。相比常规的卷积操作,参数数量和运算成本低。
主要包含两步:
1,逐通道卷积 Depthwise Convolution
一个卷积核负责一个通道,一个通道只被一个卷积核卷积
完全在二维平面内进行。卷积核的数量和上一层的通道数相同。所以一个三通道的图像经过运算后生成了3个Feature map,Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法扩展Feature map。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的feature信息。
2,逐点卷积
升维的作用。卷积核尺寸为1x1xM,M为上一层的通道数。
所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map -
1*1卷积的作用
1),增加非线性,增加网络的表达能力
2), 降维升维
3),跨通道信息交互(channel的变换) -
深度学习为什么要深层?
1.模型复杂度提升,学习能力提升
2.层次更深,特征不变性强,类别分类能力越强,要学习复杂的任务需要更深的网络。 -
如何改善训练模型的效果?
1,通过提升数据,获取良好数据,对数据预处理,零均值1方差化,数据扩充或者增强
2,诊断去哪个罗是否过拟合欠拟合。通过偏差方差。正则化,早停等解决过拟合。
3,通过学习率,激活函数的选择,改善网络全连接层个数层数,优化算法,BN层
4,权值初始化,Xavier初始化, -
如何解决梯度爆炸与消失?
1.使用预训练加微调 梯度剪切 权重正则(针对梯度爆炸)
2,使用不同的激活函数
3,使用bn层
4,使用残差结构
5,使用LSTM网络 -
CNN池化层有什么作用?
1,减少图像尺寸,数据降维
2,缓解过拟合
3,保持一定程度的旋转和平移不变性,maxpooling能保证卷积神经网络在一定范围内平移特征能得到同样的激励,具有平移不变性。 -
卷积神经网络中空洞卷积的作用是什么?
空洞卷积页脚扩张卷积,在保持采纳数个数不变的情况下增大卷积核的感受野,同时可以保证输出的特征映射的大小保持不变。一个扩张率为2的3X3卷积核,感受野与5X5的卷积核相同,但是参数数量仅为9个。 -
常用的分割算法有哪些?
1,基于阈值的分割方法:比较常用的阈值法有大律法和最小误差法
2,基于边缘的分割方法:常见的微分算子包括Robert算子、Sobel算子,Canny算子等。
3,基于区域的分割方法:主要包括种子区域生长法、区域分裂合并法和分水岭法等
4,基于图论的分方法:Graph Cut方法
5,深度学习:语义分割等。
深度学习基础
-
BN的原理,作用和实现细节
优点:
1)加快训练速度,这样我们就可以使用较大的学习率来训练网络。
2)提高网络的泛化能力。解决过拟合
3)BN层本质上是一个归一化网络层,可以替代局部响应归一化层(LRN层)。
4)可以打乱样本训练顺序(这样就不可能出现同一张照片被多次选择用来训练)论文中提到可以提高1%的精度。
BN层的输出Y与输入X之间的关系是:Y = (X - running_mean) / sqrt(running_var + eps) * gamma + beta,此不赘言。其中gamma、beta为可学习参数(在pytorch中分别改叫weight和bias),训练时通过反向传播更新;而running_mean、running_var则是在前向时先由X计算出mean和var,再由mean和var以动量momentum来更新running_mean和running_var。所以在训练阶段,running_mean和running_var在每次前向时更新一次;在测试阶段,则通过net.eval()固定该BN层的running_mean和running_var,此时这两个值即为训练阶段最后一次前向时确定的值,并在整个测试阶段保持不变。
BN层的位置:可以在激活函数之前也可以之后,使用relu可以放后面,而sigmoid和tanh放激活函数前面,避免破坏非线性特征的分布。 -
激活函数,哪些和特点
激活函数作用:加入激活函数可以给模型加入非线性因素,提升模型表达能力。
激活函数的类型:
1)sigmod函数
区间在【0,1】之间,不受欢迎主要是因为梯消失问题,输出不是以0 为中心,梯度更新的不同的方向走太远。sigmoid收敛缓慢。
2)tanh函数 双曲正切函数
输出范围【-1,1】,以0为中心,优化更容易些,但是仍存在梯度消失的问题
3)Relu函数
4)Leaky ReLu
它的收敛性提高了6倍
它可以避免和纠正梯度消失问题。现如今,几乎所有深度学习模型现在都使用ReLu函数。
但它的局限性在于它只能在神经网络模型的隐藏层中使用。
ReLu函数的另一个问题是,一些梯度在训练过程中可能很脆弱,甚至可能会死亡。它可以导致权重更新,这将使其永远不会在任何数据点上激活。简单地说ReLu可能会导致死亡神经元。
为了解决这个问题,我们引进了另一个被称为Leaky ReLu的修改函数,让它来解决死亡神经元的问题。它引入了一个小斜坡从而保持更新值具有活力。在0上不可导,可以使用二阶导值,或者一个梯度的定值。
然后,我们还有另一个变体,它形成于ReLu函数和Leaky ReLu函数的结合,我们称之为Maxout函数。
5)Mish激活函数
怎么解决梯度消失和梯度爆炸?
用ReLU、Leaky ReLU、PReLU、RReLU、Maxout等替代sigmoid函数。
用Batch Normalization。
可以通过添加正则项,避免梯度爆炸,压缩wi权重大小。
LSTM的结构设计也可以改善RNN中的梯度消失问题。
使用残差结构,主要是解决网络退化
使用更有的初始化方式,或者采用pre_train,fine_tuning模式 -
损失函数哪些,作用
1)l1范数误差,计算预测值与标签差值的绝对值:torch.nn.L1Loss(reduction=‘mean’)
2)均方误差损失函数
3)交叉熵损失函数
4)KL散度torch.nn.KLDivLoss(reduction=‘mean’)
5)二进制交叉熵损失BCELoss 二分类任务时的交叉熵计算函数。用于测量重构的误差, 例如自动编码机. 注意目标的值 t[i] 的范围为0到1之间.
6)BCEWithLogitsLoss 把sigmoid集合进BCELoss中
7)MarginRankingLoss torch.nn.MarginRankingLoss(margin=0.0, reduction=‘mean’)
对于batch中的每个实例的损失如下 m a x ( 0 , − y ∗ ( x 1 − x 2 ) + m a r g i n ) max(0,-y*(x_1-x_2)+margin) max(0,−y∗(x1−x2)+margin)
8)三元组损失函数:TripletMarginLoss
torch.nn.TripletMarginLoss(margin=1.0, p=2.0, eps=1e-06, swap=False, reduction=‘mean’)
具体例子:给一个A,然后再给B、C,看看B、C谁和A更像。
L(a,p,n)=max{d(a,p)-d(a,n)+margin,0} -
过拟合/欠拟合的预防方法
过拟合
方差大,偏差小
解决办法:
1),重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。
2),增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。
3),采用正则化方法。正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对于的范数。但是在机器学习中一般使用L2正则,下面看具体的原因。
4),采用dropout方法。这个方法在神经网络里面很常用。dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作。降低网络训练时的网络复杂度
欠拟合
1)添加其他特征项
2)减小正则化参数
3)添加多项式特征,增加网络复杂度 -
梯度消失和梯度爆炸,现象、原因和解决方法
原因:梯度的累乘,激活函数的特性决定。比如sigmiod在饱和区梯度很小,累乘后消失,在0处梯度很大,累乘会变成很大的值。
解决方案: bn relu 正则化 resnet模块 -
网络退化的现象、原因和解决方法
参考文章:https://blog.csdn.net/cristiano20/article/details/104309948
理论上网络深度越深,特征的提取能力越强。但是实际并非如此,上图所示拥有56层数的网络结构明显差于拥有20层数的网络结构,造成这一现象的原因的大概有:过拟合、梯度消失/爆炸和深度网络的退化(信息损失)。
解决方法:ResNet,引入残差结构
ResNet的初衷,就是让网络拥有这种恒等映射的能力,能够在加深网络的时候,至少能保证深层网络的表现至少和浅层网络持平。 -
各种优化器,特点和公式
1) SGD
SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新,是最常见的优化方法了
缺点:1,学习率难以选择,2,容易产生局部最优
2)Momentum
参考文献:https://blog.csdn.net/fengchao03/article/details/78208414?utm_source=blogxgwz5
momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度,动量的大小和梯度有关。
adam
经验:
对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值
SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠
如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果 -
调参技巧,调参顺序
1)实现是搭建模型: -
有源码将源码跑通,没有的话考虑自己搭建模型;
-
主干网络可以直接考虑resnet,(后续网络优化部分再考虑裁剪或者其他网络结构)
-
loss根据任务考虑,分类多试交叉熵,回归是最小二乘法;
-
优化函数,采用Adam或者SGD都可以。
-
学习率可以从0.1或者0.01开始
-
batchsize:32 或者64
2)准备小规模样本
比如存在100w数据,可以先打包1w数据或者几千样本,可以暂时先不考虑数据增强,正常打包后直接训练网络,用小批量样本来测试网络搭建中可能存在的bug,直到网络可以收敛,确保网络搭建的准确性,方便后续出现问题时,问题的定位。
3)小规模样本训练收敛之后,则可以确定模型框架没有问题。开始加大样本规模到100W,使用大规模样本训练;
4)训练后,分析训练集和测试集LOSS的变化情况,考虑上述过拟合、欠拟合、收敛不稳定不同情况,优化相应的参数;
5,在Loss出现较为理想的结果后,基本上网络训练也趋于稳定。接下来则是重点排查难点问题,尝试创新性的调整网络架构,尝试新的loss,调整数据增强策略,不同优化函数,不同学习率,不同batchsize等等,通过各种手段,来提高准确度。
-
softmax原理
计算将 x i x_i xi归属类别j的概率为:
p ( y i = j ∣ x i ; θ ) = e θ j T x i ∑ l = 1 k e θ l T x i p(y_i=j|x_i;\theta)=\frac{e^{\theta_{j}^Tx_i}}{\sum_{l=1}^ke^{\theta_l^Tx_i}} p(y