通俗易懂讲透Adam优化器

张开发
2026/4/8 9:39:00 15 分钟阅读

分享文章

通俗易懂讲透Adam优化器
通俗易懂讲透Adam优化器本科生/研究生都能看懂本文用直白语言形象比喻公式拆解可运行代码把Adam优化器讲得明明白白不用复杂数学基础也能完全理解适合深度学习入门、面试复习、课程笔记。一、先搞懂Adam到底是什么Adam 自适应矩估计Adaptive Moment Estimation它是深度学习最常用、最万能的优化器相当于动量法 RMSProp 的结合体一句话总结Adam 会记住历史更新方向还会根据梯度大小自动调步子又快又稳找到最优解。超形象比喻你在下山找最低点最小损失动量法记住你刚才往哪走顺着惯性加速不原地晃RMSProp看坡度陡不陡陡就走小步平就走大步Adam既有惯性又会看路智能下山二、Adam 核心思想不用公式也能懂一阶动量m梯度的移动平均相当于“惯性”顺着趋势走减少震荡二阶动量v梯度平方的移动平均相当于“看坡度”自动调学习率偏差校正刚开始训练时数据不准修正一下让前期更稳定参数更新用校正后的动量智能调整每一步三、Adam 公式一步步拆解超详细0. 先看普通梯度下降对照θt1θt−α⋅gt\theta_{t1} \theta_t - \alpha \cdot g_tθt1​θt​−α⋅gt​固定学习率所有参数步子一样很笨。1. 初始化超简单学习率α\alphaα默认0.001一阶动量系数β1\beta_1β1​默认0.9二阶动量系数β2\beta_2β2​默认0.999防除零ϵ\epsilonϵ10−810^{-8}10−8动量初始值m00, v00m_00,\ v_00m0​0,v0​02. 计算梯度gt∇L(θt)g_t \nabla L(\theta_t)gt​∇L(θt​)梯度就是当前参数该往哪改、改多少。3. 更新一阶动量惯性mtβ1mt−1(1−β1)gtm_t \beta_1 m_{t-1} (1-\beta_1) g_tmt​β1​mt−1​(1−β1​)gt​保留上一步的惯性加上当前梯度让更新更顺滑不抖动4. 更新二阶动量看坡度vtβ2vt−1(1−β2)gt2v_t \beta_2 v_{t-1} (1-\beta_2) g_t^2vt​β2​vt−1​(1−β2​)gt2​记录梯度平方的平滑值梯度大 →vvv大 → 学习率变小梯度小 →vvv小 → 学习率变大5. 偏差校正关键刚开始mmm和vvv都接近0不准所以要校正m^tmt1−β1t\hat{m}_t \frac{m_t}{1-\beta_1^t}m^t​1−β1t​mt​​v^tvt1−β2t\hat{v}_t \frac{v_t}{1-\beta_2^t}v^t​1−β2t​vt​​让前期训练更稳定。6. 最终参数更新Adam 核心θt1θt−α⋅m^tv^tϵ\theta_{t1} \theta_t - \alpha \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t}\epsilon}θt1​θt​−α⋅v^t​​ϵm^t​​✅ 含义用惯性方向m^\hat{m}m^决定往哪走用梯度大小v^\sqrt{\hat{v}}v^​决定走多快每个参数独立自适应学习率四、Adam 完整流程7步背下来初始化参数θ\thetaθ、动量m0,v0m0, v0m0,v0计算当前梯度gtg_tgt​更新一阶动量mtm_tmt​更新二阶动量vtv_tvt​做偏差校正得到m^t\hat{m}_tm^t​、v^t\hat{v}_tv^t​用校正动量更新参数θ\thetaθ重复直到收敛五、PyTorch 实战代码可直接复制运行用Adam训练简单神经网络做回归带可视化。importtorchimporttorch.nnasnnimporttorch.optimasoptimimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.datasetsimportmake_regressionfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScaler# 1. 生成虚拟回归数据X,ymake_regression(n_samples2000,n_features10,noise0.1,random_state42)X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)# 转为TensorX_traintorch.tensor(X_train,dtypetorch.float32)y_traintorch.tensor(y_train,dtypetorch.float32).view(-1,1)X_testtorch.tensor(X_test,dtypetorch.float32)y_testtorch.tensor(y_test,dtypetorch.float32).view(-1,1)# 标准化scalerStandardScaler()X_traintorch.tensor(scaler.fit_transform(X_train),dtypetorch.float32)X_testtorch.tensor(scaler.transform(X_test),dtypetorch.float32)# 2. 搭建简单神经网络classNet(nn.Module):def__init__(self):super(Net,self).__init__()self.fc1nn.Linear(10,64)self.fc2nn.Linear(64,64)self.fc3nn.Linear(64,1)defforward(self,x):xtorch.relu(self.fc1(x))xtorch.relu(self.fc2(x))xself.fc3(x)returnx modelNet()# 3. 损失函数 Adam优化器核心criterionnn.MSELoss()optimizeroptim.Adam(model.parameters(),lr0.001)# 直接用Adam# 4. 训练epochs200train_loss[]test_loss[]forepochinrange(epochs):model.train()optimizer.zero_grad()# 前向传播outputsmodel(X_train)losscriterion(outputs,y_train)# 反向传播 Adam更新loss.backward()optimizer.step()train_loss.append(loss.item())# 测试集损失model.eval()withtorch.no_grad():predmodel(X_test)t_losscriterion(pred,y_test)test_loss.append(t_loss.item())if(epoch1)%200:print(fEpoch [{epoch1}/{epochs}], Train Loss:{loss.item():.4f}, Test Loss:{t_loss.item():.4f})# 5. 可视化结果plt.figure(figsize(14,6))# 损失曲线plt.subplot(1,2,1)plt.plot(train_loss,labelTrain Loss,linewidth2)plt.plot(test_loss,labelTest Loss,linewidth2,linestyle--)plt.title(Train vs Test Loss)plt.xlabel(Epochs)plt.ylabel(Loss)plt.legend()plt.grid()# 预测 vs 真实plt.subplot(1,2,2)withtorch.no_grad():y_predmodel(X_test).numpy()plt.scatter(y_test.numpy(),y_pred,alpha0.7,s30)plt.plot([y_test.min(),y_test.max()],[y_test.min(),y_test.max()],r--,linewidth2)plt.xlabel(True Value)plt.ylabel(Predict Value)plt.title(Predict vs True)plt.grid()plt.tight_layout()plt.show()六、Adam 优点面试必背自适应学习率每个参数自动调整不用手动衰减收敛超快结合动量RMSProp比普通SGD快很多稳定性强偏差校正让前期训练更稳适用范围极广CNN、RNN、Transformer、GAN都能用对稀疏梯度友好NLP、推荐系统效果好七、Adam 缺点真实工程要知道可能收敛不充分后期步子太小难到全局最优小数据集易过拟合对超参数有一点敏感但默认值基本够用某些场景不如SGD比如特别注重泛化的任务八、Adam 最适合哪些场景✅深度学习必用CNN、RNN、Transformer✅稀疏数据NLP、推荐系统、文本分类✅大规模数据ImageNet、大规模语音/视频✅不稳定损失GAN、强化学习✅不想手动调学习率快速实验、炼丹九、Adam vs SGD vs AdaGrad 速记优化器优点缺点适用场景SGD简单、泛化好慢、要调学习率小数据集、高精度AdaGrad自适应、稀疏好学习率衰减太快凸优化、小模型Adam快、稳、自适应可能收敛不充分深度学习首选十、一句话总结Adam 动量 RMSProp 偏差校正它是深度学习最通用、最省心的优化器收敛快、稳定性强几乎适合所有深度模型。如果不知道选什么优化器直接用 Adam

更多文章