数据增强是和迁移学习一样,解决数据不足的手段
数据增强的优点:
数据增强的方式:
注意:
输入数据归一化的意义:训练时加快网络收敛
归一化的方式:
注意:
训练集如果使用了归一化处理,那么测试集和实际应用时也应采用归一化处理
模型应用时使用归一化的均值和方差参数,可以直接使用训练集提供的均值和方差,而不需要使用场景中采集的数据。
使用场景:实际训练中,一个样本进行一次前向后向传播是不切实际的,因为数据量是非常大的,多次的计算没有硬件可以承担,而且就算可以承担也会让训练的时间大大增加。所以切合实际的操作方法Mini-Batch应运而生。
Mini-Batch含义:将训练集打包成一个一个的小子集进行处理,如果有8000个数据,设置每1000个为一个子集,那么就有8个子集,这里的batch_size=1000, batches=8。
常见术语:
可以说,Mini-Batch梯度下降
是在随机梯度下降
和Batch梯度下降
之中的一个中和方法,即不会像Batch梯度下降
一样数量级过大耗时过长,也不会像随机梯度下降
一样因为无法剔除样本中的噪声影响而难以收敛。
优点还有及时看到训练效果,便于及时调整训练策略。
即Batch_size和Batches如何选取
具体策略:
网络参数不能直接初始化为0
除非是单节点神经网络,否则参数必须要随机初始化
但是b可以为0,w必须随机初始化
一般都是使用python中的numpy函数,x = numpy.random.randn((2,2))*0.01
,初始化两行两列的矩阵,后面乘0.01缩小是因为,在使用逻辑回归公式的时候,z会因w和b的减小而减小,这时一般使用sigmoid激活函数的时候,较小的(即接近0的)z在激活函数上的体现就是更接近于0.5,即接近导数更大的区间线段,那么在梯度下降的时候,速率起步就会较大。
如果没有激活函数,那么所有第二层以上的神经元的输入都不再是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函数使用的更多
如何选择激活函数:
对输入数据归一化的优点:
中间层数据归一化:输入层是对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中设置不同的学习率。
二分类可以通过在最后一层的神经元使用sigmoid激活函数,但是无法做到处理多分类
因此我们需要使用softmax多分类器,实际上就是一个多输入转换算法,n个输入n个输出,分别通过一种算法计算每个输入的占比,转化为概率
首先确定多分类的分类数目n,然后分别指定标签0~n-1,列向量的第几个数值,就代表的是第几个分类的输出,当作多分类器的输入
输入有了,接下来就是首先输入是有正负的,因此先对x进行变换,将其转变为非负数
e x e^x ex
然后将计算出的幂的和计算出来,再求各个x所对应的e^x占和的比值,这就是softmax转换的概率
既然sigmoid激活函数可以二分类,当然也可以利用多个sigmoid激活函数进行多分类
那么到底是使用多个sigmoid激活函数,还是使用n分类的softmax分类器呢?
这个问题需要具体项目具体分析,如果类别互斥那么可以使用softmax,如果不互斥那么就需要使用多个sigmoid激活函数
实例:学习多类目标的特征
具体的操作方法很像3.5提到的使用多个sigmoid进行二分类,即在一张图片上进行多种类别的识别。
成本函数也需要将不同的类别损失函数进行加和。
实例:人脸识别
一般来说,人脸识别的网络是分为3个子网络:
而端到端学习就是直接将多个子网络合为一个网络进行训练,这样做的优点有:
缺点也很明显: