2026/1/7 19:07:04
网站建设
项目流程
汽车之家网站做的很烂,邢台网站开发,网站建设上海网站制作,朝阳网站建设是什么意思本文讨论了经典梯度下降法之外的常用优化器#xff0c;它们都是基于梯度下降法进行了改进的方法#xff0c;它们往往会比经典梯度下降法取得更好的优化速度和精度。掌握这些优化器的用法#xff0c;并取得初步实践经验是提高深度学习应用能力的重要内容。读者在学习了基本知…本文讨论了经典梯度下降法之外的常用优化器它们都是基于梯度下降法进行了改进的方法它们往往会比经典梯度下降法取得更好的优化速度和精度。掌握这些优化器的用法并取得初步实践经验是提高深度学习应用能力的重要内容。读者在学习了基本知识后要求AI大模型来辅助设置参数提高效率。本文最后还简要说明了梯度消散和梯度爆炸问题。本专栏之四讨论了梯度下降法它是优化机器学习模型参数的基本方法。以它为基础人们又发展出了许多改进方法它们有不同的特点和适用场景。了解并实践这些内容有助于选择合适的优化器及其参数以加快优化速度和精度。本文数学公式较多读者也可以先跳过理论推导通过示例掌握应用方法。以梯度下降法为基础的改进方法主要是从增加动量和调整步长两方面着手。1.动量优化算法在经典力学中动量Momentum表示为物体的质量和速度的乘积体现为物体运动的惯性。在梯度下降法见本专栏之四中如果使梯度下降的过程具有一定的“动量”保持原方向运动的一定的 “惯性”则有可能在下降的过程中“冲过”小的“洼地”避免陷入极小值点如图11-1所示。其中在第3个点处其梯度负方向为蓝色虚线实箭头所示而在动量的影响下仍然保持向左的惯性从而“冲出”了局部极小点。图11-1 加入动量的梯度下降过程示意加入动量优化梯度下降法还可以克服前进路线振荡的问题从而加快收敛速度。梯度下降的迭代关系式本专栏之四中的式4-1为xi1xiα⋅(−df(x)dx)xxixi−α⋅df(x)dx∣xxi x_{i1} x_i \alpha \cdot \left( -\frac{df(x)}{dx} \right)_{xx_i} x_i - \alpha \cdot \frac{df(x)}{dx} \bigg|_{xx_i}xi1xiα⋅(−dxdf(x))xxixi−α⋅dxdf(x)xxi对照上式加入动量的梯度下降法迭代关系式为θi1βθi−α⋅df(x)dx∣xxixi1xiθi1(式11-1) \theta_{i1} \beta \theta_i - \alpha \cdot \left. \dfrac{df(x)}{dx} \right|_{xx_i} \\[10pt] x_{i1} x_i \theta_{i1} \tag{式11-1}θi1βθi−α⋅dxdf(x)xxixi1xiθi1(式11-1)可见加入动量之后的前进量θi1\theta_{i1}θi1是由上一步的前进量θi\theta_iθi和新梯度值df(x)dx∣xxi\frac{df(x)}{dx}\big|_{xx_i}dxdf(x)xxi的加权和其中β\betaβ决定了保留上一步前进量的大小称为动量系数。初始θ00\theta_0 0θ00。加入动量的梯度下降的迭代关系式还有一种改进方法称为 NAGNesterov accelerated gradientθi1βθi−α⋅(df(x)dx)xxiβθixi1xiθi1(式11-2) \theta_{i1} \beta\theta_i - \alpha \cdot \left( \frac{df(x)}{dx} \right)_{xx_i\beta\theta_i}\\[10pt] x_{i1} x_i \theta_{i1}\tag{式11-2}θi1βθi−α⋅(dxdf(x))xxiβθixi1xiθi1(式11-2)该方法计算梯度的点发生了变化即在xiβθix_i \beta\theta_ixiβθi处计算梯度而不是原xix_ixi点处。它可以理解为先按“惯性”前进一小步βθi\beta\theta_iβθi再计算梯度。这种方法在每一步都往前多走了一小步有时可以加快收敛速度。在 PyTorch 中动量优化和 NAG 方法主要通过设置torch.optim.SGD的momentum动量系数和nesterov两个参数的来实现。代码11-1.1示例了它们的用法。代码11-1.1 动量优化算法应用示例### 1.导入和设置环境importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorch.utils.dataimportDataLoader,TensorDatasetimportdatetimefromtorchvisionimportdatasets,transforms# 设置随机种子torch.manual_seed(0)### 2.训练样本和验证样本数据预处理# 数据预处理方式transformtransforms.Compose([transforms.ToTensor(),# 转换为 torch.Tensor])# 加载MNIST数据集train_datasetdatasets.MNIST(./data,trainTrue,downloadTrue,transformtransform)val_datasetdatasets.MNIST(./data,trainFalse,transformtransform)# 样本拉平、归一化后X_traintrain_dataset.data.float().view(-1,784)/255.0y_traintrain_dataset.targets X_valval_dataset.data.float().view(-1,784)/255.0y_valval_dataset.targets# 转换为独热编码y_traintorch.nn.functional.one_hot(y_train,num_classes10).float()y_valtorch.nn.functional.one_hot(y_val,num_classes10).float()# 创建数据加载器batch_size200train_loaderDataLoader(TensorDataset(X_train,y_train),batch_sizebatch_size,shuffleTrue)val_loaderDataLoader(TensorDataset(X_val,y_val),batch_sizebatch_size)### 3.定义神经网络模型# relu-relu-softmaxclassMNISTModel(nn.Module):def__init__(self):super(MNISTModel,self).__init__()self.fc1nn.Linear(784,784)self.fc2nn.Linear(784,784)self.fc3nn.Linear(784,10)self.relunn.ReLU()self.softmaxnn.Softmax()defforward(self,x):xself.relu(self.fc1(x))xself.relu(self.fc2(x))xself.softmax(self.fc3(x))returnx### 4.采用不同的优化器进行对比试验deftrain_process():# 训练模型开始计时start_timedatetime.datetime.now()epochs10forepochinrange(epochs):# 每轮中的训练model.train()train_loss0.0forbatch_X,batch_yintrain_loader:optimizer.zero_grad()outputsmodel(batch_X)losscriterion(outputs,batch_y)loss.backward()optimizer.step()train_lossloss.item()# 看一下该轮训练后的效果model.eval()correct0total0withtorch.no_grad():forbatch_X,batch_yintrain_loader:outputsmodel(batch_X)_,predictedtorch.max(outputs.data,1)# 模型预测值的独热编码_,labelstorch.max(batch_y.data,1)# 真实标签值的独热编码totallabels.size(0)correct(predictedlabels).sum().item()# 准确率print(fEpoch{epoch1}/{epochs}, 对训练样本进行预测的准确率Train Acc:{100*correct/total:.2f}%)# 训练结束终止计时end_timedatetime.datetime.now()print(f训练用时:{end_time-start_time})criterionnn.MSELoss()modelMNISTModel()optimizeroptim.SGD(model.parameters(),lr0.15)# 基本梯度下降法优化器train_process()输出Epoch 1/10, 对训练样本进行预测的准确率Train Acc: 46.40%Epoch 2/10, 对训练样本进行预测的准确率Train Acc: 42.39%Epoch 3/10, 对训练样本进行预测的准确率Train Acc: 51.85%Epoch 4/10, 对训练样本进行预测的准确率Train Acc: 58.24%Epoch 5/10, 对训练样本进行预测的准确率Train Acc: 74.46%Epoch 6/10, 对训练样本进行预测的准确率Train Acc: 82.62%Epoch 7/10, 对训练样本进行预测的准确率Train Acc: 85.90%Epoch 8/10, 对训练样本进行预测的准确率Train Acc: 87.47%Epoch 9/10, 对训练样本进行预测的准确率Train Acc: 88.53%Epoch 10/10, 对训练样本进行预测的准确率Train Acc: 89.14%训练用时: 0:01:19.254175criterionnn.MSELoss()modelMNISTModel()optimizeroptim.SGD(model.parameters(),lr0.15,momentum0.9)# 启用动量优化的梯度下降法优化器train_process()输出Epoch 1/10, 对训练样本进行预测的准确率Train Acc: 88.11%Epoch 2/10, 对训练样本进行预测的准确率Train Acc: 91.55%Epoch 3/10, 对训练样本进行预测的准确率Train Acc: 92.71%Epoch 4/10, 对训练样本进行预测的准确率Train Acc: 93.86%Epoch 5/10, 对训练样本进行预测的准确率Train Acc: 94.56%Epoch 6/10, 对训练样本进行预测的准确率Train Acc: 95.15%Epoch 7/10, 对训练样本进行预测的准确率Train Acc: 95.60%Epoch 8/10, 对训练样本进行预测的准确率Train Acc: 95.87%Epoch 9/10, 对训练样本进行预测的准确率Train Acc: 96.29%Epoch 10/10, 对训练样本进行预测的准确率Train Acc: 96.86%训练用时: 0:01:25.797210criterionnn.MSELoss()modelMNISTModel()optimizeroptim.SGD(model.parameters(),lr0.15,momentum0.9,nesterovTrue)# 启用NAG的梯度下降法优化器train_process()输出Epoch 1/10, 对训练样本进行预测的准确率Train Acc: 87.90%Epoch 2/10, 对训练样本进行预测的准确率Train Acc: 91.56%Epoch 3/10, 对训练样本进行预测的准确率Train Acc: 92.46%Epoch 4/10, 对训练样本进行预测的准确率Train Acc: 93.72%Epoch 5/10, 对训练样本进行预测的准确率Train Acc: 94.41%Epoch 6/10, 对训练样本进行预测的准确率Train Acc: 95.05%Epoch 7/10, 对训练样本进行预测的准确率Train Acc: 95.57%Epoch 8/10, 对训练样本进行预测的准确率Train Acc: 96.07%Epoch 9/10, 对训练样本进行预测的准确率Train Acc: 96.58%Epoch 10/10, 对训练样本进行预测的准确率Train Acc: 96.87%训练用时: 0:01:24.3064292.步长优化算法在讨论梯度下降法时简要说明了步长对梯度下降的影响。针对步长人们研究了不少的优化算法。2.1 Adagrad算法AdagradAdaptive Gradient算法的梯度迭代关系式为riri−1(df(x)dx∣xxi)2xixi−1−lrriϵ⋅df(x)dx∣xxi(式11-3) r_i r_{i-1} \left(\frac{df(\boldsymbol{x})}{d\boldsymbol{x}}\bigg|_{\boldsymbol{x}\boldsymbol{x}_i}\right)^2 \\ x_i x_{i-1} - \frac{lr}{\sqrt{r_i \epsilon}} \cdot \frac{df(x)}{dx}\bigg|_{\boldsymbol{x}\boldsymbol{x}_i} \tag{式11-3}riri−1(dxdf(x)xxi)2xixi−1−riϵlr⋅dxdf(x)xxi(式11-3)其中rir_iri称为累积平方梯度它是到当前为止所有梯度的平方和初值为000。这里的(df(x)dx∣xxi)xxi2\left( \frac{df(x)}{dx}\bigg|_{\boldsymbol{x}\boldsymbol{x}_i} \right)_{xx_i}^2(dxdf(x)xxi)xxi2表示向量元素的平方向量df(x)dx∣xxi⨀df(x)dx∣xxi\frac{df(x)}{dx} \bigg|_{xx_i} \bigodot \frac{df(x)}{dx} \bigg|_{xx_i}dxdf(x)xxi⨀dxdf(x)xxi下同。超参数lrlrlr为事先设置的步长ϵ\epsilonϵ为很小的常数。初始r00r_0 0r00。可见随着迭代次数的增加rir_iri越来越大实际步长lrri1ϵ\frac{lr}{\sqrt{r_{i1}}\epsilon}ri1ϵlr越来越小可以防止在极小值附近来回振荡。PyTorch中实现该算法的是torch.optim.Adagrad()它的lr、eps和initial_accumulator_value三个参数分别设置lrlrlr、ϵ\epsilonϵ和r0r_0r0另外还设置了步长衰减参数lr_decay和L2正则化参数weight_decay。该算法的应用示例如代码11-1.2所示。代码11-1.2 Adagrad优化器应用示例criterionnn.MSELoss()modelMNISTModel()optimizeroptim.Adagrad(model.parameters(),lr0.01)# Adagrad优化器train_process()输出Epoch 1/10, 对训练样本进行预测的准确率Train Acc: 96.76%Epoch 2/10, 对训练样本进行预测的准确率Train Acc: 98.04%Epoch 3/10, 对训练样本进行预测的准确率Train Acc: 98.64%Epoch 4/10, 对训练样本进行预测的准确率Train Acc: 98.97%Epoch 5/10, 对训练样本进行预测的准确率Train Acc: 99.20%Epoch 6/10, 对训练样本进行预测的准确率Train Acc: 99.36%Epoch 7/10, 对训练样本进行预测的准确率Train Acc: 99.51%Epoch 8/10, 对训练样本进行预测的准确率Train Acc: 99.58%Epoch 9/10, 对训练样本进行预测的准确率Train Acc: 99.64%Epoch 10/10, 对训练样本进行预测的准确率Train Acc: 99.70%训练用时: 0:01:19.3081782.2 RMSProp算法RMSPropRoot Mean Square Prop算法的原始形式对Adagrad算法进行了简单改进增加了一个系数rhorhorho来控制历史信息与当前梯度的比例rirho⋅ri−1(1−rho)(df(x)dx∣xxi)2xixi−1−lrriϵ⋅df(x)dx∣xxi(式11-4) r_i rho \cdot r_{i-1} (1 - rho) \left( \frac{df(\boldsymbol{x})}{d\boldsymbol{x}} \bigg|_{\boldsymbol{x}\boldsymbol{x}_i} \right)^2 \\ \boldsymbol{x}_i \boldsymbol{x}_{i-1} - \frac{lr}{\sqrt{r_i \epsilon}} \cdot \frac{df(\boldsymbol{x})}{d\boldsymbol{x}} \bigg|_{\boldsymbol{x}\boldsymbol{x}_i} \tag{式11-4}rirho⋅ri−1(1−rho)(dxdf(x)xxi)2xixi−1−riϵlr⋅dxdf(x)xxi(式11-4)对RMSProp的原始形式增加动量因子如下rirho⋅ri−1(1−rho)(df(x)dx∣xxi)2θiβθi−1lrriϵ⋅df(x)dx∣xxixixi−1−θi(式11-5) r_i rho \cdot r_{i-1} (1 - rho) \left( \frac{df(\boldsymbol{x})}{d\boldsymbol{x}} \bigg|_{\boldsymbol{x}\boldsymbol{x}_i} \right)^2 \\ \boldsymbol{\theta}_i \beta \boldsymbol{\theta}_{i-1} \frac{lr}{\sqrt{r_i \epsilon}} \cdot \frac{df(\boldsymbol{x})}{d\boldsymbol{x}} \bigg|_{\boldsymbol{x}\boldsymbol{x}_i} \\ \boldsymbol{x}_i \boldsymbol{x}_{i-1} - \boldsymbol{\theta}_i \tag{式11-5}rirho⋅ri−1(1−rho)(dxdf(x)xxi)2θiβθi−1riϵlr⋅dxdf(x)xxixixi−1−θi(式11-5)其中β\betaβ为动量系数。下式为 RMSProp 的中心化版本sirho⋅si−1(1−rho)df(x)dx∣xxirirho⋅ri−1(1−rho)(df(x)dx∣xxi)2θiβθi−1lrri−si2ϵ⋅df(x)dx∣xxixixi−1−θi(式11-6) \boldsymbol{s}_i rho \cdot \boldsymbol{s}_{i-1} (1 - rho) \frac{df(\boldsymbol{x})}{d\boldsymbol{x}} \bigg|_{\boldsymbol{x}\boldsymbol{x}_i} \\ r_i rho \cdot r_{i-1} (1 - rho) \left( \frac{df(\boldsymbol{x})}{d\boldsymbol{x}} \bigg|_{\boldsymbol{x}\boldsymbol{x}_i} \right)^2\\ \boldsymbol{\theta}_i \beta \boldsymbol{\theta}_{i-1} \frac{lr}{\sqrt{r_i - \boldsymbol{s}_i^2 \epsilon}} \cdot \frac{df(\boldsymbol{x})}{d\boldsymbol{x}} \bigg|_{\boldsymbol{x}\boldsymbol{x}_i}\\ \boldsymbol{x}_i \boldsymbol{x}_{i-1} - \boldsymbol{\theta}_i\tag{式11-6}sirho⋅si−1(1−rho)dxdf(x)xxirirho⋅ri−1(1−rho)(dxdf(x)xxi)2θiβθi−1ri−si2ϵlr⋅dxdf(x)xxixixi−1−θi(式11-6)它增加了一个累积梯度si\boldsymbol{s}_isi在求动量因子θi\boldsymbol{\theta}_iθi时通过si\boldsymbol{s}_isi对rir_iri进行了一个中心化过程ri−si2初始s00,r00r_i - \boldsymbol{s}_i^2 \quad 初始 \boldsymbol{s}_0 \boldsymbol{0}, r_0 0ri−si2初始s00,r00。RMSProp 在实践中效果较好得到了较多的应用在 PyTorch中也提供了实现类可以通过设置相关参数来实现以上三个版本的 RMSProp 算法。该算法的应用示例如代码11-1.3所示。代码11-1.3 RMSProp 优化器应用示例criterionnn.MSELoss()modelMNISTModel()optimizertorch.optim.RMSprop(model.parameters(),lr0.001,momentum0,centeredFalse)# RMSprop优化器原始版本train_process()输出Epoch 1/10, 对训练样本进行预测的准确率Train Acc: 95.33%Epoch 2/10, 对训练样本进行预测的准确率Train Acc: 98.02%Epoch 3/10, 对训练样本进行预测的准确率Train Acc: 98.21%Epoch 4/10, 对训练样本进行预测的准确率Train Acc: 98.82%Epoch 5/10, 对训练样本进行预测的准确率Train Acc: 98.91%Epoch 6/10, 对训练样本进行预测的准确率Train Acc: 99.33%Epoch 7/10, 对训练样本进行预测的准确率Train Acc: 99.35%Epoch 8/10, 对训练样本进行预测的准确率Train Acc: 99.36%Epoch 9/10, 对训练样本进行预测的准确率Train Acc: 99.36%Epoch 10/10, 对训练样本进行预测的准确率Train Acc: 99.54%训练用时: 0:02:55.587366criterionnn.MSELoss()modelMNISTModel()optimizertorch.optim.RMSprop(model.parameters(),lr0.001,alpha0.9,# 梯度平滑系数momentum0.8,# 添加动量加速收敛weight_decay1e-5,# L2正则化centeredFalse)train_process()输出Epoch 1/10, 对训练样本进行预测的准确率Train Acc: 93.75%Epoch 2/10, 对训练样本进行预测的准确率Train Acc: 96.19%Epoch 3/10, 对训练样本进行预测的准确率Train Acc: 95.52%Epoch 4/10, 对训练样本进行预测的准确率Train Acc: 97.39%Epoch 5/10, 对训练样本进行预测的准确率Train Acc: 97.03%Epoch 6/10, 对训练样本进行预测的准确率Train Acc: 97.13%Epoch 7/10, 对训练样本进行预测的准确率Train Acc: 97.80%Epoch 8/10, 对训练样本进行预测的准确率Train Acc: 97.58%Epoch 9/10, 对训练样本进行预测的准确率Train Acc: 97.05%Epoch 10/10, 对训练样本进行预测的准确率Train Acc: 97.30%训练用时: 0:07:34.488462criterionnn.MSELoss()modelMNISTModel()optimizertorch.optim.RMSprop(model.parameters(),lr0.001,alpha0.9,# 梯度平滑系数momentum0.8,# 添加动量加速收敛weight_decay1e-5,# L2正则化centeredTrue# 中心化)train_process()输出Epoch 1/10, 对训练样本进行预测的准确率Train Acc: 91.83%Epoch 2/10, 对训练样本进行预测的准确率Train Acc: 95.06%Epoch 3/10, 对训练样本进行预测的准确率Train Acc: 96.34%Epoch 4/10, 对训练样本进行预测的准确率Train Acc: 95.43%Epoch 5/10, 对训练样本进行预测的准确率Train Acc: 96.05%Epoch 6/10, 对训练样本进行预测的准确率Train Acc: 97.22%Epoch 7/10, 对训练样本进行预测的准确率Train Acc: 97.39%Epoch 8/10, 对训练样本进行预测的准确率Train Acc: 97.39%Epoch 9/10, 对训练样本进行预测的准确率Train Acc: 97.46%Epoch 10/10, 对训练样本进行预测的准确率Train Acc: 96.95%训练用时: 0:06:58.4171713.结合动量和步长优化的算法AdamAdaptive moment estimation算法结合了AdaGrad算法和RMSProp算法的优势它的迭代关系式为siβ1⋅si−1(1−β1)df(x)dx∣xxiriβ2⋅ri−1(1−β2)(df(x)dx∣xxi)2s^isi1−β1ir^iri1−β2ixixi−1−lr⋅s^ir^iϵ(式11-7) \boldsymbol{s}_i \beta_1 \cdot \boldsymbol{s}_{i-1} (1 - \beta_1) \frac{df(\boldsymbol{x})}{d\boldsymbol{x}} \bigg|_{\boldsymbol{x}\boldsymbol{x}_i}\\ r_i \beta_2 \cdot r_{i-1} (1 - \beta_2) \left( \frac{df(\boldsymbol{x})}{d\boldsymbol{x}} \bigg|_{\boldsymbol{x}\boldsymbol{x}_i} \right)^2\\ \hat{\boldsymbol{s}}_i \frac{\boldsymbol{s}_i}{1 - \beta_1^i}\\ \hat{r}_i \frac{r_i}{1 - \beta_2^i}\\ \boldsymbol{x}_i \boldsymbol{x}_{i-1} - \frac{lr \cdot \hat{\boldsymbol{s}}_i}{\sqrt{\hat{r}_i} \epsilon}\tag{式11-7}siβ1⋅si−1(1−β1)dxdf(x)xxiriβ2⋅ri−1(1−β2)(dxdf(x)xxi)2s^i1−β1isir^i1−β2irixixi−1−r^iϵlr⋅s^i(式11-7)式中β1,β2∈[0,1]\beta_1, \beta_2 \in [0, 1]β1,β2∈[0,1]分别为累积梯度的动量系数和累积平方梯度的动量系数。初始s00,r00\boldsymbol{s}_0 \boldsymbol{0}, r_0 0s00,r00。对比式11-7和式11-6可知Adam算法是RMSProp中心化版本的进一步改进。对累积平方梯度rir_iri可以取历史最大值用来更新称为 AMSGrad此时 Adam 算法为siβ1⋅si−1(1−β1)df(x)dx∣xxiriβ2⋅ri−1(1−β2)(df(x)dx∣xxi)2ri′max(ri−1′,ri)s^isi1−β1ir^iri′1−β2ixixi−1−lr⋅s^ir^iϵ(式11-8) \boldsymbol{s}_i \beta_1 \cdot \boldsymbol{s}_{i-1} (1 - \beta_1) \frac{df(\boldsymbol{x})}{d\boldsymbol{x}} \bigg|_{\boldsymbol{x}\boldsymbol{x}_i}\\ r_i \beta_2 \cdot r_{i-1} (1 - \beta_2) \left( \frac{df(\boldsymbol{x})}{d\boldsymbol{x}} \bigg|_{\boldsymbol{x}\boldsymbol{x}_i} \right)^2\\ r_i \max(r_{i-1}, r_i)\\ \hat{\boldsymbol{s}}_i \frac{\boldsymbol{s}_i}{1 - \beta_1^i}\\ \hat{r}_i \frac{r_i}{1 - \beta_2^i}\\ \boldsymbol{x}_i \boldsymbol{x}_{i-1} - \frac{lr \cdot \hat{\boldsymbol{s}}_i}{\sqrt{\hat{r}_i} \epsilon}\tag{式11-8}siβ1⋅si−1(1−β1)dxdf(x)xxiriβ2⋅ri−1(1−β2)(dxdf(x)xxi)2ri′max(ri−1′,ri)s^i1−β1isir^i1−β2iri′xixi−1−r^iϵlr⋅s^i(式11-8)初始r0′0r_0 0r0′0。Adam 算法综合效果较好在PyTorch 中有相应的实现类通过设置参数可以实现上述两个算法。该算法的应用示例如代码11-1.4所示。代码11-1.4 Adam 优化器应用示例criterionnn.MSELoss()modelMNISTModel()optimizeroptim.Adam(model.parameters(),lr0.001)# Adam优化器train_process()输出Epoch 1/10, 对训练样本进行预测的准确率Train Acc: 95.18%Epoch 2/10, 对训练样本进行预测的准确率Train Acc: 97.85%Epoch 3/10, 对训练样本进行预测的准确率Train Acc: 98.42%Epoch 4/10, 对训练样本进行预测的准确率Train Acc: 98.30%Epoch 5/10, 对训练样本进行预测的准确率Train Acc: 99.01%Epoch 6/10, 对训练样本进行预测的准确率Train Acc: 99.27%Epoch 7/10, 对训练样本进行预测的准确率Train Acc: 99.30%Epoch 8/10, 对训练样本进行预测的准确率Train Acc: 98.91%Epoch 9/10, 对训练样本进行预测的准确率Train Acc: 99.43%Epoch 10/10, 对训练样本进行预测的准确率Train Acc: 99.30%训练用时: 0:01:35.730784criterionnn.MSELoss()modelMNISTModel()optimizeroptim.Adam(model.parameters(),lr0.001,amsgradTrue)# Adam优化器AMSGrad版本train_process()输出Epoch 1/10, 对训练样本进行预测的准确率Train Acc: 96.44%Epoch 2/10, 对训练样本进行预测的准确率Train Acc: 97.58%Epoch 3/10, 对训练样本进行预测的准确率Train Acc: 98.43%Epoch 4/10, 对训练样本进行预测的准确率Train Acc: 98.59%Epoch 5/10, 对训练样本进行预测的准确率Train Acc: 98.85%Epoch 6/10, 对训练样本进行预测的准确率Train Acc: 99.06%Epoch 7/10, 对训练样本进行预测的准确率Train Acc: 99.37%Epoch 8/10, 对训练样本进行预测的准确率Train Acc: 99.42%Epoch 9/10, 对训练样本进行预测的准确率Train Acc: 99.42%Epoch 10/10, 对训练样本进行预测的准确率Train Acc: 99.56%训练用时: 0:01:41.566383不同的优化算法有不同的特点读者可通过更多的练习来摸索它们的应用方法和特点。4.梯度消散与梯度爆炸问题本专栏中本文之前的几篇文章讨论了多层神经网络的激活函数、损失函数和优化器等问题。这里简要说明一下与这几个问题都有关的在多层神经网络训练中非常重要的梯度消散和梯度爆炸问题。在校对误差反向传播的过程中如果偏导数较小在多次连乘之后校对误差会趋近于0导致梯度也趋近于0前面层的参数无法得到有效更新称之为梯度消散。梯度消散会使得增加再多的层也无法提高效果甚至反而会降低。相反如果偏导数较大则会在反向传播的过程中呈指数级增长导致溢出无法计算网络不稳定称之为梯度爆炸。梯度消散和梯度爆炸只在层次较多的网络中出现常用的解决方法包括尽量使用合适的激活函数如Relu函数它在正数部分导数为1和损失函数适当的优化器预训练合适的网络模型有些网络模型具有防消散和爆炸能力将在后文讨论梯度截断等等。