设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 : g1 f- {+ w- b/ y9 L  d. }( B1 ^
    + r0 M; O8 C) A9 d1 P  @$ z  Z
    为预防老年痴呆,时不时学点新东东玩一玩。
    . W6 H% R2 Y- ]; iPytorch 下面的代码做最简单的一元线性回归:
    * z4 s. P2 ]2 P- ^" E----------------------------------------------
    % j( E5 C" \( ^8 Pimport torch
    - J2 W6 x5 z' J) jimport numpy as np" k4 L% Y/ f! c# D  s( _( T
    import matplotlib.pyplot as plt5 b; g- h* g2 Q( e2 f$ ?
    import random) U$ I, o; ^' ^9 \; `* b# y/ W
    ) N* H1 L" Q7 |
    x = torch.tensor(np.arange(1,100,1))) O( f1 h, c3 Y1 o0 Q9 [* A4 Q
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    " |" c0 q5 G- h/ n7 }2 e8 o2 H* X" s# g% S( Y! z
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    8 L6 @& {, p  p' o+ y+ Q/ e: ^b = torch.tensor(0.,requires_grad=True)
    ! Z  ~+ E( W% ]9 U8 v5 b7 B
    5 I* K% C& ?# t2 D/ T3 aepochs = 100) v- T, \- l+ N) D) r" e
    # X. }6 f" U" g! L: I) M
    losses = []: p0 ^7 q1 ]3 r7 @- S4 g
    for i in range(epochs):1 f( m  j& g2 N4 ]5 u7 Y
      y_pred = (x*w+b)    # 预测
    & f& y  b; D; s5 J& N. D% K  y_pred.reshape(-1)5 m: z3 q) S* Y1 [+ J  B$ s

    $ ^7 ?2 b( o0 K+ V" y- b' d+ S1 s  loss = torch.square(y_pred - y).mean()   #计算 loss
    6 a& I# p0 C+ ?5 q5 h8 d2 M  losses.append(loss)
    8 c5 e4 X' u' y$ k. K1 h  D  
    1 a- @. F1 }5 q9 R  loss.backward() # autograd
    ) {! A7 l7 x3 j& \  with torch.no_grad():$ h0 ^* Q8 O. m
        w  -= w.grad*0.0001   # 回归 w
    " `. W  T: `8 t- V# |    b  -= b.grad*0.0001    # 回归 b
    / s) [+ w; D% {! h, E) r. s( T  w.grad.zero_()  
    $ R9 {8 r: \1 w0 _  b.grad.zero_()
    ' @6 ^8 X* V/ ~4 y2 K
    , Y5 G, ^: v, Y2 o6 hprint(w.item(),b.item()) #结果" z% r/ p; {, T9 k

    $ _+ t) i/ ]% @% KOutput: 27.26387596130371  0.49745178222656257 Y' o! H. C3 d% i4 q: E  J+ k( s( q
    ----------------------------------------------
    + w0 p8 Z* k, h最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。$ C" o1 `) ^, u1 S$ U" k  ~9 ]
    高手们帮看看是神马原因?3 c) O( G. ]8 H1 O  F

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    1 c  A9 h' B4 A; Q8 v" T/ `  _6 a9 d! t- N5 h
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
      p8 V9 `) H/ h/ I$ d# a-------
    ; h4 |3 @1 U+ Q& k0 l. t! R5 l  ^4 c不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。% P5 i; t# ?+ P, C1 q
    -------3 \$ f" J) {' h7 J1 R; E  ~. c8 A
    算法诊断部分,建议把循环次数改为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  U1 i0 ~2 e' K# y
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    6 U2 Y4 d1 H( z* f6 y+ N-------- l+ `+ [( G# y' e) N
    不好意思, ...

    0 g1 ^! D) n" B7 z5 r8 @& K谢谢,算法应该没问题,就是最简单的线性回归。- _+ V% q8 {, f! [& t) U8 `
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ( O( Y! ^9 N4 V2 ]
    雷达 发表于 2023-2-14 21:52
    5 B  h  v$ ?$ [, ]& t谢谢,算法应该没问题,就是最简单的线性回归。
      w; r, ~3 ~3 w* i( |/ ?我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
      I0 N: L  G0 A- Z

    & [. l, r( @8 O) j, u: {刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。8 O* U; ]( m$ c, e& K" K2 W% x
    & b0 J" k' V8 d/ T: w9 H
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 ; U! ^+ }' A* j# _$ A/ q6 j7 g
    老福 发表于 2023-2-14 22:004 z" @% {0 z$ K* i# ]+ [* s3 A4 ?
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    , T( H7 t) ^' L' m8 U3 L1 D
    " u2 z- o) X5 a  U. ^7 W或者把b但的起点改为1试试。 ...
    0 B- R1 I5 h7 M8 |7 \
    - q( }& n5 P; v
    你是对的。& p3 O. k* o7 w7 F" X% D
    去掉了随机部分$ ]0 S! w. V% V1 S; ?- b( ~
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)1 B: T3 n, d# y  _0 f& N
    y = (x*27+15).reshape(-1)( k. m* a5 L" i5 Z  @# O
    " D8 ?3 Y9 ^3 W. O
    循环次数加成10倍,就看到 b 收敛了" @; Q1 p3 v3 s7 Y& I# Y5 t
    w , b
    5 N. t/ Y# r' |. R27.002620697021484 14.8261671066284189 i3 \: E& }; |% a& t, K

    5 U$ z" u2 k  e和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-7 21:19 , Processed in 0.061941 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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