数据预处理
数据增广/增强
通过对图像进行变换、引入噪声等方法来增加数据多样性;
可以防止过拟合,增强泛化能力。
常用的方法有:
- 旋转:按顺时针或逆时针方向随机旋转一定角度;
- 翻转:将图像沿水平或垂直方向随机翻转一定角度;
- 缩放:将图像放大或缩小一定比例;
- 平移:将图像沿水平或垂直方向平移一定步长;
- 加噪声:加入随机噪声;
- 聚焦:将图像内容放大或缩小一定的比例。
注意区别缩放和聚焦。
数据归一化(Normalization)
Z分数法:
i
n
p
u
t
[
c
h
a
n
n
e
l
]
=
i
n
p
u
t
[
c
h
a
n
n
e
l
]
−
m
e
a
n
[
c
h
a
n
n
e
l
]
s
t
d
[
c
h
a
n
n
e
l
]
input[channel]=\frac{input[channel]-mean[channel]}{std[channel]}
input[channel]=std[channel]input[channel]−mean[channel]
数据归一化对梯度的影响
数据的各个维度存在着量级的差异,那么在梯度下降时,数量级大的数据,梯度下降快。这样会导致,某一个维度,由于数量级较大,已经到达了最低点,而其他维度仍然在进行优化,出现了等待的局面,这样的图像震荡较大。
这样会带来两个问题:
- 震荡较大,模型不稳定;
- 收敛时间长。
Z分数有两个组成部分:
方差归一化:数量级一致,曲线更平滑,加快收敛速度;
均值归一化:保证数据有正有负,加快收敛速度。
网络结构
全连接神经网络(FCN)
图像具有局部不变性特征,即图像进行数据增广后不影响其语义信息。
- 权重矩阵的参数量巨大;
- 全连接网络很难提取局部不变性特征,需要进行数据增强;参数是对图像整体的,狭义来讲,也就是说一套参数针对的是一张图片。
卷积神经网络(CNN)
- 受生物学上感受野的机制而提出;
- 局部连接;
- 权重共享:卷积核参数统一;
- 平移不变性(空间下采样):
平移不变性指的是图片发生平移,但是依旧可以被识别出来,或者说依旧可以输出同样的结果。这是因为,卷积被定义为不同位置的特征检测器。图像发生平移,特征也发生平移,卷积核扫过时,依旧可以注意到这一特征。
同时,如果加上最大池化,那么这一特征无论在任何位置,依旧可以背输出。
也就是说,卷积+最大池化约等于平移不变性。
图像的上采样和下采样
下采样/降采样:缩小图片,目的是:
- 使图像符合显示区域大小;
- 生成对应图像的缩略图。
原理是:对于一幅图像I尺寸为MN,对其进行s倍下采样,即得到(M/s)(N/s)尺寸的得分辨率图像,当然s应该是M和N的公约数才行,如果考虑的是矩阵形式的图像,就是把原始图像s*s窗口内的图像变成一个像素,这个像素点的值就是窗口内所有像素的均值。
上采样/图像插值:放大图像,目的是:
将图像显示在更高分辨率的显示设备上。
原理是:图像放大几乎都是采用内插值方法,即在原有图像像素的基础上在像素点之间采用合适的插值算法插入新的元素。
循环神经网络(RNN)
- 使用自带反馈的神经元,能够处理任意长度的时序数据;
- 比前馈神经网络更加符合生物神经网络的结构;
- 网络具有自适应记忆能力。
参数初始化
参数不能初始化为0
对称权重问题
若所有层的权重都为0或者都一样,那么任何输入数据得到的输出结果都是一样的,那么反向传播算法计算出来的梯度值也是一样的,导致参数更新值也是一样的。
如果权重初始化为同一个值,网络就不可能不对称。
预训练初始化
利用已经在其他数据集上预训练的模型的权重初始化目标模型的权重。
优势:
- 加快模型收敛速度;
- 更加有可能获得低误差模型或泛化误差模型;
- 改善初始化不当造成的梯度消失或梯度爆炸问题。
随机初始化
神经元一开始都是随机的、独一无二的。
固定方差的参数初始化
高斯初始化
参数从一个固定均值和固定方差的高斯分布进行随机初始化。
均匀分布初始化
参数可以在区间 [ − r , r ] [-r,r] [−r,r]内采用均匀分布进行初始化。
假设以上两个初始化的分布的均值都是0,激活函数为SIgmoid函数,会有以下问题:
如果方差过小,权重集中在0附近,这样会造成数据过小,数据集中在Sigmoid的原点附近,这一部分是近乎直线的,这导致了非线性化消失以及梯度爆炸的问题;
如果方差过大,激活值饱和,梯度接近0,出现梯度消失问题。
因此为了降低这一影响,通常需要采用逐层归一化。
注意,所谓的方差过大/过小都是相对于神经元个数来说。神经元多的话,相加的神经元多,方差大的话,权重大,输出也大。
基于方差缩放的参数初始化
为了缓解梯度消失或者梯度爆炸,我们尽可能地保持每个神经元的输入和输出的方差一致,更加神经元的连接数量来自适应地调整初始化分布的方差,这类方法称为方差缩放。
其中
M
t
−
1
M_{t-1}
Mt−1为t-1层神经元个数。
正交初始化
以上两种方法,都是基于随机采样得到的,由于采样的随机性,两种方法还是会出现一定的梯度消失或者梯度爆炸问题。
假设激活函数是恒等函数,
我们希望误差项在反向传播中具有范数保持性,即
∥
δ
l
−
1
∥
2
=
∥
δ
l
∥
2
=
∥
(
W
l
)
T
δ
l
∥
2
\|\delta^{l-1}\|^2=\|\delta^{l}\|^2=\|(W^l)^T\delta^{l}\|^2
∥δl−1∥2=∥δl∥2=∥(Wl)Tδl∥2
这控制了误差项的值不会过大或者过小,在一个合理的范围内变化。
我们通过将权重矩阵初始化为正交矩阵,可以实现范数保持性,这得益于正交矩阵独特的性质,即正交变换后,原矩阵的空间性质不变。
实现方法为:
- 用均值为0,方差为1的高斯分布初始化一个矩阵;
- 将这个矩阵用奇异值分解得到两个正交矩阵,并使其中一个作为权重矩阵。
正交初始化常用在循环神经网络当中。
损失函数
0-1损失函数
绝对值损失函数
对数损失函数
平方损失函数
指数损失函数
合页损失函数
感知损失函数
交叉熵损失函数
聚焦损失函数
模型优化
学习准则
我们找到一个损失函数,计算相应的经验风险;
我们的目标是找到相应的参数,使得经验风险最小化;
这其实是一个高阶最优化问题。
优化问题
难点总结来说,有以下几个:
- 参数多,影响训练;
- 如果是非凸问题,存在局部最优,影响迭代,难以求解全局最优;
- 梯度消失/梯度爆炸;
- 可解释性差。
迭代算法
非凸问题
左侧为凸问题,右侧为非凸问题。
函数的特殊点
- 驻点
导数为0的点。 - 拐点
凹凸曲线的分界点,改点切线于此穿过曲线。 - 鞍点
不是局部极值点的驻点称为鞍点。
平坦最小值问题
- 梯度值为0,在平坦最小值的领域内,所有点对应的训练损失都比较接近;
- 大部分的局部最小解都是等价的;
- 局部最小解对应的训练损失都可能非常接近全局最小解对应的训练损失。
损失函数的曲面
跳跃连接是一种用于残差网络的技术,目的是为了克服梯度消失或者梯度爆炸。我们发现,有跳跃连接得到的问题曲面更加光滑。
梯度消失和梯度爆炸的结果就是曲面的坑坑洼洼。
非凸问题的解决方案
- 高效的优化算法;——提高效率和稳定性 执行
动态学习率的调整,梯度估计修正; - 恰当地处理方式;——提高效率
参数初始化,数据预处理; 准备 - 优异的网络结构;——简化损失函数曲面 锦上添花
跳跃连接,注意力机制,激活函数,归一化处理;
优化算法
梯度下降方法
批次梯度下降(BGD)
每次参数更新,采用整个训练集的样本计算梯度;
对所有样本的梯度取均值。
特点:
- 计算慢,不能投入实时更新模型;
- 对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。
随机梯度下降(SGD)
每次参数更新,采用训练集中的一个样本来计算梯度;
特点:
- 计算快,可实时更新模型;
- SGD的噪声样本比BGD多,每次迭代也不是向着整体最优化方向降低,用准确度换来了速度;
- 更新频繁,因此损失函数会有严重的震荡;
- SGD的震荡特性给予了其进入更好的局部极小值处的可能性。
小批次梯度下降(MBGD)
每次参数更新,采用训练集中的一个小批次样本来计算梯度;
特点:
- 收敛更加稳定;
- 不能保证很好的收敛性,受到学习率的影响;
- 批次大小的选择对结果很有影响。
基于梯度下降方法的实际应用
SGD
通常是MBGD。
缺点:
- 由于MGBD对学习率敏感,因此选择合适的学习率十分困难;
- SGD容易收敛到局部最优,在某些情况下容易困于暗点。
SGD + Momentum
引入了动量,加快SGD计算速度。
特点:
- 下降初期,能够进行很好的加速;
- 下降中后期,局部最小值来回震荡的时候, μ \mu μ使得更新幅度增大,跳出陷阱;
- 在梯度方向改变的时候, μ \mu μ能减少更新。换句话说,能抑制震荡,在相关方向加速SGD,加快收敛。
Nesterov加速梯度
区别在于导数的计算方式不一样了;
AdaGrad(自适应梯度)
根据参数的重要性而对不同的参数进行不同程度的更新;
特点:
- 对每个变量用不同的学习率,这个学习率在一开始比较大,用于快速梯度下降。随着优化过程进行,对于已经下降很多的变量,则减缓学习率,对还没怎么下降的变量,则保持一个较大的学习率;
- 训练前期,梯度和较小,使得Regularizer项很大,放大梯度。[激励阶段]
训练后期,梯度和较大,使得Regularizer项很小,缩小梯度。[惩罚阶段] - 不需要手动设置学习率更新过程;
- 坟墓会不断积累,这样学习率就会收缩并最终变得非常小;
- 超参数设定值:一般选取0.01.
缺点:
- 仍然依赖于人工设置一个全局学习率;
- η \eta η设置过大的话,会使得regularizer过于敏感。对梯度调节过大;
- 中后期,梯度平方和越来越大,使得梯度消失,训练提前结束。
AdaDelta
AdaGrad的简化。
变化项加权和的根号比上梯度项方加权和的根号。
特点
- 不依赖于全局学习率;
- 训练初中期,加速效果不错;训练后期,反复在局部最小值附近抖动;
- 超参数设定:一般取0.9。
RMSprop(梯度的均方根传播)
Adadelta的特例。
其中
E
[
g
2
]
t
=
ρ
E
[
g
2
]
t
−
1
+
(
1
−
ρ
)
g
t
2
E[g^2]_t=\rho E[g^2]_{t-1}+(1-\rho)g_t^2
E[g2]t=ρE[g2]t−1+(1−ρ)gt2
类似于Adagrad,更改了Regularizer项。加权平方和。
Adam
本质上是带有动量项的RMSprop;
- 结合了Adagrad善于处理系数梯度和RMSprop善于处理非平稳目标的优点;
- 对内存需求小;
- 为不同参数计算不同的自适应学习率;
- 适用于大多非凸优化问题,适用于大数据集和高维空间。
如何选择优化算法
- 如果数据是稀疏的,用自适应方法:Adagrad、Adadelta、RMSProp、Adam。
- RMSprop、Adadelta、Adam在很多情况下,效果是相似的,随着梯度变得更加稀疏,Adam的效果更好。
- 如果需要更快收敛,或者训练更深更复杂的神经网络,需要用一种自适应算法。
超参技巧
选择方法
网格搜索
随机搜索
随机选取。
贝叶斯优化
根据已知点绘出优化结果曲线,根据曲线方向选择最好的参数。
超参数
- 学习率
对应着梯度下降步长; - 正则化系数
控制参数限制程度;
初始正则化系数设置为0,先确定好学习率;
固定学习率,确定正则化系数的数量级;
确定数量级后,细调正则化系数。 - 批次大小
批量归一化。
批量归一化
加入
γ
\gamma
γ和
β
\beta
β是为了恢复在该层学到的特征分布。这一参数是可以学习的。
模型微调
在参数初始化部分,我们介绍了采用预训练参数的方法。
这一方法节约了训练时间,易于获得较好的结果。
模型微调,也是基于预训练模型。
为什么要微调
这一问题本质上指的是不引入预训练模型的差异。
不做微调:
- 从头训练,需要大量数据、计算时间和计算资源;
- 模型不收敛、参数不够优化、准确率低;
- 泛化能力差、容易过拟合;
卷积神经网络
卷积神经网络常用来处理图像。
浅层网络可以提取基础特征,比如颜色、纹理;
深层卷积层则提取抽象特征;
全连接层则组合特征,进行评分。
在特征提取过程中,对于类似的图像,整个特征提取过程差不多,因此直接拿过来用就行,微调一下分类器就行。
如何微调
固定部分参数、训练部分参数。
注意事项
随着层数的加深,我们可以看到效果的泛化性能下降,因此,根据任务与原任务的区别,选择微调的程度。
模型泛化
也就是防止其过拟合的方法。
正则化
常用的方法有L1 Norm和L2 Norm;
从可视化角度理解,就是在一个约束条件下,找到最优解:
不同的范数会带来不同的约束可视化效果:
也意味着不同的特点与性质。
早期终止
使用一个验证集来测试每一次迭代的参数在验证集上是否最优,如果错误率不再下降,就停止迭代。
验证集不参与更新参数,因此,具有预防过拟合的效果。
权重衰减
注意,衰减的部分是参数部分,不是梯度部分。
在SGD中,权重衰减和L2正则化的效果等价,都是为了让参数更小一些;
在复杂的优化方法中,则不等价。
随机失活
每次向前传递时,随机地将激活值置0。
随机置0的概率满足伯努利分布。
空间随机失活
随机地将整个通道置0.
随机失块
卷积网络中Dropout效果不好,因为感受野是一块一块的,其中某一个像素为0,也没什么影响。
随机地将局部空间块置0.
随机失连
每次前向传递时,随机打断网络的连接模式。
数据增广
标签平滑
在输出标签中添加噪声来避免模型过拟合。