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

1.梯度下降

梯度下降是一种优化算法,用于在训练机器学习模型时更新模型参数。它通过计算代价函数(损失函数)相对于模型参数的梯度来确定最佳参数值。 梯度下降算法将代价函数的梯度值称为负梯度。它在每次迭代时沿着负梯度的方向更新模型参数,直到达到代价函数的最小值为止。

梯度下降算法的基本思想是不断移动到代价函数的最小值,使模型参数达到最优化状态。在梯度下降算法中,每个模型参数都有对应的梯度值,通过计算梯度并将其乘以一个小的学习率,来更新模型参数的值。这一过程不断重复直到代价函数的值最小化或达到预设的迭代次数。

梯度下降算法有三种变种:批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)和小批量梯度下降(Mini-batch Gradient Descent)。批量梯度下降算法在每个迭代周期中使用全部数据来计算梯度,因此它的计算资源消耗很大,并且容易受到局部最小值的影响。随机梯度下降则是随机挑选一个样本来计算梯度,从而降低计算资源消耗,但同时容易产生噪声。小批量梯度下降是随机梯度下降算法的变种,它结合了批量梯度下降和随机梯度下降的优点,使用一小部分数据(通常在100-1000个左右)来计算梯度。

2.反向传播

反向传播是一种用于训练神经网络的优化算法,其主要思想是根据输出与目标之间的误差通过误差反向传播的方式来更新神经网络的权重参数,从而达到优化预测准确率的目的。

反向传播算法的基本原理是计算神经网络中各个神经元的误差贡献,并将误差向后传播到较早的、更多的神经元,从而计算之前隐藏层和输入层的权值更新。具体地,反向传播算法首先计算网络输出与目标之间的误差,然后使用误差链规则将误差反向地传递到每个神经元,并计算每个神经元的梯度值,最后使用梯度下降法更新神经网络参数,使它们逐渐收敛到一个较优值。

反向传播算法是一个迭代算法,通常需要多次迭代才能收敛到一个最优的权重值。在每次迭代中,都需要计算目标函数、误差和梯度,然后使用梯度下降或其他优化算法进行参数调整。

经过反向传播的训练,神经网络可以通过一定的输入来预测输出结果,并且误差将不断减少,使其对输入的预测更加准确。

3.计算图

计算图是一种在计算机科学和数学中广泛应用的概念。它描述了代数表达式(包括机器学习算法)的图形表示,其中节点表示数学运算(加法、乘法等),边缘表示数据(标量、向量、张量等)。

在计算图中,每个操作(例如加法、乘法、卷积等)都被表示为节点,变量(例如输入、中间值、输出等)都被表示为边缘(也称为张量)。通过计算图,我们可以清晰地描述神经网络和其他深度学习算法中的计算过程。基于计算图,我们可以通过路径计算来求出每个变量的导数,应用于反向传播算法中的梯度计算。

计算图的一个重要特点是它可以方便地优化复杂的代数表达式。通过优化计算图中节点的排列,我们可以减少计算的数量,从而实现更快的执行速度和更少的内存使用。

此外,计算图也是许多自动微分库(如TensorFlow、PyTorch、MXNet等)的基础。这些库可以自动地构建计算图,并在计算过程中动态地更新它们,以实现反向传播等自动微分方法。

4.使用Numpy编程实现例题

=====第0轮=====
正向传播: 0.47695 0.5287
损失函数: 0.21
=====第1轮=====
正向传播: 0.39688 0.3339
损失函数: 0.1
=====第2轮=====
正向传播: 0.35292 0.24607
损失函数: 0.06
=====第3轮=====
正向传播: 0.32545 0.20128
损失函数: 0.04
=====第4轮=====
正向传播: 0.30671 0.17356
损失函数: 0.03
=====第5轮=====
正向传播: 0.29314 0.15435
损失函数: 0.03
=====第6轮=====
正向传播: 0.28291 0.14005
损失函数: 0.02
=====第7轮=====
正向传播: 0.27495 0.12888
损失函数: 0.02
=====第8轮=====
正向传播: 0.26861 0.11985
损失函数: 0.02
=====第9轮=====
正向传播: 0.26348 0.11236
损失函数: 0.02 
 

5.使用PyTorchBackward()编程实现例题

import torch

import torch.nn as nn

import torch.optim as optim

class Net(nn.Module):

def __init__(self):

    super(Net, self).__init__()

    self.fc1 = nn.Linear(2, 2)

    self.fc2 = nn.Linear(2, 2)

    self.fc3 = nn.Linear(2, 1)

def forward(self, x):

    x = torch.sigmoid(self.fc1(x))

    x = torch.sigmoid(self.fc2(x))

    x = torch.sigmoid(self.fc3(x))

    return x

net = Net()

criterion = nn.MSELoss()

optimizer= optim.SGD(net.parameters(), lr=0.1)

x = torch.tensor([[0.5, 0.3]], dtype=torch.float)

y = torch.tensor([[0.23, -0.07]], dtype=torch.float)

for i in range(10):

optimizer.zero_grad()

outputs = net(x)

loss = criterion(outputs, y)

loss.backward()

optimizer.step()

print(outputs.detach().numpy(), loss.item())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值