机器学习中各种优化器简介
1.SGD(随机梯度下降)
随机梯度下降是最经典的方法,其计算公式如下图所示。
其中L是损失函数,在机器学习中存在mini-batch,就是每次选择一小部分来训练,这样这里的损失函数实际上是把每个的预测值和真实值的损失函数类和起来最为mini-batch的损失函数返回值,但是你也可以求解平均值,在pytorch中这个在torch.nn.LossFunction中是可选择的(这里的lossfunction是指BCE,CrossEntropyLoss这类具体的lossfunction)。
2.Momentum
这类方式可以简单理解为,一个球从山顶上滚下来,它最终会停在山脚下,当速度或是这里说的动量足够的时候,这个球是不会被困在半山腰的一个凹陷处的。下图是其计算公式参考。
这里每次都会包含有以前所有计算的梯度按照参数a的类和(a<1),这说明越前面的梯度对现在的影响越小,并且在它前面有一个参数a用来定义以前所有的梯度对现在的影响。
3.AdaGrad
AdaGrad相当于增加了一个学习率递减系数,这个可以简单的理解为,比如我本来想走10步的,但是这个有一个问题就是走10步可能会错过最优值的点,所以这里我们让他脚步变慢点,我们引入一个递减系数,让他只走2步,其公式如下。
从公式中可以看出来,h是不断累加的,就是由所有的梯度的平方和相加,这回导致其开始学习快,后来学习慢的特点。
在pytorch这个损失函数中包含有学习衰减系数,我们可以理解为是上面式子中的一除以根号下h。
4.RMSProp
是以中结合了Momentum和AdaGrad以中方法,其部分公式如下。
说明:gt的平方是梯度的平方,更新参数的方式和上面的AdaGrad一样。
这里找到了另一位博主写的,我觉得写得超级厉害,他的公式如下。
在pytorch中我们可以改变参数momentum来相应改变其中的decay_rate,我的理解是decay_rate小的话,前期的结果影响小,为了减小步长的情况下,我们可以适度增加decay_rate。class torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)[source]
5.Adam
Adam是一种更加完善的把momentum和AdaGrad结合起来的方法,其公式还是参见了那位大神。
在pytorch中我们可以调节betas,其中前一个表示了梯度运行平均值系数和梯度平方的系数,我对照公式的理解是运行平均值可能说的是momentum的系数,而后一个说的是梯度平方前的系数,其参数默认值如下。class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)[source]
6.Adam的实际测试
我用了mnist数据集,搭建的网络如下。
大概是采用了两层的卷积层后面再接上一层线性层。
(一)Adam使用默认参数,即betas=(0.9,0.99)
我只训练了两个epoch,最后差不多是这样的。