设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 7 Q8 n# H+ _* L. i# {6 G5 m8 Q  u+ B
    8 Z: i! k  ~2 D( d% Y, O
    为预防老年痴呆,时不时学点新东东玩一玩。
    0 v' p# W' R9 X8 FPytorch 下面的代码做最简单的一元线性回归:
    0 M- h+ s5 K3 C& A7 j0 U----------------------------------------------
    ) b- ~2 X) Q- A: W- {$ bimport torch* v2 o4 K, Q& F) z% X  g
    import numpy as np* J6 ?9 _! C: q5 |* ~
    import matplotlib.pyplot as plt
    8 n) |5 B' `6 J& D. {* F0 F" Iimport random: b0 \8 U, b# [/ f; A6 v# ?  a. W

    9 f  Q* d4 K8 @& f+ {x = torch.tensor(np.arange(1,100,1))
    6 i' l* o! q2 @3 I" T; Z7 }( V* J# Ay = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15) [7 P1 V/ ~0 k3 M
    # ~# {& j. U" `6 @& {6 j
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    " G/ N/ X; Q* ]/ Q! ?& Mb = torch.tensor(0.,requires_grad=True)' A8 L$ {, Q/ K1 x! a9 _: c  c
    7 i+ D) _' U2 w$ Q
    epochs = 100
    + U( @$ M# J& w8 N0 k
    3 u/ L) Y. I2 m' |losses = []& _% }) a' H  _! e7 |) {& Y' @
    for i in range(epochs):3 Y2 o( e7 f( U* b
      y_pred = (x*w+b)    # 预测0 o2 I; I& d0 K# X  F
      y_pred.reshape(-1)
    ' k2 t" i+ e- b
    * j$ E' @) X( P% P  loss = torch.square(y_pred - y).mean()   #计算 loss  X0 n: v+ p* G% j6 u
      losses.append(loss)
    $ R0 O5 E( u# `5 n3 W  ' S# a  q& `/ D5 r: }
      loss.backward() # autograd
    0 Q( I' {2 Z3 n. H$ H3 @& W  with torch.no_grad():1 p2 U6 K5 y: d: T- S
        w  -= w.grad*0.0001   # 回归 w
    + k% l4 _2 c- J4 o' q8 p    b  -= b.grad*0.0001    # 回归 b
    ( K. p( O/ Q" o- i$ n  w.grad.zero_()  
    # U. ^' j# e" Q  R6 E  b.grad.zero_()
    ; g# J4 l8 A, f! J! o, G: W2 G7 h7 M$ Y) S' M) l% N7 k# }
    print(w.item(),b.item()) #结果
    % O8 E; x- R7 z) o! a1 c/ O! y7 @+ ^8 u# K; n
    Output: 27.26387596130371  0.49745178222656250 y9 F9 t/ u( e
    ----------------------------------------------
    8 y8 H' Y0 v9 M& k9 D( b$ W最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    5 x; b5 \& m5 I/ L2 D高手们帮看看是神马原因?
    9 M6 d/ U3 y! J; M& e- _

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 7 V" l! M3 M; x# c9 P( F

    " ~0 w/ g$ [& B" h8 q# u% \( \没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    : Z; ^5 \8 f- V' S-------
    * p+ Z/ O% J. i不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    + o$ Y. [8 C& }. e. f5 _6 r-------" F9 W6 P/ }. X' Z. G! d* V$ ]; 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:230 m" x8 O1 I( k) x1 B/ j
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?3 y! o# S5 \8 \4 B# i4 q
    -------5 p8 d7 H, s( \! Z7 |
    不好意思, ...

    " e; e# b. l$ t  }4 ]8 o+ S谢谢,算法应该没问题,就是最简单的线性回归。
    ! |% W9 ?8 M  I' E1 Q, u我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 % R( T& i* W* V. y+ a
    雷达 发表于 2023-2-14 21:527 j  T( t0 B4 s$ _+ R" b: O+ \9 ]+ E
    谢谢,算法应该没问题,就是最简单的线性回归。8 O0 K. M0 s  h# ]3 b* |
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    * v! [' ^! M* W/ \7 |; ~  q
    - S/ y% k& G+ o刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。6 {6 h( S, a6 w% v2 y

    ' C/ a; O1 h# q' b) O  y或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 1 i- I( C/ T) y3 B) T
    老福 发表于 2023-2-14 22:00
    2 d, p' l2 f3 o: U* l刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    " K' U* ~3 W  \6 ?
    / g8 ~2 e5 W, |$ M3 [或者把b但的起点改为1试试。 ...
    6 Y% d8 j# Q- b) `  M

    2 Q! [1 W5 M* P& B1 ?你是对的。5 w& }3 j3 ^9 W3 J0 M' s& A1 O
    去掉了随机部分8 c" C/ P' Z5 S" h4 [8 O
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)1 w0 f* M2 _) a, J+ `7 d
    y = (x*27+15).reshape(-1)
    * u5 r" h3 n( b3 ]3 S: [9 q' ]+ I( F
    循环次数加成10倍,就看到 b 收敛了
    ! g/ F5 z3 R" U- d3 E& l' P( rw , b& m- o1 z7 `$ _3 h1 F% e
    27.002620697021484 14.826167106628418
    - V5 {% Y9 e! w, g9 ?( `* e8 e7 \1 S
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-29 21:42 , Processed in 0.058728 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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