刘二大人 《PyTorch深度学习实践》P4 反向传播

本文介绍了在复杂的神经网络中,如何通过将网络视为图并通过图传播梯度实现反向传播算法。内容涉及张量数据结构在计算过程中的应用,包括梯度计算、前馈运算和权重更新,以及两个实际编程作业示例演示了反向传播的计算过程。
摘要由CSDN通过智能技术生成

反向传播

如果是非常复杂的网络,无法直接进行计算

但是如果把网络看作图,通过图传播梯度,就能把梯度计算出来,即反向传播。

在这里插入图片描述

在这里插入图片描述

e.g. x ∈ \in Rn , w ∈ \in Rm*n , b ∈ \in Rm

矩阵计算书籍 Matricx cookbook https://www.math.uwaterloo.ca/~hwolkowi/matrixcookbook.pdf

在这里插入图片描述

不管有多少层,最后统一成了y = WX+B,没有区别,因此为了增加网络复杂程度,对每一层的输出增加一个非线性函数。

在这里插入图片描述

链式求导法则:

在这里插入图片描述

计算过程:

  1. 创建计算图 前馈运算 得到z
  2. 反向得到Loss对z的偏导
  3. 使用链式求导计算 Loss对x的偏导 Loss对y的偏导
  4. 得到相应的导数之后就可以做权重的更新了

在这里插入图片描述

在这里插入图片描述

Tensor(张量)

用来存放数据,可以是标量、向量、矩阵、高维度的数据等等。

标量是零维张量,向量是一维张量,矩阵是二维张量。

  • tensor.data:表示张量w的值,其本身也是张量,输出格式tensor[数]
  • tensor.grad:表示张量w的梯度,其本身w.grad是张量,用时(标量计算)需要取w.grad.data,表示张量w.grad的值,输出格式为tensor[数]。
  • tensor.grad.item():梯度输出时需要取w.grad.item(),表示返回的是一个具体的数值。因此对于元素不止一个的tensor列表,使用item()会报错 ,向量不行二维更不行 ,只有标量行
  • tensor.item():将张量的值作为标准python数返回。这仅适用于具有一个元素的张量。

在这里插入图片描述

作业

作业1:计算y = w*x(当w=1, x = 2, y=4)的梯度,理解forward和backward过程

在这里插入图片描述

作业2:更新模型,增加一个偏置量

在这里插入图片描述

作业3:代码实现标题Tensor上方图

import torch
import matplotlib.pyplot as plt

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


# 模型
def forward(x):
    return x * w


# 计算损失
def loss(x, y):
    return (forward(x) - y) ** 2


print('Predict (before training)', 4, forward(4).item())

epoch_list = []
loss_list = []

for epoch in range(100):
    for x, y in zip(x_data, y_data):
        l = loss(x, y)
        l.backward()
        print("\tgrad", x, y, w.grad.item(), w.data, w.grad.data)
        w.data = w.data - 0.01 * w.grad.data

        w.grad.data.zero_()

    epoch_list.append(epoch)
    loss_list.append(l.item())
    print('progress:', epoch, l.item())

print('predict (after training)', 4, forward(4).item())

figure = plt.figure("反向传播")
ax = figure.add_subplot()
ax.plot(epoch_list, loss_list)
plt.show()

作业4:计算y = w1x2 + w2x + b的梯度

在这里插入图片描述

作业5:代码实现作业4

import torch
import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

w1 = torch.tensor([1.0])
w2 = torch.tensor([2.0])
b = torch.tensor([3.0])
w1.requires_grad = True
w2.requires_grad = True
b.requires_grad = True
r = 0.01


# 模型
def forward(x):
    return x ** 2 * w1 + x * w2 + b


# 计算损失
def loss(x, y):
    return (forward(x) - y) ** 2


print('Predict (before training)', 4, forward(4).item())

epoch_list = []
mse_list = []

for epoch in range(100):
    for x, y in zip(x_data, y_data):
        l = loss(x, y)
        l.backward()
        print("\tgrad", x, y, w1.grad.item(), w2.grad.item(), b.grad.item())
        w1.data = w1.data - r * w1.grad.data
        w2.data = w2.data - r * w2.grad.data
        b.data = b.data - r * b.grad.data

        w1.grad.data.zero_()
        w2.grad.data.zero_()
        b.grad.data.zero_()

    epoch_list.append(epoch)
    mse_list.append(l.item() / len(x_data))
    print('progress:', epoch, l.item())

print('predict (after training)', 4, forward(4).item())

figure = plt.figure("反向传播")
ax = figure.add_subplot()
ax.plot(epoch_list, mse_list)
plt.show()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李闪火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值