设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
查看: 3203|回复: 4
打印 上一主题 下一主题

[信息技术] 继续请教问题:关于 Pytorch 的 Autograd

[复制链接]
  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 " i9 C; S) x- X
    + p4 H% c; B  O! ]4 f1 v
    为预防老年痴呆,时不时学点新东东玩一玩。
    7 i; H% c) z3 s7 uPytorch 下面的代码做最简单的一元线性回归:
    8 D* e" q& k2 J# x. Z. p----------------------------------------------' b. ?2 p. k2 A! }0 S
    import torch
    * J- w% k8 v' j- z- wimport numpy as np
    * ]% [/ u, q7 S7 r( S3 z, W- [4 ~import matplotlib.pyplot as plt, A' s! x3 A8 V9 U0 r
    import random
    5 P# l1 a& R/ K+ ?8 B- V" e- N% ?# z3 W8 k$ Q
    x = torch.tensor(np.arange(1,100,1))1 T( Z' W% ~% \6 N7 Z  t+ C6 j$ ]/ e0 j
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15" V& ]6 }5 Q" l  v# W

    * n+ i9 C2 r/ K) Ww = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b4 l" ]' d+ f0 k) E% F' z& r+ J
    b = torch.tensor(0.,requires_grad=True)* a" y0 f# n0 `  B1 X2 V+ o
    7 b. }4 L) ~# `! E" j* D9 }
    epochs = 1003 c% t' Z* z- e. C

    4 ]$ o- z% X7 A% b4 H, u1 Mlosses = []
    + {9 y8 A$ z' |' yfor i in range(epochs):+ y. @  _  Z" j5 t/ {
      y_pred = (x*w+b)    # 预测
    , ?% }( d1 c* [  y_pred.reshape(-1)
      j$ s/ c% W. W3 i/ J) Y% c; ]3 T ' R9 y) d, w" s  V6 j- o" ?. L& O
      loss = torch.square(y_pred - y).mean()   #计算 loss4 ]( v; |+ h# }9 a8 G) }& h( C
      losses.append(loss)+ _0 v# _' {9 h" K
      
    / T, R3 a5 n! R- a1 s) I  loss.backward() # autograd
    9 B/ P' N1 X9 \5 k' j# @7 p  with torch.no_grad():. {( e! I6 g+ F; D3 z! H
        w  -= w.grad*0.0001   # 回归 w! ?0 f: q  N) w2 p* u' B+ _
        b  -= b.grad*0.0001    # 回归 b
    2 F" J7 z+ O2 n$ u9 Z7 V  w.grad.zero_()  2 q! V2 V% v8 B' w
      b.grad.zero_()
    - Q+ y# L- O: B% Q
    % |4 l- J7 i+ Z; S3 Lprint(w.item(),b.item()) #结果
    . j: E- M( s, p9 u$ d3 c# y- a' w% v! E; S
    Output: 27.26387596130371  0.49745178222656253 s. W, |3 A7 u( d: y- L
    ----------------------------------------------5 v, k# i. e8 \" r# C! C
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    / ]  p8 s' C) H+ h1 |3 R高手们帮看看是神马原因?
    + @7 J/ `% l: R' }' W

    评分

    参与人数 1爱元 +10 收起 理由
    老票 + 10 不明觉厉

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ) `9 E; ^, e0 F/ m8 ?1 {# d0 p

    4 m4 z9 ]- Y. r4 U$ t没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    " t3 Y1 @. A8 d: T& H-------
    $ [. |  d+ d$ c& }不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。7 `! O- `1 r2 d/ g# Y/ D
    -------) L" h# i: w& ]  a) a4 a
    算法诊断部分,建议把循环次数改为1000, 再看看loss是不是收敛。有点怀疑你循环次数不够,因为你起点是0, 步长很小。只是直观建议。

    评分

    参与人数 1爱元 +10 收起 理由
    雷达 + 10 谢谢建议

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    板凳
     楼主| 发表于 2023-2-14 21:52:57 | 只看该作者
    老福 发表于 2023-2-14 19:234 `8 S/ J: b9 |  }$ C; M
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    9 X$ F% F* c0 R6 T- r% I1 Z9 X-------5 O% a7 T& s& e% _5 J! L8 {, ~
    不好意思, ...

      Q0 p* B* z3 i+ X) S谢谢,算法应该没问题,就是最简单的线性回归。' N6 s+ O4 X0 C4 z
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    , X! N" d- `) t5 {
    雷达 发表于 2023-2-14 21:52
    # z+ F; g  `+ `" F谢谢,算法应该没问题,就是最简单的线性回归。5 i# |# H. k; O7 |4 L% K
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    ! U9 p6 r( j2 R$ q5 Z
    / @1 P. F! }- A, b  v6 R刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    : A2 I! {* l3 m8 t! B, M* A1 i4 @) Q4 W) N& u( F
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    ; U7 I- c0 W! P2 i2 t
    老福 发表于 2023-2-14 22:000 F0 A4 o, b: K# J
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    4 I. @) n3 w9 I- t6 ?( C0 ], [' K) J6 p0 H  c
    或者把b但的起点改为1试试。 ...

    $ @0 T5 D2 e/ m  _" a2 q% z$ V$ j; X( s  h7 o$ U& \4 m! o
    你是对的。1 s: U) m+ V& a6 A% y+ l3 h! h
    去掉了随机部分
    . J# B6 r: F+ i- p5 n#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    * @$ o1 d- }6 w& `9 O; ]y = (x*27+15).reshape(-1)
    , {. G; n% c. H$ U. i; I
    $ {* J. O" u) Y$ a& Z循环次数加成10倍,就看到 b 收敛了
    ; |. C1 R% S7 I: ^9 g# I2 tw , b
    " q3 a0 u% T% x5 F: D27.002620697021484 14.826167106628418
    9 V. \6 H6 P5 I! ]7 _
    7 J! a# g9 l7 m% ]: n8 B" T8 J和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2026-7-5 22:46 , Processed in 0.060526 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表