设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 0 B; F0 n9 [1 l$ D( G

    8 a& ~" ^6 j! u5 S' @7 R9 j为预防老年痴呆,时不时学点新东东玩一玩。6 i! g9 h; h  `5 b# f8 w
    Pytorch 下面的代码做最简单的一元线性回归:! o; N9 i8 k" Q0 _5 Z7 W0 E
    ----------------------------------------------' X8 ^9 t) x. O- K! x( d
    import torch6 P' [' [$ g0 H" a
    import numpy as np
    0 d, ~, O% |5 Y8 timport matplotlib.pyplot as plt
    7 o: K0 v) Q7 T7 [3 Aimport random; V- e# e% W( v) q  @. L
    , B( I: K6 p/ f+ R9 k; D- m
    x = torch.tensor(np.arange(1,100,1))
    5 z0 t# J  f6 I' m* qy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15" ~6 y6 z/ ~5 q0 {, W2 z, P

    ; Y9 [! `( u$ x4 U7 r" K( Q8 Fw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    & b* N: ?1 W* c) p: k* Mb = torch.tensor(0.,requires_grad=True)5 G1 n0 Y1 @$ z
    3 u, J! Y1 K0 c; i9 u; N/ M7 _* X
    epochs = 1008 W5 m  I" e: [) k
    1 j& {+ F8 \4 h0 x
    losses = []! W9 _5 U- s7 x
    for i in range(epochs):+ c( G7 b0 E) ]
      y_pred = (x*w+b)    # 预测! k  o, p2 p. I9 c2 x$ c( |6 D( }
      y_pred.reshape(-1)
    0 T/ g$ Q! K! c9 ^# B! Q. f
    * ]5 i* m/ Q( x8 p1 ~/ ?6 c  loss = torch.square(y_pred - y).mean()   #计算 loss# u3 X+ {- j8 i" z
      losses.append(loss)
    9 V; y: w6 W7 C' V  . l# a& _7 f! d
      loss.backward() # autograd
    2 y  }* O" e! R8 U* }) H7 l) P  with torch.no_grad():( _/ _+ G" r( i- Q* z
        w  -= w.grad*0.0001   # 回归 w
    & ^$ p! _1 m1 w    b  -= b.grad*0.0001    # 回归 b
    7 K, R+ W% ^- @# Q3 f7 B2 t  w.grad.zero_()  $ F7 ?' h" c0 J3 e' }
      b.grad.zero_()7 g+ F  H# P% D
    - C2 S! K) n! r) N: k
    print(w.item(),b.item()) #结果/ p. B: z$ v  v' I' w$ o; y, U7 }

    2 Y) J+ W/ e4 [0 I* A. SOutput: 27.26387596130371  0.4974517822265625( I! C5 U7 Y) p
    ----------------------------------------------1 J# ?& T) `$ d4 L9 O- ~* P) t/ ~
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    $ ?) \& Y$ B4 {0 A2 U高手们帮看看是神马原因?+ g6 m; E! {4 S! |+ \' N0 G

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑   G* [4 e" Q$ d# t5 ~
    0 y7 R! P& x" K- r6 P' n
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?) O, @0 |0 Z$ `5 w  n. r8 a
    -------1 C' }  m7 a; b
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    " X- s7 |; [) |# v( V/ L. y; _-------2 w. |4 Y0 A* B, h* ]5 `
    算法诊断部分,建议把循环次数改为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. C- m. C. G; R
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?" ]5 q6 K  }; C, R$ b
    -------) o- p# ]! t& D( r7 X" ~
    不好意思, ...

    $ Z' A, E/ h. B0 Q6 `谢谢,算法应该没问题,就是最简单的线性回归。9 n0 j! D: `) B% o' i; ~$ k  |
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    2 O( i' f$ E7 D
    雷达 发表于 2023-2-14 21:52
    1 Z$ O' r* B: c谢谢,算法应该没问题,就是最简单的线性回归。2 f5 I' F) h5 r  l8 Y$ ^
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    0 P$ ~+ r) z$ `% H3 g
    ) V" Q% z5 X+ j, K3 h7 x刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ) k- P% o, C$ x/ w4 x
    % g  C. e$ I3 x7 @* U或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 . K/ t8 H& j4 G. Q" P# X1 h
    老福 发表于 2023-2-14 22:00: C0 Y/ z3 A& x- A4 U6 V7 a/ i; z! g
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。5 o- O, E/ S7 j  r
    - Z# k0 ~( P7 ^# v% H  J
    或者把b但的起点改为1试试。 ...
    & F' C5 P% m) ]/ x6 c4 }/ I- M
    8 ]' a2 y5 Y; r
    你是对的。
    % S8 K. k+ p! {) k% _' R去掉了随机部分
    - H, O1 @! S4 f, ?7 n; d6 L2 S* H#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    1 ?* f/ a' ?3 m! @/ W2 r0 Cy = (x*27+15).reshape(-1)2 g: I8 s6 e7 _- i; |. S: C2 G2 i

    * H: n1 q% l/ @: ^8 m循环次数加成10倍,就看到 b 收敛了- [9 I& L6 r8 `# Y
    w , b
    3 y- P6 r, s4 T% f' U27.002620697021484 14.826167106628418
    0 L* t7 _6 [( d, ~& y* {3 T3 Z+ `3 I6 U$ L* a1 E1 l! W; l/ @
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-28 08:37 , Processed in 0.062196 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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