设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 5 v% A% z1 c+ ?0 k
    0 v3 V- Z! O& G9 S2 J
    为预防老年痴呆,时不时学点新东东玩一玩。2 s) C, {' r' l3 r* D/ s( j
    Pytorch 下面的代码做最简单的一元线性回归:
    1 h* h' x$ p4 r4 f3 r/ s- h----------------------------------------------
    3 y# W6 J5 W& r  Bimport torch
    , P  h& i& v9 r9 H2 W/ Himport numpy as np
    9 i" I# p4 ~0 G* n' @8 jimport matplotlib.pyplot as plt8 Y+ R. O4 o) N2 p
    import random
    5 r+ [4 Q& A8 K- P. r( C6 ^% C
    : }$ M# @9 O: t8 ~' Sx = torch.tensor(np.arange(1,100,1))
      W( ^5 T5 h1 C. ~# [* X4 ry = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15# l6 ~+ h" b7 V' a# y
    : v1 b1 A9 v5 I9 h, d. o& ]
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b2 A9 o0 @! u! _; p! @. _0 Q+ S
    b = torch.tensor(0.,requires_grad=True)
    / K) P% c. a, m% f/ y. d# V
    , U, j5 K% W9 n. q& Sepochs = 100$ J1 a$ {  B. Z: k
    5 m  G: E7 B1 e7 H3 Y! P  d
    losses = []6 D6 i2 V4 |+ y& W7 v9 d' @
    for i in range(epochs):: R: j1 ^! Y) u' O% J7 ^% h
      y_pred = (x*w+b)    # 预测
    , M; k' K1 L- q  y_pred.reshape(-1)
    7 ^2 |8 ~5 J% r; F% F, _* S0 ~0 A
    6 F0 \7 S5 U( F/ n  l6 {* l  loss = torch.square(y_pred - y).mean()   #计算 loss
    0 H" l" D* g3 R6 Q  losses.append(loss)
    ' F) t7 `9 n! J% x  
    ( S" L* i/ k5 P; {1 m; j9 D) E! S1 m  loss.backward() # autograd
    2 j5 ?0 R* Y6 O- s  with torch.no_grad():7 q' D: [. {8 L7 [. |3 S  X
        w  -= w.grad*0.0001   # 回归 w
      C; B4 S6 V3 u    b  -= b.grad*0.0001    # 回归 b 7 M  Q0 I4 i  ]" V% k5 w1 A
      w.grad.zero_()  ' O. a& @' {" g0 ?3 L3 B" L% d
      b.grad.zero_()
    & z$ }+ Z7 ^9 `1 Z$ u0 r& d  b; ~2 u( d! W0 @. v5 k. k
    print(w.item(),b.item()) #结果
    8 a& ]( b. S# N6 b/ Y1 @
    & ]9 K' r# ~! C+ c6 nOutput: 27.26387596130371  0.49745178222656254 u0 l3 ^6 o, l% U( h2 X
    ----------------------------------------------
    6 I( [1 h8 }) W* V3 n+ \最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    2 R; F, Z* V, |* q高手们帮看看是神马原因?
    0 Q8 p( m  K0 J- e3 w

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 7 F8 ]+ A7 X. S0 t
    : T4 K' n) ~( o5 t4 a: d! z+ O. r7 t* |
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
      V5 E* d! s4 P* T' d/ ?8 M-------
    ' p2 W% d5 g& h7 m8 [7 K3 F不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。! e$ I7 {# J1 ^+ w
    -------$ w& D) V* }1 L( t3 q7 E8 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:235 [% M. J1 ~% c) m6 u& p! {
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?* a; p/ ]- X& v  k7 [( d( z
    -------, a. p/ e# e- t& x; r
    不好意思, ...

    . O( ^" c  j' b( p  }: w+ \' M谢谢,算法应该没问题,就是最简单的线性回归。1 H! T; _: l/ n% q2 p2 B, m4 G, S
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 1 F6 n: X0 {: c: f
    雷达 发表于 2023-2-14 21:523 G. R7 t: o- k7 E5 E+ \; n  u
    谢谢,算法应该没问题,就是最简单的线性回归。
    , h, ^4 X. p9 E4 a! e我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    8 e( ]+ ~/ w3 ~. k; `) Y
    , X$ e  X* r/ X% H/ q8 G- Y5 Y: K刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。, n- d  O7 g0 `7 \" g+ }
    - I2 D0 k3 D( l! D% B
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 + D  @  @9 P* o1 y7 }1 Y
    老福 发表于 2023-2-14 22:00: X4 y/ j9 j4 G2 ?% f
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。" b% m5 c1 E  ?8 }
    " K, k  N, {; r9 N) A$ C
    或者把b但的起点改为1试试。 ...
    " a/ i& M7 Z6 {

    & W- l) P0 c2 m  b0 C' ^" q你是对的。
    ) E, O: X+ i' {% K$ T/ v去掉了随机部分/ I+ F# n  S" w7 t
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
      S. ]1 B9 D( N9 E! {) w- py = (x*27+15).reshape(-1)" I# q1 O' J- x  d

    # X- c7 E7 F; |9 J: w3 w循环次数加成10倍,就看到 b 收敛了
    * D& w# a! K3 T1 b( @7 J. h/ w2 t5 pw , b
    2 f2 l/ B8 I: g0 b, H. z5 N- z& W27.002620697021484 14.826167106628418
    7 N( a) L7 P6 z, h0 `
    # Z" r0 g/ B& J- O* X和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-12 19:28 , Processed in 0.102957 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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