赞
踩
对卷积的最早接触是在信号与系统中,描述系统对输入信号的响应。
连续形式:
f
(
n
)
∗
g
(
n
)
=
∫
−
∞
+
∞
f
(
τ
)
g
(
n
−
τ
)
d
τ
f(n)*g(n) = \int_{ - \infty }^{ + \infty } {f(\tau)g(n-\tau)d\tau}
f(n)∗g(n)=∫−∞+∞f(τ)g(n−τ)dτ
离散形式:
f
(
n
)
∗
g
(
n
)
=
∑
τ
=
−
∞
+
∞
f
(
τ
)
g
(
n
−
τ
)
f(n)*g(n) = \sum_{ \tau=- \infty }^{ + \infty } {f(\tau)g(n-\tau)}
f(n)∗g(n)=τ=−∞∑+∞f(τ)g(n−τ)
卷积操作就是对两个函数进行“卷积”,本质上就是先将一个函数翻转然后进行滑动,与另一个函数叠加。“积”指的就是积分/求和,在连续情况下,叠加指的是对两个函数的乘积求积分,在离散情况下就是加权求和;“卷”其实很生动地表达了翻转和滑动的过程。如果从信号经过系统产生响应的角度来看,这些操作所代表的含义是,某一时刻的系统响应不仅跟当前时刻输入信号的响应值有关,也跟过去所有时刻输入信号的响应都有关系,是对过去的所有输入的效果的累积,并且信号对应与响应函数加权求和,所以进行了翻转。
在图像处理中,卷积其实就是把每个像素周边的像素都考虑进来,对当前像素和卷积核进行某种加权处理。但是在图像卷积中,似乎翻转的概念没有特别突显,图像处理矩阵翻转应该是在x轴和y轴上都需要进行翻转,但是一般图像处理中的卷积核都是对称的,所以翻转前后不会产生变化;而在神经网络中的卷积核的参数都是预测出来的,可能代表的“卷积”含义有些区别,但结果也不受到影响。
说到卷积神经网络的起源,还是要从深度神经网络说起,这里指的DNN是原始的全连接的神经网络,即没有引入卷积操作。全连接神经网络的结构里,下层神经元和所有上层神经元都会形成连接,它的缺点是参数数量的剧增,可能带来的影响有:(1)模型更复杂,容易过拟合;(2)优化函数随着层数加深,越来越容易陷入局部最优解;(3)梯度消失/爆炸现象严重。
(后面会针对过拟合/欠拟合问题、解决局部最优问题、梯度消失和爆炸问题做具体描述。)
对于CNN来说,并不是所有上下层神经元都能直接相连,而是通过不同的卷积核相连接提取不同的特征图,同一个卷积核在所有图像内是共享的,图像通过卷积操作后仍然保留原先的位置关系。若输入尺寸
(
w
1
,
h
1
,
C
i
n
)
(w_1,h_1,C_{in})
(w1,h1,Cin),输出尺寸
(
w
2
,
h
2
,
C
o
u
t
)
(w_2,h_2,C_{out})
(w2,h2,Cout),则全连接的参数量是
w
1
×
h
1
×
C
i
n
×
w
2
×
h
2
×
C
o
u
t
w_1×h_1×C_{in}×w_2×h_2×C_{out}
w1×h1×Cin×w2×h2×Cout,而卷积神经网络变为
k
s
i
z
e
2
×
C
i
n
×
C
o
u
t
k_{size}^2×C_{in}×C_{out}
ksize2×Cin×Cout。卷积神经网络的特点是:局部感知、权值共享;优点是:参数少、训练快、得分高、易迁移,因此后来居上,碾压了全连接的神经网络。
虽然CNN使得图像空间产生了一定的关联,但是DNN的另一个问题是无法对时间序列上的变化进行建模。在普通的全连接网络或CNN中,每层神经元的信号只能向下一层传播,样本的处理在各个时刻独立,因此又被成为前向神经网络(Feed-forward Neural Networks)。而在循环神经网络(RNN)中,神经元的输出可以在下一个时间节点直接作用到自身,因此,t+1时刻网络的最终结果是该时刻输入和历史共同作用的结果。然而,在时间轴上,它的梯度传播几次就会消失,或者说当前的结果无法影响太遥远的过去。为了解决时间上的梯度消失,长短时记忆单元LSTM,通过门的开关实现时间上记忆功能。
最原始的卷积操作,在输入图像与卷积核进行卷积后的结果会损失部分值,这是因为边缘上的像素永远不会位于卷积核中心,而卷积核也没法扩展到边缘区域以外。因此,丢失了图片边界处的众多信息。
一般希望输入和输出的大小应该保持一致,为解决这个问题,可以在进行卷积操作前,对原矩阵进行边界填充(Padding),如下图所示。在矩阵的边界上填充一些值,以增加矩阵的大小,通常都用“0”来进行填充的。在神经网络模块代码中,常用的padding形式分为:
卷积核每次滑动的行数和列数称为Stride,如下图所示stride=1。stride=2可以压缩输出图的尺寸为1/2。
卷积常见问题:
1、特征图尺寸的计算,或者感受野大小的计算?
如果已知图像的输入尺寸
F
i
n
F_{in}
Fin,卷积核大小
k
k
k,padding为
P
P
P,stride为
S
S
S,计算公式如下:
F
o
u
t
=
F
i
n
−
k
+
2
P
S
+
1
F_{out}=\frac{F_{in}-k+2P}{S}+1
Fout=SFin−k+2P+1
感受野的计算可以将输出设为1,然后逆算输入尺寸
F
i
n
F_{in}
Fin。
2、如何增加感受野?
(1)增加网络层数;(2)增大卷积核的尺寸;(3)设置卷积的stride为2;(4)增加pooling层stride为2;(5)使用下采样,双线性插值;(6)使用空洞卷积(dilate_rate=2)。
3、卷积核的大小一般为奇数×奇数,如 1×1,3×3,5×5,7×7都是最常见的。为什么没有偶数×偶数,并且为什么不用很大的卷积核呢?
4、怎么才能减少卷积层的参数量,卷积的通道和空间不可分离吗?
5、1×1卷积核有什么作用呢?
6、怎么计算某一层卷积的参数量或者计算量?
如果已知图像的输入尺寸
F
i
n
F_{in}
Fin,输入通道
C
i
n
C_{in}
Cin,卷积核大小
k
k
k,输出尺寸
F
o
u
t
F_{out}
Fout,输出通道
C
o
u
t
C_{out}
Cout,计算公式如下:
参
数
量
=
k
2
×
C
i
n
×
C
o
u
t
,
计
算
量
=
k
2
×
C
i
n
×
C
o
u
t
×
F
o
u
t
2
参数量=k^2×C_{in}×C_{out},计算量=k^2×C_{in}×C_{out}×F_{out}^2
参数量=k2×Cin×Cout,计算量=k2×Cin×Cout×Fout2
7、为什么卷积对图像的特征提取是有效的?
(1)在二维图像上处理数据,权值共享,有效降低全连接的参数量。
(2)人在认知图像时是分层抽象的,首先理解的是颜色和亮度,然后是边缘、角点、直线等局部细节特征,接下来是纹理、几何形状等更复杂的信息和结构,最后形成整个物体的概念。卷积核是从左到右、从上到下依次扫描整个图像,前面的卷积层捕捉图像局部、细节信息,有小的感受野,后面的卷积层感受野逐层加大,用于捕获图像更复杂,更抽象的信息。
(3)在卷积神经网络中,每一个卷积核所对应的卷积层实际上就是一个系统,一个用于判断图像中某一个特征的系统,但是我们需要的对于判断的某一个特征的系统的具体运算法则并不清楚,所以我们需要通过误差反向传播的方式不断地调整卷积核中的参数使得在训练后调整参数的卷积核能够能够完成当前卷积层(即当前系统)能够判断某一个图像特征的工作。当所有的单个卷积层(单个特征判断系统)都能有效地完成特征判断的任务时,由这些数量众多卷积层所组成的复杂系统CNN就能够完成人类所需要的给予卷积神经网络的复杂任务。
8、为什么深度学习图像分类里的图片的输入大小都是224×224呢?
(1)训练数据,以ImageNet为代表的大多数分类数据集,图像的长宽在300分辨率左右。(2)一般地,从输入到最后一个卷积特征feature map,就是进行信息抽象的过程,然后就经过全连接层/全局池化层的变换进行分类了。这个feature map的大小,如果尺寸太小,那么信息就丢失太严重,如果尺寸太大,信息的抽象层次不够高,计算量也更大,所以7×7的大小是一个很好的平衡。另一方面,图像从大分辨率降低到小分辨率,降低倍数通常是2的指数次方,所以图像的输入最好是7×2的幂次。(3)综上所述,
7
×
2
5
=
224
7×2^5=224
7×25=224与300最接近。
反卷积和卷积的工作过程差不多,主要的区别在于反卷积输出图片的尺寸会大于输入图片的尺寸。如下所示,图中的反卷积的stride为2,通过间隔插入padding来实现的。
down-sampling 和 pooling_layer 的设计缺陷是:不可进行学习,是设定好的;内部数据结构丢失;小物体信息无法重建。空洞卷积是在卷积核上引入空洞,它的优势是:在增大感受野的同时,内部数据结构的保留以及避免使用 down-sampling这样的操作。如下图所示,dilation_rate=2。
空洞卷积潜在的问题是:网格效应(损失信息的连续性,对像素级别的预测是致命的),并且采用大 dilation_rate 的信息或许只对一些大物体分割有效果,而对小物体来说可能则有弊无利了。
为了应对同样的物体在图像中可能呈现出不同的大小、姿态、视角变化甚至非刚体形变,可变形卷积使得卷积神经网络具有学习空间几何形变的能力。由于标准卷积中的规则格点采样导致了网络难以适应几何形变,因此对卷积核中每个采样点的位置都增加了一个偏移的变量,卷积核就可以在当前位置附近随意的采样,而不再局限于之前的规则格点,这样扩展后的卷积操作被称为可变形卷积。通过增加偏移量来学习几何形变的思想还可方便地扩展到其它计算单元中去,如可变形兴趣区域池化 (deformable ROI pooling)。
简单来说,就是对一个输入通道为
M
M
M 的特征图进行的卷积操作,拆分为对
g
r
o
u
p
group
group 个通道为
M
g
r
o
u
p
\frac{M}{group}
groupM 的特征图进行的卷积操作。那么,原卷积的参数量如果为
D
K
2
×
M
×
N
D_K^2×M×N
DK2×M×N,则现在变为
g
r
o
u
p
×
D
K
2
×
M
g
r
o
u
p
×
N
g
r
o
u
p
group×D_K^2×\frac{M}{group}×\frac{N}{group}
group×DK2×groupM×groupN ,因此参数量和计算量都会大幅降低。其中,
D
K
D_K
DK是卷积核的大小,
M
M
M是输入的通道数,
N
N
N是输出的通道数。下图展示了普通卷积 -> 分组卷积 -> 深度卷积的卷积过程:
可以看出,普通卷积的一个卷积核对应产生一个特征图;分组卷积当使用和普通卷积相同的参数量时,能产生g个特征图,g是gruop的数量;深度卷积是单通道卷积,也可以看成是分组卷积的特例,因此对应通道卷积后仍然产生通道数的特征图。不过,深度卷积在不同通道的特征信息没有进行关联,MobileNet是又在整个通道维度上进行了1×1卷积,提出新的深度可分离卷积;ShuffleNet提出了通道混洗(channel shuffle)来帮助信息交换。具体参见https://blog.csdn.net/qq_37002417/article/details/105935425。
把标准卷积分解成深度卷积(depthwise convolution)和逐点卷积(pointwise convolution),大幅度降低参数量和计算量。其中,深度卷积把单一filter应用在每个输入的通道上,然后逐点卷积运用1×1大小的卷积来结合深度卷积的输出。如下图4所示:
其中,
D
K
D_K
DK是卷积核的大小,
M
M
M是输入的通道数,
N
N
N是输出的通道数。对于图中(a)的标准卷积层而言,会产生
D
K
2
×
M
×
N
D_K^2×M×N
DK2×M×N的参数量,而利用(b)和(c)的分解之后,则会产生
D
K
2
×
M
+
M
×
N
D_K^2×M+M×N
DK2×M+M×N的参数量。所以,计算量也会同时降低。
池化(pooling)的本质,其实就是采样,池化过程一般在卷积过程后。对于大图像来说,只做卷积的话资源消耗太大,并且很容易出现过拟合。因此,在卷积层之后可以适当将图像缩小,例如使用max pooling或者average pooling,如下所示,本质就是为了在尽可能保留图片空间信息的前提下,降低图片的尺寸,增大卷积核感受野,提取高层特征;同时减少网络参数量,预防过拟合。
最大池化和平均池化的区别:
池化的缺点:pooling能够增大感受野,让卷积看到更多的信息,但是它在降维的过程中丢失了一些信息,这在像素信息较为敏感的一些视觉任务中(如分割,检测),一般是较少使用pooling操作来下采样的,通常使用插值(如双线性插值等)或者stride=2的卷积层来进行下采样,尽可能的保留像素信息。
由于pooling操作是不可导的,并且由于pooling操作,使得feature map的尺寸变化,梯度无法对位的进行传播下去。解决这个问题的思想也很简单,在 2×2 pooling中就是把1个像素的梯度传递给4个像素,并且需要保证传递的loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的。
欠拟合主要表现为输出结果的高偏差,而过拟合主要表现为输出结果的高方差。
当用比较复杂的模型比如神经网络,去拟合数据时,很容易出现过拟合现象(训练集表现很好,测试集表现较差),这会导致模型的泛化能力下降。这时候,我们就需要使用正则化,可以看作是一种先验信息的约束,降低模型的复杂度。
在2012年,Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。简单而言就是,在一次训练迭代的时候,对每一层中神经元的激活值以一定的概率
p
p
p 停止工作,用余下的神经元所构成的网络来训练本次迭代中的数据(batch_size个样本)。这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征,每层神经元代表一个学习到的中间特征,随机丢弃神经元,即减少中间特征的数量,从而减少冗余,即增加每层各个特征之间的正交性、增强特征的稀疏表示。Dropout带来的缺点是可能减慢收敛速度,由于每次迭代只有一部分参数更新,可能导致梯度下降变慢。
在训练阶段,对应用了dropout的层,每个神经元以keep_prob的概率保留(或以1-keep_prob的概率关闭),没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果;然后在测试阶段,不执行dropout,也就是所有神经元都不关闭,但是对训练阶段应用了dropout的层上的神经元,其输出激活值要乘以keep_prob。而现在主流的方法是Inverted dropout,和传统的dropout方法有两点不同:(1)在训练阶段,对执行了dropout操作的层,其输出激活值要除以keep_prob;(2)测试阶段则不执行任何操作,既不执行dropout,也不用对神经元的输出乘keep_prob。
L1/L2范数正则化是通过对网络权重做正则来限制过拟合,具体是在损失函数加入正则项。 L1范数是指向量中各个元素绝对值之和,即
W
W
W 的L1范数是绝对值
∣
∣
W
∣
∣
1
=
∑
∣
w
i
∣
||W||_1=\sum{|w_i|}
∣∣W∣∣1=∑∣wi∣,可以使权值稀疏,即希望
W
W
W 的大部分元素都是0。参数稀疏化带来的好处是:(1)能实现特征的自动选择,即去掉这些没有信息的特征,也就是把这些特征对应的权重置为0;(2)模型更容易解释,因为这些未被学为0的特征在某一问题分析上面提供的信息是巨大的,决策性的。L2范数是指向量各元素的平方和然后求平方根,即
W
W
W 的L2范数是
∣
∣
W
∣
∣
2
=
∑
w
i
2
||W||_2=\sqrt{\sum{w_i^2}}
∣∣W∣∣2=∑wi2
。在损失函数的优化过程中,让L2范数的正则项最小,可以使得
W
W
W 的每个元素都很小,都接近于0,但与L1范数等于0不同。越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象,因为多项式某些分量的影响很小,模型就越平滑。
参考链接:https://blog.csdn.net/zouxy09/article/details/24971995
之前的研究表明,如果在图像处理中对输入图像进行白化(Whiten)操作的话,就是对输入数据分布变换到0均值单位方差的正态分布,那么神经网络会较快收敛。如果将神经网络每一层都当作下一个隐藏层的输入,那么是否可以都进行白化?对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数更新,导致每个隐层都会面临协变量转移的问题,也就是在训练过程中,隐层的输入分布总是变来变去,这就是所谓的内部协变量转移(Internal Covariate Shift),Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是只发生在输入层。独立同分布假设(IID),就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。可见数据分布对于网路训练是较为关键的,如果数据分布总在变化,不易于网络收敛,因为整体分布逐渐往非线性函数的取值区间的上下限两端靠近,这导致反向传播时低层神经网络的梯度消失。
BN是基于Mini-Batch SGD的,通过一定的规范化手段,把每层神经网络任意神经元输入值的分布强行拉回到均值为0方差为1的标准正太分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,避免梯度消失问题产生,能大大加快训练速度。但是这样会造成,将非线性激活函数替换成线性激活函数效果相同,网络的表达能力下降,因此每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,可能是为了找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
训练过程如上所示,先对一个batch_size内的数据求其均值和方差,进行标准化成均值为0方差为1的正态分布,然后训练参数
γ
\gamma
γ 和
β
\beta
β。推理时,因为每次只输入一个样本,所以没有办法得到均值和方差的统计量,可以用从所有训练实例中获得的统计量来代替Mini-Batch里面m个训练实例获得的均值和方差统计量,即用全局的统计量。但是想要计算所有图像的均值和方差不太现实,所以每次计算每个batch的均值和方差,然后为了让其与整体分布的均值和方差估计值接近,利用了滑动平均的操作计算更新推理的均值和方差。滑动平均或者指数加权平均,可以用来估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关,相比于直接赋值而言,不会因为某次异常取值而使得滑动平均值波动很大。有了均值和方差,每个隐层神经元也已经有对应训练好的Scale参数和Shift参数,因此可以直接计算了。参考链接:https://blog.csdn.net/just_sort/article/details/104468418。
优点:(1)允许较大的学习率;(2)减弱对参数初始化的强依赖性;(3)有轻微的正则化作用,可以防止过拟合。
缺点:(1)对较小的batch size效果不好;(2)BN适用于固定深度的前向神经网络,如CNN,不适用于RNN。
常见问题:
1、Dropout 的
p
p
p 一般取多少?
在编写tensorflow程序的时候,会发现训练的时候dropout的参数keep_prob=0.8(0.5,0.9等),在测试的时候keep_prob=1.0,即不进行dropout。在
p
=
0.5
p=0.5
p=0.5 随机舍弃神经元时,所有的神经元的排列组合数取得最大值,这就意味着随机生成的网络结构更多,符合dropout的初衷。
2、Dropout和BN在卷积神经网络中的位置如何放置?
Dropout一般放在全连接层防止过拟合,提高模型泛化能力,在全连接层中一般放在激活函数层之后,如果放在某些激活函数之前,有可能原本为0的节点在经过激活函数后又有了不为0的输出。由于卷积层参数较少,卷积层一般使用BN,BN-Inception原文建议放在ReLU激活函数之前;在ResNetv2中放在后面好像还好了一点,放在ReLU后相当于直接对之后每层的输入进行归一化。目前的话,只是习惯放在激活层前,其实区别不是很大,区别大的是是否使用BN。
3、如何分析深度神经网络训练起来越困难,收敛越来越慢的原因?
可以从以下几方面解决:(1)学习率设置不当,学习率过大导致训练在局部最小值附近来回震荡,或者学习率过小导致优化步长太小;有可能是发生了梯度消失问题,因此(2)激活函数使用不当;(3)网络中没有使用BN层;(4)网络结构没有使用像ResNet的快捷连接类似的优化结构。
4、BN在推理的时候怎么加速?
将卷积层和BN层融合,本质上是修改了卷积核的参数,在不增加conv层计算量的同时,省略掉了BN层的计算量。conv层的参数
w
,
b
w,b
w,b:
x
1
=
w
∗
x
+
b
x_1 = w*x + b
x1=w∗x+b,BN层的参数
γ
,
β
,
σ
,
μ
\gamma,\beta,\sigma,\mu
γ,β,σ,μ:
x
2
=
γ
∗
x
1
−
μ
σ
2
+
ϵ
+
β
x_2 = \gamma*\frac{x_1-\mu}{\sqrt{\sigma^2+\epsilon}}+\beta
x2=γ∗σ2+ϵ
x1−μ+β,所以输入为
x
x
x 的输出结果
x
2
=
γ
∗
w
σ
2
+
ϵ
∗
x
+
β
+
γ
∗
(
b
−
μ
)
σ
2
+
ϵ
x_2 = \frac{\gamma*w}{\sqrt{\sigma^2+\epsilon}}*x+\beta+\frac{\gamma*(b-\mu)}{\sqrt{\sigma^2+\epsilon}}
x2=σ2+ϵ
γ∗w∗x+β+σ2+ϵ
γ∗(b−μ)。
5、BN跨卡训练怎么保证相同的mean和var?
当进行多卡训练时,每次迭代输入的数据被等分在不同的GPU上前向和后向运算,在迭代完成后合并梯度、更新参数,再进行下一次迭代。因为前向和后向运算的时候,每块卡是独立的,所以BN归一化的样本数量仅仅局限于卡内,相当于批量大小减少了。跨卡同步BN的关键是前向运算的时候取全局的均值和方差,即将每张卡的
x
i
x_i
xi和
x
i
2
x_i^2
xi2 求和,后向运算时也需同步一次。
6、除了BN,还有哪些深度学习中常用的归一化方法?
常用的Normalization方法主要有:
如上图所示,(1)BN的计算就是把一个batch的N个样本的每个通道的H×W单独拿出来归一化处理。(2)但是对于LN,其不依赖于batch size和输入sequence的长度,因此可以用于batch size为1和RNN中,LN用于RNN效果比较明显,但是在CNN上效果不如BN。LN中同层神经元的输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差,简单理解为对特征图数值进行归一化。(3)IN针对图像像素做归一化,最初用于图像的风格化迁移。在图像风格化中,生成结果主要依赖于某个图像实例,并且feature map的各个channel的均值和方差会影响到最终生成图像的风格。所以对整个batch归一化不适合图像风格化,因而对H×W做归一化,可以加速模型收敛,并且保持每个图像实例之间的独立。(4)GN是为了解决BN对较小的mini-batch size效果差的问题,GN适用于占用显存比较大的任务,例如图像分割。对这类任务,可能batch_size只能是个位数,再大显存就不够用了,这时BN的表现很差,因为没办法通过几个样本的数据量来近似总体的均值和标准差。GN也是独立于batch的,它是LN和 IN的折中。(5)将 BN、LN、IN 结合,赋予权重,让网络自己去学习归一化层应该使用什么方法,但训练复杂。
梯度消失(vanishing gradients):指的是在训练过程中,梯度(偏导)过早接近于0的现象,导致(部分)参数一直不再更新,整体上表现得像损失函数收敛了,实际上网络尚未得到充分的训练。
梯度爆炸(exploding gradients):指的是在训练过程中,梯度(偏导)过大甚至为NAN(not a number)的现象,导致损失剧烈震荡,甚至发散(divergence)。
根源是深度神经网络和反向传播,目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。 梯度消失经常出现的两种情况:一是在深层网络中,二是采用了不合适的激活函数,比如sigmoid。梯度爆炸一般出现在:一是深层网络中,二是权值初始化值太大的情况下。
针对梯度爆炸:
然而,在深度神经网络中,往往是梯度消失出现的更多一些:
对局部最优的避免有两个根本方法:
1、深入研究问题的机理,对问题的机理研究的越透彻,就能更准确的找到全局最优,或划定全局最优可能的区域;
2、随机搜索,对机理不明的问题,解的搜索越随机陷入局部最优的可能性就越小。
对于已经陷入局部最优,或怀疑陷入局部最优的情况:
1、“跳出”,也就是在当前解的基础上向其他方向搜索;
2、“重启”,无视当前解并在新的区域重新搜索。
具体方法如下:
正确初始化神经网络的参数对神经网络的最终性能有着决定性作用:如果参数设置过大,会出现梯度爆炸的现象,导致网络训练过程发散;而如果参数设置过小,会出现梯度消失的现象,导致收敛极其缓慢。
在机器学习中,类别数据是一种只有标签值而没有数值的变量。将决策树算法直接应用于类别数据上,可以不进行任何数据转换,但还有许多机器学习算法并不能直接操作标签数据,这些算法要求所有的输入输出变量都是数值。很容易想到的就是整数编码,每个类别值都分配一个整数值,整数之间存在的自然排序关系也可以被机器学习所利用。但对于不存在次序关系的类别变量,仅使用上述的整数编码是不够的,因为预测值有可能落在两个类别的中间。One-Hot编码指的是将类别标签使用“01向量”来进行表示,又叫独热(一位有效)编码。它的作用是将分类变量作为二进制向量的表示,并为每个整数值都创建一个二值变量,然后将类别对应整数序号的二进制位置1,其余置0。
one-hot编码要求每个类别之间相互独立,所以包含的信息量很低,而soft label包含的信息量拥有不同类别之间的关系信息。比如说,一个图像分类的数据库有猫、狗、卡车、汽车等类别,label只给出图A中的物体是狗,图B是卡车,而并没有给出图A里面的狗会更像猫,图B里面的卡车会更像汽车。对比 hard label: [ 1 , 0 , 0 ] [1,0,0] [1,0,0],soft label: [ 0.6 , 0.3 , 0.1 ] [0.6,0.3,0.1] [0.6,0.3,0.1]。
在训练神经网络时,最小化预测概率和标签真实概率之间的交叉熵,从而得到最优的预测概率分布,即
f
(
x
i
)
{
+
∞
,
i
f
(
i
=
y
)
0
,
i
f
(
i
≠
y
)
f(x_i)
如此一来,神经网络会促使自身往正确标签和错误标签差值最大的方向学习,在训练数据较少,不足以表征所有样本特征的情况下,会导致网络过拟合。标签平滑可以解决上述问题,主要是通过soft one-hot来加入噪声,减少了真实样本标签的类别在计算损失函数时的权重,最终起到了抑制过拟合的效果。进行label smoothing后的真实概率分布如下:
P
(
x
i
)
{
(
1
−
ϵ
)
,
i
f
(
i
=
y
)
ϵ
K
−
1
,
i
f
(
i
≠
y
)
P(x_i)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。