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

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

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

训练集上的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没有多大帮助

优化失败的原因有:局部最小点或鞍点(此时梯度皆为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 (θ′)+(θ−θ′)T g +2 1 ​(θ−θ′)T H (θ−θ′)

在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 (θ′)+2 1 ​(θ−θ′)T H (θ−θ′)
令 θ − θ ′ = 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 (θ′)+2 1 ​v T H v
For all v:v T H v > 0 v^THv>0 v T H v >0,H是正定矩阵,在 θ ′ \theta’θ′ 附近,L ( θ ) > L ( θ ′ ) L(\theta)>L(\theta’)L (θ)>L (θ′)——局部最小点
For all v:v T H v < 0 v^THv,H是负定矩阵,在 θ ′ \theta’θ′ 附近,L ( θ ) < L ( θ ′ ) L(\theta)——局部最大点
For v : v T H v v^THv v T H v 有时大于0有时小于0——鞍点

如果是鞍点,可以通过H的特征向量的方向让L下降

  • 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 m 0 =0,计算θ 0 \theta^0 θ0处的梯度g^0
2.计算动量 m 1 = λ m 0 − η g 0 m^1=\lambda m^0-\eta g^0 m 1 =λm 0 −ηg 0
3.计算此时优化方向 θ 1 = θ 0 + m 1 g 1 \theta^1=\theta^0+m^1 g^1 θ1 =θ0 +m 1 g 1,计算θ 1 \theta^1 θ1处梯度g 1 g^1 g 1
4.计 算 动 量 m 2 = λ m 1 − η g 1 计算动量 m^2=\lambda m^1-\eta g^1 计算动量m 2 =λm 1 −ηg 1
5.计算此时优化方向 θ 2 = θ 1 + m 2 \theta^2=\theta^1+m^2 θ2 =θ1 +m 2

也就是说,在梯度很小或者dengyu0的时候,加上动量可以让优化继续

训练停止不一定是梯度很小(Training stuck ≠ Small Gradient),也有可能是学习率的问题,有时学习率太大,可能错过了最小点;有时学习率太小,可能需要训练很久也不一定能找到最小点。另外 不同的参数需要不同的学习率
还是从之前的优化出发:θ i t + 1 = θ i t − η g i t \theta_i^{t+1}=\theta_i^{t}-\eta g_i^t θi t +1 ​=θi t ​−ηg i t ​,对学习率进行改动:
θ 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 θi t +1 ​=θi t ​−σi t ​η​g i t ​
可以看出此时的学习率既是迭代的又是参数独立的,σ i t \sigma_i^t σi t ​ 怎么去求呢,常见的有这两种办法
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 θi t +1 ​=θi t ​−σi t ​ηt ​​g i t ​
    即让η \eta η 与时间有关,比如说可以让学习率随着时间下降,或者先增大再减小(RAdam论文)。更多学习率调整技巧可参加

所以就优化表达式总结:一般的优化:θ i t + 1 = θ i t − η g i t \theta_i^{t+1}=\theta_i^{t}-\eta g_i^t θi t +1 ​=θi t ​−ηg i t ​
改进的优化:

这个问题主要是针对回归和分类的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)}y i ′​=∑i ​e x p (y i ​)exp (y i ​)​
在二分类时,常用sigmoid函数,其实经过计算比较发现此时两者结果一样
Q:softmax和sigmoid有什么区别和联系?

我们知道回归的loss函数一般是 MSE:e = ∑ ( y ^ i − y i ) 2 e=\sum(\hat{y}_i-y_i)^2 e =∑(y ^​i ​−y i ​)2
分类的loss函数一般是 cross-entropy:e = − ∑ i y i ^ l n y i ′ e=-\sum_i \hat{y_i}ln y_i’e =−∑i ​y i ​^​l n y i ′​
在实际训练中,如果把分类问题当作回归问题,用MSE代替cross-entropy,效果不会很好。
所以:

Changing the loss function can change the difficulty of optimization

  • Question:为什么会产生不好train的时候?
    不同的参数下降速度不同,并且梯度下降斜率可能相差很大,这个时候使用固定的学习率优化效果可能就不太好,所以就用到上面讲过的自适应学习率,Adam等
  • 换个角度的思路:
    当稍微改变w值的时候,希望loss变化也比较小,那一个可能方法就是让输入的x比较小,这样改变了w,对整体的loss影响就不会很大,即
    较小的数据x 1 x_1 x 1 ​对loss影响较小,会让error surface(误差曲面)更smooth
    较大的数据x 2 x_2 x 2 ​对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 ~i r ​=(x i r ​−m i ​)/σi ​ 计算归一化后的值,此时所有维度的特征都在0的附近。
一般来说,特征归一化可以让收敛更快

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

Original: https://blog.csdn.net/ji_meng/article/details/123878687
Author: nanyidev
Title: 类神经网络训练不起来怎么办——机器学习模型训练指南

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/692409/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球