设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 & G6 W& }9 \" R4 ?4 y
    % f# T& |6 ^) x& q
    为预防老年痴呆,时不时学点新东东玩一玩。
    $ C) ?4 l6 E. [, BPytorch 下面的代码做最简单的一元线性回归:$ Y' C) ^1 n0 K0 x5 d
    ----------------------------------------------
    2 a7 h( e0 ]5 m1 |/ ~% W% @% Limport torch
    + c1 X/ I7 C% X6 o% Z: W$ kimport numpy as np
    ' q% k7 e/ k  }+ I! K6 M6 }import matplotlib.pyplot as plt) n% d/ p/ q) Z6 w' `' j& T. G4 t+ h
    import random9 r" ]: V. [8 q" S
      l) a$ w( v3 I! N% K4 ]  K
    x = torch.tensor(np.arange(1,100,1))
    + c: H; C' k" i( \8 J& q$ wy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15% w  o9 {0 ]* C+ Q
    4 W7 U2 W7 b+ ^
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b$ W+ J1 `- ]& w. b. Q
    b = torch.tensor(0.,requires_grad=True)  V- N% I5 j2 c0 Q) J8 ]
    1 @0 J% m  h: I6 u
    epochs = 100
    # s/ I( m& `+ q( |6 k' _4 I/ \. u% E
    losses = []
    1 ^5 l' u) b; e7 p3 `( H/ dfor i in range(epochs):6 U0 x$ H. ~. @( G$ v4 ]
      y_pred = (x*w+b)    # 预测5 t5 u8 \, M1 ^0 R: ~2 H
      y_pred.reshape(-1)
    : ]  m3 _. w8 y8 ~
    # j3 i7 q% b, F9 B6 E- ?, f  loss = torch.square(y_pred - y).mean()   #计算 loss
    9 I1 d$ C& |( T6 b$ u' k  losses.append(loss)* S6 A% [4 [: P. k/ P% R- u
      
    8 Q) d, `( h: W% x0 G: U  loss.backward() # autograd
    $ W& ^, b& u8 d" H$ n5 ~6 B+ P  with torch.no_grad():
    3 v  u4 X0 c7 ]8 z2 Z, C! r/ e6 B    w  -= w.grad*0.0001   # 回归 w
    - ]- E4 `2 [& n  v1 Q6 ~    b  -= b.grad*0.0001    # 回归 b 1 O0 L" B$ I( ]7 h% Q' ?: m0 L
      w.grad.zero_()  ) K1 y% T/ p% L5 V/ F
      b.grad.zero_()
    & S7 o, B( h5 l: Z7 e/ ^: {/ E: h* N4 K1 O1 [0 R
    print(w.item(),b.item()) #结果2 `7 i0 }. m& T* \
    " }% d8 ?4 a+ J3 ^. h
    Output: 27.26387596130371  0.4974517822265625
    4 U3 V  u1 W  v  q) s----------------------------------------------
    / Z, \" T9 b8 H. E; ?最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    + m. f# t( Z  _. m高手们帮看看是神马原因?& F9 ?( h1 L& `- |( @

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 - f* h. g% q6 g/ G$ A1 t0 R3 ]

    7 B1 |# D  K, @& k没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    1 L% ]. @3 ?- m/ h+ q8 G( _-------+ i& j* {) E% h6 D7 {
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    % q! T8 K7 L: y8 x2 E-------& U  q8 {% x- O0 w
    算法诊断部分,建议把循环次数改为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:235 t( _) L8 r/ U1 K* d4 Z
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?. ^, q7 `* s& V& h) g, b
    -------0 ^( }; e! f1 a- ^& a' g
    不好意思, ...

    ) e2 ~/ I& \3 u: i8 |: T谢谢,算法应该没问题,就是最简单的线性回归。
    / [% Y/ ?* B7 V: P$ S我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    ' p0 x8 k: `! y8 ]
    雷达 发表于 2023-2-14 21:52# `/ |1 Z2 v$ v4 q3 T+ e! p
    谢谢,算法应该没问题,就是最简单的线性回归。
    $ r- v; J* _- G; y: K& X& p" ~我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    7 t, n; b6 p! c( G6 G% W7 N" L& m# ]
    + [6 A; L; d/ ^0 J2 k3 ]  g
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。# M( T9 E, }& ~4 x2 z; l

    ) P3 H. `7 P+ T6 l% ?5 o或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 8 ^6 y, i: v+ d% K. w& ?; r  Z8 _
    老福 发表于 2023-2-14 22:00
    8 k! l! \- {7 K. K0 z* k3 Z6 t" T刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ! T4 g! P' b/ j9 ^7 i
    , U2 |: \. e+ U5 a! r或者把b但的起点改为1试试。 ...

    : r6 R% C2 G* `" d; \  s. F- N5 U( H; s! m% j+ q" B# d
    你是对的。
    * U8 Z* ~! y" a/ u) h4 \# M- w. J去掉了随机部分' U( [' L) I2 e/ s2 Y" E
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)/ d* j8 s- `. ~/ O# U) F# C4 j% W
    y = (x*27+15).reshape(-1)
    * D7 g1 s$ A+ g: O- j: w; s' ]+ l4 c
    ) J6 }; C( o$ b) U  x8 ~( D9 M9 }循环次数加成10倍,就看到 b 收敛了
    , W! Q9 g1 `- \  g9 d, h/ ow , b
    1 C. y2 |8 L; L5 ~! Y0 w27.002620697021484 14.826167106628418* r' `+ h) y( U$ X  Z+ {! {( K, K! J+ ?
    7 D$ {, J/ H! f' C+ `5 j/ j+ A
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-27 17:40 , Processed in 0.034048 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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