神经网络三个部分的优化

第三章、网络优化

3.1 输入端优化1:数据增强&归一化

数据增强

数据增强是和迁移学习一样,解决数据不足的手段

数据增强的优点

  • 模型性能得到提升
  • 增加训练样本的多样性,避免过拟合

数据增强的方式

  • 翻转:水平翻转、垂直翻转
  • 旋转:一般旋转90°、180°
  • 裁剪:随机裁剪原图像中的一部分,不要裁的太小
  • 增加亮度
  • 增加噪声:高斯噪声
  • 随机缩放+随机裁剪+随机分布

注意:

  • 数据增强的多样性:注意多种增强方式搭配
  • 合适的增强方式:注意样本的合理性,不是所有的方式都合理,比如人脸一般不会颠倒

输入数据归一化

输入数据归一化的意义:训练时加快网络收敛

归一化的方式:

  • Min-Max标准化:提取样本数据的最大值和最小值,将所有x的进行基于Max和Min的变换(缺点是,新数据的加入会导致最值变化,需要重新标准化)
  • 均值标准化:
    • 先将所有样本数据减去均值,整体数据的分布会移动到以0为中心的位置。
    • 再将数据除以方差(平方和均值),让数据的方差变为1,缩小数据的离散程度到[-1,1]。

训练测试方式标准化

注意:

  • 训练集如果使用了归一化处理,那么测试集和实际应用时也应采用归一化处理

  • 模型应用时使用归一化的均值和方差参数,可以直接使用训练集提供的均值和方差,而不需要使用场景中采集的数据。

3.2 输入端优化2:梯度下降参数随机初始化

Mini-Batch梯度下降

使用场景:实际训练中,一个样本进行一次前向后向传播是不切实际的,因为数据量是非常大的,多次的计算没有硬件可以承担,而且就算可以承担也会让训练的时间大大增加。所以切合实际的操作方法Mini-Batch应运而生。

Mini-Batch含义:将训练集打包成一个一个的小子集进行处理,如果有8000个数据,设置每1000个为一个子集,那么就有8个子集,这里的batch_size=1000, batches=8。

常见术语:

  • Mini-Batch梯度下降:将整个训练集拆分为多个子集进行梯度下降训练
  • Batch梯度下降:用整个训练集当作一个子集进行训练,这种情况很少见
  • 随机梯度下降:将一个样本当成一个子集进行训练,即有多少样本即多少子集
  • epoch:不管你用什么方法进行训练,只要对整个训练集进行了一次梯度下降,所有的子集都训练完一次,就是一次epoch
  • iteration:一个epoch由多个iteration组成,一个iteration即一个子集进行了梯度下降

为什么选择Mini-Batch梯度下降

可以说,Mini-Batch梯度下降是在随机梯度下降Batch梯度下降之中的一个中和方法,即不会像Batch梯度下降一样数量级过大耗时过长,也不会像随机梯度下降一样因为无法剔除样本中的噪声影响而难以收敛。

优点还有及时看到训练效果,便于及时调整训练策略。

Mini-Batch如何选择合适数值

即Batch_size和Batches如何选取

具体策略:

  • 一般Batch_size通常选用2的次方,32、64、…,子集设置在32~512之间,因为计算机对2的次方效率比较高
  • 不一定非要使用Mini-Batch,如果训练集不多,那么可以直接用Batch梯度下降
  • 看每个人电脑硬件的能力,可以训练时不断尝试进行测试,看看可以承受多少个样本,比如一开始Batch_size是128,如果GPU承受不住,就改小一些,看看硬件到底能承受的参数。

参数随机初始化

网络参数不能直接初始化为0

除非是单节点神经网络,否则参数必须要随机初始化

但是b可以为0,w必须随机初始化

一般都是使用python中的numpy函数,x = numpy.random.randn((2,2))*0.01,初始化两行两列的矩阵,后面乘0.01缩小是因为,在使用逻辑回归公式的时候,z会因w和b的减小而减小,这时一般使用sigmoid激活函数的时候,较小的(即接近0的)z在激活函数上的体现就是更接近于0.5,即接近导数更大的区间线段,那么在梯度下降的时候,速率起步就会较大。

3.3 中间层优化1:激活函数

为什么需要激活函数

如果没有激活函数,那么所有第二层以上的神经元的输入都不再是a,而是上一层的逻辑回归函数z,那么如果将最后一层的z展开,就会发现其形式最终就是关于所有层的w和b的一个逻辑回归公式,最后还是一个wx+b,即这个模型最后只能处理最简单的线性问题,就失去了其深层的意义了。

因此我们需要激活函数,激活函数是非线性函数,逻辑回归函数是线性函数,非线性函数包括在线性函数外面,最后神经元的输出就是一个非线性函数,而且神经网络层数越多,非线性程度越高,可以表示的函数就更复杂。

常见的几种激活函数

sigmoid激活函数:输出范围[0,1],平均值0.5(适合用于最后的输出层,用以处理概率问题)

tanh函数:输出范围[-1,1],平均值0

这两个函数在输入绝对值过大时,斜率很小,即收敛速率明显下降

因此这里还有一个改善该问题的函数

relu函数:(输入值大于0,斜率很高,学习很快,小于0则没有斜率,无法学习

Leaky_Relu函数:(当输入值小于0时,也有较小的斜率

两者特点:都是分段线性函数,属于非线性函数,实际应用中,输入一般都大于0,因此relu函数使用的更多一点

Mish函数:(不太懂,好像是让0分界更加平滑,不过还是relu函数使用的更多

如何选择激活函数:

  • 不同项目具体分析:少批量训练,查看瘦脸效果
  • 常见情况:
    • relu用的最多,Leaky_Relu少一些
    • 二分类概率任务输出层可采用sigmoid函数
    • 当然也可以尝试Mish函数

3.4 中间层优化2:网络归一化&学习率衰减

为什么要做网络归一化

对输入数据归一化的优点:

  • 提高网络泛化能力,即普适性强
  • 使得网络的训练速度更快

如何做网络归一化

中间层数据归一化:输入层是对x进行归一化,而中间层是对激活前的z进行归一化,统一之后再激活。换言之,输入层归一化是对逻辑函数中的x进行,而中间层则是对逻辑函数z进行。对象是一整层的z,对该层的z进行标准化处理,减均值,除方差等。

和输入层归一化不同的还有,在除方差的过程中,需要在分母根式中添加一个微小的正数扰动一下,避免分母为0。

除了减均值和除方差,还有第三个步骤,因为我们不想让z分布的区域固定,因此需要对第二阶段获得的z**继续操作,进行一个z*** = αz** + β的操作,a用于控制方差,b用于控制平均值,这样就可以让z处于我们想要的区域,不断地调整优化。 到这里,因为引入了α和β这两个参数,因此逻辑回归公式的b和β可以进行合并表示为β,最后网络需要训练的参数即为w、α和β这三个。

学习率衰减

学习率过大过好都不好,最佳设置方法是动态调整,即收敛的过程中不断衰减。

常用衰减方法:

  • 自动衰减:
    r = 1 1 + d e c a y r a t e × e p o c h n u m × r 0 r 0 : 初始学习率 d e c a y r a t e : 衰减率 e p o c h n u m : 网络迭代次数 r=\frac{1}{1+decayrate×epochnum}×r_0 \\ \\r_0:初始学习率 \\decayrate:衰减率 \\epochnum:网络迭代次数 r=1+decayrate×epochnum1×r0r0:初始学习率decayrate:衰减率epochnum:网络迭代次数

  • 手动调节:主要针对数据集较小的数据集,几个小时或几天的训练时间,即看损失函数来回震荡,那么可以停下来,调整一下学习率再接着训练。或者根据经验,在网络训练的不同epoch中设置不同的学习率。

3.5 输出端优化1:softmax多分类器

为什么要用softmax多分类器

二分类可以通过在最后一层的神经元使用sigmoid激活函数,但是无法做到处理多分类

因此我们需要使用softmax多分类器,实际上就是一个多输入转换算法,n个输入n个输出,分别通过一种算法计算每个输入的占比,转化为概率

如何使用softmax多分类器

首先确定多分类的分类数目n,然后分别指定标签0~n-1,列向量的第几个数值,就代表的是第几个分类的输出,当作多分类器的输入

输入有了,接下来就是首先输入是有正负的,因此先对x进行变换,将其转变为非负数
e x e^x ex

然后将计算出的幂的和计算出来,再求各个x所对应的e^x占和的比值,这就是softmax转换的概率

输出层如何选择激活函数

既然sigmoid激活函数可以二分类,当然也可以利用多个sigmoid激活函数进行多分类

那么到底是使用多个sigmoid激活函数,还是使用n分类的softmax分类器呢?

这个问题需要具体项目具体分析,如果类别互斥那么可以使用softmax,如果不互斥那么就需要使用多个sigmoid激活函数

3.6 输出端优化2:多任务学习&端到端学习

多任务学习

实例:学习多类目标的特征

具体的操作方法很像3.5提到的使用多个sigmoid进行二分类,即在一张图片上进行多种类别的识别。

成本函数也需要将不同的类别损失函数进行加和。

端到端学习

实例:人脸识别

一般来说,人脸识别的网络是分为3个子网络:

  • 人脸检测网络:因为场景中的人脸可能不止一个,需要提取出面积最大的人脸
  • 人脸特征点定位网络:因为场景人脸可能是侧着的,或是歪着的。所以需要定位人脸特征点,然后进行仿射变换,将人脸矫正
  • 人脸特征提取网络:将矫正过后的人脸和公安库中的人脸进行比对,确定是否为身份证上的本人。

而端到端学习就是直接将多个子网络合为一个网络进行训练,这样做的优点有:

  • 纯粹从数据中找规律,只要数据量够大,网络够深,端到端学习就比手工预设计算法更好
  • 与多个子模块算法相比更简单

缺点也很明显:

  • 需要大量数据做支撑
  • 业务流程有干扰则不便使用,比如人脸倾斜角度变动过大,网络自我学习的倾斜角度就无法使用了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

introversi0n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值