github博客传送门
csdn博客传送门
非过拟合情况
- 是否找到合适的损失函数?(不同问题适合不同的损失函数)(理解不同损失函数的适用场景)
(解决思路)选择合适的损失函数(choosing proper loss )
神经网络的损失函数是非凸的,有多个局部最低点,目标是找到一个可用的最低点。非凸函数是凹凸不平的,但是不同的损失函数凹凸起伏的程度不同,例如下述的平方损失和交叉熵损失,后者起伏更大,且后者更容易找到一个可用的最低点,从而达到优化的目的。
-. Square Error(平方损失)
-. Cross Entropy(交叉熵损失)
- batch size是否合适?batch size太大 -> loss很快平稳,batch size太小 -> loss会震荡(理解mini-batch)
(解决思路)采用合适的Mini-batch进行学习,使用Mini-batch的方法进行学习,一方面可以减少计算量,一方面有助于跳出局部最优点。因此要使用Mini-batch。更进一步,batch的选择非常重要,batch取太大会陷入局部最小值,batch取太小会抖动厉害
- 是否选择了合适的激活函数?(各个激活函数的来源和差异)
(解决思路)使用激活函数把卷积层输出结果做非线性映射,但是要选择合适的激活函数。
-. Sigmoid函数是一个平滑函数,且具有连续性和可微性,它的最大优点就是非线性。但该函数的两端很缓,会带来猪队友的问题,易发生学不动的情况,产生梯度弥散。
-. ReLU函数是如今设计神经网络时使用最广泛的激活函数,该函数为非线性映射,且简单,可缓解梯度弥散。
- 学习率,学习率小收敛慢,学习率大loss震荡(怎么选取合适的学习率)
(解决思路)学习率过大,会抖动厉害,导致没有优化提 , 学习率太小,下降太慢,训练会很慢
- 是否选择了合适的优化算法?(比如Adam)(理解不同优化算法的适用场景)
(解决思路)在梯度的基础上使用动量,有助于冲出局部最低点。
如果以上五部分都选对了,效果还不好,那就是产生过拟合了,可使如下方法来防止过拟合,分别是:
过拟合情况
- Early Stopping(早停法)
(详细解释)早停法将数据分成训练集和验证集,训练集用来计算梯度、更新权重和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。
- Regularization(正则化)
(详细解释) 权重衰减(Weight Decay)。到训练的后期,通过衰减因子使权重的梯度下降地越来越缓。
*. Batch Normalization
*. Dropout
*. L1 , L2
- 调整网络结构
- 增大训练数据量
*. 获取更多的数据
*. 数据扩充(图片: 镜像 , 翻转 , 随机裁剪等.)
print_r('点个赞吧');
var_dump('点个赞吧');
NSLog(@"点个赞吧!")
System.out.println("点个赞吧!");
console.log("点个赞吧!");
print("点个赞吧!");
printf("点个赞吧!\n");
cout << "点个赞吧!" << endl;
Console.WriteLine("点个赞吧!");
fmt.Println("点个赞吧!")
Response.Write("点个赞吧");
alert(’点个赞吧’)