设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    0 Y6 F2 R7 h: A5 ]0 [7 x. J9 f+ J' K; ]& I
    为预防老年痴呆,时不时学点新东东玩一玩。
    . a8 m. X. A6 V- E9 |! E( M1 T$ ]Pytorch 下面的代码做最简单的一元线性回归:
    4 ?/ k9 F* m& U* u# X----------------------------------------------
    ) g4 y& v/ B! e/ fimport torch
    1 S8 q' t$ N8 b0 |' L2 c1 C6 Wimport numpy as np
    + ^' q: d0 ?5 `3 B; |; gimport matplotlib.pyplot as plt( [0 ]# j  e1 ~. V* h) J
    import random- u- d  F  ], M7 m% P0 z9 o% V9 k
    ( x. k1 U7 J3 b$ F( G
    x = torch.tensor(np.arange(1,100,1))
    ) h& ^- T2 [# o( {) ~! ]1 z+ Ny = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    : v3 t& F$ z+ V- U) A: ~, ?: @' }  Y6 H, I5 N7 T" K+ K
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b, j' x& `, O  X. F) u$ v
    b = torch.tensor(0.,requires_grad=True)
    0 S5 F$ b; h' Q, ]0 t3 M4 X" x$ \# H' Q+ r5 [0 p6 l- B
    epochs = 100" b) e# p5 B& B1 P; x

    & \) \& F, F# y% o! F- d7 ylosses = []
    0 K$ c* O7 h3 a2 h. H: Dfor i in range(epochs):" e% y+ T. z, c
      y_pred = (x*w+b)    # 预测
    7 {% b2 @6 v, Q7 Q; n/ z  y_pred.reshape(-1)
    & A2 E8 D% @# J4 J' V3 x9 u. F - n) ?6 m: ?3 Z4 D" O
      loss = torch.square(y_pred - y).mean()   #计算 loss
    8 G  k- ~2 A+ H  losses.append(loss)1 n+ W3 `- L: s: c+ z$ J5 H: t$ c0 Z
      
    2 A; O) q: m0 ^" ?  loss.backward() # autograd1 H( R) F  T5 s# W/ D
      with torch.no_grad():& p" _% g2 t1 V" p/ z
        w  -= w.grad*0.0001   # 回归 w; b9 O6 t. W/ O; W6 R& @
        b  -= b.grad*0.0001    # 回归 b % }* x+ |2 Y, J* M& f$ j
      w.grad.zero_()  0 q9 |5 S+ I$ j; O) L9 z' y
      b.grad.zero_()
    : D% K9 x% O* _& u5 {! m' Y
    ) b! g. t. w9 X/ B: J2 Gprint(w.item(),b.item()) #结果
    $ P9 L8 g9 s; v4 k7 |% j0 W5 l3 Z$ A+ C
    Output: 27.26387596130371  0.4974517822265625
    % o2 \! h" r( n" e6 f; D----------------------------------------------
    ' g0 @! s1 C6 _最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    ' D0 z7 G4 J1 V8 _高手们帮看看是神马原因?$ F9 W- a0 }& `+ Y) a% z1 ~

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    3 E* d' v( w( g$ F+ `* w: B8 n1 l) O7 s% q, i& ^
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    , _0 P) M. {) e- n6 M* J% M& P-------, x- `* y+ b' @% U) V8 Z1 w6 }
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    * D) x% I, T3 P" W5 X7 @) B% }' `-------# ?% ^! L/ ?9 }/ H2 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
    $ q/ {- p' \$ W3 b没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    1 c* P1 A. \; c4 I* ?. Y  t-------
    ( N  L* j/ A, G: F! a% O' k不好意思, ...
    4 ]- `6 x3 Q- l8 e5 Y
    谢谢,算法应该没问题,就是最简单的线性回归。
    ( z2 d6 S0 K/ |' ?- d我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    : X, C! S+ A3 \
    雷达 发表于 2023-2-14 21:52
    8 E: q3 ^& I. s, Z6 u7 Q6 @2 f谢谢,算法应该没问题,就是最简单的线性回归。
    $ k$ q4 o8 ^7 X6 s! C我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    & u, H2 h' H( E3 K" m* n
    * W/ V3 `* H5 v# x5 ~
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    7 S6 T! K  g4 ?; m3 y+ E9 W
    - j3 X/ \: S' D; [或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 - `$ w4 R3 v* ]6 a+ Z  x) d( u
    老福 发表于 2023-2-14 22:00
    ) M0 ^7 G, ^( o# }: q+ \8 O刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    / M1 ?+ A6 p! \7 Z2 }, d
    # z4 T- K4 l; C4 i% Z; T# D或者把b但的起点改为1试试。 ...

    8 O0 y! ^! W. [! i4 {  H7 `; ]/ {8 Z" s0 a2 i! k! b
    你是对的。9 r: e  J& _* c7 r, N' z; M
    去掉了随机部分
    % [2 @( {+ d7 {/ q6 Z* U; j" i) X+ F% ]# b#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    . \  \% ~2 p$ h; F. Z9 l0 by = (x*27+15).reshape(-1)
    ! C+ `! ?. W' p2 ~( e4 N7 u
    9 `! j3 O( A" G7 T6 c- M$ ]循环次数加成10倍,就看到 b 收敛了# f0 |- j  }. P4 O  ]7 e3 b8 z
    w , b
    + I: t3 N  e2 a; C, t27.002620697021484 14.826167106628418
    . k4 O* B; m. _. a4 N' r. ~" X: J
    1 T# _& U$ A4 L0 H* a" x和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-10 18:55 , Processed in 0.055925 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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