设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    5 _/ ]8 K% W3 l/ e2 \* g
    5 @( D  p7 W$ p0 V# U为预防老年痴呆,时不时学点新东东玩一玩。  O- Y) N# L- N6 v  B7 @9 s
    Pytorch 下面的代码做最简单的一元线性回归:
    # b, k# j7 U; _! |( d/ q* i----------------------------------------------
    5 ~5 V* W8 ^! o5 F1 vimport torch
    : W9 f, O, k5 @% [import numpy as np: ?; ^0 M( v" r/ ^3 X, T/ a
    import matplotlib.pyplot as plt
    / M& A! o5 N2 A* ?import random
    " i/ F6 B' w- Y3 H' z* }5 j. ?$ P8 r% ]
    x = torch.tensor(np.arange(1,100,1))3 }2 W" _3 z( x. V
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    * c% E/ D6 C5 {/ A' N/ X$ |
    ; `! A: V, X* d8 t: z, Q( Zw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b' y3 U, ~4 c0 t" D& ^& K% \
    b = torch.tensor(0.,requires_grad=True)
    - q  O1 _1 P/ N2 y( I% W" S5 h0 ^! a0 R( n3 f5 `5 \% E0 |
    epochs = 100
    + G7 r" p. g) x6 B9 o
    4 E9 {1 `2 x2 B0 c' \losses = []
    - e6 ^. i# [2 W0 pfor i in range(epochs):3 o( o0 i8 g. B3 w6 z) ~' x) T
      y_pred = (x*w+b)    # 预测$ @$ B# G2 |9 `/ A/ s: t+ t
      y_pred.reshape(-1)
    / S9 n6 S' K; o  v ! I( ], |' X: ]
      loss = torch.square(y_pred - y).mean()   #计算 loss
    6 A- \0 J( r3 T4 ^6 e- H+ [  losses.append(loss)8 V7 r' t; H! t' @
      " E6 k' Y; J5 p# i( O7 Y
      loss.backward() # autograd
    4 |; N6 }; `& {  with torch.no_grad():
    8 |; \: z& Q6 w8 E4 |/ U2 a% |  N% X    w  -= w.grad*0.0001   # 回归 w- c( j) k4 i0 |5 U& |3 }
        b  -= b.grad*0.0001    # 回归 b & ~5 A3 E+ ^, P4 }  M: l
      w.grad.zero_()  & Z- ]1 Z% H% q" g. v
      b.grad.zero_()
    * E* {. k' D  r
    % m# _7 H5 m! `9 `+ ^# u+ Dprint(w.item(),b.item()) #结果
    3 l4 v& \: x$ m, r' p
    / w2 P% ~5 T3 P1 A$ w4 UOutput: 27.26387596130371  0.49745178222656257 W, ~. S. F% d& S# n% _0 I# }4 b
    ----------------------------------------------
    0 L% u- `+ P* [5 I最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。. p9 z9 J! O/ w2 [9 G1 j) T+ g% [' g
    高手们帮看看是神马原因?* w1 N9 x; J5 s' e4 n' y% U5 g

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    5 l$ z6 [, F& C2 w0 y2 V; Q5 i  `$ i! J) w
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    0 g) k6 P) x7 `0 Y0 s+ }( i-------8 c3 }' T# ^0 V3 O& O
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。1 w# d9 t, _! ?, j
    -------
    $ Y' ?6 p1 z' h$ X+ q, H0 a1 z算法诊断部分,建议把循环次数改为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
    1 c  b; ?" Q& \; R' T, P没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?& e& X8 B  v+ @
    -------
    0 x9 p1 o0 E! F% B2 `不好意思, ...

    * q/ g* v6 p! I8 D" r% S谢谢,算法应该没问题,就是最简单的线性回归。
    " l. N) E1 h1 ^我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    * b/ m% o, A" b
    雷达 发表于 2023-2-14 21:522 Q4 E9 L' i* q* \; R/ b3 k/ |
    谢谢,算法应该没问题,就是最简单的线性回归。  L1 j9 j. ]$ i
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    1 Y) `3 l/ I8 c( k! b& F8 N) o9 Y

    * `# t0 e4 f, N刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。, @& L3 S7 s4 B% Y) c" E/ ?3 A/ O

    - I' W* G. L) B或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
      G# U0 o2 ?$ V# r7 [4 ^! `
    老福 发表于 2023-2-14 22:00
    ) J+ t$ M$ i6 ~$ M3 l刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    5 E/ S' B% I: d% c. C1 v! R% e; C: w+ B
    或者把b但的起点改为1试试。 ...
    ! Q1 y! k( q! y  @8 |1 S$ [* n

    - f, O& D- F/ _/ L+ G4 q. N& \& ]0 i* J你是对的。
    ) J: v1 ~# `  S3 E2 d2 C去掉了随机部分
    4 o# D+ i/ y8 T$ i& Q1 j#y = (x*27+15+random.randint(-2,3)).reshape(-1). ], q& K+ O$ b
    y = (x*27+15).reshape(-1)
    ! h6 M7 o! s# _8 T- E% R. S
    : F9 I  x% W# {% k3 I1 h5 E) k- Q" n3 Q循环次数加成10倍,就看到 b 收敛了
    0 _. g) V1 a, j1 L8 M2 ^) E8 Xw , b
    ! K8 j8 W2 ~$ {. z/ u27.002620697021484 14.826167106628418
      Y* [' C* x6 d4 y0 ~$ L( v2 ^$ f9 C/ X5 S/ c: V
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-16 10:22 , Processed in 0.062934 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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