设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 # Q5 L: @# u2 Y' U' M

    ( {, w4 Y$ r! u! X8 M为预防老年痴呆,时不时学点新东东玩一玩。
    0 n. T) K) M% l0 FPytorch 下面的代码做最简单的一元线性回归:
    4 m. f# p9 F. C% P7 z----------------------------------------------
    ; q  I) q) }9 P4 Pimport torch
    " f( h- s4 T1 o' p. @import numpy as np
    " Q+ X6 r3 n* E0 `# d5 M7 C' `import matplotlib.pyplot as plt
    . \! X3 }( I) @1 ^# uimport random, q: J! @( ]1 {6 N, v# e
    5 Z/ H, f4 b* w# a4 P0 l( l3 T6 B% }
    x = torch.tensor(np.arange(1,100,1))
    5 k+ `$ x! U5 ^& D, i! U3 C/ \y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15$ Z9 {; M& I1 m2 P
    : r) J* P/ Z& x, R; y2 n9 E+ R) ?
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b6 X5 f( ?5 f, C. h0 c
    b = torch.tensor(0.,requires_grad=True)
    8 L2 X% t4 B# E0 j% j! J+ A% B. U/ m, k8 l7 G; D6 Y7 o( t
    epochs = 100
    ) F+ E# a- {" m* z7 H
    & _' e9 x/ r' u+ G+ A# e% }losses = []& i7 q$ y$ _0 B2 k
    for i in range(epochs):
    * x8 C% ?3 f$ m6 t% ?* q5 T7 s  y_pred = (x*w+b)    # 预测+ b  i" z$ a0 H* M8 F2 P
      y_pred.reshape(-1)
    ' Q2 B' w; L, w" i
    9 L) q. z+ p2 Z& D- C, f" i! C  loss = torch.square(y_pred - y).mean()   #计算 loss0 T7 u6 d9 L$ _
      losses.append(loss)$ \: e. q" O3 {1 f1 ^! }
      0 q1 F) ~7 T7 e( U
      loss.backward() # autograd
    5 j% U9 n% `4 j- ]5 i  with torch.no_grad():
      R2 L1 S# J: H1 ]! O0 L1 P3 h+ h    w  -= w.grad*0.0001   # 回归 w
    , X9 h2 l3 {' y, v' I    b  -= b.grad*0.0001    # 回归 b
    ) F. C/ R5 D$ Z. t1 ~9 q; L" T; T  w.grad.zero_()  ( W6 z' Y! n0 J' a
      b.grad.zero_()
    * p5 H  b/ u- Z. Z
    - |4 f+ G6 Y. J- A; f% Oprint(w.item(),b.item()) #结果+ C% A' R2 X1 ~- m

    8 {$ ~& l4 V% n! Z0 g) d  C/ H5 AOutput: 27.26387596130371  0.4974517822265625
    + D5 |; y  E$ k' U* R) i& Z8 p/ N; z----------------------------------------------
    7 J; k* R6 b0 S7 r. o5 m% l最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。* b- a! X& w. D, S( u0 b
    高手们帮看看是神马原因?. o5 r1 t, r8 R& j) U7 X+ U5 J4 V

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    ) h& b9 m$ k1 Q  Q. ~8 p) D. }" `& g$ W+ _8 G/ A+ w
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?; `7 D# m7 r! l5 q* `* x5 c
    -------8 t  \# W6 m4 i! g1 A, v* D
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。7 Q! Q0 N% a/ T* [( _1 |
    -------! `! X6 ?: ]* \6 o0 `* J
    算法诊断部分,建议把循环次数改为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
    $ s) {: s8 S0 n, a3 `没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?$ U3 F" H2 x. Z* N! J/ M, n" [
    -------
      M+ x0 T9 r. L2 C不好意思, ...

    , i9 S/ i& y1 {8 E) e' w谢谢,算法应该没问题,就是最简单的线性回归。
    . N5 i6 r9 e, }/ Y' H我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 & X: N! @/ h) }: o8 I
    雷达 发表于 2023-2-14 21:52
    - x1 I: x/ j+ S& ~3 A! B3 E谢谢,算法应该没问题,就是最简单的线性回归。6 X3 ~1 `' b% x% y2 i/ T
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    - t4 b" e2 |0 d& w! h: w4 k4 e1 A" A( j" q- a9 L
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    % F7 D% S- M& K. {: b; D9 Q; {8 E2 T
    * i- c8 Y! a2 q2 q; K' r或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 , ]! |' d) s; |# V
    老福 发表于 2023-2-14 22:00
    ' p4 g4 s: c; E9 P! w) ?刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。2 Z8 C5 k2 p. }  o& t5 T8 i

    ; r: F1 h+ p  U! Y% b% v或者把b但的起点改为1试试。 ...
    0 _' L* ^- y' y5 S* z0 k

    3 |) {* F6 \* z  P2 D/ w% e- |你是对的。) C, B5 N( B/ ?! Z8 m+ w  \
    去掉了随机部分6 ?, |4 ^3 ?6 H
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    % y6 D% E5 @/ ?6 L+ J+ ky = (x*27+15).reshape(-1)
    5 L4 e$ _5 }( B( X7 s" v# U6 p( m2 F# M- Q" _2 }5 f0 h
    循环次数加成10倍,就看到 b 收敛了. f! G' q" K/ ^' P, y% w: i% n0 E
    w , b
    & h- T, w- i. ^5 o27.002620697021484 14.826167106628418# J. J+ ?6 q# o% l7 a, W
    . R' ^7 u% e/ T3 X' v+ s3 W
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-14 09:05 , Processed in 0.067171 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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