文章目录
主要是一些训练的tips,从训练集和测试集出发。
0.General Guide
模型训练的一般准则如下图:
训练集上的loss太大怎么办?
- model bais:模型太简单,需要重新设计model。
- optimation:优化没做好,没有找到全局最小点,可能是局部最小点。
如何判断训练数据loss太大是由什么原因造成?——考察不同的模型,看训练的loss,如果更深的模型在训练集上没有获得更小的loss,那么这就是个优化问题。
如何解决optimzation的问题?——见下文momentum
测试集上的loss太大怎么办?
1.overfitting:训练数据loss小,但测试数据loss大,说明过拟合
解决:增加数据量;数据增强;给模型一些限制(更少的参数,共享参数)……
随着模型变得复杂,训练loss会一直减小,但测试loss可能会在某处反而增大,所以该如何选取比较好的模型?
将training set分为training set 和validation set,通过验证集来检验训练集的loss
怎么划分训练集和验证集——用N-fold Cross Validation
以不同的方式划分训练集和验证集,计算loss,再选择最好的方式
2.mismatch:
训练资料和测试资料分布不同,因此增加数据集之类的做法对测试集loss没有多大帮助
1.局部最小值与鞍点
优化失败的原因有:局部最小点或鞍点(此时梯度皆为0)
假设loss函数
L
(
θ
)
L(\theta)
L(θ)在
θ
=
θ
′
\theta=\theta'
θ=θ′ 附近的泰勒估计是
L
(
θ
)
≈
L
(
θ
′
)
+
(
θ
−
θ
′
)
T
g
+
1
2
(
θ
−
θ
′
)
T
H
(
θ
−
θ
′
)
L(\theta)\approx L(\theta')+(\theta-\theta')^Tg+\frac{1}{2}(\theta-\theta')^TH(\theta-\theta')
L(θ)≈L(θ′)+(θ−θ′)Tg+21(θ−θ′)TH(θ−θ′)
在critical point(驻点)即极值点或鞍点时,g=0,此时泰勒估计可以写成
L
(
θ
)
≈
L
(
θ
′
)
+
1
2
(
θ
−
θ
′
)
T
H
(
θ
−
θ
′
)
L(\theta)\approx L(\theta')+\frac{1}{2}(\theta-\theta')^TH(\theta-\theta')
L(θ)≈L(θ′)+21(θ−θ′)TH(θ−θ′)
令
θ
−
θ
′
=
v
\theta-\theta'=v
θ−θ′=v,则:
L
(
θ
)
≈
L
(
θ
′
)
+
1
2
v
T
H
v
L(\theta)\approx L(\theta')+\frac{1}{2}v^THv
L(θ)≈L(θ′)+21vTHv
For all v:
v
T
H
v
>
0
v^THv>0
vTHv>0,H是正定矩阵,在
θ
′
\theta'
θ′ 附近,
L
(
θ
)
>
L
(
θ
′
)
L(\theta)>L(\theta')
L(θ)>L(θ′)——局部最小点
For all v:
v
T
H
v
<
0
v^THv<0
vTHv<0,H是负定矩阵,在
θ
′
\theta'
θ′ 附近,
L
(
θ
)
<
L
(
θ
′
)
L(\theta)<L(\theta')
L(θ)<L(θ′)——局部最大点
For v :
v
T
H
v
v^THv
vTHv 有时大于0有时小于0——鞍点
如果是鞍点,可以通过H的特征向量的方向让L下降
2.批次(batch)与动量(momentum)
- batch就是说将数据分成很多个批次,主要探讨small batch和large batch对训练的影响(比如batch size=1和 batch size=N)
batch size也是个超参,具体区别如下图:
- momentum——类比真实世界中的动量,在梯度很小或者等于0的时候还可以继续优化,解决鞍点和局部最小点
之前的的优化过程是这样的,沿着负梯度方向前进:
现在加上动量:
Movement: movement of last step minus gradient at present
此时的优化方向是上次的运动方向减去当前的梯度,具体算法流程:
optimation(优化)+momentum(动量)
1.start at θ 0 \theta^0 θ0,令动量movement m 0 = 0 m^0=0 m0=0,计算 θ 0 \theta^0 θ0处的梯度g^0
2.计算动量 m 1 = λ m 0 − η g 0 m^1=\lambda m^0-\eta g^0 m1=λm0−ηg0
3.计算此时优化方向 θ 1 = θ 0 + m 1 g 1 \theta^1=\theta^0+m^1 g^1 θ1=θ0+m1g1,计算 θ 1 \theta^1 θ1处梯度 g 1 g^1 g1
4. 计 算 动 量 m 2 = λ m 1 − η g 1 计算动量 m^2=\lambda m^1-\eta g^1 计算动量m2=λm1−ηg1
5.计算此时优化方向 θ 2 = θ 1 + m 2 \theta^2=\theta^1+m^2 θ2=θ1+m2
也就是说,在梯度很小或者dengyu0的时候,加上动量可以让优化继续
3.自动调整学习率(Adaptive Learning Rate)
训练停止不一定是梯度很小(Training stuck ≠ Small Gradient),也有可能是学习率的问题,有时学习率太大,可能错过了最小点;有时学习率太小,可能需要训练很久也不一定能找到最小点。另外不同的参数需要不同的学习率。
还是从之前的优化出发:
θ
i
t
+
1
=
θ
i
t
−
η
g
i
t
\theta_i^{t+1}=\theta_i^{t}-\eta g_i^t
θit+1=θit−ηgit,对学习率进行改动:
θ
i
t
+
1
=
θ
i
t
−
η
σ
i
t
g
i
t
\theta_i^{t+1}=\theta_i^{t}-\frac{\eta}{\sigma_i^t} g_i^t
θit+1=θit−σitηgit
可以看出此时的学习率既是迭代的又是参数独立的,
σ
i
t
\sigma_i^t
σit 怎么去求呢,常见的有这两种办法
1.Root Mean Square:导数的均方根
2.RMSProp
优化中著名的Adam算法就是 RMSProp+Monentum
- Learning Rate Scheduling
学习率的调整,对上述的优化表达式再进行变形:
θ i t + 1 = θ i t − η t σ i t g i t \theta_i^{t+1}=\theta_i^{t}-\frac{\eta_t}{\sigma_i^t} g_i^t θit+1=θit−σitηtgit
即让 η \eta η 与时间有关,比如说可以让学习率随着时间下降,或者先增大再减小(RAdam论文)。更多学习率调整技巧可参加 click here
所以就优化表达式总结:一般的优化:
θ
i
t
+
1
=
θ
i
t
−
η
g
i
t
\theta_i^{t+1}=\theta_i^{t}-\eta g_i^t
θit+1=θit−ηgit
改进的优化:
4.loss也可能有影响
这个问题主要是针对回归和分类的loss函数
回归和分类差不多,稍有不同的就是分类需要在输出时再通过一层softmax层,可以理解成将输出的任意 y 值变换到0-1之间,softmax公式是:
y
i
′
=
exp
(
y
i
)
∑
i
e
x
p
(
y
i
)
y_i'=\frac{\exp(y_i)}{\sum_i exp(y_i)}
yi′=∑iexp(yi)exp(yi)
在二分类时,常用sigmoid函数,其实经过计算比较发现此时两者结果一样
Q:softmax和sigmoid有什么区别和联系?
我们知道回归的loss函数一般是 MSE:
e
=
∑
(
y
^
i
−
y
i
)
2
e=\sum(\hat{y}_i-y_i)^2
e=∑(y^i−yi)2
分类的loss函数一般是 cross-entropy:
e
=
−
∑
i
y
i
^
l
n
y
i
′
e=-\sum_i \hat{y_i}ln y_i'
e=−∑iyi^lnyi′
在实际训练中,如果把分类问题当作回归问题,用MSE代替cross-entropy,效果不会很好。
所以:
Changing the loss function can change the difficulty of optimization
5.批次标准化(Batch Normalization)
- Question:为什么会产生不好train的时候?
不同的参数下降速度不同,并且梯度下降斜率可能相差很大,这个时候使用固定的学习率优化效果可能就不太好,所以就用到上面讲过的自适应学习率,Adam等 - 换个角度的思路:
当稍微改变w值的时候,希望loss变化也比较小,那一个可能方法就是让输入的x比较小,这样改变了w,对整体的loss影响就不会很大,即
较小的数据 x 1 x_1 x1对loss影响较小,会让error surface(误差曲面)更smooth
较大的数据 x 2 x_2 x2对loss影响较大,会让error surface(误差曲面)更steep - solution:
所以希望不同dimension的特征有相同的数值范围(same range),即有接近的数值——进行归一化
进行归一化,计算所有数据同一个dimension的特征均值及标准差,通过公式
x
~
i
r
=
(
x
i
r
−
m
i
)
/
σ
i
\tilde{x}_i^r=(x_i^r-m_i)/\sigma_i
x~ir=(xir−mi)/σi 计算归一化后的值,此时所有维度的特征都在0的附近。
一般来说,特征归一化可以让收敛更快
进一步的可以延申至每一层网络,即不仅在数据输入层进行归一化,在经过一层神经网络后再进行归一化。
另外一般数据量很大时可以将其分成很多个batch(比如batch=64即每次输入64笔数据),减小GPU内存压力,所以称之为batch normalization.
参考链接:
https://speech.ee.ntu.edu.tw/~hylee/ml/2022-spring.php