四、反向传播 back propagation
  TEZNKK3IfmPf 2023年11月15日 18 0

四、反向传播 back propagation

一、原理

1.1 计算图

四、反向传播 back propagation

在简单的线性模型中,我们可以通过数学推导求出梯度公式。

四、反向传播 back propagation

在复杂网络中,因为太复杂,无法直接数学计算梯度公式。

考虑将这样的复杂网络看成是图,我们在图上传播梯度,最后根据链式求导求出梯度(反向传播)。

计算图(一个简单的二层神经网络)

四、反向传播 back propagation

四、反向传播 back propagation

由于可以线性展开,这样就等于一个网络,中间计算的权重就没有意义。所以我们要加上一个非线性的东西,增加模型的复杂度。

四、反向传播 back propagation


1.2 反向传播

四、反向传播 back propagation

反向传播的过程:(先是蓝色箭头,然后红色)

四、反向传播 back propagation

Example:y = w * x

四、反向传播 back propagation

四、反向传播 back propagation

二、PyTorch实现

PyTorch :

Tenso(张量):PyTorch中存储数据的基本元素。

Tensor两个重要的成员,data和grad。(grad也是个张量)

四、反向传播 back propagation

#pytorch,线性模型

import torch


#数据样本x,y
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

#设置权重w 初值1.0 ,注意中括号[]
w = torch.Tensor([1.0])
w.requires_grad = True #w需要计算梯度

# y = x * w
def forward(x):
    return x * w #由于w是Tensor类型,这里x会自动类型转换为Tensor

#损失函数
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2


print("predict (before training) x={x},y={y}".format(x=4,y=forward(4).item()))

for epoch in range(100):
    for x, y in zip(x_data, y_data):
        l = loss(x, y) #Forward, compute loss。
        l.backward()   #Backward, 反向传播后就得到梯度
        print('\tgrad:',x, y, w.grad.item())
        w.data = w.data  - 0.01 * w.grad.data #更新w

        w.grad.data.zero_()#默认w的梯度累加,但这里需要清零。所以要显式清零。
    print("progress: epoch={epoch}, loss = {l}".format(epoch=epoch, l =l.item()))
print("predict (after training) x={x},y={y}".format(x=4,y=forward(4).item()))
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

TEZNKK3IfmPf