batchsize
增大batchsize的好处有三点:
1)内存的利用率提高了,大矩阵乘法的并行化效率提高。
2)跑完一次epoch(全数据集)所需迭代次数减少,对于相同的数据量的处理速度进一步加快,但是达到相同精度所需要的epoch数量也越来越多。由于这两种因素的矛盾, batch_Size 增大到某个时候,达到时间上的最优。
3)一定范围内,batchsize越大,其确定的下降方向就越准,引起训练震荡越小。
盲目增大的坏处:
1)当数据集太大时,内存撑不住。
2)过大的batchsize的结果是网络很容易收敛到一些不好的局部最优点。
3)batchsize增大到一定的程度,其确定的下降方向已经基本不再变化。
4)太小的batch也存在一些问题,比如训练速度很慢,训练不容易收敛等。
5)具体的batch size的选取和训练集的样本数目相关。
loss
对于每个超参数,我们在每次的调整时,只去调整一个参数,然后观察loss变化,千万不要在一次改变多个超参数的值去观察loss
首先我们要理解验证集的作用,它与测试集有什么不同。
要明白验证集的最大作用是方便我们了解模型效率、调试超参数,测试集是可以没有的,但验证集是必须有的,如果验证集具有足够的泛化代表性,是可以不需要设置测试集的;注意测试集的存在只是为了验证我们在训练集和验证集上进行模型的超参和参数训练后,验证我们得到的模型是否具有泛化性能。
说法1
说法2
对于loss的变化情况,主要有以下几种可能性:上升、下降、不变,对应的数据集有train与val(validation),那么进行组合有如下的可能:
train loss 不断下降,val loss 不断下降——网络仍在学习;
train loss 不断下降,val loss 不断上升——网络过拟合;
train loss 不断下降,val loss 趋于不变——网络欠拟合;
train loss 趋于不变,val loss 趋于不变——网络陷入瓶颈;
train loss 不断上升,val loss 不断上升——网络结构问题;
train loss 不断上升,val loss 不断下降——数据集有问题;
其余的情况,也是归于网络结构问题与数据集问题中。
当loss趋于不变时观察此时的loss值与1-3中计算的loss值是否相同,如果相同,那么应该是在梯度计算中出现了nan或者inf导致oftmax输出为0。
此时可以采取的方式是减小初始化权重、降低学习率。同时评估采用的loss是否合理。