设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 & L: }; u9 p" s" Y

    ) V( B2 I4 C' Y为预防老年痴呆,时不时学点新东东玩一玩。
    3 x7 [% ^' r# p6 h( V0 xPytorch 下面的代码做最简单的一元线性回归:
      q' X; _/ {& s----------------------------------------------: C' H0 V- n+ D: B% l6 h
    import torch
    + B2 K/ w5 J/ V, cimport numpy as np; D: _( `( [* ?3 ?2 J5 W2 \) R7 Y* s
    import matplotlib.pyplot as plt
      w* i" W8 Q4 J. |import random
    , R: S( n, j0 j6 g' d" X: e. _9 w3 I, |
    x = torch.tensor(np.arange(1,100,1))
    ' n' O; ~: ?) e7 x, Ky = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    7 D8 i- ^+ T- T0 q. i' k6 h4 A9 x% M' Y  f  d0 M9 ^8 K+ u6 R
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b* b& j7 M4 a: L$ j4 [" u$ F9 E
    b = torch.tensor(0.,requires_grad=True)8 U2 c+ m9 s: |- S3 X2 b* |
    1 H& ^" J5 Z  F- Z0 D
    epochs = 100  O8 J1 I: b% w+ Z

    $ b0 ^. D* O" ]3 |6 L& closses = []
    % b9 w3 k/ l# |) Afor i in range(epochs):$ [9 X) }5 s$ A/ i# L% t
      y_pred = (x*w+b)    # 预测
    & A9 f5 b2 ?$ I: o, S) }0 ]$ f  y_pred.reshape(-1)
    , |% y6 c* O; g3 h, O8 A% s
      }  A, \+ [" E  loss = torch.square(y_pred - y).mean()   #计算 loss! h3 V! o3 g# B; T
      losses.append(loss)$ j# Y, h# z$ ~- Q. s9 p! n# F
        ^6 }4 j) q3 g3 s2 n5 ]
      loss.backward() # autograd; }  R* m6 B. a- I: ^; Q! D3 J6 b
      with torch.no_grad():  u7 w3 e6 k- K" Z2 a0 G9 C" C
        w  -= w.grad*0.0001   # 回归 w0 ]. f1 D5 ~- H, s
        b  -= b.grad*0.0001    # 回归 b
    . ^  Z' u. k# g# l* C3 }, \  w.grad.zero_()  # q1 b  u% b) v6 T6 E) k
      b.grad.zero_()
    " @4 X; F5 F& R$ I* n' l+ f. \- L
    print(w.item(),b.item()) #结果  ~+ y% I2 N( c! F1 i0 [# q
    - p1 q; X7 ]5 l/ _; c; V! {% M3 X
    Output: 27.26387596130371  0.4974517822265625
    * ?( c) E2 O6 |----------------------------------------------, A; X/ i4 M5 Q; P& ~. P5 F' G
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。4 h  c& c" o% V' P4 }
    高手们帮看看是神马原因?
    # x$ E* n. C( A# p% _! Y

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 , A& C$ M: }1 L8 |
    9 Q9 R4 E& X3 \6 y0 U
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    % `" Q. ]: u% ~9 }-------
    ! a( f1 x, q: e不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。! d4 m2 {# O! V1 P4 Y' z
    -------
    , L7 z) H8 S/ |( x8 F算法诊断部分,建议把循环次数改为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
    : C. {* r1 `: j没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    # C+ i% P; q$ e9 w2 {7 h-------. c, I" p* m7 g
    不好意思, ...

    & O  T" j! v2 e) \- w# D$ Q谢谢,算法应该没问题,就是最简单的线性回归。
    & Y9 t' d; M% ~) E3 @* U我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    / ^' @! g: O# o% W
    雷达 发表于 2023-2-14 21:526 ~6 l  q: x, B5 N
    谢谢,算法应该没问题,就是最简单的线性回归。
    ; m9 @3 ^* i2 n4 t7 \& ?. @: F9 J. _我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    ) u; k7 `' g. v5 m" {" @1 ~2 w% [2 \# w8 _. F6 d. r
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。0 E; i2 Z9 M8 \. F2 N
    2 g* }. C# o: H# w# J
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    2 A' M; o& E* I3 L' a9 F1 f2 w! L3 P
    老福 发表于 2023-2-14 22:00# q! T/ a( z" w( J7 w1 n
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。& k( ^+ p* \, U' t& e* F8 e
    2 l4 L9 e. x0 W7 a" {7 x: K
    或者把b但的起点改为1试试。 ...

    7 R1 q: Q: x0 J  B& O
    + s: w+ i1 w# ]. f6 U  W你是对的。& d2 r. h' c: J+ g4 {
    去掉了随机部分
    $ Z2 b4 P& Y$ {3 s# K#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    ( f; \# S8 A7 U8 k; |4 zy = (x*27+15).reshape(-1)
    ' a6 C% a: Y4 _3 X! _* x4 B& |8 u# l; [% F/ \
    循环次数加成10倍,就看到 b 收敛了8 k! p3 z/ `8 e* U7 r3 p
    w , b4 R( |% \3 [: C
    27.002620697021484 14.826167106628418
    ( C4 ^* n) }2 J* V( ~6 a) Z; ^; |' _0 l0 E6 a5 w  V2 W2 W* `
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-30 18:41 , Processed in 0.030167 second(s), 17 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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