Task05 网络设计的技巧
学习地址
网络设计的技巧(解决神经网络训练问题)
(一)局部最小值(local minima)与鞍点(saddle point)
- loss不下降的一个可能原因:卡在了critical point
critical point 即梯度接近0的点,包括local minima和saddle point - How to do with critical point?
- if meeting local minima: no way;
- if meeting saddle point: escape
How to escape the saddle point? 理论上,可以通过算出Hessian矩阵的特征值,朝着负特征值对应的特征向量的方向更新即可以escape the saddle point and decrease the loss.
- 如何判断是local minima还是saddle point?
提示:用到了Taylor 级数近似,此时一阶近似项为0,考虑二阶近似项,最终转化为计算Hessian矩阵,计算其特征值从而判断是否正定 - Saddle point v.s. Local minima
- local minima 在更高的维度上来看可能就变成 saddle point了
- 经验上来看,local minima 并没有那么常见
(二)批次(batch)与动量(momentum)
-
Optimization with Batch
- 看完每个Batch,计算一次梯度并update参数
- 如果batchsize=N(full batch),则一个epoch只update一次参数
-
Small Batch v.s. Large Batch -
large batch size 泛化性能差的一个可能解释: large batch 更有可能走到一个比较狭窄的峡谷 local minima里面,这样在测试时,如果测试分布与训练分布有偏移,就会导致大的offset -
Momentum
- 类似物理上给物体一个动量,以防止其卡在local minima 或者saddle point.
- 具体在gradient descent 时,每次更新参数的方向不仅仅取决于梯度的反方向,还要加上上一步的方向.
-
Gradinet Descent + Momentum 实际上,movement就是历史梯度的加权和: -
GD + Momentum 的一个直观例子 可以看到,当到达第一个local minima时,虽然梯度为0,但凭借上一步的movement影响(即动量),仍然会有向右的移动方向
(三)自动调整学习率(learning rate)
- Training stuck
≠
\neq
?= Small Gradient
训练loss停滞不一定就是走到了 critical point,也有可能是发生了振荡,可以通过查看梯度的大小进行验证 - 固定的学习率通常会使training很困难
- 太大:振荡,到达不了minima(即使是凸函数)
- 太小:在 minima 附近停滞,慢得难以忍受
- 如何解决:考虑为不同的参数定制不同的学习率以及自适应调整学习率,简单的直觉上来看,loss function 陡峭的地方学习率应该设置小一点,平的地方学习率应该设置大一点,当然还有其他策略
- 学习率优化总结
- 改进1:Momentum
- 改进2:Adaptive learning rate
- 改进3:Learning rate scheduling
- Adaptive learning rate(即根据梯度大小自适应调整学习率大小)
- Learning rate scheduling
- 策略1:Learning rate decay
- 策略2:Warm up (在resnet 和 transformer 里面也有用到)
(四)损失函数(loss)的影响
- Classification v.s. Regression
- Regression: loss 一般取MSE
- Classification: loss 一般取Cross-entropy
- ps: 分类问题一般在网络最后一层加上 softmax层
- 在
pytorch 中,CrossEntropy 自带 softmax 函数,二者是绑定在一起的!无需再在网络中加上 softmax 层 - 对于二分类而言,softmax 与 sigmoid 是等价的
- Minimizing cross-entropy 与 maximizing likelihood 是一个东西的两种说法
- Soft-max
- 为什么 classification 最后要加 softmax? 从 logistic model 推过来…,简单的解释是要把任意取值的 y Normalize 到 [0, 1]的范围 (骗小孩的说法,具体解释见往年录像)
- softmax 会让大的值跟小的值差距更大
- softmax 的输入我们一般叫作 logit
- 为什么对于 classification 而言选 cross-entropy 更合适?
- 不同的 loss function 会改变训练的难度
- mse 更难训练
(五)批次标准化(Batch Normalization)
- Feature Normalization
见之前文章:2021-07 李宏毅机器学习打卡Task03:误差来源、梯度下降 - Considering Deep Learning
- 之前只是对输入层进行scaling,但其实通过中间的权重矩阵相乘后,隐藏层的输入范围也有很大不同,也有必要进行scaling
- 在激活函数之前还是之后做Normalization 更好?
- 二者没太大区别
- 如果是
sigmoid 激活函数,比较推荐在之前做 Normalization ,因为 sigmoid 在0附近梯度比较大 - Batch Normalization - Training
- 如果每次都使用所有的输入examples进行normalization,将会是一个large network,所以考虑 a batch 是自然而然的 — Batch Normalization
- 适用于 batchsize 比较大的时候
- BN 会使 error surface 更平滑,所以使用 BN 可以适当加大学习率
- gamma和beta作为超参数被学习
- Batch Normalization - Testing
- 在训练阶段计算 μ 和 σ 的移动平均值,测试时直接拿来用
pytorch 上已自动设置 - other normalization…
另附Datawhale组队学习—李宏毅机器学习任务安排
|