基于Levenberg-Marquardt算法改进的BP神经网络-公式推导及应用

Levenberg-Marquardt算法是一种用于非线性最小化问题的优化算法,通常用于训练神经网络。它结合了梯度下降和高斯-牛顿方法的特点,旨在提高收敛速度和稳定性。下面是基于Levenberg-Marquardt算法改进的反向传播(BP)神经网络的详细推导过程。

考虑一个具有L层的前馈神经网络,其中第l层(l=1,2,...,L)有nl个神经元。令θ表示所有权重和偏置参数的集合。网络的输入为x,输出为y,训练数据集包含N个样本{(xi, yi)}。

1. 网络结构和符号定义:

   - 输入层:$a^{(1)} = x$
   - 第l层的激活:$z^{(l+1)} = \theta^{(l)}a^{(l)}$
   - 第l层的输出:$a^{(l+1)} = g(z^{(l+1)})$
   - 损失函数:$J(\theta) = \frac{1}{2}\sum_{i=1}^{N}\|y_i - a^{(L)}_i\|^2$

2. 反向传播:

   对于Levenberg-Marquardt算法,我们需要计算损失函数对参数的梯度。首先,使用反向传播计算梯度。

   - 计算输出层的误差项:
     $\delta^{(L)} = \nabla_{a^{(L)}}J \odot g'(z^{(L+1)})$

   - 计算隐藏层的误差项:
     $\delta^{(l)} = (\theta^{(l)})^T \delta^{(l+1)} \odot g'(z^{(l+1)})$

3. Levenberg-Marquardt算法的更新规则:

   Levenberg-Marquardt算法的更新规则基于牛顿方法,但引入了一个调整因子(damping parameter)λ。

   - 计算Hessian矩阵H(二阶偏导数):
     $H = \nabla_{\theta}\nabla_{\theta}J = \sum_{i=1}^{N}\nabla_{\theta}\delta_i \nabla_{\theta}\delta_i^T$

   - 计算梯度g:
     $g = \nabla_{\theta}J = \sum_{i=1}^{N}\nabla_{\theta}\delta_i$

   - 计算Levenberg-Marquardt矩阵:
     $L = H + \lambda I$

   - 使用Levenberg-Marquardt矩阵求解参数更新:
     $\Delta\theta = -L^{-1}g$

   - 更新参数:
     $\theta \leftarrow \theta + \Delta\theta$

   - 更新λ:
     $\lambda \leftarrow \lambda \times \text{adjustment factor}$

   这里,调整因子通常根据网络性能进行动态调整,以确保算法的稳定性和收敛性。

4. 迭代更新:

   通过反复执行步骤2和步骤3,直到满足停止条件(如达到最大迭代次数或达到一定的精度)为止。

5. 代码实现:

下面是一个使用PyTorch实现基于Levenberg-Marquardt算法改进的BP神经网络的简单示例:

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np

# 生成模拟数据
np.random.seed(42)
X = np.random.rand(100, 1).astype(np.float32)
Y = 3 * X + 1 + 0.1 * np.random.randn(100, 1).astype(np.float32)

# 转换为PyTorch张量
X_tensor = torch.from_numpy(X)
Y_tensor = torch.from_numpy(Y)

# 定义神经网络模型
class LinearRegression(nn.Module):
    def __init__(self):
        super(LinearRegression, self).__init__()
        self.linear = nn.Linear(1, 1, bias=True)

    def forward(self, x):
        return self.linear(x)

# 初始化模型、损失函数和优化器
model = LinearRegression()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 定义Levenberg-Marquardt算法的训练步骤
def train_step(X, Y, model, criterion, optimizer):
    model.train()
    optimizer.zero_grad()
    predictions = model(X)
    loss = criterion(predictions, Y)

    # 计算梯度和Hessian矩阵
    gradients = torch.autograd.grad(loss, model.parameters(), create_graph=True)
    hessian = torch.autograd.grad(gradients, model.parameters(), create_graph=True)

    # 调整因子
    damping = 0.01
    l_matrix = [h + damping * torch.eye(h.size(0), device=h.device) for h in hessian]

    # 使用Levenberg-Marquardt矩阵求解参数更新
    update_direction = torch.linalg.solve(l_matrix, gradients)

    # 更新参数
    for param, update in zip(model.parameters(), update_direction):
        param.data -= update.data

    return loss.item()

# 训练模型
epochs = 100
for epoch in range(epochs):
    loss = train_step(X_tensor, Y_tensor, model, criterion, optimizer)
    print(f'Epoch {epoch+1}/{epochs}, Loss: {loss}')

# 打印训练后的权重和偏置
print('Trained weights:', model.linear.weight.data.item())
print('Trained bias:', model.linear.bias.data.item())

这个示例中,我们首先定义了一个简单的线性回归模型,并使用均方误差作为损失函数。在`train_step`函数中,我们计算了梯度和Hessian矩阵,并使用Levenberg-Marquardt算法进行参数更新。在每个训练步骤中,通过反复执行`train_step`函数,模型的参数将逐渐收敛到最优值。

在实际情况中,基于Levenberg-Marquardt算法的神经网络训练可能不是最佳选择,因为该算法相对较复杂,而深度学习框架通常使用更适合大规模数据集的优化算法。不过,为了演示,你可以使用基于Levenberg-Marquardt算法的训练方法来训练一个简单的神经网络模型以在MNIST数据集上进行数字识别。以下是一个PyTorch示例:

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
import matplotlib.pyplot as plt

# 加载MNIST数据集
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)

# 定义神经网络模型
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.flatten = nn.Flatten()
        self.linear1 = nn.Linear(28 * 28, 128)
        self.relu = nn.ReLU()
        self.linear2 = nn.Linear(128, 10)

    def forward(self, x):
        x = self.flatten(x)
        x = self.linear1(x)
        x = self.relu(x)
        x = self.linear2(x)
        return x

# 定义Levenberg-Marquardt算法的训练步骤
def train_step(X, Y, model, criterion, optimizer):
    model.train()
    optimizer.zero_grad()
    predictions = model(X)
    loss = criterion(predictions, Y)

    # 计算梯度和Hessian矩阵
    gradients = torch.autograd.grad(loss, model.parameters(), create_graph=True)
    hessian = torch.autograd.grad(gradients, model.parameters(), create_graph=True)

    # 调整因子
    damping = 0.01
    l_matrix = [h + damping * torch.eye(h.size(0), device=h.device) for h in hessian]

    # 使用Levenberg-Marquardt矩阵求解参数更新
    update_direction = torch.linalg.solve(l_matrix, gradients)

    # 更新参数
    for param, update in zip(model.parameters(), update_direction):
        param.data -= update.data

    return loss.item()

# 初始化模型、损失函数和优化器
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练模型
epochs = 5
for epoch in range(epochs):
    for data, target in train_loader:
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

    print(f'Epoch {epoch+1}/{epochs}, Loss: {loss.item()}')

# 可视化模型预测结果
with torch.no_grad():
    model.eval()
    test_loader = torch.utils.data.DataLoader(datasets.MNIST('./data', train=False, download=True, transform=transform), batch_size=1000, shuffle=True)
    images, labels = next(iter(test_loader))
    predictions = model(images)
    predicted_labels = torch.argmax(predictions, dim=1)

    # 显示前25个测试样本及其预测标签
    plt.figure(figsize=(10, 10))
    for i in range(25):
        plt.subplot(5, 5, i + 1)
        plt.imshow(images[i].squeeze(), cmap='gray')
        plt.title(f'Predicted: {predicted_labels[i]}, Actual: {labels[i]}')
        plt.axis('off')
    plt.show()

请注意,这只是一个演示性质的例子,使用Levenberg-Marquardt算法来训练神经网络可能不如其他现代优化算法(如Adam、SGD等)效果好。深度学习领域通常使用梯度下降的变体来训练神经网络。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/255194.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Kubernetes]3. k8s集群Service详解

在上一节讲解了k8s 的pod,deployment,以及借助pod,deployment来部署项目,但会存在问题: 每次只能访问一个 pod,没有负载均衡自动转发到不同 pod访问还需要端口转发Pod重创后IP变了,名字也变了针对上面的问题,可以借助Service来解决,下面就来看看Service怎么使用 一.Service详…

转发一篇计算机论文

最近看到一篇雷军老师在1992年的一篇计算机论文,个人看了对计算机科学从另外一个角度又多了一层理解,感觉很有收获,鉴于网上的图片看起来不清楚,本人特地到中国知网上去下载了这篇论文,希望给有心学习的人一点帮助。我…

Goland如何进行Debug断点调试

1. 进入编辑 2. 进行编辑 3. 调试运行 将鼠标移到按钮上,即显示其功能与快捷键 4. 常用调试快捷键 按键说明F7单步执行(进入方法)F8单步执行(不进入方法)F9继续执行

adb详细教程(五)-复制文件、截屏、录屏

adb对于安卓移动端来说,是个非常重要的调试工具。在进行安卓端的开发或测试过程中,有时需要了截屏或录屏,在设备上操作完成后再将文件导入电脑非常繁琐。​如果使用adb指令在进行截屏或录屏则会便捷许多。此篇文章介绍了如何使用adb指令进行文…

蓝桥杯time模块常用操作

#导入time模块import time #获取时间戳 start_time time.time () print ( "start_time ", start_time) time .sleep ( 3) end_time time.time () print ( "end_time ", end_time)#计算运行时间 print("运行时间 { :.0f } ".format(end_time …

[德人合科技]——设计公司 \ 设计院图纸文件数据 | 资料透明加密防泄密软件

国内众多设计院都在推进信息化建设,特别是在异地办公、应用软件资产规模、三维设计技术推广应用以及协同办公等领域,这些加快了业务的发展,也带来了更多信息安全挑战,尤其是对于以知识成果为重要效益来源的设计院所,防…

STL技术概述与入门

STL技术概述与入门 STL介绍STL六大组件初识容器算法迭代器1. vector存放内置数据类型2. Vector存放自定义数据类型3. Vector容器的嵌套 ✨ 总结 参考博文1:STL技术——STL概述和入门 参考博文2:<C>初识STL —— 标准模板库 STL介…

QT QIFW Linux下制作软件安装包

一、概述 和windows的操作步骤差不多,我们需要下装linux下的安装程序,然后修改config.xml、installscript.qs和package.xml文件。 QT QIFW Windows下制作安装包(一)-CSDN博客 一、下装QIFW 下装地址:/official_releases/qt-installer-fra…

基于YOLOv7算法和的高精度实时头盔目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要:基于YOLOv7算法的高精度实时头盔目标检测系统可用于日常生活中检测与定位工人是否佩戴头盔,此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别,同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法…

Web前端-HTML(常用标签)

文章目录 1. HTML常用标签1.1 排版标签1)标题标签h (熟记)2)段落标签p ( 熟记)3)水平线标签hr(认识)4)换行标签br (熟记)5)div 和 span标签(重点)6)排版标签总结 1.2 标签属性1.3 图像标签img (重点)1.4 链…

【04】GeoScene导出海图或者电子航道图000数据成果

1创建一个带有覆盖面和定义的产品 如果你没有已存在的S-57数据,你可以通过捕捉新的产品覆盖范围(多边形产品范围)及其所需的产品定义信息(产品元数据)来为新产品创建基础。 注: 如果你已经有一个S-57数据…

可视化 | 基于CBDB的唐代历史人物分析

文章目录 📚人口统计🐇唐朝历年人数统计🐇唐朝人口金字塔🐇唐朝历年出生死亡人数统计🐇唐朝人口分布🐇享年数据分布 📚唐朝人口迁徙🐇人口迁徙🐇生卒地变迁 &#x1f4da…

Motion Plan软硬约束下的轨迹生成

Motion Plan之轨迹生成代码实现Motion Plan之搜索算法笔记Motion Plan之基于采样的路径规划算法笔记Motion Plan之带动力学约束路径搜索 Motion Plan之轨迹生成笔记Motion Plan之曲线拟合笔记本项目代码:GitHub - liangwq/robot_motion_planing: 移动机器人轨迹生成…

精选硬件连通性测试工具:企业如何做出明智选择

在当今数字化的商业环境中,企业的硬件连通性至关重要。选择适用的硬件连通性测试工具是确保网络和设备协同工作的关键一步。本文将探讨企业在选择硬件连通性测试工具时应考虑的关键因素,以帮助其做出明智的决策。 1. 功能全面性:首要考虑因素…

【Stm32-F407】全速DAP仿真器下载程序

文章内容如下: 1) 全速DAP仿真器简介2) 全速DAP仿真器下载程序流程 1) 全速DAP仿真器简介 1)全速DAP仿真器简介 DAP全称 Data Acquisition Processor,是一种用于数据采集和实时控制的设备。本文使用的全速DAP仿真器遵循ARM公司的CMSIS-DAP标准&#xff…

《使用ThinkPHP6开发项目》 - 登录接口三【表单验证】

《使用ThinkPHP6开发项目》 - 登录接口一-CSDN博客 https://blog.csdn.net/centaury32/article/details/134974860 在设置用户登录时,由于安全问题会对登录密码进行加密 表单验证这里也可以使用ThinkPHP6自带的验证规则,创建一个验证管理员的文件 ph…

新人做自动化测试,记住这5点涨薪指日可待...

关于新人如何做好自动化测试,以下是我个人的一些思考。 01、测试基础的重要性 作为一名测试新人,测试基础非常非常重要。这里说的基础,不仅仅是什么是软件测试、软件测试的目的,而是测试用例的设计能力。 因工作的原因&#xf…

【最新版】WSL安装Google Chrome、Microsoft Edge 浏览器

文章目录 一、 安装WSL1. 全新安装2. 现有 WSL 安装 二、运行 Linux GUI 应用1. 安装适用于 Linux 的 Google Chrome步骤 1: 进入 temp 文件夹步骤 2: 使用 wget 下载 Google Chrome 安装包步骤 3: 安装 Google Chrome步骤 4: 修复依赖关系问题步骤 5: 再次配置 Google Chrome步…

上海亚商投顾:沪指再度失守3000点 北向资金净卖出近百亿

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 三大指数昨日集体调整,尾盘均跌超1%,北证50则逆势拉升涨超3%。医药股逆势走强&#xf…

C语言精选练习题:(11)打印菱形

文章目录 每日一言题目思路代码结语 每日一言 Intelligence without ambition is a bird without wings. 聪明但没有抱负,就像没有翅膀的鸟。 题目 输入一个整数n,打印对应2n-1行的菱形图案,比如输入7,图案一共13行 1 …