设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 1 f2 K6 f* t3 I! Z- t; N8 I' y1 ]

    ) P4 W5 Y  l9 `: ^" s为预防老年痴呆,时不时学点新东东玩一玩。
    ) e6 \: P: ^9 z' y, {: m) O' H; o2 tPytorch 下面的代码做最简单的一元线性回归:
      W! M7 z  Y4 u/ y----------------------------------------------; \' t, k' D- l3 Q9 f
    import torch
    " v5 k$ M0 w1 W2 a/ m' b+ K  wimport numpy as np+ h  g' h4 e! {5 V! [6 Q. _( t
    import matplotlib.pyplot as plt
    ' Y2 W2 V# p0 [% D( x# y' C* eimport random4 l3 n  z6 K3 c! E5 u

    3 l( ?$ @- U" J6 w( Mx = torch.tensor(np.arange(1,100,1))
    2 R2 b4 Z9 l& Ey = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15/ \/ ]" f; h! z- Y
    . G5 m( n- C2 t$ ~
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b7 G+ [! V# A5 r5 L
    b = torch.tensor(0.,requires_grad=True), ?% r3 e% n% w  g8 s

    ( c# i; }3 C" V& g" Sepochs = 100
    $ ?7 o( n# T! s, m8 T" f5 r
    : H& m5 \7 |/ v9 J5 ~losses = []) r, k  h1 ]# v' p
    for i in range(epochs):
    + f- X3 g7 X, m4 O5 \* ~  y_pred = (x*w+b)    # 预测: R. v; k+ `  e( F
      y_pred.reshape(-1)) j5 `* x4 W0 y9 `

    : J- ^: F2 e7 s' k  loss = torch.square(y_pred - y).mean()   #计算 loss
    : Y: ?% v3 o' u  losses.append(loss)4 g' s5 O7 M% W" x( M
      + [& K* Q  ~( U( O. C% ^
      loss.backward() # autograd& T& d3 K3 I. e3 `9 c1 y
      with torch.no_grad():8 [/ K6 R$ {  i5 i9 }
        w  -= w.grad*0.0001   # 回归 w; I; q, \* X3 Z+ U1 d
        b  -= b.grad*0.0001    # 回归 b $ C% t% K! E2 r( V
      w.grad.zero_()  
    / j& V' I: \/ D9 z" M  b.grad.zero_()4 ?9 {  v# o5 G0 k  a/ O

    ; l2 B2 @  D9 |- W/ n( aprint(w.item(),b.item()) #结果& I& M! J* W% j& R  G: C5 [

    7 D' ^1 C+ w4 \Output: 27.26387596130371  0.4974517822265625/ ]. b) x- @; H0 N
    ----------------------------------------------
    / j& @, O& u# U( i9 \最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    $ R" C. R0 m) m8 I高手们帮看看是神马原因?
    / y, O- H% d; u7 t

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 5 T& h/ v4 B1 w% W( V3 _- a: Q

    . S, \3 I5 _# z; \; z( g没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
      i) I! Q7 {4 `# y-------
    7 w, h. I3 s( L3 F) h不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。7 ]* l2 D$ j) Z4 `$ f4 a' Q& f
    -------9 |/ [) z: A+ {: T. L% N4 B8 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: T: o1 \' s2 x) O) v( [% k
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?) R+ V% c( m% X9 l; W* c2 u4 |; e
    -------
    ! i  ]/ m& h- u7 b2 U不好意思, ...

    + ^  b5 M6 {' Y( {& z谢谢,算法应该没问题,就是最简单的线性回归。
    0 A% B- ^5 h, b- ^1 K) k8 K$ p+ q我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 & M. G# {& f. I! O! ^3 L  [. |
    雷达 发表于 2023-2-14 21:52, m  Y9 T9 L6 X7 R2 c
    谢谢,算法应该没问题,就是最简单的线性回归。
    % x# H4 |/ t8 n/ X0 j- X我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    . O# d: Q  e2 r4 M, P1 B, z7 ^

    8 O3 u- E* ~: j& I+ Y刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。2 v  J$ a1 w; M; O1 }
    7 T+ ?, Z& ^1 x2 T  a
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    ; Y4 e" n$ a) M! n" q& W
    老福 发表于 2023-2-14 22:00
    2 g7 l# G9 J5 H- a7 k8 o' m刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。9 m$ N1 X5 G/ I! v

    , t, o/ g* U# [) b( T' n. ?" D$ E或者把b但的起点改为1试试。 ...
    * M9 u& o  [) Y1 y) Z
    8 }' l) v4 V9 W5 C0 p& y' _5 M
    你是对的。6 ~4 ]5 {3 i! ?" `9 V
    去掉了随机部分8 z% L" t/ H# f# [$ c: R
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    . h6 f$ `, P" [- Dy = (x*27+15).reshape(-1)
    " X" S# r( o6 S0 N: ^* z; l
      y. `, P& l" W4 D- P. |0 c循环次数加成10倍,就看到 b 收敛了
    ) }( Q' p/ ?6 Y& r! r: `w , b
    7 r4 w) ~: k% K27.002620697021484 14.826167106628418; ?& ]: j% k+ j1 }

    0 ?. o9 ^: v9 x2 N和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-12 10:54 , Processed in 0.068968 second(s), 17 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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