设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    + Y  E# ]- P) ], U, D* i: D* {  S; \7 v: m+ _; E
    为预防老年痴呆,时不时学点新东东玩一玩。% [( z9 s( n% F* ^
    Pytorch 下面的代码做最简单的一元线性回归:
    " }$ N% E! H  g% x5 M7 L: G% j( Y----------------------------------------------
    1 S& [; ^  ^/ e: t( Q/ F, vimport torch$ w% Q$ W1 ~, M8 u$ A' w4 \
    import numpy as np1 g" f5 G2 k, {% A  I; H
    import matplotlib.pyplot as plt" ?$ c7 r! e4 Y& c+ M3 y! p
    import random
    . w/ s. {1 |6 F/ _! A' O: F
    + I6 U8 p" n$ G1 Sx = torch.tensor(np.arange(1,100,1))& r' E* q9 C: _  ^. W4 Y
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    # H" {* @; U5 Q$ G$ Y" ]
    3 `( y- I+ X# D" w- W$ w. mw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    9 P0 L5 n: f( C$ q! F- Sb = torch.tensor(0.,requires_grad=True)
    $ \. M  s/ e; z9 J
    # Z, ^# u' W1 C# F- Oepochs = 1002 R, g7 M) b' ~. u: o

    ) P; L; X: T  F3 E) l; l6 v1 J! dlosses = []* L6 a- S4 n+ `; f$ E
    for i in range(epochs):
    ( V) H# Y; {) p8 e$ t. X  y_pred = (x*w+b)    # 预测- p: Z5 p; \  U' o$ C  d' t! Y( e* L3 x
      y_pred.reshape(-1)
    8 M& Y& v# j8 i0 @- h5 f3 u
    1 t( w3 F8 Q5 m; ]  loss = torch.square(y_pred - y).mean()   #计算 loss
    . v2 B" u# r0 |. z  losses.append(loss)) m0 `. A" I" r8 a9 a7 `) ?  S! s
      
    $ D7 T# F& B5 c% X  loss.backward() # autograd
    8 C9 e* {) Z6 U! I  with torch.no_grad():
    ' m/ y, z; N$ N5 z: _    w  -= w.grad*0.0001   # 回归 w2 X" P$ S9 c! A9 T
        b  -= b.grad*0.0001    # 回归 b
    ! [5 u' L# g/ V' ^, Y  w.grad.zero_()  9 r! L6 u( N9 y" `% j
      b.grad.zero_()- W( v  R" S* W8 b

    7 ^/ x/ }0 b& i% e  g9 Zprint(w.item(),b.item()) #结果7 f. m$ X% O% r3 C# ], m6 y

    4 V) ]# K6 E" Y% V! ?9 @  xOutput: 27.26387596130371  0.4974517822265625
    , d, h: j: M9 z' j: X- L8 G----------------------------------------------/ Z. P, J" G$ h* C# H
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。  {/ J* s2 X3 g4 N
    高手们帮看看是神马原因?
    - n+ H) q: ^. Y9 ~

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    3 g( |+ C1 v7 e" G9 g7 J% A
    4 j7 o! a/ u) ^没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?# L& c2 d, ?; z6 `% t+ S6 B
    -------$ O8 P* m5 t- L! @0 x; j
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    4 a# k; @/ P& X4 j/ o0 W: \-------+ Q, [6 V7 [( E3 ]) E0 X; E0 P& G
    算法诊断部分,建议把循环次数改为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$ D; a+ N; e2 }# F% q- j  \1 B
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ; @# Z+ t3 n4 g+ F-------9 h% g0 m6 S* u  e* w
    不好意思, ...
    ; Z7 u7 e* s. V
    谢谢,算法应该没问题,就是最简单的线性回归。) f7 h  m( b, f' H2 E
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 # s* a, X% B; j: l, K, C2 d& d
    雷达 发表于 2023-2-14 21:522 G4 J$ X# z0 E. @1 l  y9 \& `- v
    谢谢,算法应该没问题,就是最简单的线性回归。7 ?1 e8 U2 x4 Q$ L  c: m5 b7 k  G
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    3 a; V2 s9 Y* ^  b2 |* z8 ^/ t; ^5 k
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    $ P! E* n) S3 T5 Y7 a
    , s: Y5 V$ }1 D4 W" m或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    4 e, ?8 S# w& a# q
    老福 发表于 2023-2-14 22:00
    ) P! p; {* l. D: C3 c% Y8 K刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。$ a, R. v! E# W9 _

    ( E; j0 c  A6 a% W9 s9 `4 }或者把b但的起点改为1试试。 ...
    3 ?* }' {' b" b3 }" t
    - t0 k* l8 K7 e: v) ^
    你是对的。: x' k2 B9 m% h
    去掉了随机部分
    1 d0 \0 [3 A$ y( |% K: u4 o6 k#y = (x*27+15+random.randint(-2,3)).reshape(-1)7 q$ d1 ?0 R/ J+ }, L8 O
    y = (x*27+15).reshape(-1)
    ; e0 s/ ^0 E! }: g+ h7 J0 x. b
    # _% L) B5 ]/ k: a4 {1 h' c  |循环次数加成10倍,就看到 b 收敛了* Z4 Q6 U& C2 k6 Y
    w , b
    - q* h3 [: A. k( T% r27.002620697021484 14.826167106628418+ i; Z, ^* O- d" k

    $ w3 E- V( K! g& `, y! h和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-28 06:22 , Processed in 0.058384 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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