神经网络训练前的准备工作
数据预处理
数据增广
通过对图像进行变换、引入噪声等方法来增加数据的多样性
针对图像数据,常用的一些数据增广方法:
旋转(Rotation):顺时针or逆时针旋转一定角度
翻转(Filp):将图像沿水平or垂直随机翻转一定角度
缩放(Scale):将图像按一定比例方法or缩小
平移(Shift):沿水平or垂直平移一定步长
加入噪声(Noise):加入随机的噪声影响
聚焦(Zoom In/Out):以目标为中心,将图像内容放大or缩小一定的比例
至于其代码实现,举例如下
train_augmentation = torchvision.transforms.Compose([torchvision.transforms.Resize(256),#放缩
torchvision.transforms.RandomCrop(224),#随机裁剪
torchvision.transforms.RandomHorizontalFlip(),#随机水平翻转
torchvision.transforms.ToTensor()#转换为张量
torchvision.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])])#标准化
关于数据标准化的用处,大概就像下图展示的这样
其实无论是标准化还是归一化(一般优先采用标准化),我们都是期望通过这种线性变换,将产出的数据投影到一个确定的区间or确定确定的分布中去,保证每一次迭代的过程中,输入网络的数据都有相同的分布,从而达到更好的训练效果。
在上图展示中,未归一化的数据,其不同方向上的梯度的变化速率是不均匀的。在后续梯度下降的优化的过程中,一方面很容易导致梯度所指向的位置与模型的目标收敛点产生偏差,在图中显示的是垂线不过椭圆圆心,另一方面是不同方向上梯度的变化速率不同,会导致难以产生一个合适大小的梯度,使之能够适用于所有维度的梯度下降速率,从而导致模型收敛速度过慢or不断震荡。
参数初始化
分为两种方法:预训练初始化与随机初始化
预训练初始化,即利用已经在其他数据集上预训练好的模型的参数,初始化目标模型的参数
其优势,首先相同模型在不同数据集上所得的参数具有一定的参考价值,故而能够加快模型的收敛速度;也更有可能获得低泛化误差的模型;可以改善因初始化不当造成的梯度消失或爆炸问题
随机初始化,即调试者按自己的意愿设置初始参数。其中又分为Guassian初始化、均匀分布初始化两种
损失函数的选择
0-1损失函数
L
(
Y
,
f
(
X
)
)
=
{
1
Y
≠
f
(
X
)
0
Y
=
f
(
X
)
L(Y,f(X))=\begin{cases} 1 & Y \neq f(X) \\ 0 & Y = f(X) \\ \end{cases}
L(Y,f(X))={10Y=f(X)Y=f(X)
绝对值损失函数
L(Y,f(X)) = |Y-f(X)|
可用于回归任务,在训练中不甚稳定
对数损失函数
L(Y,P(Y|X)) = - logP(Y|X)
能够较好地表征概率分布,是逻辑斯蒂回归的对标损失函数
鲁棒性不强,对噪声敏感
平方损失函数
L
(
Y
,
f
(
X
)
)
=
∑
N
(
Y
−
f
(
C
)
)
2
L(Y,f(X))=\sum_N{(Y-f(C))^2}
L(Y,f(X))=N∑(Y−f(C))2
常应用于回归问题,如最小二乘法
鲁棒性不强,对噪声敏感
指数损失函数
L
(
Y
,
f
(
X
)
)
=
e
x
p
[
−
Y
f
(
X
)
]
L(Y,f(X)) =exp[-Yf(X)]
L(Y,f(X))=exp[−Yf(X)]
对噪声or离群点较为敏感,AdaBoost算法的对应损失函数
合页损失函数
L
(
y
,
f
(
x
)
)
=
m
a
x
(
0
,
1
−
y
f
(
x
)
)
L(y,f(x))=max(0,1-yf(x))
L(y,f(x))=max(0,1−yf(x))
鲁棒性更高,对异常点与噪声不怎么敏感
交叉熵损失函数
L
(
y
,
y
^
)
=
−
1
n
∑
i
y
i
l
n
y
i
^
L(y,\hat y)=-\frac 1 n \sum_i{y_iln\hat{y_i}}
L(y,y^)=−n1i∑yilnyi^
在二分类中的损失函数如下
L
(
y
,
y
^
)
=
−
1
n
[
y
i
l
n
y
i
^
+
(
1
−
y
i
)
l
n
(
1
−
y
^
i
)
]
L(y,\hat y)=-\frac 1 n [y_iln\hat{y_i}+(1-y_i)ln(1-\hat y_i)]
L(y,y^)=−n1[yilnyi^+(1−yi)ln(1−y^i)]
优化算法
优化算法一览:
其中梯度计算基础是原理,更新方法是指运用梯度计算的手段
\ \ 1 梯度计算
(1)批次梯度下降——Batch Gradient Descent
θ
=
θ
−
η
⋅
▽
θ
J
(
θ
)
\theta = \theta -\eta·\triangledown_\theta J(\theta)
θ=θ−η⋅▽θJ(θ)
在每次的参数更新中,使用整个训练集的样本来进行梯度计算。
缺点:由于在一次的更新中,对整个数据集计算梯度,所以计算量较大,速度较慢,且不能够投入新数据、实时更新模型。
优点:对于凸函数可以收敛到全局的极小值,非凸函数也可以收敛到局部极小值
(2)随机梯度下降——Stochastic Gradient Descent
在每次参数更新中,使用训练集中的一个样本来计算梯度
θ
=
θ
−
η
⋅
▽
θ
J
(
θ
;
x
(
i
)
;
y
(
i
)
)
\theta = \theta -\eta·\triangledown_\theta J(\theta;x^{(i)};y^{(i)})
θ=θ−η⋅▽θJ(θ;x(i);y(i))
优点:由于在一次更新中,只针对一个样本来计算梯度,所以计算较快,并且可以实时投入新数据,实时更新模型
缺点:由于每次只针对一个样本来计算梯度,对于SGD(噪声样本更多、更新更加频繁)来说,较BGD(噪声样本更少,更新不很频繁),其并不是每次迭代都能沿着模型整体的最优方向进行,导致准确度下降,且会造成损失函数的严重震荡,这种震荡可能不能使之顺利地收敛到局部极小值,但可能会帮助其跳入到更优的局部极小值范围内。
(3)小批次梯度下降——Min-Batch Gradient Descent
在每次参数更新中,采用训练集中的一个小批次样本来计算梯度
θ
=
θ
−
η
⋅
▽
θ
J
(
θ
;
x
(
i
:
i
+
n
)
;
y
(
i
:
i
+
n
)
)
\theta = \theta -\eta·\triangledown_\theta J(\theta;x^{(i:i+n)};y^{(i:i+n)})
θ=θ−η⋅▽θJ(θ;x(i:i+n);y(i:i+n))
这种方法其实是批次梯度下降与随机梯度下降的一个折中方案。可以降低参数更新时的方差,收敛更加稳定;可以充分地利用高度优化的矩阵操作进行更高效的梯度计算
同时该方法对学习率有一定的要求,过大过小都不能保证其很好的收敛性,同时,批次的大小对优化结果也有一定的影响
\ \ 2 更新方式
(1)Momentum+SGD——在当前位置计算梯度,再对下降方向进行更新
在原先的SGD中,一般是指mini-batch SGD,其参数theta的更新过程如下所示
g
t
=
▽
θ
t
−
1
f
(
θ
t
−
1
)
g_t = \triangledown_{\theta_{t-1}} f(\theta_{t-1})
gt=▽θt−1f(θt−1)
△
θ
t
=
−
η
∗
g
t
\triangle \theta_t= -\eta*g_t
△θt=−η∗gt
θ
t
=
θ
t
−
1
+
△
θ
t
\theta_t = \theta_{t-1}+\triangle \theta_t
θt=θt−1+△θt
由于其易收敛到局部最优且较为“短视”的缺点,在一些情况下容易困于鞍点
我们通过引入动量趋势,得到带动量的随机梯度下降,来加速(和修正)SGD
m
t
=
μ
∗
m
t
−
1
+
g
t
m_t = \mu*m_{t-1}+g_t
mt=μ∗mt−1+gt
△
θ
t
=
−
η
∗
m
t
\triangle \theta_t = -\eta*m_t
△θt=−η∗mt
θ
t
=
θ
t
−
1
+
△
θ
t
\theta_t = \theta_{t-1}+\triangle \theta_t
θt=θt−1+△θt
在下降的初期,由于相邻两次的参数更新方向大致一致,较大的μ能够对SGD进行一个很好的加速作用
在下降的中后期,当梯度较小而趋于0,模型参数在局部极小值来回震荡时,较大的μ能够使得更新的幅度增大,而跳出陷阱
在由于采样等原因,使得梯度的方向骤然发生改变时,μ的存在,即记忆模块能够帮助减少更新,抑制震荡而加快收敛
(2)NAG加速梯度,Nesterov Accelerated Gradient——在原速度的未来理想位置计算梯度,再对下降方向(终点位置)进行修正
g
t
=
▽
θ
t
−
1
f
(
θ
t
−
1
−
η
∗
μ
∗
m
t
−
1
)
g_t = \triangledown_{\theta_{t-1}}f(\theta_{t-1}-\eta*\mu*m_{t-1})
gt=▽θt−1f(θt−1−η∗μ∗mt−1)
m
t
=
μ
∗
m
t
−
1
+
g
t
m_t = \mu*m_{t-1}+g_t
mt=μ∗mt−1+gt
△
θ
t
=
−
η
∗
m
t
\triangle \theta_t = -\eta*m_t
△θt=−η∗mt
θ
t
=
θ
t
−
1
+
△
θ
t
\theta_t = \theta_{t-1}+\triangle\theta_t
θt=θt−1+△θt
NAG方法与SGD+Momentum方法类似,只不过是计算梯度的位置不相同
(3)Adagrad,Adaptive Gradient, 自适应梯度
对于自适应梯度,其实是根据参数的重要性而对不同的参数进行不同程度的更新。其计算式为:
n
t
=
n
t
−
1
+
g
t
2
n_t = n_{t-1}+g^2_t
nt=nt−1+gt2
△
θ
t
=
−
η
n
t
+
ϵ
∗
g
t
=
−
η
∑
r
=
1
t
(
g
r
)
2
+
ϵ
∗
g
t
\triangle \theta_t = -\frac{\eta}{\sqrt{n_t+\epsilon }}*g_t= -\frac{\eta}{\sqrt{\sum_{r=1}^t{(g_r)^2}+\epsilon }}*g_t
△θt=−nt+ϵ
η∗gt=−∑r=1t(gr)2+ϵ
η∗gt
在这里
−
1
∑
r
=
1
t
(
g
r
)
2
+
ϵ
-\frac{1}{\sqrt{\sum_{r=1}^t{(g_r)^2}+\epsilon }}
−∑r=1t(gr)2+ϵ
1起到了正则化的作用。其中eta仍然是需要我们进行设置一个超参数,全局学习率,一般取0.01。
对于单个变量,其学习率无疑也是变化的,在开始时学习率较大,导致步长较大,梯度下降速度较快。随着优化的进行,对于已经优化了许多的变量,我们减小学习率(进入惩罚阶段),对于未进行许多优化的变量,我们维持一个较大的学习率(维持在激励阶段)。
缺点是在后期,极易使得梯度趋近于0,使得训练提前结束。
(4)Adadelta, Adaptive Delta
这是一种对于Adagrad的简化,其优点是不依赖于全局学习率,在训练的初期,加速效果较好,后期易在局部极小值附近抖动。
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^2_t
E[g2]t=ρ∗E[g2]t−1+(1−ρ)∗gt2
△
θ
t
=
−
R
M
S
[
△
θ
]
t
−
1
R
M
S
[
g
]
t
∗
g
t
\triangle \theta_t = - \frac{RMS[\triangle \theta]_{t-1}}{RMS[g]_t}*g_t
△θt=−RMS[g]tRMS[△θ]t−1∗gt
关于RMS,是为Root Mean Square,均方根
(5)RMSprop——梯度的均方根传播
是Adadelta的特例,rho=0.5
(6)Adam——Adaptive Moment Estimation,自适应动量估计
m
t
=
β
1
m
t
−
1
+
(
1
−
β
1
)
g
t
m_t = \beta_1 m_{t-1}+(1-\beta_1)g_t
mt=β1mt−1+(1−β1)gt
n
t
=
β
2
n
t
−
1
+
(
1
−
β
2
)
g
t
2
n_t = \beta_2n_{t-1}+(1-\beta_2)g_t^2
nt=β2nt−1+(1−β2)gt2
偏
差
校
正
:
m
^
t
=
m
t
1
−
β
1
t
偏差校正:\hat m_t = \frac{m_t}{1-\beta_1^t}
偏差校正:m^t=1−β1tmt
偏
差
校
正
:
n
^
t
=
n
t
1
−
β
2
t
偏差校正:\hat n_t = \frac{n_t}{1-\beta_2^t}
偏差校正:n^t=1−β2tnt
△
θ
t
=
−
η
n
^
t
+
ϵ
∗
m
^
t
\triangle \theta_t = -\frac{\eta}{\sqrt{\hat n_t+\epsilon }}* \hat m_t
△θt=−n^t+ϵ
η∗m^t
——带有动量项的RMSprop
经过实践,Adam继承了Adagrad(自适应方法)善于处理稀疏梯度的特点,又继承了RMSprop善于处理非平稳目标的优点。要比其他适应性的学习方法效果更好一些。能够为不同的参数计算不同的自适应学习率,适用于大数据及和高维空间(非凸优化问题)
超参数选择技巧
关于超参数选择的方法,我们有如下五中方法:
(1)网格搜索——Grid Search
(2)随机搜索——Random Search
(3)贝叶斯优化——Bayesian Optimization
通过先验点去预测后验知识,将参数组合看做自变量,模型输出看做因变量,构建曲线,通过Bayes公式找到曲线上升的方向,在这个方向上探索更优的参数组合
(4)动态资源分配——Dynamic Resource Allocation
通过一组超参数的学习曲线来预估这组超参数是否有希望得到比较好的结果,若收敛性较差,则停止策略,终止当前训练。动态资源分配的一种有效方法是逐次减半。
(5)神经架构搜索——Neural Architecture Search
NAS通过神经网络来自动实现网络架构的设计
模型泛化手段
(1)正则化
(2)权重衰减
(3)早期终止
(4)随机失活
(5)数据增广
(6)标签平滑
(7)预训练与微调