🐱?👓梯度下降
梯度下降又名批量梯度下降(Batch Gradient Descent),采用的方法是计算一个epoch(每个epoch都包含所有样本量)中所有样本的Loss和,对损失求平均就是当前epoch的损失值,进而计算梯度进行反向传播、参数更新。
🐱?💻随机梯度下降
随机梯度下降(SGD,现在SGD含义发生了变化,不是指随机梯度下降),采用的方法是对一个epoch每一个样本都进行Loss求解,进而计算梯度进行反向传播、参数更新
🐱?🚀mini-batch梯度下降
mini-batch梯度下降,又名SGD,现在看到的代码中出现SGD一般都是指mini-batch梯度下降,不是指随机梯度下降。采用的方法是把一个epoch内所有样本按batch_size进行划分,如果batch_size=128,那么计算损失就是按batch_size=128的大小计算损失并进行平均,进而计算梯度进行反向传播、参数更新。
🐱?👤总结
样本总量=m,batch_size=128
| 随机梯度下降 | mini-batch梯度下降 | 梯度下降 |
---|
Loss计算单位 | 1<= | batch_size<= | m | 优点 | 参数更新速度大大加快,因为计算完每个样本的Loss都会进行一次参数更新 | | 每个epoch通过所有样本来计算Loss,这样计算出的Loss更能表示当前分类器在于整个训练集的表现,得到的梯度的方向也更能代表全局极小值点的方向。如果损失函数为凸函数,那么这种方式一定可以找到全局最优解。 | 缺点 | 1.计算量大且无法并行。批量梯度下降能够利用矩阵运算和并行计算来计算Loss,但是SGD每遍历到一个样本就进行梯度计算和参数下降,无法进行有效的并行计算。2.容易陷入局部最优导致模型准确率下降。因为单个样本的Loss无法代替全局Loss,这样计算出来的梯度方向也会和全局最优的方向存在偏离。但是由于样本数量多,总体的Loss会保持降低,只不过Loss的变化曲线会存在较大的波动。 | | 每次都需要用所有样本来计算Loss,在样本数量非常大的时候即使也只能有限的并行计算,并且在每个epoch计算所有样本Loss后只更新一次参数,即只进行一次梯度下降操作,效率非常低。 | | | 结合随机梯度下降和梯度下降优点,避免缺点 | |
|