参考 构建机器学习算法 - 云 社区 - 腾讯云
目录
(1)、Batch训练的原理
(2)、smooth l1的计算方法
(3)、RetinaNet中Anchor初始化的含义
(4)、滑动平均为什么在测试过程中被使用?
(5)、FPN的anchor产生方式
(6)、Batch size的选取方式
(7)、为什么VGG要用3*3的卷积核
(8)、转置卷积(反卷积,分数卷积)
(9)、代价函数,损失函数,目标函数区别
(10)、ReLU激活函数和Leak ReLU激活函数的区别
(1)、Batch训练的原理
batch字面上是批量的意思,在深度学习中指的是计算一次cost需要的输入数据个数。
在batch可以认为上述cost计算公式中的m。 如果数据集比较小,可以将全体数据看做一个batch,即把数据集中每个样本都计算loss然后取其平均值当做cost。 为什么要用batch?
由上述batch可以理解为计算一次cost需要输入的样本个数,当数据集比较大的时候,一次性将所有样本输入去计算一次cost存储会吃不消,因此会采用一次输入一定量的样本来进行训练:
- 遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这称为Batch gradient descent,批梯度下降。这种方法缺点很明显,计算量大,吃内存,不适用与在线学习。
- 每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent。这种方法比较快,但是由于迭代一次仅依靠单一样本,这样很容易在相邻的两次迭代计算的梯度差距非常大,甚至方向相反,因此容易不收敛。
- 另一种就是将上述两种方法的折中,称为mini-batch gradient decent。将数据集分成一定数量的批,梯度不容易跑偏容易收敛,同时减少了一次处理的数据数量,因而计算量也小了很多,速度较快。
(2)、smooth l1的计算方法
当预测值与目标值相差很大时,L2 Loss的梯度为(x-t),容易产生梯度爆炸,L1 Loss的梯度为常数,通过使用Smooth L1 Loss,在预测值与目标值相差较大时,由L2 Loss转为L1 Loss可以防止梯度爆炸。
L2 loss的导数(梯度)中包含预测值与目标值的差值,当预测值和目标值相差很大,L2就会梯度爆炸。说明L2对异常点更敏感。L1 对噪声更加鲁棒。当差值太大时, loss在|x|>1的部分采用了 l1 loss,避免梯度爆炸。原先L2梯度里的x−t被替换成了±1, 这样就避免了梯度爆炸, 也就是它更加健壮。总的来说:相比于L2损失函数,其对离群点、异常值(outlier)不敏感,可控制梯度的量级使训练时不容易跑飞。
(3)、RetinaNet中Anchor初始化的含义
(4)、滑动平均为什么在测试过程中被使用?
滑动平均可以使模型在测试数据上更健壮(robust)。“采用随机梯度下降算法训练神经网络时,使用滑动平均在很多应用中都可以在一定程度上提高最终模型在测试数据上的表现。” 对神经网络边的权重 weights 使用滑动平均,得到对应的影子变量 shadow_weights。在训练过程仍然使用原来不带滑动平均的权重 weights,不然无法得到 weights 下一步更新的值,又怎么求下一步 weights 的影子变量 shadow_weights。之后在测试过程中使用 shadow_weights 来代替 weights 作为神经网络边的权重,这样在测试数据上效果更好。因为 shadow_weights 的更新更加平滑,对于随机梯度下降而言,更平滑的更新说明不会偏离最优点很远;对于梯度下降 batch gradient decent,我感觉影子变量作用不大,因为梯度下降的方向已经是最优的了,loss 一定减小;对于 mini-batch gradient decent,可以尝试滑动平均,毕竟 mini-batch gradient decent 对参数的更新也存在抖动。
(5)、FPN的anchor产生方式
在每一个scale层,都定义了不同大小的anchor,对于P2,P3,P4,P5,P6这些层,定义anchor的大小为32^2,64^2,128^2,256^2,512^2(P6是对P5做stride=2的下采样),另外每个scale层都有3个长宽对比度:1:2,1:1,2:1。所以整个特征金字塔有15种anchor。
(6)、Batch size的选取方式
- 当有足够算力时,选取batch size为32或更小一些。
- 算力不够时,在效率和泛化性之间做trade-off,尽量选择更小的batch size。
- 当模型训练到尾声,想更精细化地提高成绩(比如论文实验/比赛到最后),有一个有用的trick,就是设置batch size为1,即做纯SGD,慢慢把error磨低。
(7)、为什么VGG要用3*3的卷积核
- 3x3是最小的能够捕获像素八邻域信息的尺寸。
- 两个3x3的堆叠卷基层的有限感受野是5x5;三个3x3的堆叠卷基层的感受野是7x7,故可以通过小尺寸卷积层的堆叠替代大尺寸卷积层,并且感受野大小不变。
- 多个3x3的卷基层比一个大尺寸filter卷基层有更多的非线性(更多层的非线性函数),使得判决函数更加具有判决性。
- 多个3x3的卷积层比一个大尺寸的filter有更少的参数,假设卷基层的输入和输出的特征图大小相同为C,那么三个3x3的卷积层参数个数3x(3x3xCxC)=27C^2;一个7x7的卷积层参数为49C2;所以可以把三个3x3的filter看成是一个7x7filter的分解(中间层有非线性的分解, 并且起到隐式正则化的作用。
(8)、转置卷积(反卷积,分数卷积)
上采样的需求
当我们使用神经网络来生成图像的时候,通常需要从低分辨率的图像上采样成高分辨率的图像。
有很多的方法来实现上采样的操作:
- 最近邻插值
- 双线性插值
- 双三次插值
为什么用转置卷积?
如果我们想要我们的网络学习到如何最优化的进行上采样,我们可以使用转置卷积。它没有使用预先定义好的插值方法,具有可学习的参数。
理解转置卷积的概念非常有用,因为在一些重要的论文和工程都都会用到,比如:
- 在DCGAN中,生成器使用随机采样的值来生成全尺寸的图像。
- 在语义分割中,在编码阶段使用卷积层来抽取特征,然后在解码阶段,恢复原始的图像尺寸,对原始图像的每一个像素进行分类。
转置卷积也称为:
- 分数步长的卷积
- 反卷积
卷积操作
我们用一个简单的例子来解释一下卷积是怎么工作的。假设我们有一个4x4的矩阵,需要在上面使用一个3x3的卷积核进行卷积操作,不做padding,步长为1。如下面所示,输出为2x2的矩阵。
这种卷积运算的一个重要特点是输入值和输出值之间存在位置连通性。例如,输入矩阵的左上角值影响输出矩阵的左上角值。更具体地说,3x3卷积核用于连接输入矩阵中的9个值和输出矩阵中的1个值。卷积运算形成多对一关系。让我们记住这一点,因为我们以后需要它。
反过来
现在,假设我们想要反过来操作。我们想把一个矩阵中的1个值和另一个矩阵中的9个值联系起来。这是一对多的关系。这就像是卷积运算的反运算,它是转置卷积的核心思想。例如,我们上采样一个2x2矩阵到一个4x4矩阵。这个操作维护了一个1到9的关系。例如,我们上采样一个2x2矩阵到一个4x4矩阵。这个操作维护了一个1到9的关系。
但是我们怎么来进行这样的操作呢?为了讨论如何进行这个操作,我们需要定义卷积矩阵和转置卷积矩阵。
卷积矩阵
我们可以用矩阵来表示卷积运算。它只是一个重新排列的卷积核矩阵,这样我们就可以用矩阵乘法来进行卷积运算了。
我们将3x3卷积核重新排列为4x16的矩阵如下:
这就是卷积矩阵。每一行定义一个卷积运算。如果你看不懂上面的图的话,下面的图表可能会有所帮助。卷积矩阵的每一行只是一个重新排列的卷积核矩阵,在不同的地方用零来填充。
为了使用这个矩阵,我们把输入矩阵 (4x4)拉平成一个列向量 (16x1)。
我们可以将4x16卷积矩阵与16x1输入矩阵(16维列向量)相乘。
输出的4x1矩阵可以被reshape成2x2的矩阵,得到与之前相同的结果。
总之,卷积矩阵就是对卷积核权值重新排列的矩阵,卷积运算可以通过使用卷积矩阵表示。那又怎样呢?重点是使用卷积矩阵,你可以从16 (4x4)到4 (2x2)因为卷积矩阵是4x16。然后,如果你有一个16x4的矩阵,你可以从4 (2x2)到16 (4x4)。
转置卷积矩阵
我们想要从4 (2x2)到16 (4x4),所以,我们使用一个16x4的矩阵。但是,还有一样,我们要得到一个1到9的关系。假设我们将卷积矩阵C (4x16)转置到C.T (16x4)。我们可以对C用一个列向量(4x1)使用矩阵乘法,生成一个输出矩阵(16x1)。转置矩阵将1个值与输出中的9个值连接起来。
将输出reshape成4x4。
我们刚刚将一个较小的矩阵(2x2)上采样到一个较大的矩阵(4x4)。由于转置卷积重新排列权值的方式,它保持了1到9的关系。注意:矩阵中的实际权值不一定来自原始卷积矩阵。重要的是权重的排布是由卷积矩阵的转置得来的。
(9)、代价函数,损失函数,目标函数区别
- 损失函数(Loss Function )是定义在单个样本上的,算的是一个样本的误差。
- 代价函数(Cost Function )是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均。
- 目标函数(Object Function)定义为:最终需要优化的函数。等于经验风险 结构风险(也就是Cost Function 正则化项)。
- 关于目标函数和代价函数的区别还有一种通俗的区别:目标函数是最大化或者最小化,而代价函数是最小化
(10)、ReLU激活函数和Leak ReLU激活函数的区别
与Relu的不同之处在于负轴保留了非常小的常数leak,使得输入信息小于0时,信息没有完全丢掉,进行了相应的保留),即ReLU在取值小于零部分没有梯度,LeakyReLU在取值小于0部分给一个很小的梯度。