设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 ; R3 J0 C& p6 r2 n" J9 \. {
    / M# [1 Z6 O" U- t- _9 O
    为预防老年痴呆,时不时学点新东东玩一玩。% s8 b9 v2 j9 l- e/ S. d2 t8 e
    Pytorch 下面的代码做最简单的一元线性回归:
    : I; Z# f  n: W' n, @2 E  K& `----------------------------------------------
    $ z3 P7 v" i( T9 h# F' e, Bimport torch* M: e1 b+ X  D9 p  f" Z
    import numpy as np9 D8 s: r3 F; C7 ?% @7 ?/ e; b
    import matplotlib.pyplot as plt
    . _' A1 i% E- s  T+ B9 n5 c, limport random; b: [, z' i. c- T4 Y+ {
    - u* ]2 X# c5 y+ r  |1 V
    x = torch.tensor(np.arange(1,100,1))
    . L' y: f4 [# f( }+ n/ R% x" o: By = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    1 Q8 |* Q+ I2 M/ @4 U! @
    8 {, @4 j, o7 Y" V2 @3 |% ww = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b2 R' _1 d- T- Z. E( K; J/ B
    b = torch.tensor(0.,requires_grad=True); [8 T- g: K  o( A. w% k* S# e
    ) L. z2 n1 E; }& @6 ]4 u# F) ^
    epochs = 100
    5 ?! V7 b" i9 N- z; c$ u2 n
    $ l3 @4 L9 _! F' s  A; W$ Olosses = []
    & b4 B& ^9 N4 D6 Ffor i in range(epochs):2 c* Q* l& s, \, z5 f
      y_pred = (x*w+b)    # 预测
    ) j: u  {. K  b, I0 }& W) _. n6 e- C  y_pred.reshape(-1)4 b6 G6 V- T( R4 B8 A
    : ^- l9 v' V2 U- A0 J
      loss = torch.square(y_pred - y).mean()   #计算 loss" |6 b: M2 |" J( U7 @' A+ b/ ^8 I$ w
      losses.append(loss)
    1 H9 _. y0 d$ ?$ _( i. w9 M- o  * y; [  f& I3 D1 S; R& J  ~" S
      loss.backward() # autograd2 Y0 S" ~/ }7 h' a- j
      with torch.no_grad():) [; X: @. B" z5 T0 g
        w  -= w.grad*0.0001   # 回归 w, {" m5 S; w0 z, W1 e/ y+ t$ `- l
        b  -= b.grad*0.0001    # 回归 b 4 ?0 F: w. E  ?' h% Q0 `1 d
      w.grad.zero_()    ^% X+ |! h* @$ q  p
      b.grad.zero_(). b$ x. ~8 `1 Q2 ?- R+ w1 K0 f

    1 Q# ^& [5 Q0 e% F% \/ ~print(w.item(),b.item()) #结果
    + B/ z" `2 E2 y$ v7 n
    ! x8 o# Y1 D6 j$ T5 G# G7 FOutput: 27.26387596130371  0.4974517822265625
    , h' [( d* h- X----------------------------------------------
    / a0 h) w) E; f& [; f最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    " t! s& O$ O! z高手们帮看看是神马原因?
    ( Y; {  V+ k' |4 j" @

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    1 ~0 k9 I/ Y( L0 ~8 y. J% d7 J/ N; D6 G8 f$ m0 b, i+ a
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?! I* H9 ?0 |; ?. d6 h3 W. V: j  p
    -------" b) v# k! o1 P/ M, x
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。: o4 J8 r2 h6 n
    -------4 O7 ]) A* s0 o( O8 x/ Q
    算法诊断部分,建议把循环次数改为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:237 Y' O) J4 h7 B  J2 w3 f
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    7 _% |! J' L5 i% _# Z, W% X-------
    , Y) u" S7 I+ h+ p4 M$ w0 J5 ]- N, o# b不好意思, ...

    9 L; c1 n7 v( e/ i2 B# C谢谢,算法应该没问题,就是最简单的线性回归。
    ' z6 C5 F% ?( \7 p1 W0 U我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 : I9 A, b0 Y7 H- Y
    雷达 发表于 2023-2-14 21:52
    # k) \% `$ F& a3 V0 ?谢谢,算法应该没问题,就是最简单的线性回归。4 W( d* M3 e$ o! r, g3 f& `
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

      u) Y4 C+ a. B5 }! ]5 B+ d( A2 h, z5 w
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。# n$ p  W2 B0 n5 F% I' S4 ~: A
    7 m! j, \5 O+ i; P1 M" G% c
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 - @. |0 m  _6 D& n
    老福 发表于 2023-2-14 22:00
    ( \2 K+ z( h9 Q1 @+ p刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    4 T* x4 d. f2 z! \$ [# U; H5 r2 u9 V8 x3 q7 k
    或者把b但的起点改为1试试。 ...
    ; o& T& ~4 Y4 K6 w4 K- r

    : ]+ E8 d2 y( _2 D) P% S你是对的。
    ( O4 n" d8 ^4 x# Q1 d5 n去掉了随机部分8 T- x+ N1 C- U' N7 }' x8 z  x9 L
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    6 V8 X9 U8 U, ?( V5 @/ M" D% ly = (x*27+15).reshape(-1)6 E; U! g/ x# j! g' z

    ' i1 g7 _8 L% v; G( o3 `( x循环次数加成10倍,就看到 b 收敛了* ^. x& _9 y9 {& G% q
    w , b
    : G( r/ Z3 e/ L( W/ A. B27.002620697021484 14.826167106628418/ L2 t8 R( i; l6 L% e* W
    & ]2 E7 ~; E! p& i1 B
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-16 10:39 , Processed in 0.076590 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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