【22-23 春学期】AI作业6-误差反向传播

1.梯度下降

        梯度下降是一种常用的优化算法,用于求解最小化损失函数的参数。其基本思想是通过不断迭代,沿着损失函数的负梯度方向更新参数,使得损失函数不断减小,最终达到最优解。

        具体来说,梯度下降算法的步骤如下:

        1.初始化参数。将参数设为任意值,通常为随机数。

        计算损失函数的梯度。使用训练数据计算损失函数关于参数的梯度,即损失函数对每个参数的偏导数。

        2.更新参数。使用梯度下降公式更新参数,即将参数减去学习率乘以梯度。

        3.重复步骤2和3,直到达到停止条件。通常停止条件为损失函数达到某个阈值或迭代次数达到上限。

        4.需要注意的是,学习率是梯度下降算法中一个非常重要的超参数,它决定了每次参数更新的步长大小。学习率过大会导致算法无法收敛,学习率过小会导致算法收敛速度慢。

        另外,梯度下降算法有多种变体,如批量梯度下降、随机梯度下降、小批量梯度下降等,它们的区别在于每次更新参数时使用的样本数量不同。

2.反向传播   

        反向传播(backpropagation)是一种常用的神经网络训练算法,用于计算神经网络的梯度。其基本思想是通过链式法则,将损失函数对输出层输出的偏导数逐层传递回输入层,从而计算每个参数的偏导数。

        具体来说,反向传播算法的步骤如下:

        1. 前向计算。使用输入数据和当前参数值,计算神经网络的输出值。

        2. 计算损失函数。使用输出值和真实标签,计算损失函数的值。

        3. 反向传播误差。使用链式法则,将损失函数对输出层输出的偏导数逐层传递回输入层,计算每个神经元的误差。

        4. 计算梯度。使用误差和输入值,计算每个参数的偏导数。

        5. 更新参数。使用梯度下降或其他优化算法,更新参数值。

        6. 重复步骤1-5,直到达到停止条件。

需要注意的是,反向传播算法中的链式法则是关键步骤,它将复杂的损失函数对参数的偏导数分解成一系列简单的偏导数相乘。此外,反向传播算法需要选择合适的激活函数、损失函数、优化算法等,以达到更好的训练效果。

        另外,反向传播算法只适用于可微分的神经网络,且在深度神经网络中容易出现梯度消失和梯度爆炸的问题,需要采取一些技巧来缓解这些问题,如使用ReLU激活函数、批量归一化、残差连接等。

3.计算图

        计算图(computational graph)是一种用于表示计算过程的图形模型,它可以将复杂的计算过程分解成多个简单的计算步骤,并可视化这些计算步骤之间的依赖关系。

        在计算图中,每个计算步骤被表示为一个节点,每个节点接受若干输入,并输出一个输出值。节点之间的边表示输入和输出之间的依赖关系,即输出值作为下一步计算的输入值。

        计算图可以用于优化计算过程,例如在反向传播算法中,计算图可以将损失函数对参数的偏导数分解成多个简单的偏导数相乘,从而更方便地计算梯度。此外,计算图还可以用于自动微分,即自动计算复杂函数的导数,从而加速机器学习算法的实现。

        常见的计算图库包括TensorFlow和PyTorch等,它们提供了高效的计算图构建和优化工具,使得机器学习算法的实现更加方便和高效。

4.使用Numpy编程实现例题

 

 

5.使用PyTorch的Backward()编程实现例题

import torch
import numpy as np
x_data=[1.0,2.0,3.0]
y_data = [2.0, 4.0,6.0]
w = torch. Tensor([1.0]) #权重初始值
w.requires_grad = True #是否需要计算梯度,Tensor创建之 后默认不计算梯度
# y_predict=x*w
def forward(x) :
    return x * w
def loss(x,y): #损失函数
    y_pred = forward(x)
    return (y_pred - y) ** 2
#训练过程
#第一步:先算损失Loss
#第二步: backward, 反向传播
#第三步:梯度下降
for epoch in range(100):
    for x,y in zip(x_data,y_data):
        l = loss(x, y) #前向传播,求Loss, 构建计算图
        l.backward() #反向传播,求出计算图中所有梯度存入w中
        print("\tgrad:",x, y, w.grad.item())
        w.data = w.data - 0.01 * w.grad.data # w.. grad. data:获取梯度,用data计算, 不会建立计算图
 
        w. grad. data. zero_() #注意:将w中所有梯度清零
    print("pregress:",epoch,l.item())

【人工智能导论:模型与算法】MOOC 8.3 误差后向传播(BP) 例题 编程验证 - HBU_DAVID - 博客园 (cnblogs.com)icon-default.png?t=N3I4https://www.cnblogs.com/hbuwyg/p/16166814.html        https://zhuanlan.zhihu.com/p/279758736

(15条消息) 【22-23 春学期】AI作业6-误差反向传播_HBU_David的博客-CSDN博客icon-default.png?t=N3I4https://blog.csdn.net/qq_38975453/article/details/130247406

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值