优化的目标:更好、更快
梯度局部最小
优化的头号敌人是梯度为零,梯度为零即有众所周知的局部最小,还有鞍部点。
但幸好在高维空间局部最小并非经常出现,例如下面左图,在一维空间上红点是局部最小,但在二维空间上红点是鞍部点。实际模型参数空间十分复杂,在右侧二维空间的局部最小也在高维空间中大多不是局部最小。
batch size
用大batch size还是小的呢?较大的batch size训练更快,较小的batch size精度和泛化能力更好。
What?batch size不是越大越好么?实际上不是的。较大batch容易得到陡峭的最优,但越陡峭模型在测试时容易不太稳定,泛化能力减弱。但是经过特别的设计,大的batch可以又快又好。
那平时训练时是不是用batch 1与8差别会很大呢?不是的。batch大小的差别到10k上才会有显著的差异。可以放心用“大”一点的batch了。
Momentum
既然局部最优是坑,那怎么趟过去呢?那就不要只看局部,便有了momentum(类似物理学动量),考虑之前所有梯度。
学习率
不同的参数需要不同学习率才能学习的较好,那么有没有什么自动的方法呢?最经典的就是Adam:RMSProp+momentum
上面没有直接修改学习率,对梯度小的情况有良好的改善,但还是可能出现问题
那么一些学习率调整策略(黑科技)便被提了出来,一是学习率衰减,而是warm up。学习率调整的策略(poly,cosine等结合warmup)目前也基本是各种训练的标配
损失函数
在one-hot问题中交叉熵优于MSE
batch normalization
之前已经知道模型空间十分复杂,看起来崎岖陡峭,不同维度梯度差异显著,这种情况下优化就比较费劲。那通过平滑岂不就让训练变容易。所以我们常对输入数据进行归一化,同理对特征层也可以归一化,比如batch normalization。正如下图所示
对特征做归一化和对输入数据做是相似的方法。实际上对输入数据是否做归一化,对训练影响不大(个人经验)。
这里蓝线比黑色虚线在效率和精度上都有显著提升…真实神器
参考:李宏毅 机器学习
https://www.bilibili.com/video/BV1Wv411h7kN?p=7