问题一:梯度消失和梯度爆炸
1:梯度异常的原因
神经网络中基于BP算法的梯度下降策略,使用目标的负梯度方向对参数进行更新。计算梯度对激活函数求导,如果如果梯度值大于1,网络一层一层向下传播,梯度会以指数形式增加,导致梯度爆炸,反之小于1,导致梯度消失。
正向传播
假设最终的输出为f(x2)=σ(x2)
计算LOSS MSE
反向传播
>1 or <1 就可能会在神经网络中导致梯度消失或者爆炸
(1)梯度消失
- 隐藏层的层数过多
- 采用了不合适的激活函数(更容易产生梯度消失,但是也有可能产生梯度爆炸)
(2)梯度爆炸
- 隐藏层的层数过多
- 权重的初始化值过大
2:解决办法
-
逐层训练加微调
该方法由 Geoffrey Hinton 于2006年提出,具体流程为每次只训练一层神经网络,待权重稳定之后,再使用该层网络的输出进行后一层网络的输入,重复该步骤至训练所有网络层。最后再对整个模型进行finetune,得到最优的模型。
-
梯度剪切
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
-
权重正则化
比较常见的是L1正则,和L2正则,在各个深度框架中都有相应的API可以使用正则化。
-
relu、leakrelu、elu等激活函数
Relu: 如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。
-
batchnorm
batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化到均值为0,方差为1,保证网络的稳定性。
-
残差结构
残差结构中的 shortcut 有效地避免了梯度消失与爆炸问题。
问题二:过拟合和欠拟合
判断方法:k折交叉验证
用训练集训练的同时,使用验证集测试算法效果,随着模型拟合能力的增强。错误率在train上逐渐减少,而在验证集上先减少在增大。
欠拟合:错误率在验证集和训练集上都很大
过拟合:当验证集错误率达到最低点时 拟合效果最好 由最低点开始增大 就是过拟合
产生原因:
- 欠拟合:模型简单不够复杂,拟合能力不足 数据量太多
- 过拟合:数据集过于简单 是的模型在拟合函数的时候过分考虑的噪声等不必要的数据
解决方法:
过拟合:
- 增加数据量
- 降低模型复杂度 例如 剪枝 减少层数
- 针对神经网络 采用dropout 间接减少参数数量 弱化特征联系
- 提前终止训练
- 正则化方法 包括 dropout 正则化(惩罚项) 的引入,就是瓤模型在较小的参数范围内学习最优参数,从而简化模型,就是瓤最终学到的参数值绝对值变小,而且在使用Sigmoid的时候,较小的参数值导致激活函数工作在线性区,此时模型拟合能力弱,降低过拟合可能。
问题三:样本不均衡
1:可以通过 过抽样 欠抽样解决
2:通过正负样本的惩罚权重解决样本不均衡
3:focal loss