设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
      w, U  ?9 p0 k( n6 Q2 F
    # Q5 n/ e! n# s4 w为预防老年痴呆,时不时学点新东东玩一玩。
    ! }, c" ?2 Q7 v4 X* t4 zPytorch 下面的代码做最简单的一元线性回归:
    * o' W# e# n% y7 v----------------------------------------------/ S5 w0 L9 t8 G
    import torch: [2 m. J9 T; P2 x
    import numpy as np9 W6 {6 k5 v. l. V3 h
    import matplotlib.pyplot as plt' Q- [& ~: q0 p+ O  |5 z$ f
    import random
    : H) G2 b! C( T4 L
    2 n# A9 U0 x$ ^/ s" lx = torch.tensor(np.arange(1,100,1))6 j5 S* r& E5 o) M$ O  |# I
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15! L. Z+ [7 u5 g- W5 F& j$ ]
    5 _: D( b5 q) X" f4 f7 k" [$ k' V. t
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b4 P, h& Q. ?) {9 H2 L& T# K! Q* P
    b = torch.tensor(0.,requires_grad=True)
    ! h+ m4 `# i$ C, d2 N0 X* {! t' e, t$ _. B/ `4 A) }# q6 H8 B% u& F
    epochs = 100) i0 F- W' A0 `/ D' V# ~  i
      X( C3 C0 i0 b6 I2 k
    losses = []# r4 a3 J3 i( g
    for i in range(epochs):$ G9 c; I% g& W% Z0 ]  R" F; A% E
      y_pred = (x*w+b)    # 预测; _; J5 G5 w* k. E5 u9 w1 s* q
      y_pred.reshape(-1)1 h9 V5 d+ w5 D  J& ~
    " g$ B; s3 }4 [( f) L5 n( l$ p
      loss = torch.square(y_pred - y).mean()   #计算 loss) [7 }* r; D) `; j$ E( \* K% [
      losses.append(loss)
    1 m/ Q4 |8 s7 L6 e) P; K* l  + z2 C0 h( f- H
      loss.backward() # autograd
    9 R8 G0 S8 r2 q, U, X  with torch.no_grad():/ P" V$ r4 X* _8 F- w' \
        w  -= w.grad*0.0001   # 回归 w
    # {  L  S% h$ L+ F+ e    b  -= b.grad*0.0001    # 回归 b " ~+ Q0 Q1 H0 h/ M% r5 Q* m
      w.grad.zero_()  
    # ]6 u4 o/ T. {. p3 x  b.grad.zero_()
    + p0 q$ @* _$ X/ A$ y6 P2 D. d% r
    ) Q/ o. g1 S0 i9 M5 Dprint(w.item(),b.item()) #结果
    3 N' r/ D8 }3 q* ]3 b9 [# Q) o) K5 }0 E/ n0 n
    Output: 27.26387596130371  0.49745178222656259 N9 J$ |& {5 `; S. B' P, _
    ----------------------------------------------! d+ Q+ n# g3 p6 f2 ], V7 O
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    ( f1 [6 O2 |8 U) j7 B$ k高手们帮看看是神马原因?
    3 x. K; r- ?* K+ ?2 I9 p

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    9 {  p) y6 p9 \+ u' [9 Q
    ( x+ \& a* x" Q7 \没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?/ \- e( g& {/ L9 v$ V
    -------
    % V1 H  P# Y. D7 l, ^' c4 t不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    2 @  |0 W. b; }. p+ b-------4 ?% T/ |& I2 X/ u. Y% S9 u
    算法诊断部分,建议把循环次数改为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$ ]4 y1 f. S( H; y
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ( `, B" G% @0 d/ V0 X1 J: A-------
    0 C% ]3 `/ @6 s  T# Y" {9 p0 D不好意思, ...
    ; Z+ F3 @6 N' a: E% M+ j
    谢谢,算法应该没问题,就是最简单的线性回归。, B% V. C( H- k1 f  l
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 9 a$ |7 {0 v& }/ p. p) d3 n- }3 _
    雷达 发表于 2023-2-14 21:52
    3 S8 Y9 G# u% i1 D5 O) A( z谢谢,算法应该没问题,就是最简单的线性回归。: T6 e( W4 ~  Y* X# O9 U& A
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    % F' m/ M3 L- l* N3 \2 F) D) ?) z6 w3 h- f; h4 T
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。! s- j: b6 I' X4 u' E- i7 S# B6 T

    . B  V5 ^' m% t- B或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    1 w5 [- s( B- B, f5 H9 i; w2 K+ ]
    老福 发表于 2023-2-14 22:00# o# y0 T: t' X* t6 o
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ; d1 B) R3 m1 v+ M4 F2 ?
    - C9 p6 N2 a& l7 O7 d. i或者把b但的起点改为1试试。 ...

    ; q, w# M: K: u' h8 S4 {$ b! ^1 U$ Y; @# p9 i
    你是对的。
    1 r8 E" D6 t/ A1 M去掉了随机部分! C  o- B1 ]0 V3 {( D
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    9 t6 K; z* _! Z7 W2 J, i* M4 j0 Gy = (x*27+15).reshape(-1). V! m: M6 e' X/ m
    * ~2 T0 w4 M* g( h1 T' p. W
    循环次数加成10倍,就看到 b 收敛了
    ! S/ o4 V% h" M( M; D$ _4 Mw , b0 P2 H' W7 a" x& y5 r: p. B
    27.002620697021484 14.826167106628418
    # y+ Y0 s$ }. q/ _% a
    9 M; }6 Y: C) a! G, e+ ]和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

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

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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