设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 % e& C- k+ n6 J7 P; G
    7 l" G4 f) \* `) J
    为预防老年痴呆,时不时学点新东东玩一玩。
      c3 X$ [3 c/ ^. n+ Q7 e- I' hPytorch 下面的代码做最简单的一元线性回归:
    # X0 }5 ]: D5 J( j+ J----------------------------------------------
    * j/ @: b3 z' H. Dimport torch1 Q; |" S$ P& k* o! D( t
    import numpy as np
    9 \% `2 j* g8 ?0 \9 F: Zimport matplotlib.pyplot as plt
    * z3 Z# f5 d9 z# j4 \0 X! X8 }import random
    + Q! q" Q0 e4 d
    . I" F& F2 |' Y  @) t9 d4 R% Xx = torch.tensor(np.arange(1,100,1))
    $ F: e, Y$ c8 J% [' ny = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    ' h, u9 m& c- g- C6 c; q9 w  c& a& g3 W8 F; Y" V
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b8 K. y. U! z1 c& E# k$ `
    b = torch.tensor(0.,requires_grad=True)
    1 x" O0 D- N& ^+ C+ ?$ c2 F$ k. ~
    epochs = 100
    2 k/ R. V8 ^% e$ E# F4 f3 A6 x
    losses = []8 k% X0 N4 [) X& N: e& V
    for i in range(epochs):
    0 l5 B" |6 C5 J  y_pred = (x*w+b)    # 预测
    ) M6 O+ L' H) f. F/ P# q0 ^  y_pred.reshape(-1)
    : `% g! i2 u+ e1 b$ H% p3 Y* D # [9 F5 q: k" [
      loss = torch.square(y_pred - y).mean()   #计算 loss
    . L$ r; \% J6 e4 j  losses.append(loss)/ w; [  C3 z* A+ r
      : A" q$ r7 c. {" ?6 x
      loss.backward() # autograd; n6 \6 f: ^* x2 E+ P- C' S6 v
      with torch.no_grad():, V; ^% M6 ]9 x* h5 I
        w  -= w.grad*0.0001   # 回归 w) r# }% e" Z% w' x" M8 a7 M
        b  -= b.grad*0.0001    # 回归 b
    ! z) h! x# D* E0 B* l. {- @  w.grad.zero_()  
    1 D4 r* z6 F) n8 |  b.grad.zero_()! z) S. o3 w9 y. u

    # e9 M* b8 c- _, j) z: a  ^5 oprint(w.item(),b.item()) #结果
      T+ L" }, `5 p* Z0 v! Q+ U' c. R7 B# s9 S
    Output: 27.26387596130371  0.4974517822265625
    8 x% N( [" S+ l; h. z/ l! S- R----------------------------------------------
    : E) q% Z" k. e8 z! t% H4 O最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    4 g3 D7 t3 P, f0 C/ T  m高手们帮看看是神马原因?1 z4 g4 S5 R* x: v5 w1 Z; d

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 1 p$ w1 q1 h2 ^: x8 Q

    ! `' b" v2 T# m; @没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?' n1 o  {, ?' I% j+ w/ Z
    -------
    % m8 _: k7 u  [, c  s$ v  I6 N不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    : e0 O0 ]  M5 Q4 {-------
    # m1 k2 U, ~* k$ F: |) a! S1 d  r8 c9 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:23. d* u# Y  n* [7 u& T
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ; A2 S. L+ i: j/ g* @8 x-------
    9 ]3 h- f3 U4 I6 s不好意思, ...

    ' r8 v4 i3 ^4 ~( u# A, ~谢谢,算法应该没问题,就是最简单的线性回归。( Y% ?& e# ~3 |$ P1 F* K
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    8 o9 y7 b: G& a) b- \" U0 p) p
    雷达 发表于 2023-2-14 21:52* {5 ]; Z# E9 Y' Y, s! p+ f: F
    谢谢,算法应该没问题,就是最简单的线性回归。# U) H: G: \! @  z
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    4 o3 F4 w9 a3 b, R  p! _
    * G6 W7 e/ H* t刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。7 `, r! _4 C% ?* ?/ }
      |3 a9 J) c' X) A
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 % x' _, T1 M; E
    老福 发表于 2023-2-14 22:00% i% }6 [8 c7 o+ L+ z
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。" a  o: d& ~! s  C# K- C
    7 ^4 E+ ^" f- v9 y1 J) p
    或者把b但的起点改为1试试。 ...

    3 q/ D9 D$ j; E6 x0 |8 G; x- ~* n* s0 ^9 r8 k0 [5 m
    你是对的。
    ' b* o( b  c$ e! [! T- a: n7 r9 _& ?去掉了随机部分, h9 l0 R1 V( P4 p0 v" p$ ?1 j5 y
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    ' X8 R/ j% p; V' U: Z( b! Qy = (x*27+15).reshape(-1)! n$ Q2 Z; v3 l4 G' n5 C. }1 ^% ^/ Q
    & T0 B5 N, T6 n! o2 ]0 w0 J2 ^/ S
    循环次数加成10倍,就看到 b 收敛了
    % _' b# u: Z9 f. J) H" \) lw , b
    8 V; ^- K* z( Y) y. Z27.002620697021484 14.8261671066284182 w' a- w7 `3 w4 A  ^) C
    : f/ f0 `+ U9 f+ P
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-14 12:21 , Processed in 0.071946 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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