设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 9 C/ E. S/ l/ Z8 \, C2 |: _' i
    % _/ N2 E1 y4 l
    为预防老年痴呆,时不时学点新东东玩一玩。
    5 F5 g. e1 N3 L$ m" LPytorch 下面的代码做最简单的一元线性回归:
    / k* f- z9 F$ g( i2 s/ W----------------------------------------------9 \* W% M8 Z* s3 [9 e$ A2 f! M& ^
    import torch; H8 e9 b. V) b5 r- j. ]0 E6 M% ?
    import numpy as np' p4 f, ]8 Y% G* O$ h3 M% e
    import matplotlib.pyplot as plt
    ' O  {, f. [3 Kimport random: R. \4 o* @* I# t' V3 S' [% K

    . z, G1 I' v; O/ ^x = torch.tensor(np.arange(1,100,1))
    1 W2 P9 }2 Y' H$ t+ [& ty = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15% X5 o1 P% z% k
    * a0 y6 x  y( s6 i+ @
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b  ?6 B& F8 L) B# Y! p
    b = torch.tensor(0.,requires_grad=True)
    " f! I* H8 N: o5 M0 W* I+ U
    8 u0 i6 G2 }1 \; F3 Z5 I4 ?epochs = 1006 Y7 e1 F! m- M9 b/ ]
    / _& U7 n  H& t3 |
    losses = []- {6 x  D6 p8 ]! v. q* f# Z7 V! }  L
    for i in range(epochs):* G. a& x8 M' H1 D
      y_pred = (x*w+b)    # 预测3 u/ n. y) e# e' H
      y_pred.reshape(-1)
    2 X, M3 T) t) Z5 @ 6 C, J( O  g3 k
      loss = torch.square(y_pred - y).mean()   #计算 loss
    # I/ s) U2 A% v$ Z2 [6 r  losses.append(loss)+ b1 G7 S" T$ s4 c! _9 a
      2 P# [, b" b9 [8 U1 a
      loss.backward() # autograd
    5 [  I3 R3 ~/ g) E( y9 G+ ~  with torch.no_grad():: r9 X5 N+ e5 B
        w  -= w.grad*0.0001   # 回归 w
    3 J  v; s' u/ T6 o3 g  z, u+ ~    b  -= b.grad*0.0001    # 回归 b
    / `, o. N, M' i# b6 H2 K/ T  w.grad.zero_()  
    0 A* Z  \  k5 M& N$ @5 E% R6 ]  b.grad.zero_()- o) G7 x8 y, k) \# x
    5 r' R8 y$ V& R) T0 W' A
    print(w.item(),b.item()) #结果' \$ y$ F3 a. t' k
    . g# R7 x6 c, o: U$ g
    Output: 27.26387596130371  0.49745178222656259 a; @$ o; G' h, m
    ----------------------------------------------  F& ~( n; ]; B. @4 i; t
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。$ ~' @, q# K1 e4 ~& x
    高手们帮看看是神马原因?- A$ L* k+ @5 C- Z) c2 o) ]

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 8 j# z- M8 R( q9 }: g
    ) W1 r" C$ ?. ^8 Q
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    4 ~0 H2 t  A6 M2 Z! q  }7 m-------! ~5 ~" @; K4 K' r4 q5 ]' a
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。2 [/ J, u/ S4 @" o7 t+ Y% ^
    -------
    " c: C. o8 P. @# h; Q算法诊断部分,建议把循环次数改为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
    9 e2 k, z) a1 P- s没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    1 [+ E9 N' E6 o8 [3 z-------8 Q9 X# A$ a0 p$ j$ r& c
    不好意思, ...

    ; h3 z: l0 j+ h' L5 W3 h谢谢,算法应该没问题,就是最简单的线性回归。
    7 C# ]3 n, g, z/ \! G! J我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    # F* Y* `  M8 h+ @1 n
    雷达 发表于 2023-2-14 21:52  m+ q$ ]9 H$ ~% B! a! B$ m6 z
    谢谢,算法应该没问题,就是最简单的线性回归。
    . \+ u4 |' A" @  K我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    : b4 t8 I$ v' }+ s% q. w
    ( L6 P* J6 R4 m% H/ X- U0 w刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ) q9 w  d- [: w% M/ e" M8 L8 j6 x4 G0 m6 M) L. i
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    / \: m" E4 V0 e: `- p
    老福 发表于 2023-2-14 22:00
    1 h) M( `. B9 e% Q8 L" ?+ a刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。( H9 j' n3 @, K7 i7 O) M: y+ I9 v

    5 [( D; P7 T: c+ S) m或者把b但的起点改为1试试。 ...
    5 }- G( n* N* W# P4 {
    + @- I# h5 f+ r" Y3 b
    你是对的。& _  e7 ^- u* T* J2 L9 G. f
    去掉了随机部分
    # ^1 _% b- [+ _5 S#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    : s) ]- R( C! A' o4 k5 B* b, Ty = (x*27+15).reshape(-1)
    9 G5 O8 k# ?1 E3 c( W9 m* Y0 j
    + Y9 n/ f: S& u- O/ E循环次数加成10倍,就看到 b 收敛了
    ) K: }: D! W  @9 Z; Fw , b
    $ |4 g2 i5 Z$ F* |27.002620697021484 14.826167106628418* @. o, e0 K& k  Q

    4 }& P" C% b# h1 ~  f和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-22 12:34 , Processed in 0.067222 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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