在文章<深度模型训练方法>中提到,深度模型中拥有很多超参,模型的训练其实就是一个调超参的过程。而在调超参时,我们主要降低模型的Bias和Variance.
训练模型的一般性步骤
- Fit training set well on cost function
- train a bigger network
- switch to a better optimization algorithm, such as Adam
- train longer
- ...
- Fit dev set well on cost function
- train a bigger network
- regulariztion
- dropout
- get more data on training set
- ...
- Fit test set well on cost function
- go back to optimize the dev set
- get a bigger dev set
- ...
- Performs well in real world
- go back to change the dev set
- optimize the cost function
- ...
训练集上的优化
训练模型时,我们一般需要有四个步骤,首先需要调整模型在训练集上的表现,如果在训练集上表现不佳,说明出现了模型的“欠拟合”状态。
原因可能有以下两方面表现:
- 模型的参数还没有迭代彻底,此时可以多花点时间让模型迭代,或者改用学习速度更快的optimization algorithm
- 另一种情况就是数据规律比较复杂,模型拥有的参数不足以刻画数据中的规律,所以需要增强模型结构。
验证集上的优化
如果模型在训练集上表现优越,但在验证集上欠佳,改善方式有以下:
- 模型过于复杂,隐藏层中的参数过大,导致非线性激励函数输出结果系数过高,从而出现过拟合状态,这时可以用regulariztion约束参数过大,从而避免过拟合现象
- 另一种避免过拟合方法是dropout,通过随机排除隐藏层中的一些参数,从而避免部分参数过于拟合某几类数据特征,从而使模型更一般性地描述数据特征
- 应用更大的网络结构有助于学习数据中的更一般性的规律特性,从而更好地表现在dev set上
- 最后,由于训练集数据质量偏执,例如与验证集规律存在差异等原因,此时可以增加更多的训练集,让训练集中的数据拥有更普遍的规律性
测试集上的优化
如果模型在验证集上表现良好,但测试集上表现不佳:
- 调整验证集数据分布,然后重新测试验证集,对模型进行调整
- 数据集分布没有问题的话,可以尝试使用更大的网络结构学习数据中更一般性的规律
实际应用过程的优化
模型在训练集,验证集,测试集上表现都很好,但应用时表现不佳:
- 根据实际应用情况改变测试集数据分布,然后根据测试集调整模型
- 另一种情况就是刻画模型的损失函数计算存在问题,重新计算模型的损失函数,合理度量数据
提前结束模型的迭代
很多人为了增强模型在dev set上的表现,提前结束模型的迭代训练,这么做的原因是为了避免模型过度训练而导致过拟合。
这种避免过拟合的方式不建议采用,因为这种方式也影响了模型在training set上的训练,即同时影响着训练集和验证集上的模型性能表现,其干扰性很强,容易阻碍调整超参的整体流程。所以优化模型在dev set上的表现,最好采用前面提到的方式,避免提前结束模型训练。