深度学习常见问题整理
持续更新中…
如何防止过拟合
- dropout
*- dropout可以破坏节点之间的相关性,防止它们合作去拟合数据中的噪声
- 数据量小时,dropout效果不好,数据量大时效果好
- 缺点: 会增加网络的训练时间(不确定)
- 正则化 Regularization
- L2正则化
- Data augmentation
- 采集更多的数据
- 加随机噪声
- 重采样
- 通过当前数据集估计数据分布参数,使用该分布产生更多数据等
- Early stopping
- 在每一个Epoch结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算validation data的accuracy,当accuracy连续多次(10)不再提高时,就停止训练
- 减小网络规模: ResNet MobileNet
- BN(Batch Normal)
BatchNorm: 在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的
BN层的作用
将batch的数据均值、方差标准化
- 加快收敛
- 控制过拟合,可以少用或不用Dropout
- 降低网络对初始化权重不敏感
- 可以使用较大的学习率
梯度消失/爆炸
出现原因
- 网络层数过深
对激活函数进行求导,如果此部分大于1,那么层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。 - 使用了不适合的激活函数,例如sigmod
如果使用sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失 - 网络初始化值太大
解决方法
- 预训练模型加微调
- 梯度剪切
设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内 - 权重正则(针对梯度爆炸):L1、L2
- 使用不同的激活函数: 使用 Relu
- 使用batchnorm
- 使用残差结构
- 使用LSTM网络: 长短期记忆网络
Relu的作用
- 优点
- 解决了梯度消失、爆炸的问题
- 计算方便,计算速度快
- 加速了网络的训练
- 缺点
- 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
- 输出不是以0为中心的
用还是不用全连接层?
全连接层将卷积层的 feature map 转化为一维向量用于分类,但是带来的是参数量的极具增加,全连接层可以使用 global average pooling 代替,达到和全连接层一样的效果,并且参数量大大降低,参数量降低也可以防止过拟合,因此 global average pooling 可以完全代替 FC 吗?
不能,全连接层可以起到防火墙的作用,在迁移学习时,当源数据与目标数据的差异过大时,使用全连接层的效果优于 global average pooling(一篇文章中的结论,稍后看看还能不能找得到)