设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    3 y% v  f' \! L2 U( s# q) z" W; X* m- G+ V1 H
    为预防老年痴呆,时不时学点新东东玩一玩。. ~) y/ x/ }$ V- J* Z/ o! ?
    Pytorch 下面的代码做最简单的一元线性回归:- d/ l) W9 J6 Y( M; `9 ^3 ]9 o
    ----------------------------------------------
    , {8 d  \% H# g1 Eimport torch
    ; C8 y; V$ K) x/ ]import numpy as np8 g' c+ |& q. x6 C  M
    import matplotlib.pyplot as plt& E7 t: Y  O& b* p6 k. ?8 R7 K
    import random
    6 J2 N( c7 n/ Z0 H% b; \# I# U* m1 t% q1 d) V0 A4 y( o% L
    x = torch.tensor(np.arange(1,100,1))
    : y7 Q- ?2 [2 b1 J& Y  n4 dy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
      K) `8 A% Z  p# m2 \3 _: B! u
    4 ^% A2 T5 a4 e7 @" t* j, Lw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b9 `$ X0 [6 c' R( `' ~
    b = torch.tensor(0.,requires_grad=True)1 |8 C  d, O9 O, D: r5 G
    6 T5 ^. F; m/ R" U9 D1 Q0 `8 A
    epochs = 100) J7 {7 N& m: z2 L5 X3 X0 n
    ; q! e1 {2 F9 r7 t1 _6 J: j
    losses = []
    4 s8 J' u9 x8 A* u( ufor i in range(epochs):
    2 O+ E. N- ~# `# K- n  y_pred = (x*w+b)    # 预测# R% s+ N  ?% D- _
      y_pred.reshape(-1)+ l8 _0 H) h7 ]
    * n' R) x) ?7 [3 v* [4 \
      loss = torch.square(y_pred - y).mean()   #计算 loss
    6 Z+ k3 I( v0 q) j9 }: V  losses.append(loss)
    1 D; F; f, q% H; }' G9 y" Z7 m  
    2 _% W* }2 y. z  o  loss.backward() # autograd
    ; |8 Z+ z9 k+ z6 S  with torch.no_grad():0 i8 x+ M  W5 W
        w  -= w.grad*0.0001   # 回归 w  L# X$ o; ~: J- k* b* l
        b  -= b.grad*0.0001    # 回归 b
    / [% a/ r; _+ t% B: F  C  w.grad.zero_()  , L$ p9 I& e; _& H1 s+ Y
      b.grad.zero_()9 k4 q- {: K$ k; ?/ P1 k
    ' t. S6 `: a0 F8 B  _, x
    print(w.item(),b.item()) #结果
    9 E9 Y. ~: ~2 P5 i% u* |( D) F  ]! K! e/ Z; M
    Output: 27.26387596130371  0.4974517822265625
    : c2 D. T8 i( ]# ]( V3 E----------------------------------------------! J- L8 K- u3 t. h
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    5 O  O* h; G' v6 E& r0 @高手们帮看看是神马原因?; E: l4 H' e- J3 A

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ' [1 ?3 R- b- T) y7 H

    1 h! |+ `6 s3 _9 _" @1 O没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?- U+ Z. M& G  Y5 ^% _
    -------1 D5 G  [( \7 R
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
      B1 G( D2 E/ L& [% ]-------$ m4 i0 A: T9 }( _
    算法诊断部分,建议把循环次数改为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
    # ?# k6 X* `' W7 |$ R( b+ x没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    9 F! X7 x& `* L+ L-------) L+ }. U+ J# i; q
    不好意思, ...

    1 `6 M, }) {0 J6 i# a. h0 f7 N谢谢,算法应该没问题,就是最简单的线性回归。" }8 O4 R9 h3 q! \8 f
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ! G3 T2 q+ b+ t$ i" ^
    雷达 发表于 2023-2-14 21:52
    5 b5 s9 h# W+ ]. Q9 ?0 H) E; J$ m谢谢,算法应该没问题,就是最简单的线性回归。. [& y( `( n' S3 X" ?9 m
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    2 H6 Q' n! N% e7 y! \7 Z/ J2 R! f
    $ q' T2 I1 ?/ O刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    % K' @- T3 Y6 a4 c
    3 P) C/ v% k7 A- \/ R或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    - V# P5 v% X' d8 R7 z" v. k- N% k
    老福 发表于 2023-2-14 22:001 d' _( E' n  V
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。; }! B1 Q$ ?) v4 m! g/ W

    1 I/ H2 D# f$ c7 z& m或者把b但的起点改为1试试。 ...

      `$ x4 Q4 l1 V0 `+ X- A$ }) N
    7 t+ E( F7 N6 k* A; e你是对的。! m9 f+ m  ~; `% Z& D
    去掉了随机部分
    0 L3 M  K# R& o7 }1 w3 n2 J$ R#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    + u7 S  n9 }" q. T) f+ ^y = (x*27+15).reshape(-1)9 \0 d- q' s( D
    6 l2 T# z, G- N$ R0 J) x- c
    循环次数加成10倍,就看到 b 收敛了' ?& ]" q7 v. k7 h1 ~
    w , b
    / p* z: c; n, a( [- m& v27.002620697021484 14.826167106628418
    2 G' {' E/ }$ T) P( \
    3 V* C0 U" v3 Y5 l3 R' U和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-27 15:18 , Processed in 0.056295 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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