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

人工智能-深度学习-BP算法

BP算法的核心思想是通过计算损失函数对网络参数的梯度,然后使用梯度下降法来更新网络参数,从而最小化损失函数。

误差反向传播算法(BP)的基本步骤:

  1. 前向传播:正向计算得到预测值。

  2. 计算损失:通过损失函数计算预测值和真实值的差距。

  3. 梯度计算:反向传播的核心是计算损失函数对每个权重和偏置的梯度。

  4. 更新参数:一旦得到每层梯度,就可以使用梯度下降算法来更新每层的权重和偏置,使得损失逐渐减小。

  5. 迭代训练:将前向传播、梯度计算、参数更新的步骤重复多次,直到损失函数收敛或达到预定的停止条件。


前向传播

        英文(Foward propagathon),表示将输入的数据逐级向前的每个神经元运算传输,直到到达输出层。

        前向传播的目的是计算网络的预测值,以便后续计算损失函数并进行反向传播。

以下是一个三层神经网络实例,包含输入层(x1,x2,x3,b),隐藏层,输出层

链接输入和隐藏层的就是我们熟知的权重(w),在隐藏层中会完成两个动作

1.加权求和再求平均值,用于预测或计算损失。

2.再就是使用激活函数,将原本的线性公式,运算转为非线性。激活函数的使用视数据的情况而定

通常有sigmoid,Tanh,ReLu,softmax等激活函数。

x1,x2,x3,x4每个特征向量分别对隐藏层的n个神经元做线性运算,

再经过激活函数激活后得到最终预测值。

第一层的输出值等于第二层的输入值,依次经过运算。

        代码逻辑:

def test():
    # 前向传播
    i = torch.tensor([0.05,0.1])
    model1 = torch.nn.Linear(2,2)
    model1.weight.data = torch.tensor([
        [0.15,0.20],[0.25,0.30]
    ])
    model1.bias.data = torch.tensor([0.35,0.35])
    l1_l2 = model1(i)
    h1_h2 = torch.nn.Sigmoid(l1_l2)
    model2 = torch.nn.Linear(2,2)
    model2.weight.data = torch.tensor([
        [0.40,0.45],[0.50,0.55]
    ])
    model2.bias.data = torch.tensor([0.60,0.60])
    l3_l4 = model2(h1_h2)
    o1_02 = torch.nn.Sigmoid(l3_l4)

反向传播

        通过计算损失函数相对于每个参数的梯度来调整权重,使模型在训练数据上的表现逐渐优化。反向传播结合了链式求导法则和梯度下降算法,是神经网络模型训练过程中更新参数的关键步骤。

        前向传播的作用就是为了得到预测值,然后来为反向传播做准备。

        反向传播是为了得到更好的w,也就是我们的权重。


链式法则

        在深度学习中,链式法则是反向传播算法的基础,这样就可以通过分层的计算求得损失函数相对于每个参数的梯度。

复合函数的复杂性

  • 神经网络的输出是输入数据经过多层线性变换和非线性激活函数后的结果。每一层的输出都是下一层的输入,形成了一个复合函数。

  • 例如,假设有一个三层神经网络,输出 yy 可以表示为:

其中,f、g、h 分别是不同层的激活函数。

链式求导法通过将复合函数的导数分解为各个简单函数的导数的乘积,简化了求导过程。

也就是求得我们每一层的导函数,以便于做梯度更新,找到最小损失。

反向传播中的数学运算。

实在看不懂数学公式。。。

直接上API。

import torch
#第一步,创建一个神经网络类,继承官方的nn.module
class mybet(torch.nn.Module):
    #定义网络结构
    def __init__(self,input_size,output_size):
        #初始化父类:语法要求调用super方法生成父类的功能让子类继承父类的功能
        super(mybet,self).__init__()
        #定义网格结构
        self.hide1 = torch.nn.Sequential(torch.nn.Linear(input_size,3),torch.nn.Sigmoid())
        self.hide2 = torch.nn.Sequential(torch.nn.Linear(3,2),torch.nn.Sigmoid())
        self.out = torch.nn.Sequential(torch.nn.Linear(2,output_size),torch.nn.Sigmoid())
    def forward(self,input):
        input.shape[1]
        x = self.hide1(input)
        x = self.hide2(x)
        pred = self.out(x)
        return pred

def train():
    #数据集读取(这里自己编)
    input = torch.tensor([[0.5, 0.1],
                          [0.05, 0.180],
                          [0.05, 0.310]])
    target = torch.tensor([[1, 2],
                           [0, 3],
                           [1, 123]], dtype=torch.float32)
    #创建网格
    net = mybet(2,2)
    #定义损失函数
    loos_func = torch.nn.MSELoss()
    #定义优化器
    optimizer = torch.optim.SGD(net.parameters(),lr=0.01)
    #训练
    for epoch in range(500):
        #前向传播
        y_pred = net(input)
        #计算损失
        loss = loos_func(y_pred,target)
        #梯度清零
        optimizer.zero_grad()
        #反向传播(计算每一层w的偏导数(梯度值))
        loss.backward()
        print(net.hide1[0].weight)
        break
if __name__ == '__main__':
    
    train()

完整的全连接。


http://www.kler.cn/a/420692.html

相关文章:

  • android-studio开发第一个项目,并在设备上调试
  • c++总复习
  • C 语言中的外部变量
  • 搭建环境-PHP简介及环境搭建教程
  • 单片机状态机实现多个按键同时检测单击、多击、长按等操作
  • vue实现echarts饼图自动轮播
  • 【计算机网络】实验3:集线器和交换器的区别及交换器的自学习算法
  • mysql之慢查询设置及日志分析
  • Paper -- 建筑物高度估计 -- 使用街景图像、深度学习、轮廓处理和地理空间数据的建筑高度估计
  • React.memo 和useMemo 的区别
  • Python 调用 Umi-OCR API 批量识别图片/PDF文档数据
  • 【前端】小程序实现预览pdf并导出
  • Argon2-cffi:Python中的密码学哈希库
  • AI 计算基础设施的战略转折点分析
  • C++ 变量和常量:开启程序构建之门的关键锁钥与永恒灯塔
  • Go-MediatR:Go语言中的中介者模式
  • 基于 Vite 封装工具库实践
  • ABE 中的隐藏属性:DIPPE(去中心化内积谓词加密)
  • linux 压缩命令,压缩a目录,但是不压缩a目录下的b目录,zip命令
  • termius mac版无需登录注册直接永久使用
  • Mybatis 复习
  • MySQL 数据库学习教程二:深入 MySQL 数据库世界
  • uniapp进阶技巧:如何优雅地封装request实例
  • 《嵌入式硬件设计》
  • 架构学习第五周--Kubernetes(一)
  • python基础(六)