UI矩阵, 正着来和反着来, 分别进行mean的操作, 结果会明显提升, 这个事情屡试不爽.

先别急着写代码,多花一点时间进行数据预处理:

了解数据分布并找出其中规律

发现重复样本和错误标签

奇妙新颖的说法:神经网络是数据集的压缩版本

搜索,过滤,排序

可视化可以发现异常值,异常值能揭示数据的质量或预处理中的一些错误

设置端到端的训练评估框架:

在训练之前,建立一个完整的训练+评估框架

选择一个简单又不至于搞砸的模型

固定随机种子

  • 使用固定随机种子,保证运行代码的两次结果相同,消除差异因素

简单化:

  • 在此阶段不要有任何幻想,不要增广数据

在评估中添加有效数字

  • 对整个测试集进行评估,不要只绘制批次损失函数图像,然后用Tensorboard对它们进行平滑处理。

在初始阶段验证损失函数

初始化

人类基线

设置一个独立于输入的基线

过拟合一个batch

  • 增加了模型容量并验证我们可以达到的最低损失

验证减少训练损失

  • 稍微增加数据容量

在训练模型前进行数据可视化

  • 将原始张量的数据何标签可视化,可节省调试次数
  • 揭示了数据预处理,数据增广中的问题

可视化预测动态

  • 在训练过程中,对固定批次上的模型预测进行可视化

使用反向传播来获得依赖关系

  • 将第i个样本的损失设置为1.0, 运行反向传播一直到输入,确保在第i个样本上有非零梯度

概括一个特例

  • 对正在做的事情编写一个具体的函数,运行,在以后的过程中确保能得到相同的结果(??)

过拟合:

挑选模型

  • 为数据选择合适的架构
  • 不要总想着一步到位
  • 例:如果要做图像分类,复制粘贴ResNet-50, 然后再去做一些其它架构 

Adam方法是安全的

  • 在设定基线的早期阶段,使用学习率3e-4的Adam
  • Adam对超参更加宽容,包括不良学习率

一次只复杂化一个

  • 如果多个信号输入分类器,建议逐个输入,然后增加复杂性,确保性能逐步提升
  • 如:先插入较小图像,再将图像放大

不要相信学习率衰减默认值

  • 如果不小心,代码可能过早地将学习率衰减到零,导致模型无法收敛
  • 完全禁用学习率衰减避免以上情况发生

正则化:

获取更多数据

数据扩增

  • 旋转
  • 翻转
  • 拉伸
  • (做的时候可以野性一点)

有创意的扩增

  • 域随机化:Domain Randomization
  • 模拟
  • 巧妙地混合
  • 把数据插进场景
  • GAN

预训练

  • 如果手握充足数据,直接用预训练也可

跟监督学习死磕

  • 不要对无监督训练太兴奋
  • 无监督到现在也没有非常强大成果
  • 虽然NLP领域有了BERT,有会讲故事的GPT-2

输入低维一点

  • 把可能包含虚假信号的特征去掉
  • 因为过高维容易造成过拟合,尤其数据集不大时

模型小一点

  • 给网络加上领域知识的限制,把模型变小
  • 在ImageNet的骨架上放全连接层,这种操作已经被平均池化取代(???)

减小批尺寸

  • 小批量可能带来更好的正则化效果

Dropout

  • 使用dropout2d
  • 跟批量归一化不太合得来

权重衰减

  • 增加权重衰减的惩罚力度

早停法

  • 不用一直一直训练
  • 在快要过拟合的时候,及时喊停

试试大点的模型

调参:

随机网格搜索

  • 网格搜索听起来确实诱人,但是随机搜索才是最好的
  • 如:参数a是有用的,参数b起不了作用。应该对a取样更彻底一些,不要只在几个固定点多次取样。 

超参数优化

  • 有很多贝叶斯优化工具箱(???很多人给好评)
  • 大神个人经验:State-of-the-Art都是用实习生做出来的(???)

还能怎么压榨:

模型合体:

  • 把几个模型结合在一起,保证2%的准确度。
  • 如果买不起太多算力,用蒸馏把模型集合成一个神经网络。

放那让它训练:

  • 有些时候,损失看起来是趋于平稳。但是可以试试继续训练,没准能到State-of-the-Art。