那些我们在比赛中常用的Tricks(炼丹技巧)-持续更新

图像比赛常用Tricks

图像数据增强

训练时数据增强

在图像比赛中,常遇到数据不足的情况,这一问题很容易导致模型的过拟合,解决该问题的方法除了有调整模型的参数容量之外,也可以通过数据增强的方式进行解决。

  • 亮度、饱和度、对比度的随机变换
  • 随机裁剪(Random Crop)
  • 随机缩放(Random Resize)
  • 水平、垂直翻转(Horizontal / Vertical Flip)
  • 旋转(Rotation)
  • 模糊(Blurring)
  • 加噪声

在进行数据增强时,增强后的数据应尽量接近原始数据的分布。

测试时数据增强( test time augmentation, TTA)

在进行测试时,也可以进行数据增强。对一张测试样本,使用数据增强方法增强后再进行预测,最后再将预测的结果进行平均。使用TTA可以使模型的预测更加平稳。

交叉验证

在进行模型训练时,我们一般会使用数据集中的一部分进行训练,剩余部分用作验证。通过对模型在验证集上的性能表现进行观察,可以确定模型是否过拟合或性能不再提升。

留一法交叉验证

这一方法将数据集划分为两个部分,选择数据集中的一个数据作为验证,用剩余的数据集训练模型,对每一个数据点都重复这个过程。

  • 该方法使用了所有的数据点,偏差较低
  • 验证过程重复了n次,导致执行施加很长
  • 只使用一个数据作为验证,因而对模型的性能度量的差异较大。

K-Fold交叉验证

可以将数据集均分为K份,使用其中的K-1份对模型进行训练,剩余的1份用作验证。将这样的挑选过程重复K次,便可以得到K个模型,对K个模型的训练结果进行平均,作为在整个数据集上的训练结果。简要步骤如下:

  • 将整个数据集划分为k份
  • 用其中的k-1份作训练,剩余1份用作验证
  • 记录每个预测结果的误差
  • 重复k次,直到每折数据都被用于训练和验证

当k=10时,k-fold交叉验证示意图如下(示意图借鉴自eamlife’s blog):

img

交叉验证划分注意点

  • 队伍内部共享同一个划分
  • 单模型阶段和模型集成阶段尽量使用同一个划分
  • 训练集和验证集的划分要和训练集与测试集的划分方式一致
  • 折数划分越多会消耗更多的计算资源
  • 数据量足够多时,可以不进行划分

k值越小,偏差越大,k值越大,偏差变小,结果波动变大,越不稳定。K值一般选择在5~10之间。

分层k-折交叉验证(stratified k-fold cross validation)

在原始的k-折交叉验证中,折的划分是随机的,这种做法会导致原始数据集中的各个类别之间的比例被打乱。使用不同折训练得到的模型差异较大。分层k-折交叉验证的目的就是保证在每一折中都保持原有的类别比例,如下图所示(借鉴自eamlife’s blog)。

img

当出现数据不平衡问题时,常使用这一验证方法。

自助法

基于划分训练集和测试集的方法进行模型评估的方法,在数据集规模本身较小的情况下会让训练集进一步减少,可能会影响模型的训练效果。为了维持训练集样本规模,可以使用自助法。

自助法是基于自助采样法的检验方法。对于总数为n的样本集合,进行n次有放回的随机抽样,得到大小为n的训练集。有些样本会被重复采样,有的样本没有被抽出过,将没有被抽出的样本用作验证集。

模型集成

所谓模型集成,即使用多个模型的预测结果综合得出最终的预测结果。所有训练过的模型都存在不同程度的过拟合,进行模型集成会带来不小的性能提升,在进行模型集成之前需要训练好多个性能良好的模型。

平均打包(average bagging)

以分类问题为例,对于给定的单样本,每个模型都会给出其分属于各个类别的预测值。对于所有模型的预测结果施加相同的权重,最后进行平均,得到最终的预测结果。

img

打包集成选择(bagging ensemble selection)

在这一集成方法中,给每一个模型赋予不同的权重。首先,进行模型选择,在选择的过程中,有的模型可能被选中多次,有的模型可能一次也没被选中。完成模型的选择后,按照模型被选中的次数计算各个模型的权重,依据该权重对模型的预测结果进行加权平均得到最终的预测结果。

img

Stacking

在这一集成方法中,对每一个模型的每一个类都赋予不同的权重,例如,有的模型在A类上的预测性能较好,在其他类上的预测性能较差,因而需要给A类赋予更高的权重,其他类赋予较低的权重。