类神经网络训练不起来怎么办——机器学习模型训练指南


主要是一些训练的tips,从训练集和测试集出发。

0.General Guide

模型训练的一般准则如下图:

训练集上的loss太大怎么办?

  1. model bais:模型太简单,需要重新设计model。
  2. 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^iyi)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=(xirmi)/σi 计算归一化后的值,此时所有维度的特征都在0的附近。
一般来说,特征归一化可以让收敛更快

进一步的可以延申至每一层网络,即不仅在数据输入层进行归一化,在经过一层神经网络后再进行归一化。
另外一般数据量很大时可以将其分成很多个batch(比如batch=64即每次输入64笔数据),减小GPU内存压力,所以称之为batch normalization.

参考链接:
https://speech.ee.ntu.edu.tw/~hylee/ml/2022-spring.php

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值