操作建议
在教程结束之前,我们会给一些操作上的经验。之前的教程讨论了很多理论,这不意味着在深度学习日常工作中最重要的是知道很多算法理论,会推导很多数学公式。实际上,正确熟练地使用很多经验技巧至少是同等重要的。
建议一个深度学习实验采用以下的标准动作:
定义指标和目标
由于可能的模型空间非常大,尽量从已有的模型开始实验,发明新的好用的模型结构更像“黑魔法”,要谨慎尝试。
由于模型的复杂度和大数据量,完整的训练可能比较费时,所以可以使用部分数据进行初期的使用,调整超参数,注意记录详细实验数据。
分析实验,判断性能问题原因。过拟合?欠拟合?数据问题?程序bug?
不断进行训练分析迭代,每次都按照分析的结果来或加数据,或调参,或换网络。
如何进行模型调优
增加数据、增加模型表达能力的权衡
首先需要确认模型在训练集上的性能是好的。
如果在训练集上的性能较差,可以尝试
通过增加网络深度和宽度来增强模型表达能力
检查训练数据干净程度,必要时重新清洗训练数据
如果在训练集上的性能较好,可以优先尝试增加数据。深度学习的初学者容易犯的一个错误就是,在第一次跑通模型训练之后,就开始进行各种算法上的调优。但是从经验来看,增加训练数据量很可能是更有效的方法。
确认模型训练充分
找到最大的能收敛的Learning Rate。
用阶梯下降法或倍增总训练轮数,确认使得模型训练充分的总训练轮数。
无论怎么训练,模型性能都抖动很大时,应该做如下动作
确认数据的正确性:可能是每轮的测试集不一样,训练集没有shuffle好。
修正数据集:可能是标注错误较多,部分case太难,或者训练、测试数据量太少。
取最后若干轮中性能最好的一轮,当作该模型的性能。该性能的绝对值可能会虚高(overfit了验证、测试集),但相对值是有意义的,可以用于判断不同超参数的优劣。
在确定数据集、大致的网络规模、LR、训练轮数后,尝试找到最优的网络和超参数
将网络、参数分为相关的几组,分别调优
网络结构优化:BN,InceptionBlock,ResBlock
模型表达能力:网络宽度、深度,Regularization
优化方式:SGD、Adam,LR策略
通过grid search的方式确认每组的最优参数,切忌一次实验改变多个变量。