设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 $ K+ l' }; Y. ~6 c6 a: r

    9 n7 f; G. U* X6 d5 r为预防老年痴呆,时不时学点新东东玩一玩。
    # x. w7 h, q6 @* KPytorch 下面的代码做最简单的一元线性回归:
    / f. E# d5 X6 x$ ?4 b" l7 Z! H----------------------------------------------; {* U) h5 k: V8 I8 a
    import torch* P8 j! P, |) k* g7 u6 z, _
    import numpy as np
    $ j% f) B9 X8 j' W6 p( B2 Q: c1 b6 e2 Limport matplotlib.pyplot as plt% F* M! p" o9 e: y1 D; E
    import random
    ; S5 y  l+ s9 m1 N; N- n7 d( V; p0 Z3 \" N
    x = torch.tensor(np.arange(1,100,1))
    , p4 P2 G4 {( _1 My = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15/ g1 `' V7 c% f2 m/ w* V9 W. J
    . k4 D$ Y: x; s6 i, N
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b) `8 N5 m( E9 E
    b = torch.tensor(0.,requires_grad=True)* l: F- b% C% x6 v, K) b5 z

    0 q4 E7 a& X0 ?. C# Kepochs = 100
    9 x- ?( o2 y( D2 Y1 X3 g. E( l& M
    losses = []
    ' `3 }% y% v2 m& pfor i in range(epochs):
    ' Z! @" J% D' P  G$ i! f2 r  y_pred = (x*w+b)    # 预测
    : `& O, L  X* u3 N( Z- o  y  y_pred.reshape(-1)/ F' I9 D2 A9 i( z( h2 y8 z9 E

    5 f# U, ]9 d4 K* c3 D8 G- l  loss = torch.square(y_pred - y).mean()   #计算 loss' e* l! h" s2 q7 K" s" \: M
      losses.append(loss)3 a, _: e+ S& z5 o' y8 Q
      6 [6 q& P( l$ i% s) W+ f; P( ]
      loss.backward() # autograd8 n2 m; b& V$ [6 y+ K
      with torch.no_grad():) j0 H" c- w! e7 k! |8 B
        w  -= w.grad*0.0001   # 回归 w! _/ x: B: k/ a; }& \! \
        b  -= b.grad*0.0001    # 回归 b
    + D- U& Z$ `$ X6 N7 r, R$ P* `& j  w.grad.zero_()  3 ?' ~; R/ N1 q1 a! m5 C) J( I
      b.grad.zero_()
    0 S% N* Y6 a$ _9 Y) D$ [3 f% T9 j5 i! I
    print(w.item(),b.item()) #结果/ G( j% w" {, \" R, N% Q

    ; d2 v7 M' c6 sOutput: 27.26387596130371  0.4974517822265625
    : o0 J3 Z& _( F----------------------------------------------
    : D5 Z: Z0 i. n7 Q最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    * B+ b; t' `% u; }( k高手们帮看看是神马原因?* |9 \  k6 t2 V! W& i4 A

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    ! K0 _: e" j1 ]: }
    " `0 H# V+ A6 ?9 f2 R没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    * I5 [: \" N/ W* Y0 ^" z-------# r5 J, Q5 X  J' g. |3 c: d6 x
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。0 h: X9 a( ?( a8 i
    -------1 |$ @9 E/ |4 @1 }% g+ X% x/ s' D- E
    算法诊断部分,建议把循环次数改为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:234 j# ^1 q$ N3 G9 |6 K
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    / ~7 v; k- r6 R1 e9 O-------
    . Z& a; C; C1 ^4 N不好意思, ...

    0 F2 h% ~4 F8 V+ o. p8 ~8 z谢谢,算法应该没问题,就是最简单的线性回归。
    + {  a1 f5 z8 n- [6 V! j1 P, C我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 7 o2 n/ |$ \7 d! Q3 m
    雷达 发表于 2023-2-14 21:52
    ; S% W# _+ T0 R2 n谢谢,算法应该没问题,就是最简单的线性回归。
    , ?3 R. U1 f6 T6 ]3 b* _# p我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    3 Z& M( M/ K& p# O+ Y# i
    * ?! b2 V8 ]. U: ~/ M
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。& p! b( [% n# G! q

    6 h( O( B; W; Z: l3 d' |或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 6 B) q* s! w: @; S; E, {
    老福 发表于 2023-2-14 22:00. R8 d8 d" |) z4 a9 T' S5 p
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。; Y* e# u( W3 z3 Z0 a0 g

    + U- `4 m( r) C0 q% K& b) g" h. g或者把b但的起点改为1试试。 ...

    ( \5 V  f5 b) ^4 J2 G7 t- D; ^+ p; r7 R# A
    你是对的。
    ' f: u* N# I+ \3 R' [去掉了随机部分
    & }2 O3 ~: F5 k& z0 q#y = (x*27+15+random.randint(-2,3)).reshape(-1)) l! O2 R7 P0 g/ `$ ~  S
    y = (x*27+15).reshape(-1)
    4 X! d( A% e3 y) H! N
    + J+ @4 V+ s  X& @9 j  q循环次数加成10倍,就看到 b 收敛了
    6 E( F& ^. }' u) q# z2 _) L  p  Tw , b7 A& x. ~& |( ~. }/ k7 w( u( @
    27.002620697021484 14.826167106628418" E+ B1 Q( x- ^3 O: L8 E; ^
    ( L6 O6 X4 l! J% W" t- V
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-30 04:47 , Processed in 0.056807 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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