Back Propagation 反向传播

简介: Back Propagation 反向传播

3、Back Propagation 反向传播

B站视频教程传送门:PyTorch深度学习实践 - 反向传播

3.1 引出算法

对于简单(单一)的权重 W ,我们可以将它封装到 Neuron(神经元)中,然后对权重W进行更新即可:

但是,往往实际情况中会涉及多个权重(例如下图:会有几十到上百个),我们几乎不可能做到写出所有的解析式:

矩阵论参考:The Matrix Cookbook - http://matrixcookbook.com

所以,引出反向传播(Back Propagation)算法:

当然,也可以将括号里面展开,如下如所示:

注意:不断地进行线性变化,不管有多少层,最后都会统一成一种形式。

所以:不能够化简(展开),因为增加的这些权重毫无意义。

3.2 非线性函数

所以我们需要引进非线性函数,每一层都需要一个非线性函数

3.3 算法步骤

在具体讲解反向传播之间,先回顾一下链式求导法则

(1)创建计算图表 Create Computational Graph (Forward)

(2)本地梯度 Local Gradient

(3)给出连续节点的梯度 Given gradient from successive node

(4)使用链式规则来计算梯度 Use chain rule to compute the gradient (Backward)

(5)Example: 𝑓 = 𝑥 ∙ 𝜔, 𝑥 = 2, 𝜔 = 3

3.3.1 例子

3.3.2 作业1

解答如下:

3.3.3 作业2

解答如下:

3.4 Tensor in PyTorch

3.5 PyTorch实现线性模型

import torch
x_data = [1.0, 2.0, 3.0, 4.0]
y_data = [2.0, 4.0, 6.0, 8.0]
w = torch.Tensor([1.0])
w.requires_grad = True  # 计算梯度
def forward(x):
    return x * w
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2
print("predict (before training)", 4, forward(4).item())
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 -= 0.01 * w.grad.data
        w.grad.data.zero_()
    print("progress:", epoch, l.item())
print("predict (after training)", 4, forward(4).item())
predict (before training) 4 4.0
  grad: 1.0 2.0 -2.0
  grad: 2.0 4.0 -7.840000152587891
  grad: 3.0 6.0 -16.228801727294922
  grad: 4.0 8.0 -23.657981872558594
progress: 0 8.745314598083496
...
  grad: 1.0 2.0 -2.384185791015625e-07
  grad: 2.0 4.0 -9.5367431640625e-07
  grad: 3.0 6.0 -2.86102294921875e-06
  grad: 4.0 8.0 -3.814697265625e-06
progress: 99 2.2737367544323206e-13
predict (after training) 4 7.999999523162842

3.6 作业3

解答如下:

代码实现:

import torch
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
w1 = torch.Tensor([1.0])  # 初始权值
w1.requires_grad = True  # 计算梯度,默认是不计算的
w2 = torch.Tensor([1.0])
w2.requires_grad = True
b = torch.Tensor([1.0])
b.requires_grad = True
def forward(x):
    return w1 * x ** 2 + w2 * x + b
def loss(x, y):  # 构建计算图
    y_pred = forward(x)
    return (y_pred - y) ** 2
print('Predict (before training)', 4, forward(4))
for epoch in range(100):
    l = loss(1, 2)  # 为了在for循环之前定义l,以便之后的输出,无实际意义
    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 - 0.01 * w1.grad.data  # 注意这里的grad是一个tensor,所以要取他的data
        w2.data = w2.data - 0.01 * w2.grad.data
        b.data = b.data - 0.01 * b.grad.data
        w1.grad.data.zero_()  # 释放之前计算的梯度
        w2.grad.data.zero_()
        b.grad.data.zero_()
    print('Epoch:', epoch, l.item())
print('Predict (after training)', 4, forward(4).item())
Predict (before training) 4 tensor([21.], grad_fn=<AddBackward0>)
  grad: 1.0 2.0 2.0 2.0 2.0
  grad: 2.0 4.0 22.880001068115234 11.440000534057617 5.720000267028809
  grad: 3.0 6.0 77.04720306396484 25.682401657104492 8.560800552368164
Epoch: 0 18.321826934814453
...
  grad: 1.0 2.0 0.31661415100097656 0.31661415100097656 0.31661415100097656
  grad: 2.0 4.0 -1.7297439575195312 -0.8648719787597656 -0.4324359893798828
  grad: 3.0 6.0 1.4307546615600586 0.47691822052001953 0.15897274017333984
Epoch: 99 0.00631808303296566
Predict (after training) 4 8.544171333312988


目录
相关文章
|
机器学习/深度学习 算法 PyTorch
反向传播(Backpropagation)
反向传播(Backpropagation)是一种用于训练神经网络的常用算法。它通过计算神经网络中各个参数对于损失函数的梯度,从而实现参数的更新和优化。神经网络是一种模拟人脑神经元相互连接的计算模型,用于解决各种机器学习和深度学习任务。
166 1
|
5月前
|
机器学习/深度学习 算法 Python
Backpropagation
【6月更文挑战第24天】
50 7
|
5月前
|
监控 Java API
Java一分钟之-JPA事务管理:PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW等
【6月更文挑战第14天】Java企业开发中,事务管理确保数据一致性,Spring事务管理核心概念包括`PROPAGATION_REQUIRED`和`PROPAGATION_REQUIRES_NEW`。前者在无事务时新建,有事务时加入,常用于保证业务方法在事务中执行。后者始终创建新事务,独立于当前事务,适用于需隔离影响的场景。理解其应用场景和易错点,合理配置事务传播行为,能提升应用的健壮性和性能。通过监控和日志优化事务策略是关键。
124 1
|
5月前
|
机器学习/深度学习 存储 PyTorch
四、反向传播 back propagation
四、反向传播 back propagation
|
6月前
|
机器学习/深度学习 数据采集 自然语言处理
Pre-trained Model
“【5月更文挑战第30天】”
59 0
|
6月前
|
机器学习/深度学习 人工智能 算法
神经网络算法——反向传播 Back Propagation
神经网络算法——反向传播 Back Propagation
83 0
|
存储 JSON 数据挖掘
PlistEdit Pro
PlistEdit Pro 是一款为 macOS 设计的属性列表(Plist)编辑器,它可以帮助用户直观且方便地查看、编辑和管理 Plist 文件。Plist 文件是 macOS 和 iOS 操作系统中许多应用程序和系统功能使用的配置文件格式,通常包含键值对、数组和字典等数据结构。
285 0
|
机器学习/深度学习 算法 Python
BP神经网络(Back Propagation Neural Network)算法原理推导与Python实现详解
BP神经网络(Back Propagation Neural Network)算法原理推导与Python实现详解
|
机器学习/深度学习 资源调度 Python
一文弄懂神经网络中的反向传播法——Back Propagation
其实应用挺广的,在图像识别,文本分类等等都会用到,我会专门再写一篇Auto-Encoder的文章来说明,包括一些变种之类的。如果你的输出和原始输入不一样,那么就是很常见的人工神经网络了,相当于让原始数据通过一个映射来得到我们想要的输出数据,也就是我们今天要讲的话题。
一文弄懂神经网络中的反向传播法——Back Propagation
|
机器学习/深度学习 算法 搜索推荐
On the Unreasonable Effectiveness of Feature propagation in Learning on Graphs with Missing 论文阅读笔记
On the Unreasonable Effectiveness of Feature propagation in Learning on Graphs with Missing 论文阅读笔记
210 0
On the Unreasonable Effectiveness of Feature propagation in Learning on Graphs with Missing 论文阅读笔记