设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 % U7 C% B; e$ b+ z1 a- p6 _: i. ~
    , C# i; {: \9 U( I: i  o
    为预防老年痴呆,时不时学点新东东玩一玩。
    / }3 t7 t, a" Q( h- r. G0 fPytorch 下面的代码做最简单的一元线性回归:
    - [6 E- S. j0 Z% R! s+ |----------------------------------------------
    & k: G9 S4 }: a. _2 simport torch$ p! j/ l2 D, X" C8 k. y+ ?8 v
    import numpy as np' ~& Q; S1 e( F! B. z* X  u
    import matplotlib.pyplot as plt
    4 Z1 ^+ Z- e% ^, ]) X3 i( ^import random5 d$ v' z5 ^6 w* S8 _
    - U: M* [* h! q# y+ X: \$ S, f
    x = torch.tensor(np.arange(1,100,1))
    ( C+ m% V% |3 M2 k: G% F* i" vy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    9 Y  p% ?8 q# x
    $ M2 u) Y: U* o6 V' i4 V3 ]6 T5 ^+ ]w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b0 x, ^" R2 N" X" F% }
    b = torch.tensor(0.,requires_grad=True)
    6 ^! _; ]6 Y0 d6 H; b3 F4 R7 m
    % m0 U/ i, A+ o! t0 nepochs = 100# j0 g1 y) y; @0 J
    ; O$ {8 y/ U/ N
    losses = []
    $ I9 {( Y/ v- sfor i in range(epochs):# |# c8 R8 }" ^% f; x9 t1 n
      y_pred = (x*w+b)    # 预测3 `) k: {) c/ w/ y! r
      y_pred.reshape(-1)9 M, f/ {$ n3 P7 O1 H/ |

    ! I4 u5 t$ v+ L" P" H8 Y, R  loss = torch.square(y_pred - y).mean()   #计算 loss% B( g1 U- t& N
      losses.append(loss)' E; ?4 j* N! b. f5 u. |2 E5 b
      2 @% Q% A  A# U" V$ w7 X( U" t
      loss.backward() # autograd
    6 [/ i: J) P, Q. |2 K  with torch.no_grad():8 n3 ^" {4 S) [1 m' }: K: Y
        w  -= w.grad*0.0001   # 回归 w
    ( M/ c( ]6 V8 S0 Y    b  -= b.grad*0.0001    # 回归 b # U$ S3 d; n& [, b8 `! O: G4 K
      w.grad.zero_()  
    , c4 l( O- E% ~; m" x  b.grad.zero_(), i$ `$ p' P0 _" @5 L6 l5 K
    * y# l$ c& H7 Z. x& p4 S! k% V
    print(w.item(),b.item()) #结果
    % J/ H8 p* Q; `& N% h
    1 k. {6 Q; T; c8 [+ mOutput: 27.26387596130371  0.49745178222656259 K& C0 z* c; i8 _& B, h
    ----------------------------------------------
    : ]5 ?9 _  g: {& o最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。9 G2 b. o7 p! g7 V3 x6 q. x
    高手们帮看看是神马原因?
    3 i' x" P& y8 h. o+ B$ T5 ?

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 % U, ]) _! K* k. J. F  a

    . j8 @& H3 B. ^+ g4 t2 m* {" R没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    1 K) g7 n; `. C# b/ E3 |+ S( I-------
    . N6 I9 L+ J# o/ t% [( R3 w; r不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。& `  r9 w8 H6 ~& [0 N8 V2 z' @) `
    -------8 Z9 m* ]5 j  K- t/ i" M
    算法诊断部分,建议把循环次数改为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:23
    2 U9 L8 q  l1 R! C没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    / Y- B* I7 ^) K% L-------3 n3 E* b) t/ g- m$ `0 B
    不好意思, ...
    $ U, M/ y$ p. O  K
    谢谢,算法应该没问题,就是最简单的线性回归。
    - ]( B  B: t) u# A3 e* j' [我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ' @" m: Q; O' L- M  }) Y- K
    雷达 发表于 2023-2-14 21:52' A6 {; d2 j; V' M  [/ ?5 a
    谢谢,算法应该没问题,就是最简单的线性回归。
    " D9 b; [* }5 L; o* X我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    * C7 w+ u. z! G+ u. o" s) _* ]5 o  u5 U" s( @
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。- [8 {: `# m3 O8 F4 W- e. ]
    ) q+ U6 k! j  e
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 9 \$ ?) l. N' J% l( Q' C, V
    老福 发表于 2023-2-14 22:007 O' X, g5 J* o& z) }7 {- _0 y
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。* R2 J4 _" u: X7 p: q1 @
    ) S. w- Y- M6 ], F" C2 P
    或者把b但的起点改为1试试。 ...
    + v5 `/ G7 _% ]% v. Q
    5 H6 J$ z: ^- U& x9 z) N7 m9 ]
    你是对的。
    0 Y: ]& `& E8 I( p+ J% Y去掉了随机部分- i) x+ z! ?! I( B8 L1 ?
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)" F2 R6 t0 q/ l7 l. v$ S" G# u
    y = (x*27+15).reshape(-1)
    8 _+ d. E. \( C% U3 i  N& i- `( `0 Z- u% R3 d, R3 U% I& ?( A
    循环次数加成10倍,就看到 b 收敛了
    - s: J' Z3 T$ n9 p# v1 z2 Ew , b
      W7 G2 |  C8 q3 ?2 r% Q& e% a27.002620697021484 14.826167106628418  X  w& `' Q+ Y
    ' R  T) G7 M- j  @( O$ \
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-22 15:54 , Processed in 0.057096 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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