momentum 与 sgd 的图像比较

本文通过代码展示了Momentum优化算法与SGD的区别,当momentum设为0时等同于SGD。通过可视化结果,可以观察到使用Momentum后,优化过程的震荡减少,优化效果更优。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

momentum:

v的形状与params[key] 相同,与grads[key]相同。

v[key] = momentum*v[key] - lr*grads[key]

params[key] += v[key]

 

当momentum=0时,就是SGD

 

optimizer=Momentum(0.8,0)#相当于sgd,可以看到有多之字形震荡:

 

optimizer=Momentum(0.8,0.2),使用momentum后,得到优化

 

 

 

import sys, os
sys.path.append(os.pardir)
import numpy as np
from common.gradient import numerical_gradient
import matplotlib.pylab as plt

class simple:
    def __init__(self,x,y):
        self.x=x
        self.y=y     
        
    def f(self):
        z=np.sum((self.x**2)/20+self.y**2)
        return z
    
    
    def grad(self):
        grads={}  
        self.f()
        Func=lambda W:self.f()
        grads['x']=numerical_gradient(Func,self.x)
        grads['y']=numerical_gradient(Func,self.y)
        return grads


class Momentum:
    def __init__(self,lr=0.01,momentum=0.9):
        self.lr=lr
        self.momentum=momentum
        self.v=None
        
    def update(self,params,grads):
        if self.v is None:
            self.v={}
            for key,value in params.items():
                self.v[key]=np.zeros_like(value)
                
        for key in params.keys():
            self.v[key]=self.momentum*self.v[key]-self.lr*grads[key]
            params[key]+=self.v[key]


params={}
params['x']=np.array([-5.0])
params['y']=np.array([-5.0])
Net=simple(params['x'],params['y'])


#optimizer=Momentum(0.8,0)#相当于sgd

optimizer=Momentum(0.8,0.2)
opt_num =200
result_x=np.arange(opt_num,dtype=np.float)
result_y=np.arange(opt_num,dtype=np.float)

for i in range(opt_num):
    grads=Net.grad()
    result_x[i]=params['x']
    result_y[i]=params['y']
    optimizer.update(params,grads)
    
    
  
plt.plot(result_x,result_y,0.01) 
print(result_x)
print(result_y)

plt.show()  

 

### SGD 和 Adam 优化器在图像分割任务中的性能及适用场景 #### 性能表现 SGD(随机梯度下降)是一种经典的优化算法,其通过计算每一批次样本的梯度来更新模型权重。尽管 SGD 的收敛速度较慢,但它具有较强的鲁棒性和较低的内存占用特性[^1]。相比之下,Adam 是一种自适应学习率的方法,它结合了 AdaGrad 和 RMSProp 的优点,能够在训练过程中动态调整每个参数的学习率。这种机制使得 Adam 能够更快地收敛并找到更优解。 然而,在某些情况下,Adam 可能在后期训练阶段过早停止探索新的方向,从而陷入局部最优或平坦区域而无法进一步改善性能[^3]。对于复杂的图像分割任务而言,这可能意味着使用 Adam 训练得到的结果虽然初期效果较好,但在最终精度上未必优于经过充分调参后的 SGD 方法。 #### 收敛速度稳定性 从收敛速度来看,由于 Adam 自动调节步长的能力使其通常比标准形式下的 SGD 更快达到目标损失值附近的位置;但是当接近全局最小点时,如果设置不当,则可能出现震荡现象影响整体稳定程度。另一方面,传统意义上的 SGD 需要手动设定初始学习速率以及衰减策略等因素才能获得良好的结果,不过一旦配置得当之后往往具备更高的精确度水平特别是在长期运行期间可以持续改进直至非常接近理论上的最佳状态为止。 另外值得注意的是,在处理大规模数据集或者高维度空间内的问题时(比如医疗影像领域),因为存在大量噪声干扰等原因可能导致单纯依赖于历史统计信息作为依据来进行下一步决策变得不可靠起来——此时引入 momentum 参数可以帮助缓解这一状况,即通过对先前几次迭代产生的变化趋势加以考虑进而平滑整个路径走向以促进更加平稳有效的进展过程发生发展下去直到完成全部周期循环结束为止[^2]。 #### 应用场景差异 针对不同的应用场景选择合适的优化器至关重要。例如,在资源受限环境下部署轻量级网络结构用于边缘计算设备执行简单分类识别功能的话那么采用静态量化配合少量微调即可满足基本需求无需过多关注复杂度较高的超参数调试工作因此倾向于选用易于理解和维护的传统方案如 mini-batch stochastic gradient descent with nesterov accelerated gradients(NAG)[^4];而对于追求极致准确性的科研项目来说则建议优先尝试各种先进的变体版本包括但不限于 AMSgrad, Nadam 等在内的众多改良型产品以便发掘潜在优势所在同时也要做好详尽记录便于后续验证分析之需. ```python import torch.optim as optim # 定义 SGD 优化器 sgd_optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9) # 定义 Adam 优化器 adam_optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999)) ``` #### 结论 综上所述,SGD 和 Adam 各有千秋。前者凭借多年积累的经验教训形成了成熟稳定的框架体系适用于大多数常规情况;后者依靠创新设计理念实现了显著提速增效特别适合解决新兴难题挑战。究竟应该选取哪一方取决于具体业务诉求和技术条件限制综合考量后再做决定最为稳妥合理^.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值