本篇文章5755字,读完约14分钟
据雷锋说。作者张华严和金桥智慧科技算法工程师。原文包含在作者的个人博客中。雷锋。(公开号码:雷锋。com)已被授权。
本文介绍了实现深度神经网络的八种技术或技巧,包括数据增强、图像预处理、网络初始化、训练技巧、激活函数的选择、不同的正则化方法、数据洞察、多深度网络集成方法等。
1.数据扩充可以通过增加数据量而不改变图像类别来提高模型的泛化能力。
有许多方法可以增加自然图像的数据,例如水平翻转、一定程度的位移或裁剪和颜色抖动。此外,您可以尝试各种操作的组合,例如同时进行旋转和随机比例变换。此外,您可以将hsv彩色空中每个面片的所有像素的饱和度和亮度增加0.25-4次方,乘以0.7-1.4之间的系数,并添加-0.1-0.1之间的值。同样,您可以将-0.1到0.1之间的值添加到色调通道(h)中每个图片或面片的所有像素。
2.预处理2.1最简单的预处理方法:零均值
标准化
2.1.1为什么要零均值
数据平均值过大可能导致参数梯度过大。如果有后续处理,可能需要零均值的数据,如主成分分析。零均值不会消除像素之间的相对差异。人们通常从像素之间的相对色差获得图像信息,而不是像素值。
2.1.2我们为什么要正常化
规范化就是使不同维度的数据具有相同的分布。假设二维数据的两个维度(x1,x2)服从均值为零的正态分布,但x1方差为100,x2方差为1。那么通过随机采样在二维坐标系中绘制的图像(x1,x2)应该是一个狭窄的椭圆形。
以下表达式用于这些数据的特征提取:
s = w1 * x1+w2 * x2+b;
那么参数w1和w2的梯度是:
ds/dw1 = x1;ds / dw2 = x2
由于x1和x2的分布比例差异很大,w1和w2的导数也非常不同。这时,目标函数的表面图(不是S)被绘制出来,就像一个深峡谷。w2沿峡谷方向变化,坡度很小;W1沿峡谷的垂直方向变化,坡度非常陡,如图1所示,而我们的预期目标函数如图2所示。
目标函数很难优化,因为w1和w2之间的梯度差太大,所以在二维中需要不同的迭代方案。然而,在实践中,为了方便起见,我们通常为所有维度设置相同的步长。通过迭代,步长的减小在不同的维度上是同步的。这就要求W在不同纬度的分布尺度大致相同,而这一切都是从数据的归一化开始的。
2.1.3实现代码
X-=numpy.mean(x,轴=0) #,即x的每一列减去该列的平均值
注意:对于灰度图像,零均值也可以减去整幅图像的平均值:x-=numpy.mean(x)
X/=numpy.std(x,轴=0) #数据标准化。
x是输入数据,(图片数量x图片尺寸)。另一种标准化方法是标准化每个维度,以确保每个维度的最大值和最小值分别为-1和1。只有当每个输入要素的比例或单位不同时,这种预处理方法才有意义。例如,将图片像素作为输入,所有像素值都在0-255的范围内,因此不需要严格执行该预处理操作。当在自然图像上训练时,归一化操作是不必要的,因为理论上,图像的任何部分的统计特性应该与其他部分的统计特性相同,并且图像的这种特性被称为平稳性
2.2白化相当于在零均值运算和归一化运算之间插入一个旋转运算,将数据投影到主轴上。在图片被白化之后,可以认为每个像素在统计上是独立的。然而,白化很少用于卷积神经网络。可能的原因是图像信息是由像素之间的相对差异反映的。白化使像素去相关,这使得差异不确定并丢失信息。
首先将数据置零,然后计算协方差矩阵,观察数据中的相关结构。
x-=np .均值(x,轴=0)
Cov=np.dot(x.t,x)/x.shape[0] #计算协方差矩阵
然后进行去相关运算,即将原始数据(零平均后的数据)投影到本征基空.
u,s,v=np.linalg.svd(cov) #计算数据协方差矩阵的奇异值奇异值分解
Xrot=np.dot(x,u) #去相关数据
最后一种变换是白化,即将空特征基之间的数据除以每个维度的特征值,以标准化尺度。
Xwhite=xrot/np.sqrt(s+1e-5) #除以奇异值的平方根。请注意,这里添加了1e-5,以防止分母为0。
pca白化的一个缺点是它会增加数据中的噪声,因为它将输入数据的所有维度扩展到相同的大小,并且这些维度包括噪声维度(它通常是不相关的并且具有小的方差)。在实践中,通过将1e-5增加到更大的值,可以将这个缺点引入到更强的平滑中。
3.初始化3.1不要将所有参数初始化为零。几乎所有的有线电视新闻网都是堆积的。将参数初始化为零将导致流过网络的数据是对称的(所有的都是零),并且没有办法在没有干扰的情况下打破这种数据对称,这将导致网络无法学习。
当参数零初始化时,无论输入是什么,中间神经元的激活值都是相同的(任何神经元的激活值都是a=f(wtx),当权重w是零向量时,wtx也是零向量,所以激活函数后的激活值是相同的),反向传播过程中计算的梯度也是相同的,所以每个权重参数的更新都是相同的,因此网络失去了不对称性。
3.2具有小随机数的初始化参数应该非常接近零(但不都等于零),以破坏网络的对称性。初始参数应该是随机和独立的,以确保每个参数更新过程是不同的。给每个参数一个接近于零的随机值:
w = 0.01 * numpy . rand . randn(d,h)
Randn方法可以生成均值为零、方差为正态分布的随机数,也可以使用较小值的均匀分布来生成初始化参数,但实际上,两种方法的最终结果相差不大
3.3方差的归一化用随机初始化方法初始化参数将导致输出S的方差随输入量(X或W向量的维数)的增加而增加。
独立随机变量之和的方差具有以下性质:
var(a+b+c)=var(a)+ var(b)+ var(c)
s = w1*x1 + w2*x2 +…+wi*xi+ b
s是多个随机变量的加权和。假设钨的尺寸相互独立。随着数据维度的增长,S的方差将线性累积。由于不同任务的数据维度是不可控的,所以我们希望对S的方差进行归一化,只需要W:
w = numpy . random . randn(n)/sqrt(n)# n是数据维度
上述操作是正确的推导过程:
当n*var(w) = 1时,std(w) = 1/sqrt(n)。
注意:现在更多的论文实际上使用了relus函数,这是relus推荐的:
w = numpy . rand . randn(n)* sqrt(2.0/n)
4.在训练过程中,4.1卷积滤波器和池层大小的输入数据最好是2的整数次方,例如32(CIFAR-10中的图像大小)和64,224(ImageNet中的公共大小)。此外,使用较小的滤波器尺寸(例如,3×3)、较小的步长(例如,1)和零填充将不仅减少参数的数量,而且提高整个网络的精度。当使用步长为1、填充为1的3×3滤波器时,图片或特征图像的空之间的大小将保持不变。共用层常用的共用尺寸为2x2。
4.2使用验证集的学习率是获得适当学习率的有效手段。训练开始时,Lr通常设置为0.1。在实践中,当您观察到验证集的损失或精度没有变化时,将lr除以2或5,然后继续运行。
4.3微调预培训模式
许多最先进的深度网络模型都是开源的,这些预先训练好的模型具有很强的泛化能力,因此可以根据自己的任务进行微调。微调涉及两个重要因素:新数据集的大小和两个数据集之间的相似性。网络顶级要素包含更多特定于数据集的要素。
5.激活功能
激活函数用于将非线性引入网络。Sigmoid和tanh过去很受欢迎,但现在它们很少用于视觉模型。主要原因是当输入的绝对值较大时,其梯度(导数)接近于零,则参数几乎不再更新,梯度的反向传播过程将被中断,出现梯度耗散现象。
激活功能示意图,斯坦福cs231n图片
乙状结肠激活功能
Tanh激活功能
Relu激活功能
relu的优势:
它实现起来非常简单,并且加快了计算过程。
加速收敛,无饱和问题,并大大缓解梯度耗散现象。
Relu缺点:
也就是说,如果有一组二维数据x(x1,x2)分布在x1:[0,1],x2:[0,1]的区域,它可能永远消失,一组参数w(w1,w2)线性变换x,并将结果输入到relu。
f = w1*x1 + w2*x2
如果w1 = w2 = -1,那么无论x取什么值,f都必须小于或等于零。那么relu函数对f的导数将总是零。这个relu节点永远不会参与整个模型的学习过程。
为了解决负区间relu的导数为零的问题,人们发明了漏relu、参数relu、随机化relu等变体。他们的中心思想是在负区间给relu函数一个特定的斜率,这样它的导数就不为零(这里,让斜率为α)。
漏relu直接为alpha指定一个固定值,整个模型使用这个斜率:
参数化relu以α为参数,通过学习数据获得其最优值。
随机化relu的α在指定的间隔内随机选择,并且在测试阶段是一个恒定值。
一些学者在cifar-10、cifar-100和ndsb数据集上进行了实验,将两种具有不同激活函数的cnn网络结合起来,并评价了这四种激活函数的优缺点。实验结果表明,漏relu在获取较大的α时具有较好的准确性。参数relu易于在小数据集上拟合(训练集中的错误率最低,测试集不理想),但仍优于relu。Rrelu是有效的,实验表明它可以克服模型的过拟合,这可能是由于阿尔法选择的随机性。实际上,参数化relu和随机化relu都是理想的。
6.以下是通过控制模型的容量来防止神经网络过拟合的几种常用方法。
6.1 l2正则化l2正则化可能是最常用的正则化形式。这可以通过将模型中所有参数的平方阶作为惩罚项添加到目标函数中来实现。也就是说,对于网络中的每个权重w,我们将其项12λw2添加到目标函数中,其中λ是正则化的强度参数。在惩罚项公式前加上12是很常见的。其原因是优化函数12λw2的导数在它之前不产生常数项因子2,而只是λw的简单形式..l2正则化的直观解释是l2正则化强烈惩罚峰值向量,并倾向于分散加权向量。
6.2 l1正则化l1正则化是另一种相关且常见的正则化方法。这里,对于网络中的每个权重w,我们将在目标函数中添加一个项λ|w|。L1正则化有一个非常有趣的特性,即它使权重向量w在优化过程中变得稀疏(例如,它非常接近零向量)。l1正则项结束的神经网络仅使用其最重要且几乎恒定的噪声输入的稀疏子集。相反,来自l2的最终权重向量正则化通常是分散且小的。实际上,如果您不关心显式特征选择,那么您可以期望l2正则化在l1中具有更好的性能。
6.3最大范数约束的另一种规范化形式是在每个神经元的权重向量中实现绝对上限,并使用投影梯度下降来实施约束。实际上,这对应于参数的正常更新,然后执行箝位约束的vec {w}的每个神经元的权重向量满足并行vec {w} parallel_2 6.4丢弃
drop是一种非常有效、简单且最近提出的正则化技术,作为上述三种正则化方法(l1、l2、最大范数约束)的补充。在训练期间,丢失可以理解为在完全连接的神经网络中对神经网络进行次采样,并且仅基于输入数据更新网络采样更新的参数。但是,对于可能的样本数量的索引,网络并不是独立的,因为它们共享参数。在测试过程中,没有使用辍学。通过整合指数级的所有子网络来解释预测平均值。实际上,辍学率为p=0.5,这是一个合理的默认值。但是,该值可以根据验证数据进行微调。
最流行的正规化技术,辍学
7.从数字中观察
7.1从学习率来看,学习率高,损失曲线会很奇怪,容易出现参数爆炸现象;学习率低,损失减少缓慢;学习率高,损失一开始会下降很快,但很容易陷入局部最小值;好的学习率应该平稳下降。
7.2扩大损失曲线的观察。在图2中,横坐标是历元(网络在整个训练集上完全运行的时间,因此在每个历元中将有多个小批量),纵坐标是每个训练批量的分类损失。如果损失曲线呈线性(缓慢下降),则表明学习率过低;如果损失不再下降,则意味着学习率过高,并陷入局部最小值;曲线的宽度与批量大小有关。如果宽度太宽,则意味着相邻批次之间的变化太大,因此应减少批次大小。
7.3从精度曲线观察。图3中的红线是训练集的准确率和绿色验证集的准确率。当验证集上的精度收敛时,红线和绿线之间的距离太大,并且训练集上明显存在过拟合。当两条线之间的距离很小时,精度很低,说明模型的学习能力太低,需要增加模型的容量。
8.它集成在机器学习中,是一种尖端的学习方法,可以训练多个学习者,并将其组合使用。众所周知,当获得更高的准确度时,整合方法通常比单个学习者更重要。此外,该集成方法在实际任务中取得了很大的成功。在实际应用中,尤其是在挑战和比赛中,几乎所有的第一名和第二名获奖者都使用集成。
在这里,我们将介绍深度学习场景中的几种集成技巧:
8.1对于同一个模型,不同的初始化使用交叉验证来确定最优的超参数,然后根据最优的超参数集训练多种方法,但是使用不同的随机初始化。这种方法的危险在于模型的多样性只取决于初始化。
8.2交叉验证阶段最佳模型的发现使用交叉验证来确定最佳超参数,然后选择几个具有最佳结果的模型进行集成。这提高了集成的多样性,但也有风险:例如,局部优化。在实践中,这可以更容易地执行,因为它不需要额外的训练来交叉验证模型。事实上,您可以直接从caffe model zoo选择几个高级深度模型来执行集成。
8.3单一模式的不同检查点如果培训成本很高,有些人取得的成功有限。不同检查点的单一网络随着时间形成了一个整体(例如,在每个阶段)。显然,这受到了一些缺乏多样性的限制,但它在实践中仍然可以很好地工作。这种方法的优点是非常简单。
参考文献:
t/rys AMS
雷锋。com相关阅读:
Pytorch的预训练,是时候学习了
keras之父解释说:几行代码就可以在分布式环境中训练模型
开发者特别会议|英伟达深度学习学院现场授课
英伟达dli高级工程师现场指导,理论联系实际,深入学习!
课程链接:mooc.ai/course/90
雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。
标题:训练深度神经网络的必知技巧,你知道哪些?
地址:http://www.hcsbodzyz.com/hcxw/4713.html