设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    $ i" T5 \9 U' R0 d: Q$ r6 ?
    + l, j6 k% w- G: @/ f/ B为预防老年痴呆,时不时学点新东东玩一玩。/ Q7 W% A) _4 v. k
    Pytorch 下面的代码做最简单的一元线性回归:
    3 E- k  t2 ^9 O* U2 y& z----------------------------------------------8 s# ~  s: z9 Z4 T/ d2 O
    import torch7 w7 h% M& J- r4 i
    import numpy as np. _0 |" X4 b, c8 e2 z1 |7 o/ e
    import matplotlib.pyplot as plt& a, {" U8 }2 ]5 k3 {
    import random% |5 z. e" i- T8 t6 O

    / E+ B) G% r. Ux = torch.tensor(np.arange(1,100,1))
    % h7 ^9 f8 ^, S; j8 v2 o" Ey = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15, G5 X2 X+ C( M0 V# \( `& ]
    7 [8 E; q8 B- F6 W9 V3 S/ q
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    , z1 q0 u/ C6 T' O, ?- Bb = torch.tensor(0.,requires_grad=True)0 d' }0 g4 f# E: I, B; p
    5 r: N  p- d8 t2 a+ |
    epochs = 100- C' y6 _) ]) J* I7 Q. e6 L3 J

    7 a: Y8 g7 k! j9 ^: Q* V+ s4 |losses = []& B4 ~1 J6 W4 F% R6 O
    for i in range(epochs):$ _5 s& m( o( o5 v: f
      y_pred = (x*w+b)    # 预测
    % J6 E3 S& X3 K; ~3 b1 B  y_pred.reshape(-1)/ a2 |  B( ?4 M

    8 K: m3 r+ W. Z+ H9 C. d- N  loss = torch.square(y_pred - y).mean()   #计算 loss, {; V/ V! r7 C2 ~, o6 V! T% C
      losses.append(loss)
    # w6 \5 e8 Z# _) K, H  ' C; q& U3 a" L, ^! P0 [2 P
      loss.backward() # autograd) p+ ?& p" n- y) ]& Y: {2 D
      with torch.no_grad():
    $ a0 C$ J' [1 u- g  ^2 L    w  -= w.grad*0.0001   # 回归 w
    & @' \/ J- a- W. L" y' M$ J5 _    b  -= b.grad*0.0001    # 回归 b
    ! c2 b- }% I; Y/ l/ P- [" L- a- }  w.grad.zero_()  
    $ X. d0 e! h0 K# O* C  b.grad.zero_()8 n1 g* j4 |; ?/ K

    ) D8 n0 S1 I1 ~0 O3 Zprint(w.item(),b.item()) #结果
    ; u) _  d9 L$ ^; n( i/ [- z/ z7 S% |0 J
    9 b- K, z8 V# }- _/ v8 I% y" WOutput: 27.26387596130371  0.4974517822265625( k$ a  c: D/ q" e
    ----------------------------------------------
    7 [: g$ ]! k/ g最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。4 j# @/ n& `- D% r6 K* ^. O  b
    高手们帮看看是神马原因?+ p3 }( ?  l% X4 T9 [

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    , Q4 R4 @- E2 s; ?& V2 B, `  u% p, w
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    $ O. @! N  S1 |" [-------
    * I, Z' p, b" r% k- c不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。* I- e; y7 x9 n+ V
    -------
    0 U# ~8 d; }# H. W! ]/ I2 w2 D算法诊断部分,建议把循环次数改为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' Q& J- d2 L2 b( ]2 ^+ e; A
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?/ K, j( z) w' C5 t+ ?- ?1 F- B3 ^  o  A- [
    -------
    6 C1 n2 r" k3 O/ R6 |不好意思, ...
    ) }/ a% z8 o3 V
    谢谢,算法应该没问题,就是最简单的线性回归。
    4 G/ p2 G' G, H/ p( ?4 b我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 : x6 e$ V0 l. K8 Q' k: Q) \7 o
    雷达 发表于 2023-2-14 21:52: H& D0 o0 W& `2 d6 n
    谢谢,算法应该没问题,就是最简单的线性回归。
    1 E2 O/ V+ x2 S! p$ t' h我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    9 z/ p! g+ g! S0 Q$ A6 p# V1 W+ N0 w4 |; E: U8 o, ^5 y
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    # X; W1 x: F8 Y$ @: h% Y1 }3 \% Q3 `- C
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    # {4 G. H( \1 s; L/ }& C& O
    老福 发表于 2023-2-14 22:00
    % v7 u, d$ D4 ^  `/ u刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    + g& j: r" b+ Z; Y' r" p
    4 V0 @6 m& W  @/ T4 `或者把b但的起点改为1试试。 ...
    ! T0 q- ]3 [) J3 C
    4 B* E' H% X! U! }' {' s2 X* ?9 u
    你是对的。
    0 c' \7 U1 u2 o$ `去掉了随机部分
    # e: i. T7 D% v4 K) n, F9 C/ D4 q#y = (x*27+15+random.randint(-2,3)).reshape(-1): k% k$ a9 N( |" Q+ x& u& N; c! m
    y = (x*27+15).reshape(-1)
    / p5 O& n6 w4 U$ j; X! B/ D: N
    8 j& I# @2 p: y: K循环次数加成10倍,就看到 b 收敛了
    - N/ y% `- c5 q4 U; O% Z* cw , b
    9 O, L1 d% @4 y27.002620697021484 14.826167106628418& L5 \& r' B5 m9 [& L" |
    # F0 N7 Z1 M! b" k" U2 E8 L
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-26 22:19 , Processed in 0.065240 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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