Day-14 Pytorch 的 Gradient 计算

  • 之前我们看过用 Python 计算 Gradient 必须要手动计算偏微分之後,才有办法算出
  • 那如果利用 Pytorch 呢?

一样的前提假设

  • 我们一样假设我们的目标 function 是 https://chart.googleapis.com/chart?cht=tx&chl=%24f(x)%20%3D%20w%20*%20x%24 ,今天希望找到正确的 w,然後我们的 loss function 一样是 MSE https://chart.googleapis.com/chart?cht=tx&chl=%24(%5Chat%20y%20-%20y)%20%5E%202%24
  • 所以我们一样得到我们的 function
    def forward(x):
    
        return w * x
    
  • 还有我们的 loss function
    def loss(y, y_predicted):
    
        return ((y_predicted-y) ** 2).mean() 
    
  • 原本我们用 python 去计算 Gradient 需要自己再写一个 Gradient function,但是 Pytorch 不用,我们来看看怎麽用

Calculate Gradient

  • Pytorch 提供了 Autograd 来做 Gradient 的计算,而要计算 Gradient 必须要在参数创立时,开几一个变数 requires_grad
    x = torch.randn(3, requires_grad=True)
    print(x)
    # tensor([-0.2124, -0.1003, -0.3773], requires_grad=True)
    
  • 那关於 Pytorch 在开启 requires_grad 之後,会自动产生 Backward function 当他开始计算的过程中
    y = x + 2
    print(y)
    # tensor([1.7876, 1.8997, 1.6227], grad_fn=<AddBackward0>)
    z = y * y * 2
    # tensor([6.3911, 7.2174, 5.2663], grad_fn=<MulBackward0>)
    z = z.mean()
    print(z)
    # tensor(6.2916, grad_fn=<MeanBackward0>)
    
  • 我们从神经元的角度看待 https://chart.googleapis.com/chart?cht=tx&chl=%24y%20%3D%20x%20%2B%202%24 ,Pytorch 在开启 Autograd 之後,会自动在神经元 forward 运算时,建立一个 backward 的 gradient 运算

  • 所以当我们使用 torch.backward() 呼叫 backward calculate 时就等於计算了 dz/dx
    z.backward()
    print(x.grad)
    # tensor([2.3835, 2.5329, 2.1636])
    
  • 当我们要更新参数时,例如我们要更新我们的 weight,我们不需要他们产生 gradient function 了,因此我们需要一个没有 Autograd 的环境,这边有三种方式达到
    import torch
    
    x = torch.randn(3, requires_grad=True)
    print(x)
    # tensor([-0.2124, -0.1003, -0.3773], requires_grad=True)
    
    # using: x.requires_grad_(False)
    x.requires_grad_(False)
    print(x)
    # tensor([-0.2124, -0.1003, -0.3773])
    
    # using: x.detach()
    y = x.detach()
    print(y)
    # tensor([-0.2124, -0.1003, -0.3773])
    
    # using: with torch.no_grad():
    y = x + 2
    print(y)
    # tensor([1.7876, 1.8997, 1.6227], grad_fn=<AddBackward0>)
    with torch.no_grad():
        y = x + 2
        print(y)
        # tensor([1.7876, 1.8997, 1.6227])
    
  • 那 Pytorch 的 grad 运算是会叠加的,因此当你每个训练的回圈结束时,请记得净空 grad,那如何净空?
    x.grad.zero_()
    

每日小结

  • 大声欢呼吧~我们原本手写非常复杂的 gradient 在 Pytorch 眼中就是一个 function 啦~是不是轻松很多啊 XDD,这就是 Framework 的威力
  • 明天就让我们直接看看一个简单的 Regression Model 如果要训练的话,用 Python 跟 Pytorch 的程序码差异吧~

<<:  Day 17. 计算属性(Computed) VS 方法(Methods)

>>:  Day 15. 常见模板 Template OS Linux / Windows by Zabbix agent 介绍

[Day27] Esp32 + IFTTT + Google Sheet

1.前言 今天要讲解如标题一样,Google Sheet是Google所开发的试算表,所以我们要用G...

javascript流程控制-回圈

while回圈计算1加到100: for回圈计算1加到100: break跟continue的范例:...

Day3 — 前导:电晶体如何组成逻辑闸

如果用非常概括性的说法来描述 CPU 的组成,其实就是数以亿计的电晶体组合而成的。那麽电晶体又是怎麽...

Day.2 选择 - 关联式与非关联式 (SQL vs. NoSQL )

提到资料库特性势必要先了解SQL(关联式资料库)vs.NoSQL(非关联式资料库)之间的差异,在应...

存取方法

终於度过前面枯燥乏味的内容了...(但它们都很重要,也与今天的主题有关) 今天要来进入重点项目 我们...