文章简介

优化器是神经网络训练核心组件,负责更新网络参数、最小化损失函数。本文基于昇腾平台 + MindSpore 框架,使用鸢尾花 Iris 数据集,对比无优化器、SGD、Momentum、Adam四种优化器在极值寻优与分类任务上的表现,完整复现实验流程,分析不同优化器特点。适合 MindSpore 入门、昇腾 AI 实验报告参考。

实验环境:Python3 + MindSpore + 昇腾环境 数据集:鸢尾花 Iris 数据集,共 150 条样本,4 个特征,3 个花卉类别

一、实验背景

神经网络初始化参数是随机值,依靠优化器不断迭代更新参数,逐步逼近最优参数,完成模型拟合。不同优化器更新策略不同,收敛速度、抗震荡能力差异很大。 本次实验在 MindSpore 昇腾本地化环境,对比无优化器、SGD、Momentum、Adam,观察损失下降、模型分类精度差异,理解各类优化器原理。

鸢尾花数据集简介 数据集包含 3 类鸢尾花,每类 50 条样本,总计 150 条。特征为花萼长、花萼宽、花瓣长、花瓣宽(单位 cm),标签为花卉类别,是经典多分类测试数据集。

二、实验目的

  1. 掌握 MindSpore 框架中优化器的调用方法与作用。
  2. 学会使用 MindSpore 搭建 SGD、Momentum、Adam 优化器实验。
  3. 理解不同优化器的基本原理,对比收敛效果。

三、实验任务流程

任务 1:创建实验环境

  1. 登录 Jupyter Notebook 实验平台,点击New,选择Python3(ipykernel)新建 Notebook 开发环境。
  2. 获取鸢尾花数据集:Iris 数据集可从 UCI 公开数据集地址下载,文件为 iris.data。
  3. 将数据集上传至 Notebook 工作目录,也可直接调用 MindSpore 内置接口加载数据集。

任务 2:导入依赖库,加载并预处理数据集

import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder

# 昇腾设备配置
ms.set_context(device_target="Ascend")

# 加载鸢尾花数据集
iris = load_iris()
x_data = iris.data.astype(np.float32)
y_data = iris.target.reshape(-1,1)

# 标签独热编码
enc = OneHotEncoder(sparse_output=False)
y_onehot = enc.fit_transform(y_data).astype(np.float32)

# 划分训练集、测试集
x_train, x_test, y_train, y_test = train_test_split(x_data, y_onehot, test_size=0.2, random_state=42)

# 转为MindSpore Tensor
x_train = Tensor(x_train)
y_train = Tensor(y_train)
x_test = Tensor(x_test)
y_test = Tensor(y_test)

任务 3:搭建简单分类网络

搭建简易全连接网络用于鸢尾花三分类任务:

class IrisNet(nn.Cell):
    def __init__(self):
        super(IrisNet, self).__init__()
        self.fc1 = nn.Dense(4,16)
        self.fc2 = nn.Dense(16,3)
        self.relu = nn.ReLU()
    def construct(self,x):
        x = self.relu(self.fc1(x))
        out = self.fc2(x)
        return out

# 损失函数:交叉熵损失
loss_fn = nn.SoftmaxCrossEntropyWithLogits(sparse=False)

任务 4:定义 4 组优化器,分别训练

# 模型初始化
model_noopt = IrisNet()
model_sgd = IrisNet()
model_mom = IrisNet()
model_adam = IrisNet()

# 四种优化器
opt_noopt = None
opt_sgd = nn.SGD(model_sgd.trainable_params(), learning_rate=0.01)
opt_mom = nn.Momentum(model_mom.trainable_params(), learning_rate=0.01, momentum=0.9)
opt_adam = nn.Adam(model_adam.trainable_params(), learning_rate=0.01)

# 封装训练网络
from mindspore.train import Model
model_no = Model(model_noopt, loss_fn)
model_sgd_net = Model(model_sgd, loss_fn, optimizer=opt_sgd)
model_mom_net = Model(model_mom, loss_fn, optimizer=opt_mom)
model_adam_net = Model(model_adam, loss_fn, optimizer=opt_adam)

任务 5:训练、记录损失,评估结果

epochs = 30
# 此处省略循环训练代码,实验中记录每轮loss,绘制损失曲线
# 训练完成后在测试集评估精度

四、优化器原理简述

  1. 无优化器:参数不更新,损失不会下降,模型无法学习,作为对照组。
  2. SGD 随机梯度下降:沿梯度反方向更新参数;优点简单,缺点收敛震荡、容易卡在局部极小值。
  3. Momentum 动量优化器:引入动量,累积历史梯度,平滑更新方向,减弱震荡,加速收敛。
  4. Adam:结合动量与自适应学习率,为不同参数动态调整学习率,收敛速度快,是最常用优化器。

五、实验结果分析

  1. 无优化器:训练损失基本不变,模型不具备拟合能力,分类准确率很低。
  2. SGD:损失缓慢下降,曲线波动较大,收敛速度慢。
  3. Momentum:借助动量减少梯度震荡,收敛速度优于基础 SGD。
  4. Adam:收敛最快,损失快速下降,最终测试集分类精度最高;但学习率设置不当容易出现过拟合。

可视化:可绘制 4 条损失曲线在一张图,直观对比不同优化器收敛趋势。

六、实验总结

本实验在昇腾 + MindSpore 平台完成鸢尾花数据集分类,对比 4 种优化器训练效果。SGD 简单但震荡明显;Momentum 依靠动量缓解梯度震荡;Adam 自适应学习率,收敛性能最优。优化器直接决定神经网络的收敛速度与拟合效果,实际深度学习任务中,Adam 是首选,SGD、Momentum 可根据场景选用。

七、常见问题

  1. 昇腾环境报错:确认device_target="Ascend",MindSpore 版本与昇腾驱动匹配。
  2. 损失不下降:检查学习率,学习率过大不收敛,过小收敛极慢。
  3. 数据集加载失败:确认 iris.data 文件上传路径正确。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐