设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 # T5 j# C0 d7 f0 u  f

    0 Q1 X' o, [& {! _' j; v: T% ?为预防老年痴呆,时不时学点新东东玩一玩。
    ; ?- x9 U# B3 C% i- C1 WPytorch 下面的代码做最简单的一元线性回归:6 i- A  Q( H& V  n% g, Q$ _9 Z
    ----------------------------------------------
    7 q* k  m' [+ U5 y- Eimport torch
    # I# R4 u" b3 @7 aimport numpy as np1 Y+ ]8 ?( Y) ^# s2 R) T
    import matplotlib.pyplot as plt1 }3 T- C3 q$ _1 s& {+ I" m
    import random. g$ B% d- ]$ G8 |( C- g, |
    ) |7 b- b0 y2 D* M
    x = torch.tensor(np.arange(1,100,1))
    4 j$ W  A: C; N$ j" m. ~y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15- X2 q4 K% `  j7 A/ n3 `7 I
    % K  Y7 e' f1 t9 M7 D9 \
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b4 M9 |1 c' F- ~3 O5 k* U
    b = torch.tensor(0.,requires_grad=True)
    2 ^5 S1 I0 k: j+ X5 _
      @+ P- n/ w$ t3 A, iepochs = 100( y+ U7 K, x+ l1 J
    : f6 r! _# f$ _% T8 F
    losses = []8 Z! ?1 N8 a$ ]: I
    for i in range(epochs):% y8 m. \* X2 B) M5 P& T
      y_pred = (x*w+b)    # 预测: Q! F' L5 @1 f
      y_pred.reshape(-1)
    / d" e( D  q! L
    . V( e" X6 p6 `$ J6 J, p* F6 C) p1 F  loss = torch.square(y_pred - y).mean()   #计算 loss+ `& U; g/ X# P( N, N% H0 m3 ?
      losses.append(loss)1 P/ K4 z" {8 H1 A5 N/ F. R
      
    ' e, @+ d$ J* s5 ~5 N7 w$ s  loss.backward() # autograd( _' k, F- x, n# r/ v9 M$ v
      with torch.no_grad():$ p7 H3 s) ~/ O9 Z( C6 F$ X
        w  -= w.grad*0.0001   # 回归 w. V+ a5 m: U& i  @+ b
        b  -= b.grad*0.0001    # 回归 b / G) t3 z3 ~& E/ j9 Q
      w.grad.zero_()  
    % E; s) b0 I2 W, y( f: M6 M  V/ a  b.grad.zero_()
    ! h& h+ m+ O( _, `& C
    / F3 f* k0 M+ ~( \. qprint(w.item(),b.item()) #结果
    + f. E' g: l1 n# k9 K3 q3 w% q' f5 O& H+ t  {; V3 g! C
    Output: 27.26387596130371  0.4974517822265625
    3 i& J  D1 X- Q; L' z----------------------------------------------
    % m1 K4 j2 B; X% M1 h最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    0 f) U" m! Y2 o( B+ C高手们帮看看是神马原因?
    . b' }, j: R  t2 y* `& I  t3 q5 P. R, r

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 0 p6 C+ v( B$ }+ m

    / R$ L0 `2 `- h5 S没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?6 \0 w2 G2 ~) h, s
    -------+ i$ |8 k$ J  c: }5 C( I+ n( V0 g( ~
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    3 g0 c  ^9 e! W& W, P  I-------4 v+ O% L* F; @1 k
    算法诊断部分,建议把循环次数改为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: G/ r* R$ g5 G" L" h7 H
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    0 f1 M; X% ?4 b- t% y8 q6 y-------& H6 m4 u# o( [
    不好意思, ...
    : q& h& c4 z% `" O5 `* `
    谢谢,算法应该没问题,就是最简单的线性回归。
    3 k: M4 F* W* q2 U# }7 ^, }' t我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 : Z5 p1 x9 X/ L3 Z
    雷达 发表于 2023-2-14 21:52
    5 F/ x! _/ M- ~) y+ I; O; U谢谢,算法应该没问题,就是最简单的线性回归。: T# o) ?) ]  H/ T$ ^5 q8 ]& x' o  B
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    : \3 {/ n5 S8 U7 Y: H4 v! l. {4 `0 a
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ( f( O. p+ b: m/ H9 \' i8 w/ W# ^, j2 @4 v: n
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    9 |: ?' @6 q) c' H9 h3 G9 V5 y
    老福 发表于 2023-2-14 22:00
    ' X- i: Y0 d9 f$ a/ ?$ F刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。8 F0 ]# d  p% q4 z; C
    3 ]: A1 P# {; j  l
    或者把b但的起点改为1试试。 ...
    . A6 v: z" g$ M1 v

      a% b& ~6 E+ v% y你是对的。
    3 o# b& q) Q+ M7 i; G/ [去掉了随机部分
    / L# X  Z4 Q; b; |& j& `6 t#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    $ H& ~4 x: _  v$ Ny = (x*27+15).reshape(-1)
    ) t9 v& G0 C% M" _" R, b4 t, q
    : R6 b/ v9 C# u4 }循环次数加成10倍,就看到 b 收敛了& A) D" U/ Q1 i1 @& w
    w , b
    - B0 P8 [  V4 m: }: U; [27.002620697021484 14.826167106628418! E. ~$ J; k2 S$ g' P

    9 n& c8 |0 D2 R# V: M; }和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-9 13:09 , Processed in 0.064608 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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