当前位置: 首页 > news >正文

AI学习指南深度学习篇-带动量的随机梯度下降法Python实践

AI学习指南深度学习篇-带动量的随机梯度下降法Python实践

深度学习已经成为现代人工智能领域的重要基石。随机梯度下降法(SGD)是训练深度学习模型的常用优化算法,而带动量的随机梯度下降(Momentum SGD)在此基础上进一步加速了收敛过程,改善了模型的训练效果。本篇博客将深入探讨带动量的SGD及其在Python中的实现,涵盖代码示例、参数调优以及最佳实践。

1. 什么是带动量的随机梯度下降法?

在了解带动量的SGD之前,我们需要先了解普通的SGD。

1.1 随机梯度下降法(SGD)

随机梯度下降法是一种迭代优化算法,主要用于训练机器学习模型。其基本思想是通过不断更新模型参数,以最小化目标函数(通常是损失函数)。在SGD中,每次迭代只使用一小批数据(mini-batch)来计算梯度。

θ t + 1 = θ t − η ∇ θ J ( θ t ; x ( i ) , y ( i ) ) \theta_{t+1} = \theta_t - \eta \nabla_{\theta} J(\theta_t; x^{(i)}, y^{(i)}) θt+1=θtηθJ(θt;x(i),y(i))

其中:

  • θ \theta θ是模型的参数
  • η \eta η是学习率
  • J J J是损失函数
  • ( x ( i ) , y ( i ) ) (x^{(i)}, y^{(i)}) (x(i),y(i))是当前的训练样本

1.2 带动量的SGD

带动量的SGD引入了“动量”的概念,通过累积过去梯度的指数平均来加速SGD的更新。动量在一定程度上帮助模型跳出局部最优解,提高收敛速度。

其更新公式为:

v t = β v t − 1 + ( 1 − β ) ∇ θ J ( θ t ; x ( i ) , y ( i ) ) v_t = \beta v_{t-1} + (1 - \beta) \nabla_{\theta} J(\theta_t; x^{(i)}, y^{(i)}) vt=βvt1+(1β)θJ(θt;x(i),y(i))

θ t + 1 = θ t − η v t \theta_{t+1} = \theta_t - \eta v_t θt+1=θtηvt

在这里:

  • v t v_t vt是当前动量的值
  • β \beta β是动量衰减因子(通常取0.9)

2. 环境配置

在开始深度学习实现之前,请确保你已经安装了Python以及常用的深度学习库,如TensorFlow或PyTorch。

2.1 安装TensorFlow

如果你选择使用TensorFlow,可以使用以下命令安装:

pip install tensorflow

2.2 安装PyTorch

如果你选择使用PyTorch,可以使用以下命令安装:

pip install torch torchvision

3. 使用TensorFlow实现带动量的SGD

3.1 数据集准备

我们将使用著名的MNIST手写数字数据集来演示如何使用带动量的SGD优化模型。首先,加载数据集并进行预处理。

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
import numpy as np# 加载数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0# 将数据形状调整为 (批次,长度,高度,颜色通道)
x_train = np.expand_dims(x_train, axis=-1)
x_test = np.expand_dims(x_test, axis=-1)

3.2 构建模型

接下来,我们创建一个简单的卷积神经网络(CNN)模型。

def create_model():model = models.Sequential()model.add(layers.Conv2D(32, (3, 3), activation="relu", input_shape=(28, 28, 1)))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Conv2D(64, (3, 3), activation="relu"))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Flatten())model.add(layers.Dense(64, activation="relu"))model.add(layers.Dense(10, activation="softmax"))return modelmodel = create_model()

3.3 编译模型

使用带动量的SGD作为优化器:

# 设置动量
momentum = 0.9
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=momentum)# 编译模型
model.compile(optimizer=optimizer,loss="sparse_categorical_crossentropy",metrics=["accuracy"])

3.4 训练模型

训练模型,并观察训练过程中的损失和准确率。

# 训练模型
epochs = 10
history = model.fit(x_train, y_train, epochs=epochs, validation_split=0.2)# 可视化训练过程
import matplotlib.pyplot as pltplt.plot(history.history["loss"], label="train_loss")
plt.plot(history.history["val_loss"], label="val_loss")
plt.xlabel("Epochs")
plt.ylabel("Loss")
plt.legend()
plt.show()

3.5 评估模型

最后,我们评估模型在测试集上的表现。

test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_acc}")

4. 使用PyTorch实现带动量的SGD

接下来,我们将使用PyTorch实现同样的功能。

4.1 数据集准备

import torch
from torchvision import datasets, transforms
from torch import nn, optim# 数据预处理
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
trainset = datasets.MNIST(root="./data", train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testset = datasets.MNIST(root="./data", train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)

4.2 构建模型

class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=3)self.pool = nn.MaxPool2d(kernel_size=2)self.conv2 = nn.Conv2d(32, 64, kernel_size=3)self.fc1 = nn.Linear(64 * 5 * 5, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 64 * 5 * 5)x = F.relu(self.fc1(x))x = self.fc2(x)return xmodel = Net()

4.3 优化器设置

# 设置动量
momentum = 0.9
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=momentum)criterion = nn.CrossEntropyLoss()

4.4 训练模型

# 训练模型
epochs = 10
for epoch in range(epochs):running_loss = 0.0for images, labels in trainloader:optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()print(f"Epoch {epoch+1}, Loss: {running_loss / len(trainloader)}")# 可视化训练过程...

4.5 评估模型

# 评估模型
correct = 0
total = 0
with torch.no_grad():for images, labels in testloader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f"Test accuracy: {100 * correct / total}%")

5. 带动量的SGD调参过程

在训练模型时,合理的超参数设置可以显著提升模型性能。以下是一些重要的超参数及其调整策略:

5.1 学习率(Learning Rate)

学习率决定了模型权重更新的步伐大小。通常,使用学习率衰减是一个有效的策略。你可以从一个较大的学习率开始,然后逐渐减小。

5.2 动量衰减(Momentum Coefficient)

动量衰减可以帮助模型更快地收敛,通常我们将其设置为0.9或0.99。可以尝试不同的值来观察模型的变化。

5.3 批量大小(Batch Size)

批量大小的选择对于训练速度和模型收敛都有影响。小批量通常会导致更高的噪声,但有时也能更好地跳出局部最优解。

5.4 训练轮数(Epochs)

增加训练轮数能提高模型的准确率,但要注意过拟合的问题。可以通过监控验证损失来确定最佳的训练轮数。

6. 最佳实践

  • 使用更复杂的模型:可以尝试添加更多的卷积层和全连接层,以获得更高的准确率。
  • 数据增强:使用数据增强技术来增加训练数据的多样性,从而提高模型的泛化能力。
  • 交叉验证:划分数据集进行交叉验证,以确保模型的稳定性和准确性。
  • 早停法:监控验证损失并在其不再减小时终止训练,以防止过拟合。

7. 结论

通过本篇博客,我们深入探讨了带动量的随机梯度下降法,并通过TensorFlow和PyTorch进行了实践。希望你能理解这一优化算法的原理,以及如何在深度学习中有效应用。最重要的是,调参和模型优化是一个不断探索的过程,掌握相关技巧和最佳实践将有助于你在深度学习领域取得成功。

如有疑问,欢迎在评论区讨论!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 技术美术一百问(01)
  • 基于CNN-BiGUR的恶意域名检测方法
  • IDC基础学习笔记
  • Pycharm Remote Development 报错解决
  • HTTP 协议和 APACHE 服务
  • TikTok运营需要的独立IP如何获取?
  • Redis 入门 - 五大基础类型及其指令学习
  • 代码随想录冲冲冲 Day41 动态规划Part9
  • Mysql | 知识 | 事务隔离级别
  • Kylin Server V10 下 MySQL 8 binlog 管理
  • Spark底层逻辑
  • 高教社杯数模竞赛特辑论文篇-2013年B题:碎纸复原模型与算法
  • 分享一个基于微信小程序的医院挂号就诊一体化平台uniapp医院辅助挂号应用小程序设计(源码、调试、LW、开题、PPT)
  • WORD批量转换器MultiDoc Converter
  • Spring 框架——@Retryable 注解与 @Recover 注解
  • ----------
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • classpath对获取配置文件的影响
  • javascript从右向左截取指定位数字符的3种方法
  • Javascript设计模式学习之Observer(观察者)模式
  • Linux各目录及每个目录的详细介绍
  • maya建模与骨骼动画快速实现人工鱼
  • Phpstorm怎样批量删除空行?
  • Python3爬取英雄联盟英雄皮肤大图
  • Rancher-k8s加速安装文档
  • Spark学习笔记之相关记录
  • Sublime text 3 3103 注册码
  • 阿里云Kubernetes容器服务上体验Knative
  • 构建工具 - 收藏集 - 掘金
  • 基于web的全景—— Pannellum小试
  • 记录:CentOS7.2配置LNMP环境记录
  • 前端面试之CSS3新特性
  • 少走弯路,给Java 1~5 年程序员的建议
  • 扩展资源服务器解决oauth2 性能瓶颈
  • #{}和${}的区别?
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • $jQuery 重写Alert样式方法
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (十八)Flink CEP 详解
  • (十六)串口UART
  • (四)stm32之通信协议
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)memcache、redis缓存
  • (转)使用VMware vSphere标准交换机设置网络连接
  • *上位机的定义
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .net core + vue 搭建前后端分离的框架
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Framework 3.5安装教程
  • .NET 服务 ServiceController
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net反混淆脱壳工具de4dot的使用
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /var/log/cvslog 太大